CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
OptPass789A.txt1154 linesDownload Raw Back to Compiler
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