00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "lnotarget.h"
00037 #include "w2op.h"
00038
00039 TOP
00040 LNOTARGET_Whirl_To_Top (WN* wn)
00041 {
00042 OPCODE opcode = WN_opcode(wn);
00043 switch (opcode) {
00044 case OPC_F4ADD:
00045 return TOP_fadd_s;
00046 case OPC_F8ADD:
00047 return TOP_fadd_d;
00048 case OPC_F4SUB:
00049 return TOP_fsub_s;
00050 case OPC_F8SUB:
00051 return TOP_fsub_d;
00052 case OPC_F4MPY:
00053 return TOP_fmpy_s;
00054 case OPC_F8MPY:
00055 return TOP_fmpy_d;
00056 case OPC_BF4LT:
00057 case OPC_BF8LT:
00058 case OPC_I4F4LT:
00059 case OPC_I4F8LT:
00060 return TOP_fcmp_lt;
00061 case OPC_BF4GT:
00062 case OPC_BF8GT:
00063 case OPC_I4F4GT:
00064 case OPC_I4F8GT:
00065 return TOP_fcmp_gt;
00066 case OPC_BF4LE:
00067 case OPC_BF8LE:
00068 case OPC_I4F4LE:
00069 case OPC_I4F8LE:
00070 return TOP_fcmp_le;
00071 case OPC_BF4GE:
00072 case OPC_BF8GE:
00073 case OPC_I4F4GE:
00074 case OPC_I4F8GE:
00075 return TOP_fcmp_ge;
00076 case OPC_BF4EQ:
00077 case OPC_BF8EQ:
00078 case OPC_I4F4EQ:
00079 case OPC_I4F8EQ:
00080 return TOP_fcmp_eq;
00081 case OPC_BF4NE:
00082 case OPC_BF8NE:
00083 case OPC_I4F4NE:
00084 case OPC_I4F8NE:
00085 return TOP_fcmp_neq;
00086 }
00087 return WHIRL_To_TOP(wn);
00088 }
00089
00090 void
00091 LNOTARGET_Loop_Inc_Test_Res (TI_RES_COUNT* resource_count)
00092 {
00093 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_adds);
00094 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_br_cloop);
00095 }
00096
00097 double
00098 LNOTARGET_Cvt_Res (TI_RES_COUNT* resource_count, OPCODE opcode)
00099 {
00100 switch(opcode) {
00101 case OPC_F4I4CVT:
00102 case OPC_F4I8CVT:
00103 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00104 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00105 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnorm_s);
00106 return 3.0;
00107 case OPC_F8I4CVT:
00108 case OPC_F8I8CVT:
00109 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00110 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00111 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnorm_d);
00112 return 3.0;
00113 case OPC_F4U4CVT:
00114 case OPC_F4U8CVT:
00115 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00116 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnorm_s);
00117 return 2.0;
00118 case OPC_F8U4CVT:
00119 case OPC_F8U8CVT:
00120 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00121 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnorm_d);
00122 return 2.0;
00123 case OPC_I4F4CVT:
00124 case OPC_I4F8CVT:
00125 case OPC_I8F4CVT:
00126 case OPC_I8F8CVT:
00127 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx);
00128 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00129 return 2.0;
00130 case OPC_U4F4CVT:
00131 case OPC_U4F8CVT:
00132 case OPC_U8F4CVT:
00133 case OPC_U8F8CVT:
00134 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fxu);
00135 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00136 return 2.0;
00137 case OPC_I4F4TRUNC:
00138 case OPC_I8F4TRUNC:
00139 case OPC_I4F8TRUNC:
00140 case OPC_I8F8TRUNC:
00141 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx_trunc);
00142 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00143 return 2.0;
00144 case OPC_U4F4TRUNC:
00145 case OPC_U8F4TRUNC:
00146 case OPC_U4F8TRUNC:
00147 case OPC_U8F8TRUNC:
00148 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fxu_trunc);
00149 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00150 return 2.0;
00151 case OPC_I4F4RND:
00152 case OPC_I8F4RND:
00153 case OPC_I4F8RND:
00154 case OPC_I8F8RND:
00155 case OPC_I4F4CEIL:
00156 case OPC_I8F4CEIL:
00157 case OPC_I4F8CEIL:
00158 case OPC_I8F8CEIL:
00159 case OPC_I4F4FLOOR:
00160 case OPC_I8F4FLOOR:
00161 case OPC_I4F8FLOOR:
00162 case OPC_I8F8FLOOR:
00163 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx);
00164 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fsetc);
00165 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00166 return 3.0;
00167 case OPC_U4F4RND:
00168 case OPC_U8F4RND:
00169 case OPC_U4F8RND:
00170 case OPC_U8F8RND:
00171 case OPC_U4F4CEIL:
00172 case OPC_U8F4CEIL:
00173 case OPC_U4F8CEIL:
00174 case OPC_U8F8CEIL:
00175 case OPC_U4F4FLOOR:
00176 case OPC_U8F4FLOOR:
00177 case OPC_U4F8FLOOR:
00178 case OPC_U8F8FLOOR:
00179 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fxu);
00180 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fsetc);
00181 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00182 return 3.0;
00183 case OPC_F8F4CVT:
00184 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnorm_d);
00185 return 1.0;
00186 case OPC_F4F8CVT:
00187 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnorm_s);
00188 return 1.0;
00189 }
00190 return 0.0;
00191 }
00192
00193 double
00194 LNOTARGET_FP_Madd_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00195 {
00196 TOP fma = (mtype == MTYPE_F4 ? TOP_fma_s : TOP_fma_d);
00197 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00198 return 1.0;
00199 }
00200
00201 double
00202 LNOTARGET_FP_Min_Max_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00203 {
00204 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcmp_lt);
00205 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_f);
00206 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_f);
00207 return 3.0;
00208 }
00209
00210 double
00211 LNOTARGET_FP_Div_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00212 {
00213 if (mtype == MTYPE_F8) {
00214 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00215 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnma);
00216 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00217 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00218 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00219 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00220 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00221 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00222 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnma);
00223 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_d);
00224 return 10.0;
00225 }
00226 else {
00227 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00228 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnma);
00229 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00230 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00231 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00232 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00233 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00234 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_s);
00235 return 8.0;
00236 }
00237 }
00238
00239 double
00240 LNOTARGET_FP_Recip_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00241 {
00242 if (mtype == MTYPE_F8) {
00243 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00244 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnma);
00245 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00246 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00247 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00248 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00249 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00250 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnma);
00251 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_d);
00252 return 9.0;
00253 }
00254 else {
00255 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00256 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fnma);
00257 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00258 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00259 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma);
00260 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy);
00261 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_s);
00262 return 7.0;
00263 }
00264 }
00265
00266 double
00267 LNOTARGET_FP_Rsqrt_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00268 {
00269 BOOL is_double = (MTYPE_is_size_double(mtype) != 0);
00270 TOP fnma = is_double ? TOP_fnma_d : TOP_fnma_s;
00271 TOP fma = is_double ? TOP_fma_d : TOP_fma_s;
00272 TOP fmpy = is_double ? TOP_fmpy_d : TOP_fmpy_s;
00273
00274 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frsqrta);
00275 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00276 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_exp);
00277 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00278
00279 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00280 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00281 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00282
00283 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00284 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00285 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00286
00287 if (is_double) {
00288 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00289 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00290 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00291 return 13.0;
00292 }
00293 else {
00294 return 10.0;
00295 }
00296 }
00297
00298 double
00299 LNOTARGET_FP_Sqrt_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00300 {
00301 BOOL is_double = (MTYPE_is_size_double(mtype) != 0);
00302 TOP fnma = is_double ? TOP_fnma_d : TOP_fnma_s;
00303 TOP fma = is_double ? TOP_fma_d : TOP_fma_s;
00304 TOP fmpy = is_double ? TOP_fmpy_d : TOP_fmpy_s;
00305 TOP fadd = is_double ? TOP_fadd_d : TOP_fadd_s;
00306
00307 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frsqrta);
00308 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00309 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_exp);
00310 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00311 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_exp);
00312 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fadd);
00313 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00314 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00315 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00316 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00317
00318 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00319 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00320 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00321
00322 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00323 TI_RES_COUNT_Add_Op_Resources(resource_count, fadd);
00324 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00325 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00326 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00327
00328 if (is_double) {
00329 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00330 TI_RES_COUNT_Add_Op_Resources(resource_count, fadd);
00331 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00332 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00333 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00334 }
00335
00336 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00337 return (is_double ? 24.0 : 19.0);
00338 }
00339
00340 double
00341 LNOTARGET_FP_Exp_Res (TI_RES_COUNT* resource_count,
00342 INTRINSIC intr,
00343 INT num_multiplies)
00344 {
00345 INT i;
00346 switch (intr) {
00347 case INTRN_F4I4EXPEXPR:
00348 case INTRN_F4I8EXPEXPR:
00349 for (i = 0; i < num_multiplies; i++) {
00350 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy_s);
00351 }
00352 return num_multiplies;
00353 case INTRN_F8I4EXPEXPR:
00354 case INTRN_F8I8EXPEXPR:
00355 for (i = 0; i < num_multiplies; i++) {
00356 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy_d);
00357 }
00358 return num_multiplies;
00359 case INTRN_C4I4EXPEXPR:
00360 case INTRN_C4I8EXPEXPR:
00361 for (i = 0; i < num_multiplies; i++) {
00362 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_s);
00363 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_s);
00364 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy_s);
00365 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy_s);
00366 }
00367 return 4*num_multiplies;
00368 case INTRN_C8I4EXPEXPR:
00369 case INTRN_C8I8EXPEXPR:
00370 for (i = 0; i < num_multiplies; i++) {
00371 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_d);
00372 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fma_d);
00373 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy_d);
00374 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fmpy_d);
00375 }
00376 return 4*num_multiplies;
00377 }
00378 return 0.0;
00379 }
00380
00381 double
00382 LNOTARGET_Complex_Add_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00383 {
00384 TOP fadd = (mtype == MTYPE_C4 ? TOP_fadd_s : TOP_fadd_d);
00385 TI_RES_COUNT_Add_Op_Resources(resource_count, fadd);
00386 TI_RES_COUNT_Add_Op_Resources(resource_count, fadd);
00387 return 2.0;
00388 }
00389
00390 double
00391 LNOTARGET_Complex_Mult_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00392 {
00393 TOP fmpy = (mtype == MTYPE_C4 ? TOP_fmpy_s : TOP_fmpy_d);
00394 TOP fma = (mtype == MTYPE_C4 ? TOP_fma_s : TOP_fma_d);
00395 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00396 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00397 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00398 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00399 return 4.0;
00400 }
00401
00402 double
00403 LNOTARGET_Complex_Neg_Res (TI_RES_COUNT* resource_count, TYPE_ID mtype)
00404 {
00405 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fneg);
00406 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fneg);
00407 return 2.0;
00408 }
00409
00410 double
00411 LNOTARGET_Int_Select_Res (TI_RES_COUNT* resource_count)
00412 {
00413 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_ne);
00414 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00415 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00416 return 3.0;
00417 }
00418
00419 double
00420 LNOTARGET_Int_Cvtl_Res (TI_RES_COUNT* resource_count)
00421 {
00422 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_extr);
00423 return 1.0;
00424 }
00425
00426 double
00427 LNOTARGET_Int_Neg_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00428 {
00429 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_sub);
00430 return 1.0;
00431 }
00432
00433 double
00434 LNOTARGET_Int_Abs_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00435 {
00436 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_lt);
00437 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_sub);
00438 return 1.0;
00439 }
00440
00441 double
00442 LNOTARGET_Int_Bnot_Res (TI_RES_COUNT* resource_count)
00443 {
00444 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_xor_i);
00445 return 1.0;
00446 }
00447
00448 double
00449 LNOTARGET_Int_Lnot_Res (TI_RES_COUNT* resource_count)
00450 {
00451 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_xor_i);
00452 return 1.0;
00453 }
00454
00455 double
00456 LNOTARGET_Int_Mult_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00457 {
00458 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00459 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00460 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_xma_l);
00461 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00462 return 4.0;
00463 }
00464
00465 double
00466 LNOTARGET_Int_Add_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00467 {
00468 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_add);
00469 return 1.0;
00470 }
00471
00472 double
00473 LNOTARGET_Int_Sub_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00474 {
00475 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_sub);
00476 return 1.0;
00477 }
00478
00479 double
00480 LNOTARGET_Int_Div_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00481 {
00482 TOP fnma = eight_bytes ? TOP_fnma : TOP_fnma_d;
00483 TOP fma = eight_bytes ? TOP_fma : TOP_fma_d;
00484 TOP fmpy = eight_bytes ? TOP_fmpy : TOP_fmpy_d;
00485
00486 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00487 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00488 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00489 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00490 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00491 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00492 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00493 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00494 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00495 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00496 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00497 if (eight_bytes) {
00498 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00499 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00500 }
00501 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00502 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00503 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00504 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx_trunc);
00505 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00506 return (eight_bytes ? 18.0 : 16.0);
00507 }
00508
00509 double
00510 LNOTARGET_Int_Mod_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00511 {
00512 TOP fnma = eight_bytes ? TOP_fnma : TOP_fnma_d;
00513 TOP fma = eight_bytes ? TOP_fma : TOP_fma_d;
00514 TOP fmpy = eight_bytes ? TOP_fmpy : TOP_fmpy_d;
00515 TOP cmp = eight_bytes ? TOP_cmp_lt : TOP_cmp4_lt;
00516
00517 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00518 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00519 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00520 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00521 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00522 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00523 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00524 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00525 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00526 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00527 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00528 if (eight_bytes) {
00529 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00530 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00531 }
00532 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00533 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00534 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00535 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx_trunc);
00536 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00537 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00538 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx);
00539 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00540 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_xor);
00541 TI_RES_COUNT_Add_Op_Resources(resource_count, cmp);
00542 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_add);
00543 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00544 return (eight_bytes ? 25.0 : 23.0);
00545 }
00546
00547 double
00548 LNOTARGET_Int_Rem_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00549 {
00550 TOP fnma = eight_bytes ? TOP_fnma : TOP_fnma_d;
00551 TOP fma = eight_bytes ? TOP_fma : TOP_fma_d;
00552 TOP fmpy = eight_bytes ? TOP_fmpy : TOP_fmpy_d;
00553
00554 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00555 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00556 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00557 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00558 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00559 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00560 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00561 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00562 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00563 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00564 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00565 if (eight_bytes) {
00566 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00567 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00568 }
00569 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00570 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00571 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00572 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx_trunc);
00573 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00574 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00575 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx);
00576 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00577 return (eight_bytes ? 21.0 : 19.0);
00578 }
00579
00580 double
00581 LNOTARGET_Int_DivRem_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00582 {
00583 TOP fnma = eight_bytes ? TOP_fnma : TOP_fnma_d;
00584 TOP fma = eight_bytes ? TOP_fma : TOP_fma_d;
00585 TOP fmpy = eight_bytes ? TOP_fmpy : TOP_fmpy_d;
00586
00587 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00588 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00589 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_setf_sig);
00590 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00591 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_frcpa);
00592 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00593 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00594 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00595 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00596 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00597 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00598 if (eight_bytes) {
00599 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00600 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00601 }
00602 TI_RES_COUNT_Add_Op_Resources(resource_count, fmpy);
00603 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00604 TI_RES_COUNT_Add_Op_Resources(resource_count, fma);
00605 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx_trunc);
00606 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_xf);
00607 TI_RES_COUNT_Add_Op_Resources(resource_count, fnma);
00608 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_fcvt_fx);
00609 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00610 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_getf_sig);
00611 return (eight_bytes ? 22.0 : 20.0);
00612 }
00613
00614 double
00615 LNOTARGET_Int_Min_Max_Res (TI_RES_COUNT* resource_count, BOOL minmax)
00616 {
00617 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_lt);
00618 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00619 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00620 if (minmax) {
00621 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00622 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00623 return 5.0;
00624 }
00625 else {
00626 return 3.0;
00627 }
00628 }
00629
00630 double
00631 LNOTARGET_Int_Band_Res (TI_RES_COUNT* resource_count)
00632 {
00633 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_and);
00634 return 1.0;
00635 }
00636
00637 double
00638 LNOTARGET_Int_Bior_Res (TI_RES_COUNT* resource_count)
00639 {
00640 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_or);
00641 return 1.0;
00642 }
00643
00644 double
00645 LNOTARGET_Int_Bnor_Res (TI_RES_COUNT* resource_count)
00646 {
00647 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_or);
00648 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_xor);
00649 return 2.0;
00650 }
00651
00652 double
00653 LNOTARGET_Int_Bxor_Res (TI_RES_COUNT* resource_count)
00654 {
00655 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_xor);
00656 return 1.0;
00657 }
00658
00659 double
00660 LNOTARGET_Int_Land_Res (TI_RES_COUNT* resource_count)
00661 {
00662 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_and);
00663 return 1.0;
00664 }
00665
00666 double
00667 LNOTARGET_Int_Cand_Res (TI_RES_COUNT* resource_count)
00668 {
00669 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_and);
00670 return 1.0;
00671 }
00672
00673 double
00674 LNOTARGET_Int_Lior_Res (TI_RES_COUNT* resource_count)
00675 {
00676 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_or);
00677 return 1.0;
00678 }
00679
00680 double
00681 LNOTARGET_Int_Cior_Res (TI_RES_COUNT* resource_count)
00682 {
00683 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_or);
00684 return 1.0;
00685 }
00686
00687 double
00688 LNOTARGET_Int_Shl_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00689 {
00690 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_shl);
00691 if (!eight_bytes) {
00692 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_sxt4);
00693 return 2.0;
00694 }
00695 else {
00696 return 1.0;
00697 }
00698 }
00699
00700 double
00701 LNOTARGET_Int_Ashr_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00702 {
00703 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_shr);
00704 if (!eight_bytes) {
00705 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_sxt4);
00706 return 2.0;
00707 }
00708 else {
00709 return 1.0;
00710 }
00711 }
00712
00713 double
00714 LNOTARGET_Int_Lshr_Res (TI_RES_COUNT* resource_count, BOOL eight_bytes)
00715 {
00716 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_shr_u);
00717 if (!eight_bytes) {
00718 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_sxt4);
00719 return 2.0;
00720 }
00721 else {
00722 return 1.0;
00723 }
00724 }
00725
00726 double
00727 LNOTARGET_Int_Eq_Res (TI_RES_COUNT* resource_count)
00728 {
00729 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_eq);
00730 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00731 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00732 return 3.0;
00733 }
00734
00735 double
00736 LNOTARGET_Int_Ne_Res (TI_RES_COUNT* resource_count)
00737 {
00738 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_ne);
00739 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00740 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00741 return 3.0;
00742 }
00743
00744 double
00745 LNOTARGET_Int_Gt_Res (TI_RES_COUNT* resource_count)
00746 {
00747 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_gt);
00748 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00749 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00750 return 3.0;
00751 }
00752
00753 double
00754 LNOTARGET_Int_Ge_Res (TI_RES_COUNT* resource_count)
00755 {
00756 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_ge);
00757 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00758 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00759 return 3.0;
00760 }
00761
00762 double
00763 LNOTARGET_Int_Lt_Res (TI_RES_COUNT* resource_count)
00764 {
00765 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_lt);
00766 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00767 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00768 return 3.0;
00769 }
00770
00771 double
00772 LNOTARGET_Int_Le_Res (TI_RES_COUNT* resource_count)
00773 {
00774 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_cmp_le);
00775 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov);
00776 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_mov_i);
00777 return 3.0;
00778 }
00779
00780 double
00781 LNOTARGET_Int_Lda_Res (TI_RES_COUNT* resource_count)
00782 {
00783 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_add);
00784 TI_RES_COUNT_Add_Op_Resources(resource_count, TOP_add);
00785 return 2.0;
00786 }
00787
00788
00789 INT
00790 LNOTARGET_Cvt_Lat (OPCODE opcode)
00791 {
00792 switch(opcode) {
00793 case OPC_F4I4CVT:
00794 case OPC_F4I8CVT:
00795 return LNOTARGET_Top_Latency(TOP_setf_sig)
00796 + LNOTARGET_Top_Latency(TOP_fcvt_xf)
00797 + LNOTARGET_Top_Latency(TOP_fnorm_s);
00798 case OPC_F8I4CVT:
00799 case OPC_F8I8CVT:
00800 return LNOTARGET_Top_Latency(TOP_setf_sig)
00801 + LNOTARGET_Top_Latency(TOP_fcvt_xf)
00802 + LNOTARGET_Top_Latency(TOP_fnorm_d);
00803 case OPC_F4U4CVT:
00804 case OPC_F4U8CVT:
00805 return LNOTARGET_Top_Latency(TOP_setf_sig)
00806 + LNOTARGET_Top_Latency(TOP_fnorm_s);
00807 case OPC_F8U4CVT:
00808 case OPC_F8U8CVT:
00809 return LNOTARGET_Top_Latency(TOP_setf_sig)
00810 + LNOTARGET_Top_Latency(TOP_fnorm_d);
00811 case OPC_I4F4CVT:
00812 case OPC_I4F8CVT:
00813 case OPC_I8F4CVT:
00814 case OPC_I8F8CVT:
00815 return LNOTARGET_Top_Latency(TOP_fcvt_fx)
00816 + LNOTARGET_Top_Latency(TOP_getf_sig);
00817 case OPC_U4F4CVT:
00818 case OPC_U4F8CVT:
00819 case OPC_U8F4CVT:
00820 case OPC_U8F8CVT:
00821 return LNOTARGET_Top_Latency(TOP_fcvt_fxu)
00822 + LNOTARGET_Top_Latency(TOP_getf_sig);
00823 case OPC_I4F4TRUNC:
00824 case OPC_I8F4TRUNC:
00825 case OPC_I4F8TRUNC:
00826 case OPC_I8F8TRUNC:
00827 return LNOTARGET_Top_Latency(TOP_fcvt_fx_trunc)
00828 + LNOTARGET_Top_Latency(TOP_getf_sig);
00829 case OPC_U4F4TRUNC:
00830 case OPC_U8F4TRUNC:
00831 case OPC_U4F8TRUNC:
00832 case OPC_U8F8TRUNC:
00833 return LNOTARGET_Top_Latency(TOP_fcvt_fxu_trunc)
00834 + LNOTARGET_Top_Latency(TOP_getf_sig);
00835 case OPC_I4F4RND:
00836 case OPC_I8F4RND:
00837 case OPC_I4F8RND:
00838 case OPC_I8F8RND:
00839 case OPC_I4F4CEIL:
00840 case OPC_I8F4CEIL:
00841 case OPC_I4F8CEIL:
00842 case OPC_I8F8CEIL:
00843 case OPC_I4F4FLOOR:
00844 case OPC_I8F4FLOOR:
00845 case OPC_I4F8FLOOR:
00846 case OPC_I8F8FLOOR:
00847 return LNOTARGET_Top_Latency(TOP_fcvt_fx)
00848 + LNOTARGET_Top_Latency(TOP_fsetc)
00849 + LNOTARGET_Top_Latency(TOP_getf_sig);
00850 case OPC_U4F4RND:
00851 case OPC_U8F4RND:
00852 case OPC_U4F8RND:
00853 case OPC_U8F8RND:
00854 case OPC_U4F4CEIL:
00855 case OPC_U8F4CEIL:
00856 case OPC_U4F8CEIL:
00857 case OPC_U8F8CEIL:
00858 case OPC_U4F4FLOOR:
00859 case OPC_U8F4FLOOR:
00860 case OPC_U4F8FLOOR:
00861 case OPC_U8F8FLOOR:
00862 return LNOTARGET_Top_Latency(TOP_fcvt_fxu)
00863 + LNOTARGET_Top_Latency(TOP_fsetc)
00864 + LNOTARGET_Top_Latency(TOP_getf_sig);
00865 case OPC_F8F4CVT:
00866 return LNOTARGET_Top_Latency(TOP_fnorm_d);
00867 case OPC_F4F8CVT:
00868 return LNOTARGET_Top_Latency(TOP_fnorm_s);
00869
00870
00871 case OPC_U8I4CVT:
00872 case OPC_U8U4CVT:
00873 case OPC_I8I4CVT:
00874 case OPC_I8U4CVT:
00875 return LNOTARGET_Top_Latency(TOP_nop);
00876 }
00877 return -1;
00878 }
00879
00880 INT
00881 LNOTARGET_FP_Madd_Add_Lat (TYPE_ID mtype)
00882 {
00883 TOP fma = (mtype == MTYPE_F4 ? TOP_fma_s : TOP_fma_d);
00884 return TI_LATENCY_Result_Available_Cycle(fma, 0)
00885 - TI_LATENCY_Operand_Access_Cycle(fma, 0);
00886 }
00887
00888 INT
00889 LNOTARGET_FP_Madd_Mult_Lat (TYPE_ID mtype)
00890 {
00891 TOP fma = (mtype == MTYPE_F4 ? TOP_fma_s : TOP_fma_d);
00892 return TI_LATENCY_Result_Available_Cycle(fma, 0)
00893 - TI_LATENCY_Operand_Access_Cycle(fma, 1);
00894 }
00895
00896 INT
00897 LNOTARGET_FP_Min_Max_Lat (TYPE_ID mtype)
00898 {
00899 return LNOTARGET_Top_Latency(TOP_fcmp_lt)
00900 + LNOTARGET_Top_Latency(TOP_mov_f);
00901 }
00902
00903 INT
00904 LNOTARGET_FP_Div_Lat (TYPE_ID mtype)
00905 {
00906 Lmt_DevWarn(1, ("TODO: Finish LNOTARGET_*_Lat for IA-64"));
00907 return 20;
00908 }
00909
00910 INT
00911 LNOTARGET_FP_Recip_Lat (TYPE_ID mtype)
00912 {
00913 Lmt_DevWarn(1, ("TODO: Finish LNOTARGET_*_Lat for IA-64"));
00914 return 15;
00915 }
00916
00917 INT
00918 LNOTARGET_FP_Rsqrt_Lat (TYPE_ID mtype)
00919 {
00920 Lmt_DevWarn(1, ("TODO: Finish LNOTARGET_*_Lat for IA-64"));
00921 return 15;
00922 }
00923
00924 INT
00925 LNOTARGET_FP_Sqrt_Lat (TYPE_ID mtype)
00926 {
00927 Lmt_DevWarn(1, ("TODO: Finish LNOTARGET_*_Lat for IA-64"));
00928 return 20;
00929 }
00930
00931 INT
00932 LNOTARGET_FP_Exp_Lat (INTRINSIC intr, INT num_multiplies)
00933 {
00934 switch (intr) {
00935 case INTRN_F4I4EXPEXPR:
00936 case INTRN_F4I8EXPEXPR:
00937 return num_multiplies * LNOTARGET_Top_Latency(TOP_fmpy_s);
00938 case INTRN_F8I4EXPEXPR:
00939 case INTRN_F8I8EXPEXPR:
00940 return num_multiplies * LNOTARGET_Top_Latency(TOP_fmpy_d);
00941 case INTRN_C4I4EXPEXPR:
00942 case INTRN_C4I8EXPEXPR:
00943 return num_multiplies * (2*LNOTARGET_Top_Latency(TOP_fmpy_s) +
00944 2*LNOTARGET_Top_Latency(TOP_fadd_s));
00945 case INTRN_C8I4EXPEXPR:
00946 case INTRN_C8I8EXPEXPR:
00947 return num_multiplies * (2*LNOTARGET_Top_Latency(TOP_fmpy_d) +
00948 2*LNOTARGET_Top_Latency(TOP_fadd_d));
00949 }
00950 return -1;
00951 }
00952
00953 INT
00954 LNOTARGET_Complex_Add_Lat (TYPE_ID mtype)
00955 {
00956 TOP add = (mtype == MTYPE_C4 ? TOP_fadd_s : TOP_fadd_d);
00957 return 2*LNOTARGET_Top_Latency(add);
00958 }
00959
00960 INT
00961 LNOTARGET_Complex_Mult_Lat (TYPE_ID mtype)
00962 {
00963 TOP add = (mtype == MTYPE_C4 ? TOP_fadd_s : TOP_fadd_d);
00964 TOP mul = (mtype == MTYPE_C4 ? TOP_fmpy_s : TOP_fmpy_d);
00965 return 2*LNOTARGET_Top_Latency(add)
00966 + 2*LNOTARGET_Top_Latency(mul);
00967 }
00968
00969 INT
00970 LNOTARGET_Complex_Neg_Lat (TYPE_ID mtype)
00971 {
00972 return 2*LNOTARGET_Top_Latency(TOP_fneg);
00973 }