hschumann2/TempleOS-Source-Code
0838
1 2I64 OptPass789A(CCmpCtrl *cc,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg)3{/*cc->pass==7 is first time4cc->pass==8 is second time5cc->pass==9 is third time6cc->pass==9 is fourth time and repeated until size stops shrinking7size is now known8cc->pass==10 is final pass, code is placed into buf.9*/10 CIntermediateCode *tmpi,*tmpi_next;11 I64 i,cnt,num_lines=cc->max_line+1-cc->min_line,rip=0,rip2;12 U8 *ptr,saved_arg1_arg2_r[3*sizeof(CICArg)];13 CCodeMisc *lb;14 CAOT *tmpaot;15 CAOTAbsAddr *tmpa;16 CAOTImportExport *tmpie;17 CAOTHeapGlbl *tmphg;18 CAOTHeapGlblRef *tmphgr;19 CDbgInfo *dbg_info;20 CAOTCtrl *aotc=cc->aotc;21 Bool short_jmp;22 CHashClass *tmpc;23 CHashFun *tmpf;24 CHashGlblVar *tmpg;25 CExternUsage *tmpeu;26 27 if (_dbg) {28 *_dbg=dbg_info=CAlloc(offset(CDbgInfo.body)+sizeof(U32)*(num_lines+1));29 dbg_info->min_line=cc->min_line;30 dbg_info->max_line=cc->max_line;31 if (cc->flags&CCF_AOT_COMPILE)32 dbg_info->body[0]=aotc->rip;33 else34 dbg_info->body[0]=buf;35 } else36 dbg_info=NULL;37 38 if (Bt(&cc->flags,CCf_PASS_TRACE_PRESENT) &&39 Bt(&cc->saved_pass_trace,cc->pass))40 "$BK,1$$LTRED$$IV,1$This code gets merged together and patched.\n"41 "$FG$$IV,0$$BK,0$";42 43 cc->last_float_op_ic=NULL;44 tmpi=&cc->coc.coc_head;45 tmpi->ic_last_start=-1;46 tmpi->ic_cnt=0;47 tmpi=tmpi->next;48 while (tmpi->ic_code) {49 tmpi_next=tmpi->next;50 if (tmpi->ic_flags&ICF_PASS_TRACE && Bt(&cc->saved_pass_trace,cc->pass))51 ICPut(cc,tmpi);52 rip2=rip;53 if (cc->flags&CCF_AOT_COMPILE)54 rip2+=aotc->rip;55 else56 rip2+=buf;57 cc->cur_ic_float_op_num=0;58 if (!(tmpi->ic_flags &ICF_CODE_FINAL)) {59 tmpi->ic_flags=tmpi->ic_flags&60 ~(ICF_PREV_DELETED|ICF_DONT_RESTORE)|ICF_CODE_FINAL;61 if (cc->pass==7)62 cc->dont_push_float=Btr(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0);63 MemCpy(saved_arg1_arg2_r,&tmpi->arg1,3*sizeof(CICArg));64 tmpi->ic_cnt=0;65 tmpi->ic_last_start=-1;66 if (tmpi->arg2.type.mode) {67 if (tmpi->ic_flags & ICF_ARG2_TO_F64) {68 ICFCvt(cc,tmpi,REG_RAX,tmpi->arg2.type,69 tmpi->arg2.reg,tmpi->arg2.disp,FALSE,CN_A2,rip2);70 tmpi->arg2.type=MDF_REG+RT_I64;71 tmpi->arg2.reg=REG_RAX;72 tmpi->arg2.disp=0;73 } else if (tmpi->ic_flags & ICF_ARG2_TO_INT) {74 ICFCvt(cc,tmpi,REG_RAX,75 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,TRUE,CN_A2,rip2);76 tmpi->arg2.type=MDF_REG+RT_I64;77 tmpi->arg2.reg=REG_RAX;78 tmpi->arg2.disp=0;79 }80 }81 if (tmpi->arg1.type.mode) {82 if (tmpi->ic_flags & ICF_ARG1_TO_F64) {83 ICFCvt(cc,tmpi,REG_RDX,tmpi->arg1.type,84 tmpi->arg1.reg,tmpi->arg1.disp,FALSE,CN_A1,rip2);85 tmpi->arg1.type=MDF_REG+RT_I64;86 tmpi->arg1.reg=REG_RDX;87 tmpi->arg1.disp=0;88 } else if (tmpi->ic_flags & ICF_ARG1_TO_INT) {89 ICFCvt(cc,tmpi,REG_RDX,90 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,TRUE,CN_A1,rip2);91 tmpi->arg1.type=MDF_REG+RT_I64;92 tmpi->arg1.reg=REG_RDX;93 tmpi->arg1.disp=0;94 }95 }96 97 switch [tmpi->ic_code] {98 start:99 start:100 case IC_ABS_ADDR:101 ICU16(tmpi,0xB848);102 ICU64(tmpi,tmpi->ic_data);103 if (buf && cc->flags&CCF_AOT_COMPILE &&104 !(cc->flags&(CCF_NO_ABSS|CCF_ASM_EXPRESSIONS))) {105 tmpa=CAlloc(sizeof(CAOTAbsAddr));106 tmpa->next=aotc->abss;107 tmpa->type=AAT_ADD_U64;108 aotc->abss=tmpa;109 tmpa->rip=rip2+tmpi->ic_cnt-8;110 }111 break;112 case IC_HEAP_GLBL:113 ICU16(tmpi,0xB848);114 ICU64(tmpi,0);115 tmphg=tmpi->ic_data;116 if (buf && cc->flags&CCF_AOT_COMPILE &&117//TODO:is this necessary--flags?118 !(cc->flags&(CCF_NO_ABSS|CCF_ASM_EXPRESSIONS))) {119 tmphgr=CAlloc(sizeof(CAOTHeapGlblRef));120 tmphgr->next=tmphg->references;121 tmphg->references=tmphgr;122 tmphgr->rip=rip2+tmpi->ic_cnt-8;123 }124 break;125 case IC_ADDR_IMPORT:126 ICU8(tmpi,0xB8);127 ICU32(tmpi,0);128 if (buf && !(cc->flags&CCF_NO_ABSS)) {129 tmpg=tmpi->ic_data;130 tmpie=CAlloc(sizeof(CAOTImportExport));131 tmpie->type=IET_IMM_U32;132 tmpie->rip=rip2+tmpi->ic_cnt-4;133 tmpie->next=tmpg->ie_lst;134 tmpg->ie_lst=tmpie;135 }136 ICU24(tmpi,0xC06348);137 break;138 case IC_RIP:139 ICU16(tmpi,0xB848);140 ICU64(tmpi,rip2+tmpi->ic_cnt-2);141 if (cc->flags&CCF_AOT_COMPILE && buf &&!(cc->flags&CCF_NO_ABSS)) {142 tmpa=CAlloc(sizeof(CAOTAbsAddr));143 tmpa->next=aotc->abss;144 tmpa->type=AAT_ADD_U64;145 aotc->abss=tmpa;146 tmpa->rip=rip2+tmpi->ic_cnt-8;147 }148 break;149 end:150 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,151 MDF_REG+RT_I64,REG_RAX,0,rip2);152 break;153 case IC_BR_CARRY:154 ICFlagBranch(tmpi,rip,0x72820F,buf);155 break;156 case IC_BR_NOT_CARRY:157 ICFlagBranch(tmpi,rip,0x73830F,buf);158 break;159 case IC_BR_ZERO:160 ICTestAndBranch(tmpi,rip,0x74840F,buf,rip2);161 break;162 case IC_BR_NOT_ZERO:163 ICTestAndBranch(tmpi,rip,0x75850F,buf,rip2);164 break;165 case IC_BR_MM_ZERO:166 ICPreIncDec(tmpi,SLASH_OP_DEC,rip2);167 ICFlagBranch(tmpi,rip,0x74840F,buf);168 break;169 case IC_BR_MM_NOT_ZERO:170 ICPreIncDec(tmpi,SLASH_OP_DEC,rip2);171 ICFlagBranch(tmpi,rip,0x75850F,buf);172 break;173 case IC_BR_EQU_EQU:174 ICCmpAndBranch(tmpi,FALSE,rip,0x74840F,0x74840F,175 0x74840F,0x74840F,buf,rip2);176 break;177 case IC_BR_EQU_EQU2:178 ICCmpAndBranch(tmpi,TRUE,rip,0x74840F,0x74840F,179 0x74840F,0x74840F,buf,rip2);180 break;181 case IC_BR_NOT_EQU:182 ICCmpAndBranch(tmpi,FALSE,rip,0x75850F,0x75850F,183 0x75850F,0x75850F,buf,rip2);184 break;185 case IC_BR_NOT_EQU2:186 ICCmpAndBranch(tmpi,TRUE,rip,0x75850F,0x75850F,187 0x75850F,0x75850F,buf,rip2);188 break;189 case IC_BR_LESS:190 if (tmpi->ic_flags&ICF_USE_F64)191 ICFCmpAndBranch(cc,tmpi, rip,0x72820F,0x77870F,buf,rip2);192 else193 ICCmpAndBranch(tmpi,FALSE,rip,0x72820F,0x7C8C0F,194 0x77870F,0x7F8F0F,buf,rip2);195 break;196 case IC_BR_LESS2:197 ICCmpAndBranch(tmpi,TRUE,rip,0x72820F,0x7C8C0F,198 0x77870F,0x7F8F0F,buf,rip2);199 break;200 case IC_BR_GREATER_EQU:201 if (tmpi->ic_flags&ICF_USE_F64)202 ICFCmpAndBranch(cc,tmpi, rip,0x73830F,0x76860F,buf,rip2);203 else204 ICCmpAndBranch(tmpi,FALSE,rip,0x73830F,0x7D8D0F,205 0x76860F,0x7E8E0F,buf,rip2);206 break;207 case IC_BR_GREATER_EQU2:208 ICCmpAndBranch(tmpi,TRUE,rip,0x73830F,0x7D8D0F,209 0x76860F,0x7E8E0F,buf,rip2);210 break;211 case IC_BR_GREATER:212 if (tmpi->ic_flags&ICF_USE_F64)213 ICFCmpAndBranch(cc,tmpi, rip,0x77870F,0x72820F,buf,rip2);214 else215 ICCmpAndBranch(tmpi,FALSE,rip,0x77870F,0x7F8F0F,216 0x72820F,0x7C8C0F,buf,rip2);217 break;218 case IC_BR_GREATER2:219 ICCmpAndBranch(tmpi,TRUE,rip,0x77870F,0x7F8F0F,220 0x72820F,0x7C8C0F,buf,rip2);221 break;222 case IC_BR_LESS_EQU:223 if (tmpi->ic_flags&ICF_USE_F64)224 ICFCmpAndBranch(cc,tmpi, rip,0x76860F,0x73830F,buf,rip2);225 else226 ICCmpAndBranch(tmpi,FALSE,rip,0x76860F,0x7E8E0F,227 0x73830F,0x7D8D0F,buf,rip2);228 break;229 case IC_BR_LESS_EQU2:230 ICCmpAndBranch(tmpi,TRUE,rip,0x76860F,0x7E8E0F,231 0x73830F,0x7D8D0F,buf,rip2);232 break;233 case IC_BR_BT:234 ICBrBitOps(tmpi,rip,0xA30F,0x20BA0F,0x72820F,buf,rip2);235 break;236 case IC_BR_BTS:237 ICBrBitOps(tmpi,rip,0xAB0F,0x28BA0F,0x72820F,buf,rip2);238 break;239 case IC_BR_BTR:240 ICBrBitOps(tmpi,rip,0xB30F,0x30BA0F,0x72820F,buf,rip2);241 break;242 case IC_BR_BTC:243 ICBrBitOps(tmpi,rip,0xBB0F,0x38BA0F,0x72820F,buf,rip2);244 break;245 case IC_BR_NOT_BT:246 ICBrBitOps(tmpi,rip,0xA30F,0x20BA0F,0x73830F,buf,rip2);247 break;248 case IC_BR_NOT_BTS:249 ICBrBitOps(tmpi,rip,0xAB0F,0x28BA0F,0x73830F,buf,rip2);250 break;251 case IC_BR_NOT_BTR:252 ICBrBitOps(tmpi,rip,0xB30F,0x30BA0F,0x73830F,buf,rip2);253 break;254 case IC_BR_NOT_BTC:255 ICBrBitOps(tmpi,rip,0xBB0F,0x38BA0F,0x73830F,buf,rip2);256 break;257 case IC_BR_AND_ZERO:258 ICAndBranch(tmpi,rip,0x74840F,buf,rip2);259 break;260 case IC_BR_AND_NOT_ZERO:261 ICAndBranch(tmpi,rip,0x75850F,buf,rip2);262 break;263 case IC_SUB_CALL:264 lb=OptLabelFwd(tmpi->ic_data);265 ICU8(tmpi,0xE8);266 ICU32(tmpi,lb->addr-(rip+5));267 break;268 case IC_JMP:269 lb=OptLabelFwd(tmpi->ic_data);270 short_jmp=ToBool(tmpi->ic_flags&ICF_SHORT_JMP);271 if (!buf && lb->addr!=INVALID_PTR &&272 I8_MIN+5<lb->addr-rip<I8_MAX-5)273 short_jmp=TRUE;274 if (short_jmp) {275 tmpi->ic_flags|=ICF_SHORT_JMP;276 i=lb->addr-(rip+2);277 if (buf || i)278 ICU16(tmpi,i<<8+0xEB);279 else280 tmpi->ic_code=IC_NOP1;281 } else {282 i=lb->addr-(rip+5);283 ICU8(tmpi,0xE9);284 ICU32(tmpi,i);285 }286 break;287 case IC_LABEL:288 lb=tmpi->ic_data;289 lb->addr=rip;290 if (lb->flags&CMF_POP_CMP) {291 ICAddRSP(tmpi,-8,FALSE);292 ICAddRSP(tmpi,8,FALSE);293 }294 if (lb->type==CMT_ASM_LABEL)295 lb->addr+=lb->rip;296 break;297 case IC_STR_CONST:298 case IC_GET_LABEL:299 lb=tmpi->ic_data;300 if (cc->flags&CCF_AOT_COMPILE)301 i=lb->addr+aotc->rip;302 else303 i=lb->addr+buf;304 ICLea(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,305 MDF_RIP_DISP32+RT_PTR,0,i,cc,buf,rip2);306 break;307 case IC_ASM:308 tmpaot=tmpi->ic_data;309 tmpi->ic_cnt+=tmpaot->aot_U8s;310 if (buf) {311 MemCpy(buf+rip,tmpaot->buf,tmpaot->aot_U8s);312 Free(tmpaot->buf);313 tmpaot->buf=buf;314 tmpaot->rip=rip;315 tmpaot->rip2=rip2;316 if (cc->flags&CCF_AOT_COMPILE)317 CmpFixUpAOTAsm(cc,tmpaot);318 else319 CmpFixUpJITAsm(cc,tmpaot);320 cnt=tmpi->ic_cnt;321 goto op789A_skip_copy;322 }323 break;324 case IC_CALL:325 i=tmpi->ic_data-(rip2+5);326 if (!(I32_MIN<=i<=I32_MAX) && !(cc->flags&CCF_AOT_COMPILE)) {327 ICU16(tmpi,0xBB48);328 ICU64(tmpi,tmpi->ic_data);329 ICU16(tmpi,0xD3FF);330 } else {331 ICU8(tmpi,0xE8);332 ICU32(tmpi,i);333 }334 break;335 case IC_CALL_EXTERN: //Only for static modules336 ICU8(tmpi,0xE8);337 ICU32(tmpi,0);338 if (buf) {339 tmpf=tmpi->ic_data;340 tmpeu=CAlloc(sizeof(CExternUsage));341 tmpeu->next=tmpf->ext_lst;342 tmpf->ext_lst=tmpeu;343 tmpeu->rip=rip2+1;344 }345 break;346 case IC_CALL_INDIRECT2:347 ICU16(tmpi,0xBB48);348 if (cc->flags&CCF_AOT_COMPILE) i=rip2+tmpi->ic_cnt;349 ICU64(tmpi,tmpi->ic_data);350 ICU16(tmpi,0x13FF);351 if (buf && cc->flags&CCF_AOT_COMPILE&& !(cc->flags&CCF_NO_ABSS)) {352 tmpa=CAlloc(sizeof(CAOTAbsAddr));353 tmpa->next=aotc->abss;354 tmpa->type=AAT_ADD_U64;355 aotc->abss=tmpa;356 tmpa->rip=i;357 }358 break;359 case IC_CALL_IMPORT:360 if (GetOption(OPTf_USE_IMM64)) {361 ICU16(tmpi,0xBB48);362 ICU64(tmpi,0);363 if (buf) {364 tmpf=tmpi->ic_data;365 tmpie=CAlloc(sizeof(CAOTImportExport));366 tmpie->type=IET_IMM_I64;367 tmpie->rip=rip2+tmpi->ic_cnt-8;368 tmpie->next=tmpf->ie_lst;369 tmpf->ie_lst=tmpie;370 }371 ICU16(tmpi,0xD3FF);372 } else {373 ICU8(tmpi,0xE8);374 ICU32(tmpi,0);375 if (buf) {376 tmpf=tmpi->ic_data;377 tmpie=CAlloc(sizeof(CAOTImportExport));378 tmpie->type=IET_REL_I32;379 tmpie->rip=rip2+tmpi->ic_cnt-4;380 tmpie->next=tmpf->ie_lst;381 tmpf->ie_lst=tmpie;382 }383 }384 break;385 end:386 tmpi->ic_flags&=~ICF_CODE_FINAL;387 break;388 case IC_LEAVE:389 if (cc->htc.fun) {390 if (Bt(&cc->htc.fun->flags,Ff_INTERRUPT))391 ICPopRegs(tmpi,REGG_CLOBBERED|cc->htc.fun->used_reg_mask&392 (REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS|REGG_STK_TMP));393 else394 ICPopRegs(tmpi,cc->htc.fun->used_reg_mask&395 (REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS));396 }397 if (tmpi->ic_data<=I16_MAX) {398 if (tmpi->ic_data)399 ICU8(tmpi,0xC9); //LEAVE400 else401 ICU8(tmpi,0x5D); //POP RBP402 } else {403 ICAddRSP(tmpi,tmpi->ic_data);404 ICU8(tmpi,0x5D); //POP RBP405 }406 if (cc->htc.fun && Bt(&cc->htc.fun->flags,Ff_INTERRUPT)) {407 if (Bt(&cc->htc.fun->flags,Ff_HASERRCODE))408 ICAddRSP(tmpi,8);409 ICU16(tmpi,0xCF48);410 } else if (cc->htc.fun && cc->htc.fun->arg_cnt &&411 (Bt(&cc->htc.fun->flags,Ff_RET1) ||412 Bt(&cc->htc.fun->flags,Ff_ARGPOP)) &&413 !Bt(&cc->htc.fun->flags,Ff_NOARGPOP)) {414 ICU8(tmpi,0xC2);415 ICU16(tmpi,cc->htc.fun->arg_cnt<<3);416 } else417 ICU8(tmpi,0xC3);418 break;419 case IC_RET:420 ICU8(tmpi,0xC3);421 break;422 case IC_FS:423 ICZero(tmpi,REG_RAX);424 ICU32(tmpi,0x8B4864);425 break;426 case IC_GS:427 ICZero(tmpi,REG_RAX);428 ICU32(tmpi,0x8B4865);429 break;430 case IC_MOV_FS:431 ICZero(tmpi,REG_RAX);432 ICU8(tmpi,0x64);433//It's ugly to use ic_class here434 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,435 MDF_DISP+CmpRawType(tmpi->ic_class),REG_RAX,tmpi->ic_data,436 rip2);437 break;438 case IC_MOV_GS:439 ICZero(tmpi,REG_RAX);440 ICU8(tmpi,0x65);441//It's ugly to use ic_class here442 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,443 MDF_DISP+CmpRawType(tmpi->ic_class),REG_RAX,tmpi->ic_data,444 rip2);445 break;446 case IC_HOLYC_TYPECAST:447 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,448 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);449 break;450 case IC_COM:451 ICUnaries(tmpi,SLASH_OP_NOT,rip2);452 break;453 case IC_NOT:454 ICNot(tmpi,rip2);455 break;456 case IC_UNARY_MINUS:457 if (tmpi->res.type.raw_type==RT_F64)458 ICFUnaryMinus(cc,tmpi,buf,rip2);459 else460 ICUnaries(tmpi,SLASH_OP_NEG,rip2);461 break;462 case IC_ADDR:463 case IC_MOV:464 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,465 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);466 break;467 case IC_DEREF:468 ICDeref(tmpi,rip2);469 break;470 case IC_DEREF_PP:471 ICDerefPostIncDec(tmpi,SLASH_OP_INC,rip2);472 break;473 case IC_DEREF_MM:474 ICDerefPostIncDec(tmpi,SLASH_OP_DEC,rip2);475 break;476 case IC__PP:477 if (tmpi->ic_flags&ICF_USE_INT)478 ICPostIncDec(tmpi,SLASH_OP_INC,rip2);479 else480 ICFPostIncDec(cc,tmpi,CMP_TEMPLATE_INC,rip2);481 break;482 case IC__MM:483 if (tmpi->ic_flags&ICF_USE_INT)484 ICPostIncDec(tmpi,SLASH_OP_DEC,rip2);485 else486 ICFPostIncDec(cc,tmpi,CMP_TEMPLATE_DEC,rip2);487 break;488 case IC_PP_:489 if (tmpi->ic_flags&ICF_USE_INT)490 ICPreIncDec(tmpi,SLASH_OP_INC,rip2);491 else492 ICFPreIncDec(cc,tmpi,CMP_TEMPLATE_INC,rip2);493 break;494 case IC_MM_:495 if (tmpi->ic_flags&ICF_USE_INT)496 ICPreIncDec(tmpi,SLASH_OP_DEC,rip2);497 else498 ICFPreIncDec(cc,tmpi,CMP_TEMPLATE_DEC,rip2);499 break;500 case IC_LEA:501 ICLea(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,502 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,cc,buf,rip2);503 break;504 case IC_POWER:505 ICFPow(cc,tmpi,buf,rip2);506 break;507 case IC_SHL:508 ICShift(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,509 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,510 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,511 0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,rip2);512 break;513 case IC_SHR:514 ICShift(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,515 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,516 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,517 0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,rip2);518 break;519 case IC_MUL:520 if (tmpi->ic_flags&ICF_USE_INT)521 ICMul(tmpi,rip2);522 else523 ICFMul(cc,tmpi,buf,rip2);524 break;525 case IC_DIV:526 if (tmpi->ic_flags&ICF_USE_INT)527 ICDiv(tmpi,rip2);528 else529 ICFDiv(cc,tmpi,buf,rip2);530 break;531 case IC_MOD:532 if (tmpi->ic_flags&ICF_USE_INT)533 ICMod(tmpi,rip2);534 else535 ICFMod(cc,tmpi,rip2);536 break;537 case IC_AND:538 ICAddEct(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,539 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,540 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x23,rip2);541 break;542 case IC_OR:543 ICAddEct(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,544 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,545 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x0B,rip2);546 break;547 case IC_XOR:548 ICAddEct(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,549 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,550 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x33,rip2);551 break;552 case IC_ADD:553 if (tmpi->ic_flags&ICF_USE_INT)554 ICAddEct(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,555 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,556 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,0x03,rip2);557 else558 ICFAdd(cc,tmpi,buf,rip2);559 break;560 case IC_SUB:561 if (tmpi->ic_flags&ICF_USE_INT)562 ICSub(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,563 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,564 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);565 else566 ICFSub(cc,tmpi,buf,rip2);567 break;568 case IC_EQU_EQU:569 ICCmp(tmpi,0x75,0x75,rip2);570 break;571 case IC_NOT_EQU:572 ICCmp(tmpi,0x74,0x74,rip2);573 break;574 case IC_LESS:575 if (tmpi->ic_flags&ICF_USE_INT)576 ICCmp(tmpi,0x73,0x7D,rip2);577 else578 ICFCmp(cc,tmpi,CMP_TEMPLATE_LESS,rip2);579 break;580 case IC_GREATER_EQU:581 if (tmpi->ic_flags&ICF_USE_INT)582 ICCmp(tmpi,0x72,0x7C,rip2);583 else584 ICFCmp(cc,tmpi,CMP_TEMPLATE_GREATER_EQU,rip2);585 break;586 case IC_GREATER:587 if (tmpi->ic_flags&ICF_USE_INT)588 ICCmp(tmpi,0x76,0x7E,rip2);589 else590 ICFCmp(cc,tmpi,CMP_TEMPLATE_GREATER,rip2);591 break;592 case IC_LESS_EQU:593 if (tmpi->ic_flags&ICF_USE_INT)594 ICCmp(tmpi,0x77,0x7F,rip2);595 else596 ICFCmp(cc,tmpi,CMP_TEMPLATE_LESS_EQU,rip2);597 break;598 case IC_AND_AND:599 ICAndAnd(tmpi,rip2);600 break;601 case IC_OR_OR:602 ICOrOr(tmpi,rip2);603 break;604 case IC_XOR_XOR:605 ICXorXor(tmpi,rip2);606 break;607 case IC_ASSIGN:608 ICAssign(tmpi,rip2);609 break;610 case IC_ASSIGN_PP:611 ICAssignPostIncDec(tmpi,SLASH_OP_INC,rip2);612 break;613 case IC_ASSIGN_MM:614 ICAssignPostIncDec(tmpi,SLASH_OP_DEC,rip2);615 break;616 case IC_SHL_EQU:617 ICShiftEqu(tmpi,tmpi->arg1_type_pointed_to,618 tmpi->res.type,tmpi->res.reg,tmpi->res.disp,619 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,620 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,621 0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,rip2);622 break;623 case IC_SHR_EQU:624 ICShiftEqu(tmpi,tmpi->arg1_type_pointed_to,625 tmpi->res.type,tmpi->res.reg,tmpi->res.disp,626 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,627 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,628 0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,rip2);629 break;630 case IC_MUL_EQU:631 if (tmpi->ic_flags&ICF_USE_INT)632 ICMulEqu(tmpi,rip2);633 else634 ICFOpEqu(cc,tmpi,SLASH_OP_FMUL,buf,rip2);635 break;636 case IC_DIV_EQU:637 if (tmpi->ic_flags&ICF_USE_INT)638 ICDivEqu(tmpi,FALSE,rip2);639 else640 ICFOpEqu(cc,tmpi,SLASH_OP_FDIV,buf,rip2);641 break;642 case IC_MOD_EQU:643 if (tmpi->ic_flags&ICF_USE_INT)644 ICDivEqu(tmpi,TRUE,rip2);645 else646 ICFModEqu(cc,tmpi,rip2);647 break;648 case IC_AND_EQU:649 ICAndEqu(tmpi,rip2);650 break;651 case IC_OR_EQU:652 ICOrEqu(tmpi,rip2);653 break;654 case IC_XOR_EQU:655 ICXorEqu(tmpi,rip2);656 break;657 case IC_ADD_EQU:658 if (tmpi->ic_flags&ICF_USE_INT)659 ICAddSubEctEqu(tmpi,tmpi->arg1_type_pointed_to,660 tmpi->res.type,tmpi->res.reg,tmpi->res.disp,661 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,662 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,663 0x010000000003,rip2);664 else665 ICFOpEqu(cc,tmpi,SLASH_OP_FADD,buf,rip2);666 break;667 case IC_SUB_EQU:668 if (tmpi->ic_flags&ICF_USE_INT)669 ICAddSubEctEqu(tmpi,tmpi->arg1_type_pointed_to,670 tmpi->res.type,tmpi->res.reg,tmpi->res.disp,671 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,672 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,673 0x29000000052B,rip2);674 else675 ICFOpEqu(cc,tmpi,SLASH_OP_FSUB,buf,rip2);676 break;677 case IC_SHL_CONST:678 ICShift(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,679 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,680 MDF_IMM+RT_I64,0,tmpi->ic_data,681 0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,rip2);682 break;683 case IC_SHR_CONST:684 ICShift(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,685 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,686 MDF_IMM+RT_I64,0,tmpi->ic_data,687 0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,rip2);688 break;689 case IC_ADD_CONST:690 ICAddSubEctImm(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,691 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,tmpi->ic_data,692 0x0003,rip2);693 break;694 case IC_SUB_CONST:695 ICAddSubEctImm(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,696 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,tmpi->ic_data,697 0x052B,rip2);698 break;699 case IC_ENTER:700 ICU32(tmpi,0xEC8B4855);701 if (tmpi->ic_data)702 ICAddRSP(tmpi,-tmpi->ic_data,FALSE);703 if (cc->htc.fun) {704 if (Bt(&cc->htc.fun->flags,Ff_INTERRUPT))705 ICPushRegs(tmpi,REGG_CLOBBERED|cc->htc.fun->used_reg_mask&706 (REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS|REGG_STK_TMP));707 else {708 if (sys_var_init_flag && i)709 ICLocalVarInit(tmpi);710 ICPushRegs(tmpi,cc->htc.fun->used_reg_mask711 &(REGG_LOCAL_VARS|REGG_LOCAL_NON_PTR_VARS));712 }713 for (i=0;i<REG_REGS_NUM;i++)714 if (reg_offsets[i]>0 && reg_offsets[i].offset!=I64_MAX) {715 tmpc=OptClassFwd(reg_offsets[i].m->member_class);716 ICMov(tmpi,MDF_REG+RT_I64,i,0,MDF_DISP+tmpc->raw_type,717 REG_RBP,reg_offsets[i].offset,rip2);718 }719 }720 break;721 case IC_ADD_RSP:722 ICAddRSP(tmpi,tmpi->ic_data);723 break;724 case IC_CALL_INDIRECT:725 if (I8_MIN<=tmpi->ic_data<=I8_MAX) {726 ICU24(tmpi,0x2454FF); //CALL disp[RSP]727 ICU8(tmpi,tmpi->ic_data);728 } else {729 ICU24(tmpi,0x2494FF); //CALL disp[RSP]730 ICU32(tmpi,tmpi->ic_data);731 }732 break;733 case IC_PUSH:734 ICPush(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);735 break;736 case IC_POP:737 ICU8(tmpi,0x58);738 break;739 case IC_INVLPG:740 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,741 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);742 ICU24(tmpi,0x38010F);743 break;744 case IC_CLFLUSH:745 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,746 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);747 ICU24(tmpi,0x38AE0F);748 break;749 case IC_GET_RFLAGS:750 ICU8(tmpi,0x9C);751 ICPop(tmpi,MDF_REG+RT_I64,REG_RAX,0,rip2);752 break;753 case IC_CARRY:754 ICU24(tmpi,0xC0920F); //SETC AL755 ICU24(tmpi,0x01E083); //AND EAX,1756 break;757 case IC_RDTSC:758 ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_RDTSC,TRUE,FALSE,FALSE,CN_INST);759 break;760 case IC_SET_RFLAGS:761 ICPush(tmpi,tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);762 ICU8(tmpi,0x9D);763 break;764 case IC_GET_RBP:765 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,766 MDF_REG+RT_I64,REG_RBP,0,rip2);767 break;768 case IC_SET_RBP:769 ICMov(tmpi,MDF_REG+RT_I64,REG_RBP,0,770 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);771 break;772 case IC_GET_RSP:773 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,774 MDF_REG+RT_I64,REG_RSP,0,rip2);775 break;776 case IC_SET_RSP:777 ICMov(tmpi,MDF_REG+RT_I64,REG_RSP,0,778 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);779 break;780 case IC_RETURN_VAL:781 case IC_SET_RAX:782 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,783 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);784 break;785 case IC_RETURN_VAL2:786 case IC_GET_RAX:787 break;788 case IC_BT:789 ICBitOps(tmpi,&tmpi->arg1,&tmpi->arg2,tmpi->next,790 0xA30F,0x20BA0F,rip2);791 break;792 case IC_BTS:793 case IC_LBTS:794 ICBitOps(tmpi,&tmpi->arg1,&tmpi->arg2,tmpi->next,795 0xAB0F,0x28BA0F,rip2);796 break;797 case IC_BTR:798 case IC_LBTR:799 ICBitOps(tmpi,&tmpi->arg1,&tmpi->arg2,tmpi->next,800 0xB30F,0x30BA0F,rip2);801 break;802 case IC_BTC:803 case IC_LBTC:804 ICBitOps(tmpi,&tmpi->arg1,&tmpi->arg2,tmpi->next,805 0xBB0F,0x38BA0F,rip2);806 break;807 case IC_BSF:808 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,809 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);810 ICU32(tmpi,0xC0BC0F48);811 ICU16(tmpi,0x0375);812 ICU24(tmpi,0xD0F748);813 break;814 case IC_BSR:815 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,816 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);817 ICU32(tmpi,0xC0BD0F48);818 ICU16(tmpi,0x0375);819 ICU24(tmpi,0xD0F748);820 break;821 case IC_SIGN_I64:822 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,823 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);824 ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_SIGN_I64,825 TRUE,FALSE,FALSE,CN_INST);826 break;827 case IC_TOUPPER:828 ICToUpper(tmpi,rip2);829 break;830 case IC_TO_I64:831 ICToI64(cc,tmpi,rip2);832 break;833 case IC_TO_F64:834 ICToF64(cc,tmpi,rip2);835 break;836 case IC_TO_BOOL:837 ICToBool(cc,tmpi,rip2);838 break;839 case IC_SQR:840 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_SQR,rip2);841 break;842 case IC_ABS:843 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_ABS,rip2);844 break;845 case IC_SQRT:846 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_SQRT,rip2);847 break;848 case IC_SIN:849 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_SIN,rip2);850 break;851 case IC_COS:852 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_COS,rip2);853 break;854 case IC_TAN:855 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_TAN,rip2);856 break;857 case IC_ATAN:858 ICFTemplateFun(cc,tmpi,CMP_TEMPLATE_ATAN,rip2);859 break;860 case IC_ABS_I64:861 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,862 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);863 ICU24(tmpi,0xC08548);864 ICU16(tmpi,0x0379);865 ICU24(tmpi,0xD8F748);866 break;867 case IC_MIN_I64:868 ICMinMax(tmpi,0x4F,rip2);869 break;870 case IC_MAX_I64:871 ICMinMax(tmpi,0x4C,rip2);872 break;873 case IC_MIN_U64:874 ICMinMax(tmpi,0x47,rip2);875 break;876 case IC_MAX_U64:877 ICMinMax(tmpi,0x42,rip2);878 break;879 case IC_MOD_U64:880 ICModU64(tmpi,rip2);881 break;882 case IC_SQR_I64:883 ICSqr(tmpi,SLASH_OP_IMUL,rip2);884 break;885 case IC_SQR_U64:886 ICSqr(tmpi,SLASH_OP_MUL,rip2);887 break;888 case IC_SWAP_U8:889 case IC_SWAP_U16:890 case IC_SWAP_U32:891 case IC_SWAP_I64:892 ICSwap(tmpi,rip2);893 break;894 case IC_QUE_INIT:895 ICQueInit(tmpi,rip2);896 break;897 case IC_QUE_INS:898 ICQueIns(tmpi,rip2);899 break;900 case IC_QUE_INS_REV:901 ICQueInsRev(tmpi,rip2);902 break;903 case IC_QUE_REM:904 ICQueRem(tmpi,rip2);905 break;906 case IC_STRLEN:907 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,908 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);909 ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_INST);910 break;911 case IC_IN_U32:912 if (tmpi->arg1.type&MDF_IMM) {913 ICU16(tmpi,0xC033);914 if (tmpi->arg1.disp<=U8_MAX)915 ICU16(tmpi,0xE5+tmpi->arg1.disp<<8);916 else {917 ICU32(tmpi,0xBA00+OC_OP_SIZE_PREFIX+tmpi->arg1.disp<<16);918 ICU8(tmpi,0xED);919 }920 } else {921 ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,922 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);923 ICU16(tmpi,0xC033);924 ICU8(tmpi,0xED);925 }926 break;927 case IC_IN_U16:928 if (tmpi->arg1.type&MDF_IMM) {929 ICU16(tmpi,0xC033);930 if (tmpi->arg1.disp<=U8_MAX)931 ICU24(tmpi,0xE500+OC_OP_SIZE_PREFIX+tmpi->arg1.disp<<16);932 else {933 ICU32(tmpi,0xBA00+OC_OP_SIZE_PREFIX+tmpi->arg1.disp<<16);934 ICU16(tmpi,0xED00+OC_OP_SIZE_PREFIX);935 }936 } else {937 ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,938 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);939 ICU16(tmpi,0xC033);940 ICU16(tmpi,0xED00+OC_OP_SIZE_PREFIX);941 }942 break;943 case IC_IN_U8:944 if (tmpi->arg1.type&MDF_IMM) {945 ICU16(tmpi,0xC033);946 if (tmpi->arg1.disp<=U8_MAX)947 ICU16(tmpi,0xE4+tmpi->arg1.disp<<8);948 else {949 ICU32(tmpi,0xBA00+OC_OP_SIZE_PREFIX+tmpi->arg1.disp<<16);950 ICU8(tmpi,0xEC);951 }952 } else {953 ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,954 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);955 ICU16(tmpi,0xC033);956 ICU8(tmpi,0xEC);957 }958 break;959 case IC_OUT_U32:960 if (tmpi->arg2.type&MDF_IMM) {961 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,962 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);963 if (tmpi->arg2.disp<=U8_MAX)964 ICU16(tmpi,0xE7+tmpi->arg2.disp<<8);965 else {966 ICU32(tmpi,0xBA00+OC_OP_SIZE_PREFIX+tmpi->arg2.disp<<16);967 ICU8(tmpi,0xEF);968 }969 } else {970 ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,971 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);972 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,973 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);974 ICU8(tmpi,0xEF);975 }976 break;977 case IC_OUT_U16:978 if (tmpi->arg2.type&MDF_IMM) {979 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,980 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);981 if (tmpi->arg2.disp<=U8_MAX)982 ICU24(tmpi,0xE700+OC_OP_SIZE_PREFIX+tmpi->arg2.disp<<16);983 else {984 ICU32(tmpi,0xBA00+OC_OP_SIZE_PREFIX+tmpi->arg2.disp<<16);985 ICU16(tmpi,0xEF00+OC_OP_SIZE_PREFIX);986 }987 } else {988 ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,989 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);990 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,991 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);992 ICU16(tmpi,0xEF00+OC_OP_SIZE_PREFIX);993 }994 break;995 case IC_OUT_U8:996 if (tmpi->arg2.type&MDF_IMM) {997 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,998 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);999 if (tmpi->arg2.disp<=U8_MAX)1000 ICU16(tmpi,0xE6+tmpi->arg2.disp<<8);1001 else {1002 ICU32(tmpi,0xBA00+OC_OP_SIZE_PREFIX+tmpi->arg2.disp<<16);1003 ICU8(tmpi,0xEE);1004 }1005 } else {1006 ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,1007 tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip2);1008 ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,1009 tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip2);1010 ICU8(tmpi,0xEE);1011 }1012 break;1013 case IC_NOBOUND_SWITCH:1014 ICSwitch(tmpi,rip,TRUE,cc,buf,rip2);1015 break;1016 case IC_SWITCH:1017 ICSwitch(tmpi,rip,FALSE,cc,buf,rip2);1018 break;1019 case IC_NOP1:1020 case IC_NOP2:1021 OptFree(tmpi);1022 goto op789A_next;1023 case IC_CALL_START:1024 case IC_PUSH_REGS:1025 ICPushRegs(tmpi,tmpi->ic_data);1026 break;1027 case IC_CALL_END:1028 ICPopRegs(tmpi,tmpi->ic_data);1029 if (tmpi->res.type.mode)1030 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,1031 MDF_REG+RT_I64,REG_RAX,0,rip2);1032 break;1033 case IC_POP_REGS:1034 ICPopRegs(tmpi,tmpi->ic_data);1035 break;1036 case IC_PUSH_CMP:1037 case IC_CALL_END2:1038 case IC_END:1039 case IC_ADD_RSP1:1040 break;1041 default:1042 "Pass:%d Missing IC hndlr\n",cc->pass;1043 ICPut(cc,tmpi);1044 LexExcept(cc,"Compiler Optimization Error at ");1045 }1046 if (tmpi->res.type.mode) {1047 if (tmpi->ic_flags & ICF_RES_TO_F64) {1048 if (tmpi->ic_code==IC_PUSH_CMP) {1049 ICU24(tmpi,0x242CDF); //FILD U64 [RSP]1050 ICU24(tmpi,0x241CDD); //FSTP U64 [RSP]1051 } else {1052 ICFCvt(cc,tmpi,REG_RAX,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,1053 FALSE,CN_RES,rip2);1054 if (!Bt(&tmpi->ic_flags,ICf_DONT_POP_FLOAT0+1055 cc->cur_ic_float_op_num-1))1056 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,1057 MDF_REG+RT_I64,REG_RAX,0,rip2);1058 }1059 } else if (tmpi->ic_flags & ICF_RES_TO_INT) {1060 ICFCvt(cc,tmpi,REG_RAX,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,1061 TRUE,CN_RES,rip2);1062 ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,1063 MDF_REG+RT_I64,REG_RAX,0,rip2);1064 }1065 }1066 }1067 cnt=tmpi->ic_cnt;1068 if (tmpi->ic_flags&ICF_DEL_PREV_INS) {1069 if (cc->pass>8)1070 cnt=tmpi->ic_last_start;1071 tmpi->ic_flags&=~ICF_DEL_PREV_INS;1072 }1073 if (cnt && buf)1074 MemCpy(buf+rip,tmpi->ic_body,cnt);1075op789A_skip_copy:1076 if (dbg_info && cc->min_line<=tmpi->ic_line<=cc->max_line) {1077 i=tmpi->ic_line-cc->min_line;1078 if (!dbg_info->body[i])1079 dbg_info->body[i]=rip2;1080 }1081 if (tmpi->ic_flags&ICF_PASS_TRACE &&1082 Bt(&cc->saved_pass_trace,cc->pass) && cnt) {1083 "$RED$";1084 if (buf)1085 Un(buf+rip,cnt,64);1086 else1087 Un(tmpi->ic_body,cnt,64);1088 "$FG$";1089 }1090 if (!(tmpi->ic_flags&(ICF_CODE_FINAL|ICF_DONT_RESTORE)))1091 MemCpy(&tmpi->arg1,saved_arg1_arg2_r,3*sizeof(CICArg));1092 rip+=cnt;1093 if (tmpi->ic_cnt>=IC_BODY_SIZE && tmpi->ic_code!=IC_ASM)1094 throw('Compiler');1095op789A_next:1096 tmpi=tmpi_next;1097 }1098 1099 lb=cc->coc.coc_next_misc;1100 while (lb!=&cc->coc.coc_next_misc) {1101 switch (lb->type) {1102 case CMT_STR_CONST:1103 lb->addr=rip;1104 if (buf)1105 MemCpy(buf+rip,lb->str,lb->st_len);1106 rip+=lb->st_len;1107 break;1108 case CMT_JMP_TABLE:1109 lb->addr=rip;1110 ptr=buf+lb->addr;1111 if (lb->flags&(CMF_I8_JMP_TABLE|CMF_U8_JMP_TABLE)) {1112 if (buf)1113 for (i=0;i<lb->range;i++)1114 *ptr++=lb->jmp_table[i]->addr-lb->begin->addr;1115 rip+=lb->range;1116 } else if (lb->flags&(CMF_I16_JMP_TABLE|CMF_U16_JMP_TABLE)) {1117 if (buf)1118 for (i=0;i<lb->range;i++)1119 *ptr(U16 *)++=lb->jmp_table[i]->addr-lb->begin->addr;1120 rip+=lb->range<<1;1121 } else {1122 if (buf)1123 for (i=0;i<lb->range;i++) {1124 if (cc->flags&CCF_AOT_COMPILE && !(cc->flags&CCF_NO_ABSS)) {1125 tmpa=CAlloc(sizeof(CAOTAbsAddr));1126 tmpa->next=aotc->abss;1127 tmpa->type=AAT_ADD_U32;1128 aotc->abss=tmpa;1129 tmpa->rip=aotc->rip+lb->addr+i<<2;1130 *ptr(U32 *)++=lb->jmp_table[i]->addr+aotc->rip;1131 } else1132 *ptr(U32 *)++=lb->jmp_table[i]->addr+buf;1133 }1134 rip+=lb->range<<2;1135 }1136 break;1137 case CMT_FLOAT_CONSTS:1138 lb->addr=rip;1139 if (buf)1140 MemCpy(buf+lb->addr,lb->float_consts,lb->num_consts*sizeof(F64));1141 rip+=lb->num_consts*sizeof(F64);1142 break;1143 }1144 lb=lb->next;1145 }1146 if (dbg_info) {1147 if (cc->flags&CCF_AOT_COMPILE)1148 dbg_info->body[num_lines]=rip+aotc->rip;1149 else1150 dbg_info->body[num_lines]=rip+buf;1151 }1152 return rip;1153}1154 