hschumann2/TempleOS-Source-Code
0838
1 2/*OptPass0123 4Pass#05When parsing the arg expressions to a function6call, there is a call to OptPass012 to determine7the type of the expression. OptPass0128 9Pass#1&210Constant expressions are simplified.11Eliminated opcodes are set to NOP.12Types are determined by reconstructing an13expression tree for operators14CIntermediateCode.CICTreeLinks.15 16Pointer arithmetic size is set, once17the type is determined.18 19Branches are expressed with short-circuit20logic. 3-Arg comparisons are established.21 22*/23 24CIntermediateCode *OptPass012(CCmpCtrl *cc)25{/*Simplify CONST arithmetic.26Sets the class throughout Expression trees.27Returns the type of an Expression for use28in int<-->F64 conversions of fun29args.30*/31 I64 code,i;32 Bool is_unsigned;33 CHashClass *tmpc,*tmpc1,*tmpc2;34 CIntermediateCode *tmpi,*tmpi1,*tmpi2,*tmpi3,*tmpi_push,35 *last_with_class=NULL;36 CCodeMisc *lb,*lb1,*lb2;37 CPrsStk *ps;38 if (!(ps=cc->ps))39 ps=cc->ps=MAlloc(sizeof(CPrsStk));40 ps->ptr=0;41 ps->ptr2=0;42 tmpi=cc->coc.coc_head.next;43 while (code=tmpi->ic_code) {44 tmpc=tmpi->ic_class;45 tmpi->ic_class2=tmpc;46 tmpi_push=tmpi;47 MemSet(&tmpi->arg1,0,3*sizeof(CICArg));48 tmpi->arg1_type_pointed_to=0;49 switch [intermediate_code_table[code].arg_cnt] {50 case IS_V_ARG:51 ps->ptr-=tmpi->ic_data>>2;52 break;53 case IS_2_ARG:54 tmpi2=PrsPop(ps);55 tmpc2=tmpi2->ic_class;56 tmpi->t.arg2_tree=tmpi2;57 tmpi->t.arg2_class=PrsPop(ps);58 case IS_1_ARG:59 tmpi1=PrsPop(ps);60 tmpc1=tmpi1->ic_class;61 tmpi->t.arg1_tree=tmpi1;62 tmpi->t.arg1_class=PrsPop(ps);63 break;64 case IS_0_ARG: //nobound switch65 break;66 }67 if (intermediate_code_table[code].not_const)68 cc->flags|=CCF_NOT_CONST;69 switch [code] {70 case IC_IMM_F64:71 tmpi->ic_flags&=~ICF_RES_TO_F64;72 if (cc->pass==2 && tmpi->ic_flags&ICF_RES_TO_INT) {73 tmpi->ic_data=ToI64(tmpi->ic_data(F64));74 tmpi->ic_flags&=~ICF_RES_TO_INT;75 tmpi->ic_code=IC_IMM_I64;76 tmpi->ic_class=cmp.internal_types[RT_I64];77 }78 break;79 case IC_IMM_I64:80 tmpi->ic_flags&=~ICF_RES_TO_INT;81 if (cc->pass==2 && tmpi->ic_flags&ICF_RES_TO_F64) {82 tmpi->ic_data(F64)=ToF64(tmpi->ic_data);83 tmpi->ic_flags&=~ICF_RES_TO_F64;84 tmpi->ic_code=IC_IMM_F64;85 tmpi->ic_class=cmp.internal_types[RT_F64];86 }87 break;88 case IC_HOLYC_TYPECAST:89 if (tmpi1->ic_code==IC_IMM_I64 || tmpi1->ic_code==IC_IMM_F64) {90 if (tmpi->ic_class->raw_type==RT_F64)91 tmpi1->ic_code=IC_IMM_F64;92 else93 tmpi1->ic_code=IC_IMM_I64;94 tmpi1->ic_class=tmpi->ic_class;95 tmpi1->ic_flags|=tmpi->ic_flags;96 tmpi_push=tmpi1;97 OptSetNOP1(tmpi);98 } else {99 if (tmpi->ic_data) {//was paren100 if (!tmpi_push->ic_class->ptr_stars_cnt) {101 if (tmpi_push->ic_class->raw_type==RT_F64)102 tmpi_push->ic_class2=cmp.internal_types[RT_F64];103 else104 tmpi_push->ic_class2=cmp.internal_types[RT_I64];105 }106 } else {107 tmpi1->ic_class=tmpi->ic_class;108 tmpi1->ic_flags|=tmpi->ic_flags;109 tmpi_push=tmpi1;110 OptSetNOP1(tmpi);111 }112 }113 break;114 case IC_FS:115 case IC_GS:116//CALL,FS/GS,CALL_END,IMM,ADD,DEREF-->MOV_FS/GS117 tmpi1=tmpi->next->next; //IMM118 tmpi2=tmpi1->next; //ADD119 tmpi3=tmpi2->next; //DEREF120 if (tmpi1->ic_code==IC_IMM_I64 && tmpi2->ic_code==IC_ADD &&121 tmpi3->ic_code==IC_DEREF &&122 !(tmpi3->ic_flags&~ICG_NO_CVT_MASK)) {123 tmpi->ic_flags|=tmpi1->ic_flags|tmpi2->ic_flags|tmpi3->ic_flags;124 if (tmpi->ic_code==IC_FS)125 tmpi->ic_code=IC_MOV_FS;126 else127 tmpi->ic_code=IC_MOV_GS;128 tmpi->ic_data=tmpi1->ic_data;129 tmpi->ic_class =tmpi3->ic_class;130 tmpi->ic_class2=tmpi3->ic_class2;131 OptSetNOP1(tmpi1);132 OptSetNOP1(tmpi2);133 OptSetNOP1(tmpi3);134 135 tmpi1=tmpi->last; //CALL136 tmpi2=tmpi->next; //CALL_END137 tmpi->ic_flags|=tmpi1->ic_flags|tmpi2->ic_flags;138 OptSetNOP1(tmpi1);139 OptSetNOP1(tmpi2);140 }141 break;142 case IC_PUSH_CMP:143 if (tmpi1=OptLag(tmpi)) {144 if (tmpi1->ic_code==IC_AND_AND)145 tmpi1=OptLag(tmpi1);146 if (tmpi1)147 tmpi->ic_class=tmpi1->ic_class;148 }149 tmpi->ic_class2=tmpi->ic_class;150 tmpi->ic_data=0;151 if (tmpi->ic_class->raw_type==RT_F64)152 tmpi->ic_flags|=ICF_USE_F64;153 break;154 case IC_COM:155 if (tmpi1->ic_code==IC_IMM_I64) {156 tmpi->ic_data=~tmpi1->ic_data;157 tmpi->ic_code=IC_IMM_I64;158 tmpi->ic_flags|=tmpi1->ic_flags;159 OptSetNOP1(tmpi1);160 }161 tmpi_push->ic_class2=cmp.internal_types[RT_I64];162 break;163 start:164 case IC_NOT:165 if (tmpc->raw_type==RT_F64) {166 if (tmpi1->ic_code==IC_IMM_F64) {167 tmpi->ic_data(F64)=!tmpi1->ic_data(F64);168 tmpi->ic_code=IC_IMM_F64;169 tmpi->ic_flags|=tmpi1->ic_flags;170 OptSetNOP1(tmpi1);171 }172 break;173 }174 if (tmpi1->ic_code==IC_IMM_I64) {175 tmpi->ic_data=!tmpi1->ic_data;176 tmpi->ic_code=IC_IMM_I64;177 tmpi->ic_flags|=tmpi1->ic_flags;178 OptSetNOP1(tmpi1);179 }180 break;181 case IC_UNARY_MINUS:182 if (i=OptFixupUnaryOp(tmpi,tmpi1,&is_unsigned)) {183 if (i==FBO1_INT) {184 tmpi->ic_data=-tmpi1->ic_data(I64);185 tmpi->ic_code=IC_IMM_I64;186 } else {187 tmpi->ic_data(F64)=-tmpi1->ic_data(F64);188 tmpi->ic_code=IC_IMM_F64;189 }190 }191 if (tmpc1->type&HTT_INTERNAL_TYPE && tmpc1->raw_type&RTF_UNSIGNED)192 tmpi->ic_class=cmp.internal_types[tmpc1->raw_type-1];193 break;194 case IC_SHL_CONST:195 if (i=OptFixupUnaryOp(tmpi,tmpi1,&is_unsigned)) {196 if (i==FBO1_INT) {197 if (is_unsigned)198 tmpi->ic_data=tmpi1->ic_data(U64)<<tmpi->ic_data(U64);199 else200 tmpi->ic_data=tmpi1->ic_data(I64)<<tmpi->ic_data(I64);201 tmpi->ic_code=IC_IMM_I64;202 } else {203 tmpi->ic_data(F64)=tmpi1->ic_data(F64)<<tmpi->ic_data;204 tmpi->ic_code=IC_IMM_F64;205 }206 } else if (tmpi1->ic_code==IC_SHL_CONST) {207 tmpi->ic_flags|=tmpi1->ic_flags;208 tmpi->ic_data+=tmpi1->ic_data;209 OptSetNOP1(tmpi1);210 }211 break;212 case IC_SHR_CONST:213 if (i=OptFixupUnaryOp(tmpi,tmpi1,&is_unsigned)) {214 if (i==FBO1_INT) {215 if (is_unsigned)216 tmpi->ic_data=tmpi1->ic_data(U64)>>tmpi->ic_data(U64);217 else218 tmpi->ic_data=tmpi1->ic_data(I64)>>tmpi->ic_data(I64);219 tmpi->ic_code=IC_IMM_I64;220 } else {221 tmpi->ic_data(F64)=tmpi1->ic_data(F64)>>tmpi->ic_data;222 tmpi->ic_code=IC_IMM_F64;223 }224 } else if (tmpi1->ic_code==IC_SHR_CONST) {225 tmpi->ic_flags|=tmpi1->ic_flags;226 tmpi->ic_data+=tmpi1->ic_data;227 OptSetNOP1(tmpi1);228 }229 break;230 case IC_SHL:231 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {232 if (i==FBO1_INT) {233 if (is_unsigned)234 tmpi->ic_data=tmpi1->ic_data(U64)<<tmpi2->ic_data(U64);235 else236 tmpi->ic_data=tmpi1->ic_data(I64)<<tmpi2->ic_data(I64);237 tmpi->ic_code=IC_IMM_I64;238 } else {239 tmpi->ic_data(F64)=tmpi1->ic_data(F64) << tmpi2->ic_data(F64);240 tmpi->ic_code=IC_IMM_F64;241 }242 } else if (tmpi2->ic_code==IC_IMM_I64) {243 tmpi->ic_flags|=tmpi2->ic_flags;244 tmpi->ic_data=tmpi2->ic_data;245 tmpi->ic_code=IC_SHL_CONST;246 OptSetNOP1(tmpi2);247 }248 break;249 case IC_SHR:250 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {251 if (i==FBO1_INT) {252 if (is_unsigned)253 tmpi->ic_data=tmpi1->ic_data(U64)>>tmpi2->ic_data(U64);254 else255 tmpi->ic_data=tmpi1->ic_data(I64)>>tmpi2->ic_data(I64);256 tmpi->ic_code=IC_IMM_I64;257 } else {258 tmpi->ic_data(F64)=tmpi1->ic_data(F64) >> tmpi2->ic_data(F64);259 tmpi->ic_code=IC_IMM_F64;260 }261 } else if (tmpi2->ic_code==IC_IMM_I64) {262 tmpi->ic_flags|=tmpi2->ic_flags;263 tmpi->ic_data=tmpi2->ic_data;264 tmpi->ic_code=IC_SHR_CONST;265 OptSetNOP1(tmpi2);266 }267 break;268 end:269 if (!tmpi_push->ic_class->ptr_stars_cnt) {270 if (tmpi_push->ic_class->raw_type==RT_F64)271 tmpi_push->ic_class2=cmp.internal_types[RT_F64];272 else273 tmpi_push->ic_class2=cmp.internal_types[RT_I64];274 }275 break;276 case IC_DEREF:277 if (cc->pass==2) {278 if (!tmpc->size)279 LexWarn(cc,"Dereference U0 ");280 if (tmpi1->ic_class->raw_type!=RT_F64) {281 if (tmpi1->ic_code==IC__PP) {282 tmpi->ic_code=IC_DEREF_PP;283 tmpi->ic_flags|=tmpi1->ic_flags;284 OptSetNOP1(tmpi1);285 } else if (tmpi1->ic_code==IC__MM) {286 tmpi->ic_code=IC_DEREF_MM;287 tmpi->ic_flags|=tmpi1->ic_flags;288 OptSetNOP1(tmpi1);289 }290 }291 }292 break;293 case IC__PP:294 case IC__MM:295 case IC_PP_:296 case IC_MM_:297 if (cc->pass==2 && !tmpc->size)298 LexWarn(cc,"Dereference U0 ");299 break;300 case IC_POWER:301 tmpc=tmpi->ic_class=cmp.internal_types[RT_F64];302 if (tmpc1->raw_type!=RT_F64)303 tmpi1->ic_flags|=ICF_RES_TO_F64;304 if (tmpc2->raw_type!=RT_F64)305 tmpi2->ic_flags|=ICF_RES_TO_F64;306 tmpi_push->ic_class2=cmp.internal_types[RT_F64];307 break;308 start:309 case IC_MUL:310 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {311 if (i==FBO1_INT) {312 if (is_unsigned)313 tmpi->ic_data=tmpi1->ic_data(U64)*tmpi2->ic_data(U64);314 else315 tmpi->ic_data=tmpi1->ic_data(I64)*tmpi2->ic_data(I64);316 tmpi->ic_code=IC_IMM_I64;317 } else {318 tmpi->ic_data(F64)=tmpi1->ic_data(F64)*tmpi2->ic_data(F64);319 tmpi->ic_code=IC_IMM_F64;320 }321 } else {322 if (tmpi1->ic_code==IC_IMM_I64 && cc->pass==2) {323 switch (i=tmpi1->ic_data) {324 case 0:325 break;326 case 1:327 tmpi2->ic_flags|=tmpi->ic_flags|tmpi1->ic_flags;328 tmpi2->ic_class2=tmpi->ic_class2;329 tmpi_push=tmpi2;330 OptSetNOP1(tmpi1);331 OptSetNOP1(tmpi);332 break;333 default:334 if (Bsf(i)==Bsr(i)) {335 tmpi->ic_flags|=tmpi1->ic_flags;336 tmpi->t.arg1_class=tmpi->t.arg2_class;337 tmpi->ic_data=Bsf(i);338 tmpi->ic_code=IC_SHL_CONST;339 OptSetNOP1(tmpi1);340 }341 }342 } else if (tmpi2->ic_code==IC_IMM_I64) {343 switch (i=tmpi2->ic_data) {344 case 0:345 break;346 case 1:347 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;348 tmpi1->ic_class2=tmpi->ic_class2;349 tmpi_push=tmpi1;350 OptSetNOP1(tmpi2);351 OptSetNOP1(tmpi);352 break;353 default:354 if (Bsf(i)==Bsr(i)) {355 tmpi->ic_flags|=tmpi2->ic_flags;356 tmpi->ic_data=Bsf(i);357 tmpi->ic_code=IC_SHL_CONST;358 OptSetNOP1(tmpi2);359 } else if (tmpi1->ic_code==IC_MUL && cc->pass==2) {360 if (tmpi1->t.arg1_tree->ic_code==IC_IMM_I64) {361 tmpi1->ic_flags|=tmpi->ic_flags;362 tmpi1->t.arg1_tree->ic_data*=tmpi2->ic_data;363 tmpi1->ic_class2=tmpi->ic_class2;364 tmpi_push=tmpi1;365 OptSetNOP1(tmpi2);366 OptSetNOP1(tmpi);367 } else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_I64) {368 tmpi1->ic_flags|=tmpi->ic_flags;369 tmpi1->t.arg2_tree->ic_data*=tmpi2->ic_data;370 tmpi1->ic_class2=tmpi->ic_class2;371 tmpi_push=tmpi1;372 OptSetNOP1(tmpi2);373 OptSetNOP1(tmpi);374 }375 }376 }377 } else if (tmpi2->ic_code==IC_IMM_F64 && cc->pass==2) {378 if (tmpi2->ic_data(F64)==1.0) {379 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;380 tmpi1->ic_class2=tmpi->ic_class2;381 tmpi_push=tmpi1;382 OptSetNOP1(tmpi2);383 OptSetNOP1(tmpi);384 } else if (tmpi1->ic_code==IC_MUL) {385 if (tmpi1->t.arg1_tree->ic_code==IC_IMM_F64) {386 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;387 tmpi1->t.arg1_tree->ic_data(F64)*=tmpi2->ic_data(F64);388 tmpi1->ic_class2=tmpi->ic_class2;389 tmpi_push=tmpi1;390 OptSetNOP1(tmpi2);391 OptSetNOP1(tmpi);392 } else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_F64) {393 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;394 tmpi1->t.arg2_tree->ic_data(F64)*=tmpi2->ic_data(F64);395 tmpi1->ic_class2=tmpi->ic_class2;396 tmpi_push=tmpi1;397 OptSetNOP1(tmpi2);398 OptSetNOP1(tmpi);399 }400 }401 }402 }403 break;404 case IC_DIV:405 if ((tmpi2->ic_data || tmpi2->ic_code!=IC_IMM_I64 &&406 tmpi2->ic_code!=IC_IMM_F64) &&407 (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned))) {408 if (i==FBO1_INT) {409 if (is_unsigned)410 tmpi->ic_data=tmpi1->ic_data(U64)/tmpi2->ic_data(U64);411 else412 tmpi->ic_data=tmpi1->ic_data(I64)/tmpi2->ic_data(I64);413 tmpi->ic_code=IC_IMM_I64;414 } else {415 tmpi->ic_data(F64)=tmpi1->ic_data(F64)/416 tmpi2->ic_data(F64);417 tmpi->ic_code=IC_IMM_F64;418 }419 } else {420 if (tmpi2->ic_code==IC_IMM_I64 && (i=tmpi2->ic_data)) {421 if (i==1) {422 tmpi1->ic_flags|=tmpi2->ic_flags|tmpi->ic_flags;423 tmpi1->ic_class2=tmpi->ic_class2;424 tmpi_push=tmpi1;425 OptSetNOP1(tmpi2);426 OptSetNOP1(tmpi);427 } else if (Bsf(i)==Bsr(i)) {428 tmpi->ic_flags|=tmpi2->ic_flags;429 tmpi->ic_data=Bsf(i);430 tmpi->ic_code=IC_SHR_CONST;431 OptSetNOP1(tmpi2);432 }433 }434 }435 break;436 case IC_MOD:437 if ((tmpi2->ic_data || tmpi2->ic_code!=IC_IMM_I64 &&438 tmpi2->ic_code!=IC_IMM_F64) &&439 (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned))) {440 if (i==FBO1_INT) {441 if (is_unsigned)442 tmpi->ic_data=tmpi1->ic_data(U64)%tmpi2->ic_data(U64);443 else444 tmpi->ic_data=tmpi1->ic_data(I64)%tmpi2->ic_data(I64);445 tmpi->ic_code=IC_IMM_I64;446 } else {447 tmpi->ic_data(F64)=tmpi1->ic_data(F64)%448 tmpi2->ic_data(F64);449 tmpi->ic_code=IC_IMM_F64;450 }451 } else if (cc->pass==2 && tmpi2->ic_code==IC_IMM_I64 &&452 (i=tmpi2->ic_data) && Bsf(i)==Bsr(i) &&453 tmpi_push->ic_class->raw_type!=RT_F64 &&454 tmpi_push->ic_class->raw_type&RTF_UNSIGNED) {//do only unsigned455 tmpi2->ic_data=i-1;456 tmpi->ic_code=IC_AND;457 }458 break;459 case IC_AND:460 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {461 tmpi->ic_data=tmpi1->ic_data&tmpi2->ic_data;462 if (i==FBO1_INT)463 tmpi->ic_code=IC_IMM_I64;464 else465 tmpi->ic_code=IC_IMM_F64;466 }467 break;468 case IC_OR:469 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {470 tmpi->ic_data=tmpi1->ic_data|tmpi2->ic_data;471 if (i==FBO1_INT)472 tmpi->ic_code=IC_IMM_I64;473 else474 tmpi->ic_code=IC_IMM_F64;475 }476 break;477 case IC_XOR:478 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {479 tmpi->ic_data=tmpi1->ic_data^tmpi2->ic_data;480 if (i==FBO1_INT)481 tmpi->ic_code=IC_IMM_I64;482 else483 tmpi->ic_code=IC_IMM_F64;484 }485 break;486 case IC_ADD:487 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {488 if (i==FBO1_INT) {489 tmpi->ic_data=tmpi1->ic_data+tmpi2->ic_data;490 tmpi->ic_code=IC_IMM_I64;491 } else {492 tmpi->ic_data(F64)=tmpi1->ic_data(F64)+493 tmpi2->ic_data(F64);494 tmpi->ic_code=IC_IMM_F64;495 }496 } else {497 if (tmpi1->ic_code==IC_ABS_ADDR&&tmpi2->ic_code==IC_IMM_I64) {498 tmpi->ic_flags|=tmpi1->ic_flags|tmpi2->ic_flags;499 tmpi->ic_data=tmpi1->ic_data+tmpi2->ic_data;500 tmpi->ic_code=IC_ABS_ADDR;501 OptSetNOP1(tmpi1);502 OptSetNOP1(tmpi2);503 } else if (cc->pass==2) {504 if (tmpi1->ic_code==IC_IMM_I64) {505 if (!tmpi1->ic_data) {506 tmpi2->ic_flags|=tmpi1->ic_flags|tmpi->ic_flags;507 tmpi2->ic_class2=tmpi->ic_class2;508 tmpi_push=tmpi2;509 OptSetNOP1(tmpi1);510 OptSetNOP1(tmpi);511 } else if (tmpi2->ic_code==IC_ADD||512 tmpi2->ic_code==IC_SUB) {513 if (tmpi2->t.arg1_tree->ic_code==IC_IMM_I64) {514 tmpi2->ic_flags|=tmpi->ic_flags;515 tmpi2->t.arg1_tree->ic_data+=tmpi1->ic_data;516 tmpi2->ic_class2=tmpi->ic_class2;517 tmpi_push=tmpi2;518 OptSetNOP1(tmpi1);519 OptSetNOP1(tmpi);520 } else if (tmpi2->t.arg2_tree->ic_code==IC_IMM_I64) {521 tmpi2->ic_flags|=tmpi->ic_flags;522 if (tmpi2->ic_code==IC_ADD)523 tmpi2->t.arg2_tree->ic_data+=tmpi1->ic_data;524 else525 tmpi2->t.arg2_tree->ic_data-=tmpi1->ic_data;526 tmpi2->ic_class2=tmpi->ic_class2;527 tmpi_push=tmpi2;528 OptSetNOP1(tmpi1);529 OptSetNOP1(tmpi);530 }531 }532 } else if (tmpi2->ic_code==IC_IMM_I64) {533 if (!tmpi2->ic_data) {534 tmpi1->ic_flags|=tmpi2->ic_flags|tmpi->ic_flags;535 tmpi1->ic_class2=tmpi->ic_class2;536 tmpi_push=tmpi1;537 OptSetNOP1(tmpi2);538 OptSetNOP1(tmpi);539 } else if (tmpi1->ic_code==IC_ADD ||540 tmpi1->ic_code==IC_SUB) {541 if (tmpi1->t.arg1_tree->ic_code==IC_IMM_I64) {542 tmpi1->ic_flags|=tmpi->ic_flags;543 tmpi1->t.arg1_tree->ic_data+=tmpi2->ic_data;544 tmpi1->ic_class2=tmpi->ic_class2;545 tmpi_push=tmpi1;546 OptSetNOP1(tmpi2);547 OptSetNOP1(tmpi);548 } else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_I64) {549 tmpi1->ic_flags|=tmpi->ic_flags;550 if (tmpi1->ic_code==IC_ADD)551 tmpi1->t.arg2_tree->ic_data+=tmpi2->ic_data;552 else553 tmpi1->t.arg2_tree->ic_data-=tmpi2->ic_data;554 tmpi1->ic_class2=tmpi->ic_class2;555 tmpi_push=tmpi1;556 OptSetNOP1(tmpi2);557 OptSetNOP1(tmpi);558 }559 }560 } else if (tmpi1->ic_code==IC_IMM_F64) {561 if (!tmpi1->ic_data) {562 tmpi2->ic_flags|=tmpi1->ic_flags|tmpi->ic_flags;563 tmpi2->ic_class2=tmpi->ic_class2;564 tmpi_push=tmpi2;565 OptSetNOP1(tmpi1);566 OptSetNOP1(tmpi);567 } else if (tmpi2->ic_code==IC_ADD||568 tmpi2->ic_code==IC_SUB) {569 if (tmpi2->t.arg1_tree->ic_code==IC_IMM_F64) {570 tmpi2->ic_flags|=tmpi->ic_flags;571 tmpi2->t.arg1_tree->ic_data(F64)+=tmpi1->ic_data(F64);572 tmpi2->ic_class2=tmpi->ic_class2;573 tmpi_push=tmpi2;574 OptSetNOP1(tmpi1);575 OptSetNOP1(tmpi);576 } else if (tmpi2->t.arg2_tree->ic_code==IC_IMM_F64) {577 tmpi2->ic_flags|=tmpi->ic_flags;578 if (tmpi2->ic_code==IC_ADD)579 tmpi2->t.arg2_tree->ic_data(F64)+=tmpi1->ic_data(F64);580 else581 tmpi2->t.arg2_tree->ic_data(F64)-=tmpi1->ic_data(F64);582 tmpi2->ic_class2=tmpi->ic_class2;583 tmpi_push=tmpi2;584 OptSetNOP1(tmpi1);585 OptSetNOP1(tmpi);586 }587 }588 } else if (tmpi2->ic_code==IC_IMM_F64) {589 if (!tmpi2->ic_data) {590 tmpi1->ic_flags|=tmpi2->ic_flags|tmpi->ic_flags;591 tmpi1->ic_class2=tmpi->ic_class2;592 tmpi_push=tmpi1;593 OptSetNOP1(tmpi2);594 OptSetNOP1(tmpi);595 } else if (tmpi1->ic_code==IC_ADD ||596 tmpi1->ic_code==IC_SUB) {597 if (tmpi1->t.arg1_tree->ic_code==IC_IMM_F64) {598 tmpi1->ic_flags|=tmpi->ic_flags;599 tmpi1->t.arg1_tree->ic_data(F64)+=tmpi2->ic_data(F64);600 tmpi1->ic_class2=tmpi->ic_class2;601 tmpi_push=tmpi1;602 OptSetNOP1(tmpi2);603 OptSetNOP1(tmpi);604 } else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_F64) {605 tmpi1->ic_flags|=tmpi->ic_flags;606 if (tmpi1->ic_code==IC_ADD)607 tmpi1->t.arg2_tree->ic_data(F64)+=tmpi2->ic_data(F64);608 else609 tmpi1->t.arg2_tree->ic_data(F64)-=tmpi2->ic_data(F64);610 tmpi1->ic_class2=tmpi->ic_class2;611 tmpi_push=tmpi1;612 OptSetNOP1(tmpi2);613 OptSetNOP1(tmpi);614 }615 }616 }617 }618 }619 break;620 case IC_SUB:621 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {622 if (i==FBO1_INT) {623 tmpi->ic_data=tmpi1->ic_data-tmpi2->ic_data;624 tmpi->ic_code=IC_IMM_I64;625 } else {626 tmpi->ic_data(F64)=tmpi1->ic_data(F64)-627 tmpi2->ic_data(F64);628 tmpi->ic_code=IC_IMM_F64;629 }630 } else {631 if (cc->pass==2) {632 if (tmpi2->ic_code==IC_IMM_I64) {633 if (!tmpi2->ic_data) {634 tmpi1->ic_flags|=tmpi2->ic_flags|tmpi->ic_flags;635 tmpi1->ic_class2=tmpi->ic_class2;636 tmpi_push=tmpi1;637 OptSetNOP1(tmpi2);638 OptSetNOP1(tmpi);639 } else640 if (tmpi1->ic_code==IC_ADD ||641 tmpi1->ic_code==IC_SUB) {642 if (tmpi1->t.arg1_tree->ic_code==IC_IMM_I64) {643 tmpi1->ic_flags|=tmpi->ic_flags;644 tmpi1->t.arg1_tree->ic_data-=tmpi2->ic_data;645 tmpi1->ic_class2=tmpi->ic_class2;646 tmpi_push=tmpi1;647 OptSetNOP1(tmpi2);648 OptSetNOP1(tmpi);649 } else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_I64) {650 tmpi1->ic_flags|=tmpi->ic_flags;651 if (tmpi1->ic_code==IC_ADD)652 tmpi1->t.arg2_tree->ic_data-=tmpi2->ic_data;653 else654 tmpi1->t.arg2_tree->ic_data+=tmpi2->ic_data;655 tmpi1->ic_class2=tmpi->ic_class2;656 tmpi_push=tmpi1;657 OptSetNOP1(tmpi2);658 OptSetNOP1(tmpi);659 }660 }661 } else662 if (tmpi2->ic_code==IC_IMM_F64) {663 if (!tmpi2->ic_data) {664 tmpi1->ic_flags|=tmpi2->ic_flags|tmpi->ic_flags;665 tmpi1->ic_class2=tmpi->ic_class2;666 tmpi_push=tmpi1;667 OptSetNOP1(tmpi2);668 OptSetNOP1(tmpi);669 } else670 if (tmpi1->ic_code==IC_ADD || tmpi1->ic_code==IC_SUB) {671 if (tmpi1->t.arg1_tree->ic_code==IC_IMM_F64) {672 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;673 tmpi1->t.arg1_tree->ic_data(F64)-=tmpi2->ic_data(F64);674 tmpi1->ic_class2=tmpi->ic_class2;675 tmpi_push=tmpi1;676 OptSetNOP1(tmpi2);677 OptSetNOP1(tmpi);678 } else if (tmpi1->t.arg2_tree->ic_code==IC_IMM_F64) {679 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;680 if (tmpi1->ic_code==IC_ADD)681 tmpi1->t.arg2_tree->ic_data(F64)-=tmpi2->ic_data(F64);682 else683 tmpi1->t.arg2_tree->ic_data(F64)+=tmpi2->ic_data(F64);684 tmpi1->ic_class2=tmpi->ic_class2;685 tmpi_push=tmpi1;686 OptSetNOP1(tmpi2);687 OptSetNOP1(tmpi);688 }689 }690 }691 }692 }693 break;694 case IC_AND_AND:695 if (OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {696 tmpi->ic_data=tmpi1->ic_data&&tmpi2->ic_data;697 tmpi->ic_code=IC_IMM_I64;698 }699 tmpi->ic_class=cmp.internal_types[RT_I64];700 break;701 case IC_OR_OR:702 if (OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {703 tmpi->ic_data=tmpi1->ic_data||tmpi2->ic_data;704 tmpi->ic_code=IC_IMM_I64;705 }706 tmpi->ic_class=cmp.internal_types[RT_I64];707 break;708 case IC_XOR_XOR:709 if (OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {710 tmpi->ic_data=tmpi1->ic_data^^tmpi2->ic_data;711 tmpi->ic_code=IC_IMM_I64;712 }713 tmpi->ic_class=cmp.internal_types[RT_I64];714 break;715 end:716 if (!tmpi_push->ic_class->ptr_stars_cnt) {717 if (tmpi_push->ic_class->raw_type==RT_F64)718 tmpi_push->ic_class2=cmp.internal_types[RT_F64];719 else if (is_unsigned)720 tmpi_push->ic_class2=cmp.internal_types[RT_U64];721 else722 tmpi_push->ic_class2=cmp.internal_types[RT_I64];723 }724 break;725 start:726 case IC_EQU_EQU:727 if (OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {728 tmpi->ic_data=tmpi1->ic_data==tmpi2->ic_data;729 tmpi->ic_code=IC_IMM_I64;730 } else731 if (tmpi->ic_class->raw_type==RT_F64)732 tmpi->ic_flags|=ICF_USE_F64;733 break;734 case IC_NOT_EQU:735 if (OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {736 tmpi->ic_data=tmpi1->ic_data!=tmpi2->ic_data;737 tmpi->ic_code=IC_IMM_I64;738 } else739 if (tmpi->ic_class->raw_type==RT_F64)740 tmpi->ic_flags|=ICF_USE_F64;741 break;742 case IC_LESS:743 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {744 if (i==FBO1_INT) {745 if (is_unsigned)746 tmpi->ic_data=tmpi1->ic_data(U64)<tmpi2->ic_data(U64);747 else748 tmpi->ic_data=tmpi1->ic_data(I64)<tmpi2->ic_data(I64);749 } else750 tmpi->ic_data=tmpi1->ic_data(F64)<tmpi2->ic_data(F64);751 tmpi->ic_code=IC_IMM_I64;752 } else {753 if (is_unsigned)754 tmpi->ic_flags|=ICF_USE_UNSIGNED;755 if (tmpi->ic_class->raw_type==RT_F64)756 tmpi->ic_flags|=ICF_USE_F64;757 }758 break;759 case IC_GREATER_EQU:760 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {761 if (i==FBO1_INT) {762 if (is_unsigned)763 tmpi->ic_data=tmpi1->ic_data(U64)>=tmpi2->ic_data(U64);764 else765 tmpi->ic_data=tmpi1->ic_data(I64)>=tmpi2->ic_data(I64);766 } else767 tmpi->ic_data=tmpi1->ic_data(F64)>=tmpi2->ic_data(F64);768 tmpi->ic_code=IC_IMM_I64;769 } else {770 if (is_unsigned)771 tmpi->ic_flags|=ICF_USE_UNSIGNED;772 if (tmpi->ic_class->raw_type==RT_F64)773 tmpi->ic_flags|=ICF_USE_F64;774 }775 break;776 case IC_GREATER:777 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {778 if (i==FBO1_INT) {779 if (is_unsigned)780 tmpi->ic_data=tmpi1->ic_data(U64)>tmpi2->ic_data(U64);781 else782 tmpi->ic_data=tmpi1->ic_data(I64)>tmpi2->ic_data(I64);783 } else784 tmpi->ic_data=tmpi1->ic_data(F64)>tmpi2->ic_data(F64);785 tmpi->ic_code=IC_IMM_I64;786 } else {787 if (is_unsigned)788 tmpi->ic_flags|=ICF_USE_UNSIGNED;789 if (tmpi->ic_class->raw_type==RT_F64)790 tmpi->ic_flags|=ICF_USE_F64;791 }792 break;793 case IC_LESS_EQU:794 if (i=OptFixupBinaryOp1(tmpi,tmpi1,tmpi2,&is_unsigned)) {795 if (i==FBO1_INT) {796 if (is_unsigned)797 tmpi->ic_data=tmpi1->ic_data(U64)<=tmpi2->ic_data(U64);798 else799 tmpi->ic_data=tmpi1->ic_data(I64)<=tmpi2->ic_data(I64);800 } else801 tmpi->ic_data=tmpi1->ic_data(F64)<=tmpi2->ic_data(F64);802 tmpi->ic_code=IC_IMM_I64;803 } else {804 if (is_unsigned)805 tmpi->ic_flags|=ICF_USE_UNSIGNED;806 if (tmpi->ic_class->raw_type==RT_F64)807 tmpi->ic_flags|=ICF_USE_F64;808 }809 break;810 end:811 tmpi->ic_flags&=~ICF_RES_TO_INT;812 if (!tmpi_push->ic_class->ptr_stars_cnt) {813 if (tmpi_push->ic_class->raw_type==RT_F64)814 tmpi_push->ic_class2=cmp.internal_types[RT_F64];815 else if (is_unsigned)816 tmpi_push->ic_class2=cmp.internal_types[RT_U64];817 else818 tmpi_push->ic_class2=cmp.internal_types[RT_I64];819 }820 if (tmpi_push->ic_flags & ICF_PUSH_CMP)821 tmpi->ic_class=tmpi->ic_class2;822 else823 tmpi->ic_class=cmp.internal_types[RT_I64];824 break;825 start:826 if (cc->pass==2 && (!tmpc->size||!tmpc2->size))827 LexWarn(cc,"Assign U0 ");828 start:829 case IC_MUL_EQU:830 if (tmpi2->ic_code==IC_IMM_I64 && tmpc->raw_type!=RT_F64 &&831 tmpc2->raw_type!=RT_F64) {832 if (i=tmpi2->ic_data) {833 if (Bsf(i)==Bsr(i)) {834 tmpi2->ic_data=Bsf(i);835 tmpi->ic_code=IC_SHL_EQU;836 }837 }838 }839 break;840 case IC_DIV_EQU:841 if (tmpi2->ic_code==IC_IMM_I64 && tmpc->raw_type!=RT_F64 &&842 tmpc2->raw_type!=RT_F64 &&843 (i=tmpi2->ic_data) && Bsf(i)==Bsr(i)) {844 tmpi2->ic_data=Bsf(i);845 tmpi->ic_code=IC_SHR_EQU;846 }847 break;848 case IC_MOD_EQU:849 if (tmpi2->ic_code==IC_IMM_I64 && tmpc->raw_type!=RT_F64 &&850 tmpc2->raw_type!=RT_F64 &&851 (i=tmpi2->ic_data) && Bsf(i)==Bsr(i)) {852 tmpi2->ic_data=i-1;853 tmpi->ic_code=IC_AND_EQU;854 }855 break;856 case IC_ADD_EQU:857 case IC_SUB_EQU:858 break;859 end:860 if (tmpi2->ic_class->raw_type==RT_F64)861 tmpi->ic_flags=tmpi->ic_flags|ICF_USE_F64;862 if (tmpc->raw_type==RT_F64) {863 if (tmpc2->raw_type!=RT_F64)864 tmpi2->ic_flags|=ICF_RES_TO_F64;865 }866 break;867 case IC_ASSIGN:868 if (tmpc->raw_type==RT_F64) {869 if (tmpc2->raw_type!=RT_F64)870 tmpi2->ic_flags|=ICF_RES_TO_F64;871 } else {872 if (tmpc2->raw_type==RT_F64)873 tmpi2->ic_flags|=ICF_RES_TO_INT;874 }875 if (cc->pass==2 && tmpi1->ic_class->raw_type!=RT_F64) {876 if (tmpi1->ic_code==IC__PP) {877 tmpi->ic_code=IC_ASSIGN_PP;878 tmpi->ic_flags|=tmpi1->ic_flags;879 tmpi->t.class2=tmpi1->ic_class;880 OptSetNOP1(tmpi1);881 } else if (tmpi1->ic_code==IC__MM) {882 tmpi->ic_code=IC_ASSIGN_MM;883 tmpi->ic_flags|=tmpi1->ic_flags;884 tmpi->t.class2=tmpi1->ic_class;885 OptSetNOP1(tmpi1);886 }887 }888 break;889 case IC_SHL_EQU:890 case IC_SHR_EQU:891 case IC_AND_EQU:892 case IC_OR_EQU:893 case IC_XOR_EQU:894 if (tmpc2->raw_type==RT_F64)895 tmpi2->ic_flags|=ICF_RES_TO_INT;896 break;897 end:898 break;899 case IC_ENTER:900 case IC_LEAVE:901 tmpi->ic_data=-cc->htc.fun->size;902 break;903 case IC_ADD_RSP:904 if (tmpi1=OptLag(tmpi)) {905 if (tmpi1->ic_code==IC_ADD_RSP) {906 tmpi->ic_data+=tmpi1->ic_data;907 tmpi->ic_flags|=tmpi1->ic_flags;908 OptSetNOP1(tmpi1);909 }910 }911 case IC_ADD_RSP1:912 break;913 case IC_BSF:914 if (tmpi1->ic_code==IC_IMM_I64) {915 tmpi1->ic_data=Bsf(tmpi1->ic_data);916 tmpi_push=tmpi1;917 OptSetNOP1(OptLag(tmpi1)); //CALL_START918 tmpi2=OptLead1(tmpi);919 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;920 OptSetNOP1(tmpi2); //CALL_END921 OptSetNOP1(tmpi); //BSF922 }923 break;924 case IC_BSR:925 if (tmpi1->ic_code==IC_IMM_I64) {926 tmpi1->ic_data=Bsr(tmpi1->ic_data);927 tmpi_push=tmpi1;928 OptSetNOP1(OptLag(tmpi1)); //CALL_START929 tmpi2=OptLead1(tmpi);930 tmpi1->ic_flags|=tmpi->ic_flags|tmpi2->ic_flags;931 OptSetNOP1(tmpi2); //CALL_END932 OptSetNOP1(tmpi); //BSR933 }934 break;935 case IC_LBTS:936 case IC_LBTR:937 case IC_LBTC:938 tmpi->ic_flags|=ICF_LOCK;939 break;940 case IC_TO_I64:941 if (tmpi1->ic_code==IC_IMM_F64) {942 tmpi2=tmpi1->last;943 while (tmpi2->ic_code!=IC_CALL_START)944 tmpi2=tmpi2->last;945 OptSetNOP1(tmpi2);946 947 tmpi2=tmpi->next;948 while (tmpi2->ic_code!=IC_CALL_END)949 tmpi2=tmpi2->next;950 951 tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_INT|tmpi2->ic_flags;952 OptSetNOP1(tmpi2);953 954 tmpi->ic_code=IC_IMM_I64;955 tmpi->ic_data=ToI64(tmpi1->ic_data(F64));956 tmpi->ic_class=cmp.internal_types[RT_I64];957 tmpi->ic_class2=cmp.internal_types[RT_I64];958 OptSetNOP1(tmpi1);959 } else if (tmpi1->ic_code==IC_IMM_I64) {960 tmpi2=tmpi1->last;961 while (tmpi2->ic_code!=IC_CALL_START)962 tmpi2=tmpi2->last;963 OptSetNOP1(tmpi2);964 965 tmpi2=tmpi->next;966 while (tmpi2->ic_code!=IC_CALL_END)967 tmpi2=tmpi2->next;968 969 tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_F64|tmpi2->ic_flags;970 OptSetNOP1(tmpi2);971 972 tmpi->ic_code=IC_IMM_I64;973 tmpi->ic_data=tmpi1->ic_data;974 tmpi->ic_class=cmp.internal_types[RT_I64];975 tmpi->ic_class2=cmp.internal_types[RT_I64];976 OptSetNOP1(tmpi1);977 }978 if (tmpi1->ic_flags&ICF_RES_TO_F64) {979 i=0;980 tmpi2=tmpi1->last;981 while (TRUE) {982 if (tmpi2->ic_code==IC_CALL_START) {983 if (!i) break;984 i--;985 } else if (tmpi2->ic_code==IC_CALL_END)986 i++;987 tmpi2=tmpi2->last;988 }989 OptSetNOP1(tmpi2);990 991 tmpi2=tmpi1->next;992 while (tmpi2->ic_code!=IC_CALL_END)993 tmpi2=tmpi2->next;994 995 tmpi1->ic_flags=tmpi->ic_flags|tmpi1->ic_flags&996 ~(ICF_RES_TO_F64|ICF_PUSH_RES)|tmpi2->ic_flags;997 OptSetNOP1(tmpi2);998 999 tmpi1->ic_class=cmp.internal_types[RT_I64];1000 tmpi1->ic_class2=cmp.internal_types[RT_I64];1001 tmpi_push=tmpi1;1002 OptSetNOP1(tmpi);1003 }1004 break;1005 case IC_TO_F64:1006 if (tmpi1->ic_code==IC_IMM_I64) {1007 tmpi2=tmpi1->last;1008 while (tmpi2->ic_code!=IC_CALL_START)1009 tmpi2=tmpi2->last;1010 OptSetNOP1(tmpi2);1011 1012 tmpi2=tmpi->next;1013 while (tmpi2->ic_code!=IC_CALL_END)1014 tmpi2=tmpi2->next;1015 1016 tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_F64|tmpi2->ic_flags;1017 OptSetNOP1(tmpi2);1018 1019 tmpi->ic_code=IC_IMM_F64;1020 tmpi->ic_data(F64)=ToF64(tmpi1->ic_data);1021 tmpi->ic_class=cmp.internal_types[RT_F64];1022 tmpi->ic_class2=cmp.internal_types[RT_F64];1023 OptSetNOP1(tmpi1);1024 } else if (tmpi1->ic_code==IC_IMM_F64) {1025 tmpi2=tmpi1->last;1026 while (tmpi2->ic_code!=IC_CALL_START)1027 tmpi2=tmpi2->last;1028 OptSetNOP1(tmpi2);1029 1030 tmpi2=tmpi->next;1031 while (tmpi2->ic_code!=IC_CALL_END)1032 tmpi2=tmpi2->next;1033 1034 tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_INT|tmpi2->ic_flags;1035 OptSetNOP1(tmpi2);1036 1037 tmpi->ic_code=IC_IMM_F64;1038 tmpi->ic_data=tmpi1->ic_data;1039 tmpi->ic_class=cmp.internal_types[RT_F64];1040 tmpi->ic_class2=cmp.internal_types[RT_F64];1041 OptSetNOP1(tmpi1);1042 }1043 if (tmpi1->ic_flags&ICF_RES_TO_INT) {1044 i=0;1045 tmpi2=tmpi1->last;1046 while (TRUE) {1047 if (tmpi2->ic_code==IC_CALL_START) {1048 if (!i) break;1049 i--;1050 } else if (tmpi2->ic_code==IC_CALL_END)1051 i++;1052 tmpi2=tmpi2->last;1053 }1054 OptSetNOP1(tmpi2);1055 1056 tmpi2=tmpi1->next;1057 while (tmpi2->ic_code!=IC_CALL_END)1058 tmpi2=tmpi2->next;1059 1060 tmpi1->ic_flags=tmpi->ic_flags|tmpi1->ic_flags&1061 ~(ICF_RES_TO_INT|ICF_PUSH_RES)|tmpi2->ic_flags;1062 OptSetNOP1(tmpi2);1063 1064 tmpi1->ic_class=cmp.internal_types[RT_F64];1065 tmpi1->ic_class2=cmp.internal_types[RT_F64];1066 tmpi_push=tmpi1;1067 OptSetNOP1(tmpi);1068 }1069 break;1070 case IC_TO_BOOL:1071 if (tmpi1->ic_code==IC_IMM_I64 || tmpi1->ic_code==IC_IMM_F64) {1072 tmpi2=tmpi1->last;1073 while (tmpi2->ic_code!=IC_CALL_START)1074 tmpi2=tmpi2->last;1075 OptSetNOP1(tmpi2);1076 1077 tmpi2=tmpi->next;1078 while (tmpi2->ic_code!=IC_CALL_END)1079 tmpi2=tmpi2->next;1080 1081 tmpi->ic_flags|=tmpi1->ic_flags&~ICF_RES_TO_F64|tmpi2->ic_flags;1082 OptSetNOP1(tmpi2);1083 1084 tmpi->ic_code=IC_IMM_I64;1085 tmpi->ic_data=ToBool(tmpi1->ic_data);1086 tmpi->ic_class=cmp.internal_types[RT_I64];1087 tmpi->ic_class2=cmp.internal_types[RT_I64];1088 OptSetNOP1(tmpi1);1089 }1090 break;1091 case IC_BR_ZERO:1092 tmpi_push=OptBrZero(cc,tmpi);1093 break;1094 case IC_BR_NOT_ZERO:1095 tmpi_push=OptBrNotZero(cc,tmpi);1096 break;1097 case IC_NOP1:1098 if (tmpi->ic_flags&ICF_PUSH_RES) {1099 tmpi1=tmpi;1100 do tmpi1=tmpi1->last;1101 while (tmpi1->ic_code==IC_NOP1);1102 tmpi1->ic_flags|=ICF_PUSH_RES;1103 tmpi->ic_flags&=~ICF_PUSH_RES;1104 }1105 break;1106 case IC_NOP2:1107 ps->ptr+=tmpi->ic_data<<1;1108 break;1109 case IC_LABEL:1110 lb=OptLabelFwd(tmpi->ic_data);1111 lb1=tmpi->ic_data;1112 while (lb2=lb1->fwd) {1113 lb1->fwd=lb;1114 lb1=lb2;1115 }1116 if (tmpi1=OptLag(tmpi)) {1117 if (tmpi1->ic_code==IC_JMP) {1118 lb1=tmpi1->ic_data;1119 while (lb1->fwd)1120 lb1=lb1->fwd;1121 if (lb1==lb) {1122 tmpi->ic_flags|=tmpi1->ic_flags;1123 OptSetNOP1(tmpi1);1124 }1125 } else if (tmpi1->ic_code==IC_LABEL) {1126 lb1=tmpi1->ic_data;1127 if (!lb1->fwd)1128 lb1->fwd=lb;1129 if (tmpi1=OptLag(tmpi1)) {1130 if (tmpi1->ic_code==IC_JMP) {1131 lb1=tmpi1->ic_data;1132 while (lb1->fwd)1133 lb1=lb1->fwd;1134 if (lb1==lb) {1135 tmpi->ic_flags|=tmpi1->ic_flags;1136 OptSetNOP1(tmpi1);1137 }1138 }1139 }1140 }1141 }1142 break;1143 case IC_JMP:1144 if (tmpi1=OptLag(tmpi)) {1145 if (tmpi1->ic_code==IC_LABEL) {1146 lb=OptLabelFwd(tmpi->ic_data);1147 lb1=OptLabelFwd(tmpi1->ic_data);1148 if (lb!=lb1)1149 lb1->fwd=lb;1150 }1151 }1152 break;1153 case IC_STR_CONST:1154 case IC_RBP:1155 case IC_MOV_FS:1156 case IC_MOV_GS:1157 case IC_RIP:1158 case IC_SIZEOF:1159 case IC_SQR:1160 case IC_ABS:1161 case IC_SQRT:1162 case IC_SIN:1163 case IC_COS:1164 case IC_TAN:1165 case IC_ATAN:1166 case IC_BR_CARRY:1167 case IC_BR_NOT_CARRY:1168 case IC_BR_EQU_EQU ...IC_BR_LESS_EQU:1169 case IC_BR_EQU_EQU2...IC_BR_LESS_EQU2:1170 case IC_BR_OR_OR_NOT_ZERO:1171 case IC_BR_OR_OR_ZERO:1172 case IC_BR_AND_AND_NOT_ZERO:1173 case IC_BR_AND_AND_ZERO:1174 case IC_BR_AND_NOT_ZERO:1175 case IC_BR_AND_ZERO:1176 case IC_BR_MM_NOT_ZERO:1177 case IC_BR_MM_ZERO:1178 case IC_BR_BT:1179 case IC_BR_BTS:1180 case IC_BR_BTR:1181 case IC_BR_BTC:1182 case IC_BR_NOT_BT:1183 case IC_BR_NOT_BTS:1184 case IC_BR_NOT_BTR:1185 case IC_BR_NOT_BTC:1186 case IC_END:1187 case IC_ADDR:1188 case IC_RET:1189 case IC_END_EXP:1190 case IC_CALL_START:1191 case IC_CALL_END:1192 case IC_CALL_END2:1193 case IC_PUSH_REGS:1194 case IC_POP_REGS:1195 case IC_SUB_CALL:1196 case IC_CALL:1197 case IC_CALL_INDIRECT:1198 case IC_CALL_INDIRECT2:1199 case IC_CALL_EXTERN:1200 case IC_CALL_IMPORT: