CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

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