hschumann2/TempleOS-Source-Code
0838
1 2Bool OptIC4(CIntermediateCode *tmpi)3{4 I64 i;5 CIntermediateCode *tmpil1,*tmpil2;6 7 if (tmpi->ic_code<IC_IMM_I64) return FALSE;8 9 tmpil1=tmpi;10 if (!(tmpil2=OptLag1(tmpil1)))11 return FALSE;12 13 if (tmpil2->res.type&MDF_STK && !(tmpil2->ic_flags&ICF_PUSH_RES)) {14 if (tmpil1->ic_code==IC_ADD_CONST && tmpil1->arg1.type&MDF_STK) {15 if ((tmpil2->ic_code==IC_REG || tmpil2->ic_code==IC_MOV) &&16 tmpil2->arg1.type&MDF_REG) {17 i=tmpil1->ic_data;18 if (I32_MIN<=i<=I32_MAX &&19 !Bt(&cmp.non_ptr_vars_mask,tmpil2->arg1.reg)) {20 tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;21 tmpil1->ic_code=IC_LEA;22 tmpil1->arg1.type=MDF_DISP+tmpil1->arg1.type.raw_type;23 tmpil1->arg1.reg=tmpil2->arg1.reg;24 tmpil1->arg1.disp=i;25 OptFree(tmpil2);26 return TRUE;27 }28 } else if (tmpil2->ic_code==IC_SHL_CONST && tmpil2->arg1.type&MDF_REG) {29 i=tmpil1->ic_data;30 if (I32_MIN<=i<=I32_MAX && tmpil2->arg1.reg!=REG_RSP &&31 1<=tmpil2->ic_data<=3) {32 tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;33 tmpil1->ic_code=IC_LEA;34 tmpil1->arg1.type=MDF_SIB+tmpil1->arg1.type.raw_type;35 tmpil1->arg1.reg=tmpil2->arg1.reg<<8+REG_NONE;36 if (tmpil2->ic_data==1)37 tmpil1->arg1.reg|=0x4000;38 else if (tmpil2->ic_data==2)39 tmpil1->arg1.reg|=0x8000;40 else41 tmpil1->arg1.reg|=0xC000;42 tmpil1->arg1.disp=i;43 OptFree(tmpil2);44 return TRUE;45 }46 }47 }48 if (tmpil2->ic_code==IC_MOV || tmpil2->ic_code==IC_REG) {49 if (tmpil1->arg2.type&MDF_STK) {50 if (tmpil2->ic_flags & ICF_RES_TO_INT) {51 if (tmpil2->arg1.type&MDF_IMM)52 tmpil2->arg1.disp=tmpil2->arg1.disp(F64);53 else54 tmpil1->ic_flags|=ICF_ARG2_TO_INT;55 } else if (tmpil2->ic_flags&ICF_RES_TO_F64) {56 if (tmpil2->arg1.type&MDF_IMM)57 tmpil2->arg1.disp(F64)=tmpil2->arg1.disp;58 else59 tmpil1->ic_flags|=ICF_ARG2_TO_F64;60 }61 tmpil1->arg2.type=tmpil2->arg1.type&MDG_MASK+62 MinI64(tmpil1->arg2.type.raw_type,63 MinI64(tmpil2->res.type.raw_type,tmpil2->arg1.type.raw_type));64 tmpil1->arg2.reg=tmpil2->arg1.reg;65 tmpil1->arg2.disp=tmpil2->arg1.disp;66 tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;67 OptSetNOP2(tmpil2);68 return TRUE;69 }70 if (tmpil1->arg1.type&MDF_STK) {71 if (tmpil2->ic_flags & ICF_RES_TO_INT) {72 if (tmpil2->arg1.type&MDF_IMM)73 tmpil2->arg1.disp=tmpil2->arg1.disp(F64);74 else75 tmpil1->ic_flags|=ICF_ARG1_TO_INT;76 } else if (tmpil2->ic_flags&ICF_RES_TO_F64) {77 if (tmpil2->arg1.type&MDF_IMM) {78 if (tmpil2->arg1.type&RTF_UNSIGNED)79 tmpil2->arg1.disp(F64)=tmpil2->arg1.disp(U64);80 else81 tmpil2->arg1.disp(F64)=tmpil2->arg1.disp(I64);82 } else83 tmpil1->ic_flags|=ICF_ARG1_TO_F64;84 }85 tmpil1->arg1.type=tmpil2->arg1.type&MDG_MASK+86 MinI64(tmpil1->arg1.type.raw_type,87 MinI64(tmpil2->res.type.raw_type,tmpil2->arg1.type.raw_type));88 CmpMinTypePointed(tmpil1,tmpil2->arg1_type_pointed_to);89 tmpil1->arg1.reg=tmpil2->arg1.reg;90 tmpil1->arg1.disp=tmpil2->arg1.disp;91 tmpil1->ic_flags|=tmpil2->ic_flags&ICG_NO_CVT_MASK;92 OptSetNOP2(tmpil2);93 return TRUE;94 }95 }96 if (tmpil1->ic_code==IC_DEREF) {97 if (tmpil2->ic_code==IC_ADD_CONST && tmpil2->arg1.type&MDF_REG &&98 tmpil1->arg1.type&MDF_STK) {99 i=tmpil2->ic_data;100 if (I32_MIN<=i<=I32_MAX &&101 !Bt(&cmp.non_ptr_vars_mask,tmpil2->arg1.reg)) {102 tmpil1->ic_flags|=tmpil2->ic_flags;103 tmpil1->ic_code=IC_MOV;104 tmpil1->arg1.type=MDF_DISP+tmpil1->arg1_type_pointed_to;105 tmpil1->arg1.reg=tmpil2->arg1.reg;106 tmpil1->arg1.disp=i;107 OptSetNOP2(tmpil2,-1);108 return TRUE;109 }110 }111 if (tmpil2->ic_code==IC_LEA && tmpil1->arg1.type&MDF_STK) {112 tmpil1->ic_flags|=tmpil2->ic_flags;113 tmpil1->ic_code=IC_MOV;114 tmpil1->arg1.type=tmpil2->arg1.type&MDG_MASK+115 tmpil1->arg1_type_pointed_to;116 tmpil1->arg1.reg=tmpil2->arg1.reg;117 tmpil1->arg1.disp=tmpil2->arg1.disp;118 OptFree(tmpil2);119 return TRUE;120 }121 }122 }123 if (tmpil1->ic_code==IC_DEREF) {124 if (tmpil1->arg1.type&MDF_REG) {125 tmpil1->arg1.type=MDF_DISP+tmpil1->arg1_type_pointed_to;126 tmpil1->arg1.disp=0;127 tmpil1->ic_code=IC_MOV;128 return TRUE;129 }130 }131 return FALSE;132}133 134U0 OptPass4(CCmpCtrl *cc,COptReg *reg_offsets,I64 *_type)135{136 CHashClass *tmpc,*tmpc1,*tmpc2;137 CIntermediateCode *tmpi,*tmpi1,*tmpi2,*tmpil1,*tmpil2,*tmpil3,138 *tmpi_next;139 I64 code,i;140 Bool dead_code=FALSE;141 CCodeMisc *lb;142 CPrsStk *ps=cc->ps;143 ps->ptr=0;144 ps->ptr2=0;145 146 if (_type)147 *_type=RT_I64;148 149 tmpi=cc->coc.coc_head.next;150 while (code=tmpi->ic_code) {151 tmpi_next=tmpi->next;152 if (dead_code&&code!=IC_LABEL) {153 if (code==IC_JMP||code==IC_SUB_CALL) {154 lb=OptLabelFwd(tmpi->ic_data);155 if (lb->use_cnt>0)156 lb->use_cnt--;157 }158 tmpi=OptFree(tmpi);159 } else {160 tmpc=tmpi->ic_class;161 tmpi1=tmpi2=&cmp.ic_nop;162 if (tmpil1=OptLag2(tmpi)) {163 if (tmpil2=OptLag2(tmpil1)) {164 if (!(tmpil3=OptLag2(tmpil2)))165 tmpil3=&cmp.ic_nop;166 } else167 tmpil2=tmpil3=&cmp.ic_nop;168 } else169 tmpil1=tmpil2=tmpil3=&cmp.ic_nop;170 switch [intermediate_code_table[code].arg_cnt] {171 case IS_V_ARG:172 ps->ptr-=tmpi->ic_data>>3;173 break;174 case IS_2_ARG:175 tmpi2=PrsPop(ps);176 tmpc2=tmpi2->ic_class;177 case IS_1_ARG:178 tmpi1=PrsPop(ps);179 tmpc1=tmpi1->ic_class;180 break;181 case IS_0_ARG: //nobound switch182 break;183 }184 switch [code] {185 case IC_IMM_I64:186 case IC_TYPE:187 tmpi->arg1.type=MDF_IMM+RT_I64;188 tmpi->arg1.disp=tmpi->ic_data;189 tmpi->ic_code=IC_MOV;190 break;191 case IC_IMM_F64:192 tmpi->arg1.type=MDF_IMM+RT_I64;193 tmpi->arg1.disp=tmpi->ic_data;194 tmpi->arg1_type_pointed_to=RT_F64;195 tmpi->ic_code=IC_MOV;196 break;197 case IC_MOV:198 if (tmpi->arg1.type&MDF_DISP && tmpi->arg1.reg==REG_RBP) {199 i=CmpOffset2Reg(tmpi->arg1.disp,reg_offsets);200 if (i>=0) {201 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;202 tmpi->arg1.reg=i;203 tmpi->arg1.disp=0;204 }205 }206 break;207 case IC_DEREF:208 if (tmpi1->ic_code==IC_LEA) {209 if (tmpi1->arg1.type&MDF_DISP && tmpi1->arg1.reg==REG_RBP) {210 i=CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets);211 if (i>=0) {212 tmpi->ic_flags|=tmpi1->ic_flags;213 tmpi->ic_code=IC_REG;214 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;215 tmpi->arg1.reg=i;216 tmpi->arg1.disp=0;217 OptFree(tmpi1);218 }219 }220 } else if ((tmpi1->ic_code==IC_ABS_ADDR ||221 tmpi1->ic_code==IC_MOV &&222 tmpi1->arg1.type==MDF_IMM+RT_I64 &&223 0<=tmpi1->arg1.disp<=I32_MAX)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {224 if (tmpi1->ic_code==IC_ABS_ADDR)225 tmpi->arg1.disp=tmpi1->ic_data;226 else227 tmpi->arg1.disp=tmpi1->arg1.disp;228 tmpi->ic_flags|=tmpi1->ic_flags;229 tmpi->ic_code=IC_MOV;230 tmpi->arg1.type=MDF_RIP_DISP32+tmpi->arg1_type_pointed_to;231 tmpi->arg1.reg=REG_RIP;232 OptFree(tmpi1);233 }234 break;235 case IC_BR_MM_ZERO:236 case IC_BR_MM_NOT_ZERO:237//(branch ++ to zero is unlikely)238 case IC_DEREF_PP:239 case IC_DEREF_MM:240 case IC__PP:241 case IC__MM:242 case IC_PP_:243 case IC_MM_:244 if (tmpi1->ic_code==IC_LEA) {245 if (tmpi1->arg1.type&MDF_DISP && tmpi1->arg1.reg==REG_RBP) {246 i=CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets);247 if (i>=0) {248 tmpi->ic_flags|=tmpi1->ic_flags;249 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;250 tmpi->arg1.reg=i;251 tmpi->arg1.disp=0;252 tmpi->ic_flags|=ICF_BY_VAL;253 OptSetNOP2(tmpi1);254 } else255 goto p4_lea_gone;256 } else {257p4_lea_gone:258 tmpi->ic_flags|=tmpi1->ic_flags;259 tmpi->arg1.type=tmpi1->arg1.type;260 tmpi->arg1.reg=tmpi1->arg1.reg;261 tmpi->arg1.disp=tmpi1->arg1.disp;262 tmpi->ic_flags|=ICF_BY_VAL;263 OptSetNOP2(tmpi1);264 }265 } else if ((tmpi1->ic_code==IC_ABS_ADDR || tmpi1->ic_code==IC_MOV &&266 tmpi1->arg1.type==MDF_IMM+RT_I64 &&267 0<=tmpi1->arg1.disp<=I32_MAX)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {268 tmpi->ic_flags|=tmpi1->ic_flags;269 if (tmpi1->ic_code==IC_ABS_ADDR)270 tmpi->arg1.disp=tmpi1->ic_data;271 else272 tmpi->arg1.disp=tmpi1->arg1.disp;273 tmpi->arg1.type=MDF_RIP_DISP32+tmpi->arg1_type_pointed_to;274 tmpi->arg1.reg=REG_RIP;275 tmpi->ic_flags|=ICF_BY_VAL;276 OptFree(tmpi1);277 }278 break;279 case IC_ADD:280 if (tmpi1->ic_code==IC_MOV && tmpi1->arg1.type==MDF_REG+RT_I64 ||281 tmpi1->ic_code==IC_REG) {282 if (tmpi2->ic_code==IC_MOV && tmpi2->arg1.type==MDF_REG+RT_I64 ||283 tmpi2->ic_code==IC_REG) {284 if (tmpi2->arg1.reg!=REG_RSP) {285 tmpi->arg1.disp=0;286 tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;287 goto p4_sib;288 } else if (tmpi1->arg1.reg!=REG_RSP) {289 tmpi->arg1.disp=0;290 tmpi->arg1.reg=tmpi2->arg1.reg+tmpi1->arg1.reg<<8;291p4_sib:292 tmpi->ic_flags|=(tmpi1->ic_flags|tmpi2->ic_flags)293 &ICG_NO_CVT_MASK;294 OptSetNOP2(tmpi1);295 OptFree(tmpi2);296 297 tmpi->ic_code=IC_LEA;298 tmpi->arg1.type=MDF_SIB+RT_I64;299 tmpi->arg1_type_pointed_to=RT_I64;300 301 tmpi->arg2.type=MDF_NULL+tmpi->arg2.type.raw_type;302 }303 } else if (tmpi2->ic_code==IC_SHL_CONST &&304 tmpi2->arg1.type==MDF_REG+RT_I64 && tmpi2->ic_data<=3) {305 if (tmpi2->arg1.reg!=REG_RSP) {306 tmpi->arg1.disp=0;307 tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;308 if (tmpi2->ic_data==1)309 tmpi->arg1.reg|=0x4000;310 else if (tmpi2->ic_data==2)311 tmpi->arg1.reg|=0x8000;312 else313 tmpi->arg1.reg|=0xC000;314 goto p4_sib;315 }316 }317 } else if (tmpi1->ic_code==IC_LEA &&318 tmpi1->arg1.type&MDF_DISP) {319 if (tmpi1->arg1.reg==REG_RBP &&320 CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets)>=0)321 break;322 if (tmpi2->ic_code==IC_MOV && tmpi2->arg1.type==MDF_REG+RT_I64 ||323 tmpi2->ic_code==IC_REG) {324 if (tmpi2->arg1.reg!=REG_RSP) {325 tmpi->arg1.disp=tmpi1->arg1.disp;326 tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;327 goto p4_sib;328 } else if (tmpi1->arg1.reg!=REG_RSP) {329 tmpi->arg1.disp=tmpi1->arg1.disp;330 tmpi->arg1.reg=tmpi2->arg1.reg+tmpi1->arg1.reg<<8;331 goto p4_sib;332 }333 } else if (tmpi2->ic_code==IC_SHL_CONST &&334 tmpi2->arg1.type==MDF_REG+RT_I64 && tmpi2->ic_data<=3) {335 if (tmpi2->arg1.reg!=REG_RSP) {336 tmpi->arg1.disp=tmpi1->arg1.disp;337 tmpi->arg1.reg=tmpi1->arg1.reg+tmpi2->arg1.reg<<8;338 if (tmpi2->ic_data==1)339 tmpi->arg1.reg|=0x4000;340 else if (tmpi2->ic_data==2)341 tmpi->arg1.reg|=0x8000;342 else343 tmpi->arg1.reg|=0xC000;344 goto p4_sib;345 }346 }347 }348 break;349 case IC_ASSIGN_PP:350 case IC_ASSIGN_MM:351//this val was stashed during pass012 for pointer arithmetic352 tmpi->ic_class2=tmpi->t.class2; //See ic_class2353 case IC_ASSIGN:354 case IC_SHL_EQU:355 case IC_SHR_EQU:356 case IC_MUL_EQU:357 case IC_DIV_EQU:358 case IC_MOD_EQU:359 case IC_AND_EQU:360 case IC_OR_EQU:361 case IC_XOR_EQU:362 case IC_ADD_EQU:363 case IC_SUB_EQU:364 if (tmpi1->ic_code==IC_LEA) {365 if (tmpi1->arg1.type&(MDF_DISP|MDF_SIB)) {366 tmpi2=tmpi->next;367 if (tmpi1->arg1.type&MDF_DISP && tmpi1->arg1.reg==REG_RBP) {368 i=CmpOffset2Reg(tmpi1->arg1.disp,reg_offsets);369 if (i>=0) {370 tmpi->ic_flags|=tmpi1->ic_flags;371 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;372 tmpi->arg1.reg=i;373 tmpi->arg1.disp=0;374 OptSetNOP2(tmpi1);375 } else {376 tmpi->ic_flags|=tmpi1->ic_flags;377 tmpi->arg1.type=MDF_DISP+tmpi->arg1.type.raw_type;378 tmpi->arg1.reg=REG_RBP;379 tmpi->arg1.disp=tmpi1->arg1.disp;380 OptSetNOP2(tmpi1);381 }382 } else {383 tmpi->ic_flags|=tmpi1->ic_flags;384 tmpi->arg1.type=tmpi1->arg1.type&MDG_MASK+385 tmpi->arg1.type.raw_type;386 tmpi->arg1.reg=tmpi1->arg1.reg;387 tmpi->arg1.disp=tmpi1->arg1.disp;388 OptSetNOP2(tmpi1);389 }390 if (tmpi->res.type&MDF_STK && tmpi2->arg2.type&MDF_STK &&391 code!=IC_ASSIGN_PP && code!=IC_ASSIGN_MM) {392 tmpi->res.type=tmpi->arg1.type;393 tmpi->res.reg=tmpi->arg1.reg;394 tmpi->res.disp=tmpi->arg1.disp;395 tmpi2->arg2.type=tmpi->arg1.type;396 tmpi2->arg2.reg=tmpi->arg1.reg;397 tmpi2->arg2.disp=tmpi->arg1.disp;398 CmpMinTypePointed(tmpi2,tmpi->arg1_type_pointed_to);399 }400 tmpi->ic_flags|=ICF_BY_VAL;401 }402 } else if ((tmpi1->ic_code==IC_ABS_ADDR ||403 tmpi1->ic_code==IC_MOV && tmpi1->arg1.type==MDF_IMM+RT_I64 &&404 0<=tmpi1->arg1.disp<=I32_MAX)&& !(tmpi1->ic_flags&ICF_NO_RIP)) {405 tmpi->ic_flags|=tmpi1->ic_flags;406 if (tmpi1->ic_code==IC_ABS_ADDR)407 tmpi->arg1.disp=tmpi1->ic_data;408 else409 tmpi->arg1.disp=tmpi1->arg1.disp;410 tmpi->arg1.type=MDF_RIP_DISP32+tmpi->arg1.type.raw_type;411 tmpi->arg1.reg=REG_RIP;412 tmpi->ic_flags|=ICF_BY_VAL;413 OptSetNOP2(tmpi1);414 }415 break;416 case IC_RETURN_VAL:417 case IC_RETURN_VAL2:418 if (!tmpi->ic_class) {419 if (_type) {420 tmpil1=tmpi;421 while (tmpil1=OptLag1(tmpil1))422 if (tmpil1->ic_class) {423 if (tmpil1->ic_flags & ICF_RES_TO_F64)424 *_type=RT_F64;425 else if (tmpil1->ic_flags & ICF_RES_TO_INT)426 *_type=RT_I64;427 else428 *_type=tmpil1->ic_class->raw_type;429 break;430 }431 }432 tmpi->ic_class=cmp.internal_types[RT_I64];433 } else if (_type)434 *_type=tmpi->ic_class->raw_type;435 break;436 case IC_NOP1:437 tmpi=OptFree(tmpi);438 break;439 case IC_BR_BT:440 case IC_BR_BTS:441 case IC_BR_BTR:442 case IC_BR_BTC:443 case IC_BR_NOT_BT:444 case IC_BR_NOT_BTS:445 case IC_BR_NOT_BTR:446 case IC_BR_NOT_BTC:447 case IC_BT:448 case IC_BTS:449 case IC_BTR:450 case IC_BTC:451 case IC_LBTS:452 case IC_LBTR:453 case IC_LBTC:454 if (!(tmpi->ic_flags&ICF_BY_VAL)) {455 if (tmpi2->ic_code==IC_ADDR) {456 if (tmpi2->arg1.type&MDF_STK &&457 tmpi2->res.type&MDF_STK) {458 if (tmpil2=OptLag1(tmpi2)) {459 if (tmpil2->ic_code==IC_LEA) {460 if (tmpil2->arg1.type&(MDF_IMM|MDG_REG_DISP_SIB_RIP)) {461 if (tmpi2) {462 tmpi->ic_flags|=tmpi2->ic_flags;463 OptFree(tmpi2);464 }465 tmpi->ic_flags|=tmpil2->ic_flags|ICF_BY_VAL;466 tmpi->arg2.type=tmpil2->arg1.type;467 tmpi->arg2.reg =tmpil2->arg1.reg;468 tmpi->arg2.disp=tmpil2->arg1.disp;469 OptFree(tmpil2);470 }471 break;472 } else if (tmpil2->ic_code!=IC_ABS_ADDR &&473 !(tmpil2->ic_code==IC_MOV &&474 tmpil2->arg1.type==MDF_IMM+RT_I64 &&475 0<=tmpil2->arg1.disp<=I32_MAX) ||476 tmpil2->ic_flags&ICF_NO_RIP)477 tmpil2=NULL;478 else {479 if (tmpil2->ic_code==IC_ABS_ADDR)480 tmpi->arg2.disp=tmpil2->ic_data;481 else482 tmpi->arg2.disp=tmpil2->arg1.disp;483 }484 }485 } else {486 if (tmpi2->arg1.type==MDF_IMM+RT_I64 &&487 0<=tmpi2->arg1.disp<=I32_MAX &&488 !(tmpi2->ic_flags&ICF_NO_RIP)) {489 tmpil2=tmpi2;490 tmpi2=NULL;491 tmpi->arg2.disp=tmpil2->arg1.disp;492 } else493 tmpil2=NULL;494 }495 if (tmpil2) {496 if (tmpi2) {497 tmpi->ic_flags|=tmpi2->ic_flags;498 OptFree(tmpi2);499 }500 tmpi->ic_flags|=tmpil2->ic_flags|ICF_BY_VAL;501 tmpi->arg2.type=MDF_RIP_DISP32+tmpi->arg2.type.raw_type;502 tmpi->arg2.reg=REG_RIP;503 OptFree(tmpil2);504 }505 } else if (tmpi2->ic_code==IC_MOV && tmpi2->res.type&MDF_STK &&506 tmpi2->arg1.type==MDF_IMM+RT_I64 &&507 0<=tmpi2->arg1.disp<=I32_MAX &&508 !(tmpi2->ic_flags&ICF_NO_RIP)) {509 tmpi->arg2.disp=tmpi2->arg1.disp;510 tmpi->ic_flags|=tmpi2->ic_flags|ICF_BY_VAL;511 tmpi->arg2.type=MDF_RIP_DISP32+tmpi->arg2.type.raw_type;512 tmpi->arg2.reg=REG_RIP;513 OptFree(tmpi2);514 }515 }516 break;517 case IC_BR_EQU_EQU ...IC_BR_LESS_EQU:518 case IC_BR_EQU_EQU2...IC_BR_LESS_EQU2:519 case IC_BR_CARRY:520 case IC_BR_NOT_CARRY:521 case IC_BR_ZERO:522 case IC_BR_NOT_ZERO:523 lb=tmpi->ic_data;524 if (tmpi->ic_flags&ICF_PUSH_CMP) {525 lb->flags|=CMF_POP_CMP;526 lb->fwd=NULL;527 }528 break;529 case IC_LABEL:530 lb=tmpi->ic_data;531 if (lb->use_cnt)532 dead_code=FALSE;533 break;534 case IC_JMP:535 case IC_RET:536 dead_code=TRUE;537 break;538 case IC_NOP2:539 ps->ptr+=tmpi->ic_data;540 break;541 case IC_CALL_END:542 case IC_END_EXP:543 if (!(tmpil1->ic_flags&ICF_PUSH_RES)) {544 if (tmpi->ic_flags&ICF_RES_NOT_USED) {545 tmpil1->ic_flags|=ICF_RES_NOT_USED;546 tmpil1->res.type=MDF_NULL+tmpil1->res.type.raw_type;547 } else if (tmpi->arg1.type&MDF_STK &&548 tmpil1->res.type&MDF_STK) {549 tmpi->arg1.type=MDF_REG+tmpi->arg1.type.raw_type;550 tmpi->arg1.disp=0;551 tmpil1->res.type=MDF_REG+tmpil1->res.type.raw_type;552 tmpil1->res.disp=0;553 if (intermediate_code_table[tmpi->ic_code].arg_cnt==IS_2_ARG) {554 tmpi->arg1.reg=REG_R8;555 tmpil1->res.reg=REG_R8;556 } else {557 tmpi->arg1.reg=REG_RAX;558 tmpil1->res.reg=REG_RAX;559 }560 }561 }562 break;563 case IC_STR_CONST:564 case IC_FS:565 case IC_GS:566 case IC_MOV_FS:567 case IC_MOV_GS:568 case IC_RIP:569 case IC_RBP:570 case IC_REG:571 case IC_COM:572 case IC_HOLYC_TYPECAST:573 case IC_NOT:574 case IC_UNARY_MINUS:575 case IC_PUSH_CMP:576 case IC_ADD_CONST:577 case IC_SUB_CONST:578 case IC_ENTER:579 case IC_ADD_RSP:580 case IC_ADD_RSP1:581 case IC_CALL:582 case IC_CALL_INDIRECT:583 case IC_CALL_INDIRECT2:584 case IC_CALL_EXTERN:585 case IC_CALL_IMPORT:586 case IC_PUSH:587 case IC_POP:588 case IC_INVLPG:589 case IC_CLFLUSH:590 case IC_GET_RFLAGS:591 case IC_CARRY:592 case IC_RDTSC:593 case IC_SET_RFLAGS:594 case IC_GET_RBP:595 case IC_SET_RBP:596 case IC_GET_RSP:597 case IC_GET_RAX:598 case IC_SET_RSP:599 case IC_SET_RAX:600 case IC_SHL_CONST:601 case IC_LEA:602 case IC_SHR_CONST:603 case IC_POWER:604 case IC_SHL:605 case IC_SHR:606 case IC_MUL:607 case IC_DIV:608 case IC_MOD:609 case IC_AND:610 case IC_OR:611 case IC_XOR:612 case IC_SUB:613 case IC_EQU_EQU...IC_LESS_EQU:614 case IC_AND_AND:615 case IC_OR_OR:616 case IC_XOR_XOR:617 case IC_GET_LABEL:618 case IC_ABS_ADDR:619 case IC_HEAP_GLBL:620 case IC_ADDR_IMPORT:621 case IC_BSF:622 case IC_BSR:623 case IC_SIGN_I64:624 case IC_TOUPPER:625 case IC_TO_I64:626 case IC_TO_F64:627 case IC_TO_BOOL:628 case IC_SQR:629 case IC_ABS:630 case IC_SQRT:631 case IC_SIN:632 case IC_COS:633 case IC_TAN:634 case IC_ATAN:635 case IC_ABS_I64:636 case IC_MIN_I64:637 case IC_MAX_I64:638 case IC_MIN_U64:639 case IC_MAX_U64:640 case IC_MOD_U64:641 case IC_SQR_I64:642 case IC_SQR_U64:643 case IC_SWAP_U8:644 case IC_SWAP_U16:645 case IC_SWAP_U32:646 case IC_SWAP_I64:647 case IC_QUE_INIT:648 case IC_QUE_INS:649 case IC_QUE_INS_REV:650 case IC_QUE_REM:651 case IC_IN_U32:652 case IC_IN_U16:653 case IC_IN_U8:654 case IC_STRLEN:655 case IC_OUT_U32:656 case IC_OUT_U16:657 case IC_OUT_U8:658 case IC_NOBOUND_SWITCH:659 case IC_SWITCH:660 case IC_END:661 case IC_ADDR:662 case IC_CALL_START:663 case IC_LEAVE:664 case IC_PUSH_REGS:665 case IC_POP_REGS:666 case IC_ASM:667 case IC_BR_AND_NOT_ZERO:668 case IC_BR_AND_ZERO:669 case IC_SUB_CALL:670 case IC_CALL_END2:671 break;672 default:673 "Pass:%d Missing IC hndlr\n",cc->pass;674 ICPut(cc,tmpi);675 LexExcept(cc,"Compiler Optimization Error at ");676 }677 if (tmpi) {678 while (OptIC4(tmpi));679 code=tmpi->ic_code;680 if (intermediate_code_table[code].res_cnt)681 PrsPush(ps,tmpi);682 }683 }684 tmpi=tmpi_next;685 }686 if (ps->ptr>2) {687 "Pass:%d Stk:%08X\n",cc->pass,ps->ptr;688 LexExcept(cc,"Compiler Optimization Error at ");689 }690}691 