CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
BackA.txt660 linesDownload Raw Back to Compiler
1 2U0 ICAddEct(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,3        CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 op,I64 rip)4{5  I64 i,tmp,res_reg=REG_RAX;6  Bool swap=FALSE;7  if (r3!=res_reg) {8    swap^=TRUE;9    SwapI64(&t2,&t3);10    SwapI64(&r2,&r3);11    SwapI64(&d2,&d3);12  }13  if (t2.raw_type>=RT_I64 && r2!=res_reg && t2&MDG_REG_DISP_SIB_RIP) {14    if (t1&MDF_REG && !(r2==r1 && t2&MDG_REG_DISP_SIB))15      res_reg=r1;16    ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,rip);17    i=ICModr1(res_reg,t2,r2,d2);18    if (tmpi->ic_flags&ICF_LOCK)19      ICU8(tmpi,OC_LOCK_PREFIX);20    ICRex(tmpi,i.u8[1]);21    ICU16(tmpi,i.u8[2]<<8+op);22    ICModr2(tmpi,i,,d2,rip);23  } else {24    if (t2&MDF_REG)25      tmp=r2;26    else27      tmp=REG_RCX;28 29    if (t1&MDF_REG)30      res_reg=r1;31 32    if (tmp==res_reg)33      res_reg=REG_RDX;34    if (swap) {35      if (r3==tmp && t3&MDG_REG_DISP_SIB)36        tmp=REG_RCX;37      ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t2,r2,d2,rip);38      ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,rip);39    } else {40      if (r2==res_reg && t2&MDG_REG_DISP_SIB)41        res_reg=REG_RDX;42      ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t3,r3,d3,rip);43      ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t2,r2,d2,rip);44    }45    i=0x48;46    if (res_reg>7)47      i+=4;48    if (tmp>7)49      i++;50    if (tmpi->ic_flags&ICF_LOCK)51      ICU8(tmpi,OC_LOCK_PREFIX);52    ICU24(tmpi,0xC00000+i+(tmp&7)<<16+(res_reg&7)<<19+op<<8);53  }54  ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);55}56 57U0 ICAddSubEctImm(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,58        CICType t2,I64 r2,I64 d2,I64 d,I64 op,I64 rip)59{60  I64 i;61  if (op.u8[0]==0x2B) {62    op=0x0003;63    d=-d;64  }65  if (t1&MDF_REG) {66    if (!(t2&MDF_REG)) {67      ICMov(tmpi,t1,r1,d1,t2,r2,d2,rip);68      t2=t1;69      r2=r1;70      d2=d1;71    }72    if (r1==r2) {73      if (r1>7)74        i=0x49;75      else76        i=0x48;77      if (!d &&78            (op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))79        return;80      else if (d==1 && op.u8[0]==0x03) {81        ICU24(tmpi,0xC0FF00+op.u8[1]<<19+i+(r1&7)<<16);82        return;83      } else if (d==-1 && op.u8[0]==0x03) {84        ICU24(tmpi,0xC8FF00+i+(r1&7)<<16);85        return;86      } else if (I8_MIN<=d<=I8_MAX) {87        ICU24(tmpi,0xC08300+op.u8[1]<<19+i+(r1&7)<<16);88        ICU8(tmpi,d);89        return;90      } else if (I32_MIN<=d<=I32_MAX) {91        ICU24(tmpi,0xC08100+op.u8[1]<<19+i+(r1&7)<<16);92        ICU32(tmpi,d);93        return;94      }95    }96    if (op.u8[0]==0x03 && I32_MIN<=d<=I32_MAX &&97          !Bt(&cmp.non_ptr_vars_mask,r2)) {98      i=ICModr1(r1,MDF_DISP+RT_I64,r2,d);99      i.u8[1]|=0x48;100      ICU24(tmpi,i.u8[2]<<16+0x8D00+i.u8[1]);101      ICModr2(tmpi,i,,d,rip);102      return;103    }104  }105  switch (Bsr(t1)) {106    case MDf_REG:107    case MDf_DISP:108    case MDf_SIB:109    case MDf_RIP_DISP32:110      if (t1!=t2 || r1!=r2 || d1!=d2) {111        ICMov(tmpi,t1,r1,d1,t2,r2,d2,rip);112        t2=t1;113        r2=r1;114        d2=d1;115      }116 117      if (!d &&(op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B))118        return;119 120      if (op.u8[0]==0x03 && d==-1) //add -1121        op.u8[1]=1; //Decrement slash val122 123      if (op.u8[0]==0x03 && (d==1 || d==-1)) {  //Add124        i=ICModr1(op.u8[1],t1,r1,d1);125        if (!(t1&MDF_REG) && tmpi->ic_flags&ICF_LOCK)126          ICU8(tmpi,OC_LOCK_PREFIX);127        switch (t1.raw_type) {128          case RT_I8:129          case RT_U8:130            ICRex(tmpi,i.u8[1]);131            ICU16(tmpi,i.u8[2]<<8+0xFE);132            break;133          case RT_I16:134          case RT_U16:135            ICOpSizeRex(tmpi,i.u8[1]);136            ICU16(tmpi,i.u8[2]<<8+0xFF);137            break;138          default:139            ICRex(tmpi,i.u8[1]);140            ICU16(tmpi,i.u8[2]<<8+0xFF);141        }142        ICModr2(tmpi,i,,d1,rip);143        return;144      }145      if (I8_MIN<=d<=I8_MAX || t1&(RTG_MASK-RTF_UNSIGNED)==RT_I8) {146        ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_IMM_U8+op.u8[1],rip+1);147        ICU8(tmpi,d);148        return;149      }150      if (I32_MIN<=d<=I32_MAX || t1.raw_type<RT_I64) {151        ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_IMM_U32+op.u8[1],rip);152        if (t1&(RTG_MASK-RTF_UNSIGNED)==RT_I16)153          ICU16(tmpi,d);154        else155          ICU32(tmpi,d);156        return;157      }158      break;159    case MDf_STK:160      ICAddSubEctImm(tmpi,MDF_REG+RT_I64,REG_RAX,0,t2,r2,d2,d,op,rip);161      ICPushRegs(tmpi,1<<REG_RAX);162      return;163  }164  ICAddEct(tmpi,t1,r1,d1,MDF_IMM+RT_I64,0,d,t2,r2,d2,op.u8[0],rip);165}166 167U0 ICSub(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,168        CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,I64 rip)169{170  I64 i=0x48,op=0x2B;171  Bool swap=FALSE;172  if (r3!=REG_RAX) {173    swap=TRUE;174    SwapI64(&t2,&t3);175    SwapI64(&r2,&r3);176    SwapI64(&d2,&d3);177  }178  if (t2.raw_type>=RT_I64 && r2.u8[0]!=REG_RAX &&179        (!(t2&MDF_SIB) || r2.u8[1]&15!=REG_RAX) && t2&MDG_REG_DISP_SIB_RIP) {180    ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);181    if (!swap) {182      op=0x03;183      ICU24(tmpi,0xD8F748);184    }185    i=ICModr1(REG_RAX,t2,r2,d2);186    if (tmpi->ic_flags&ICF_LOCK)187      ICU8(tmpi,OC_LOCK_PREFIX);188    ICRex(tmpi,i.u8[1]);189    ICU16(tmpi,i.u8[2]<<8+op);190    ICModr2(tmpi,i,,d2,rip);191    ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,REG_RAX,0,rip);192  } else {193    if (!(t3&MDF_REG) || t3.raw_type<RT_I64) {194      if (swap) {195        swap=FALSE;196        ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);197        ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);198        r2=REG_RAX;199        r3=REG_RCX;200      } else {201        ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);202        ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);203        r3=REG_RAX;204        r2=REG_RCX;205      }206    } else {207      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);208      r2=REG_RCX;209    }210    if (swap) {211      op=0x03;212      ICU24(tmpi,0xD9F748);213    }214    if (r3>7)215      i++;216    if (r2>7)217      i+=4;218    if (tmpi->ic_flags&ICF_LOCK)219      ICU8(tmpi,OC_LOCK_PREFIX);220    ICU24(tmpi,0xC00000+i+(r3&7)<<16+(r2&7)<<19+op<<8);221    ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,r2,0,rip);222  }223}224 225U0 ICMul(CIntermediateCode *tmpi,I64 rip)226{227  I64 i,r2,r=REG_RAX,j;228  CICArg *arg1,*arg2;229  Bool alt;230  if (tmpi->arg1.type&MDF_IMM) {231    arg1=&tmpi->arg2;232    arg2=&tmpi->arg1;233    alt=TRUE;234  } else {235    arg1=&tmpi->arg1;236    arg2=&tmpi->arg2;237    alt=FALSE;238  }239  i=arg2->disp;240  if (!(tmpi->ic_class->raw_type&RTF_UNSIGNED) &&241        arg2->type&MDF_IMM && I32_MIN<=i<=I32_MAX) {242    if (tmpi->res.type==MDF_REG+RT_I64) {243      ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,244            arg1->type,arg1->reg,arg1->disp,rip);245      r=tmpi->res.reg;246    } else247      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg1->type,arg1->reg,arg1->disp,rip);248    if (r>7)249      j=0xC0004D;250    else251      j=0xC00048;252    if (I8_MIN<=i<=I8_MAX)253      ICU32(tmpi,i<<24+0x6B00+j+(r&7)<<16+(r&7)<<19);254    else {255      ICU24(tmpi,0x6900+j+(r&7)<<16+(r&7)<<19);256      ICU32(tmpi,i);257    }258  } else {259    if (tmpi->ic_class->raw_type&RTF_UNSIGNED)260      i=0xE0F748;261    else262      i=0xE8F748;263    if (alt) {264      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,arg1->type,arg1->reg,arg1->disp,rip);265      r2=REG_RCX;266      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,arg2->reg,arg2->disp,rip);267    } else {268      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type,arg2->reg,arg2->disp,rip);269      if (!(arg1->type&MDF_REG) || arg1->type.raw_type<RT_I64) {270        ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,271              arg1->type,arg1->reg,arg1->disp,rip);272        r2=REG_RCX;273      } else274        r2=arg1->reg;275    }276    if (r2>7) {277      i++;278      r2&=7;279    }280    ICU24(tmpi,i+r2<<16);281  }282  ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,283        MDF_REG+RT_I64,r,0,rip);284}285 286U0 ICMulEqu(CIntermediateCode *tmpi,I64 rip)287{288  I64 i=tmpi->arg2.disp,r=REG_RAX,j;289  if (!(tmpi->ic_class->raw_type&RTF_UNSIGNED) &&290        tmpi->arg2.type&MDF_IMM && I32_MIN<=i<=I32_MAX) {291    if (tmpi->ic_flags & ICF_BY_VAL) {292      if (tmpi->arg1.type==MDF_REG+RT_I64)293        r=tmpi->arg1.reg;294      else295        ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,296              tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,297              tmpi->arg1.reg,tmpi->arg1.disp,rip);298      if (r>7)299        j=0xC0004D;300      else301        j=0xC00048;302      if (I8_MIN<=i<=I8_MAX)303        ICU32(tmpi,i<<24+0x6B00+j+(r&7)<<16+(r&7)<<19);304      else {305        ICU24(tmpi,0x6900+j+(r&7)<<16+(r&7)<<19);306        ICU32(tmpi,i);307      }308      ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,309            tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,r,0,rip);310    } else {311      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,312            tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);313      ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,314            MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);315      r=REG_RBX;316      if (I8_MIN<=i<=I8_MAX)317        ICU32(tmpi,i<<24+0xDB6B48);318      else {319        ICU24(tmpi,0xDB6948);320        ICU32(tmpi,i);321      }322      ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,323            MDF_REG+RT_I64,REG_RBX,0,rip);324    }325  } else {326    if (tmpi->ic_class->raw_type&RTF_UNSIGNED)327      i=0xE3F748;328    else329      i=0xEBF748;330    if (tmpi->ic_flags & ICF_BY_VAL) {331      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,332            tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);333      ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,334            tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,335            tmpi->arg1.reg,tmpi->arg1.disp,rip);336      ICU24(tmpi,i);337      ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,338            tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RAX,0,rip);339    } else {340      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,341            tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);342      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,343            tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);344      ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,345            MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip);346      ICU24(tmpi,i);347      ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,348            MDF_REG+RT_I64,REG_RAX,0,rip);349    }350  }351  if (tmpi->res.type.mode)352    ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,353          MDF_REG+RT_I64,r,0,rip);354}355 356U0 ICDiv(CIntermediateCode *tmpi,I64 rip)357{358  ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,359        tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);360  ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,361        tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);362  if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {363    ICZero(tmpi,REG_RDX);364    ICU24(tmpi,0xF1F748);365  } else {366    ICU16(tmpi,0x9948);367    ICU24(tmpi,0xF9F748);368  }369  ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,370        MDF_REG+RT_I64,REG_RAX,0,rip);371}372 373U0 ICDivEqu(CIntermediateCode *tmpi,Bool is_mod,I64 rip)374{375  if (tmpi->ic_flags & ICF_BY_VAL) {376    ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,377          tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);378    ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,379          tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,380          tmpi->arg1.reg,tmpi->arg1.disp,rip);381    if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {382      ICZero(tmpi,REG_RDX);383      ICU24(tmpi,0xF1F748);384    } else {385      ICU16(tmpi,0x9948);386      ICU24(tmpi,0xF9F748);387    }388    if (is_mod)389      ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,390            tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RDX,0,rip);391    else392      ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to,393            tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RAX,0,rip);394  } else {395    ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,396          tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);397    ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,398          tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);399//dangerous might clobber RBX in Mov, but it doesn't400    ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+tmpi->arg1_type_pointed_to,401          REG_RBX,0,rip);402    if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {403      ICZero(tmpi,REG_RDX);404      ICU24(tmpi,0xF1F748);405    } else {406      ICU16(tmpi,0x9948);407      ICU24(tmpi,0xF9F748);408    }409    if (is_mod)410      ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RBX,0,411            MDF_REG+RT_I64,REG_RDX,0,rip);412    else413      ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RBX,0,414            MDF_REG+RT_I64,REG_RAX,0,rip);415  }416  if (tmpi->res.type.mode) {417    if (is_mod)418      ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,419            MDF_REG+RT_I64,REG_RDX,0,rip);420    else421      ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,422            MDF_REG+RT_I64,REG_RAX,0,rip);423  }424}425 426U0 ICMod(CIntermediateCode *tmpi,I64 rip)427{428  ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,429        tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip);430  ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,431        tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip);432  if (tmpi->ic_class->raw_type&RTF_UNSIGNED) {433    ICZero(tmpi,REG_RDX);434    ICU24(tmpi,0xF1F748);435  } else {436    ICU16(tmpi,0x9948);437    ICU24(tmpi,0xF9F748);438  }439  ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,440        MDF_REG+RT_I64,REG_RDX,0,rip);441}442 443U0 ICAddSubEctEqu(CIntermediateCode *tmpi,U8 type_pointed_to,444        CICType t1,I64 r1,I64 d1,CICType t2,I64 r2,I64 d2,445        CICType t3,I64 r3,I64 d3,I64 op,I64 rip)446{447  Bool done;448  I64 res_reg,tmp,i;449  if (tmpi->ic_flags & ICF_BY_VAL) {450    if (t3&MDF_IMM) {451      ICAddSubEctImm(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,t2&MDG_MASK+452            type_pointed_to,r2,d2,d3,op,rip);453      if (t1.mode)454        ICMov(tmpi,t1,r1,d1,t2&MDG_MASK+type_pointed_to,r2,d2,rip);455      return;456    } else {457      done=FALSE;458      if (type_pointed_to>=RT_I64) {459        if (!t1.mode && t2&MDG_REG_DISP_SIB_RIP) {460          if (t3&MDF_REG)461            tmp=r3;462          else {463            tmp=REG_RCX;464            ICMov(tmpi,MDF_REG+RT_I64,tmp,0,t3,r3,d3,rip);465          }466          i=ICModr1(tmp,t2&MDG_MASK+type_pointed_to,r2,d2);467          if (tmpi->ic_flags&ICF_LOCK)468            ICU8(tmpi,OC_LOCK_PREFIX);469          ICRex(tmpi,i.u8[1]);470          ICU16(tmpi,i.u8[2]<<8+op.u8[5]);471          ICModr2(tmpi,i,,d2,rip);472          return;473        }474        if (t3.raw_type>=RT_I64 && t3&MDG_REG_DISP_SIB_RIP) {475          if (t2&MDF_REG)476            res_reg=r2;477          else {478            res_reg=REG_RCX;479            ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);480          }481          i=ICModr1(res_reg,t3&MDG_MASK+type_pointed_to,r3,d3);482          if (tmpi->ic_flags&ICF_LOCK)483            ICU8(tmpi,OC_LOCK_PREFIX);484          ICRex(tmpi,i.u8[1]);485          ICU16(tmpi,i.u8[2]<<8+op.u8[0]);486          ICModr2(tmpi,i,,d3,rip);487          ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,488                MDF_REG+RT_I64,res_reg,0,rip);489          done=TRUE;490        }491      }492      if (!done) {493        ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);494        if (t2&MDF_REG && r2!=REG_RAX)495          res_reg=r2;496        else {497          res_reg=REG_RCX;498          ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,499                t2&MDG_MASK+type_pointed_to,r2,d2,rip);500        }501        if (tmpi->ic_flags&ICF_LOCK)502          ICU8(tmpi,OC_LOCK_PREFIX);503        if (res_reg>7)504          ICU8(tmpi,0x4C);505        else506          ICU8(tmpi,0x48);507        ICU16(tmpi,0xC000+op.u8[0]+(res_reg&7)<<11);508        ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,509              MDF_REG+RT_I64,res_reg,0,rip);510      }511    }512  } else {513    done=FALSE;514    if (t3&MDF_IMM && op.u8[2]) {515      if (!d3.u32[1]) {516        if (tmpi->ic_flags&ICF_RES_NOT_USED &&517              t2&MDF_REG && d3(U64)<=I8_MAX) {518          ICSlashOp(tmpi,MDF_DISP+type_pointed_to,r2,0,0x838000+op.u8[4],rip);519          ICU8(tmpi,d3);520          done=TRUE;521        } else if (op.u8[2]==0x24) {//AND522          ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);523          ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,524                MDF_DISP+type_pointed_to,REG_RCX,0,rip);525          res_reg=REG_RAX;526          if (tmpi->ic_flags&ICF_LOCK)527            ICU8(tmpi,OC_LOCK_PREFIX);528          ICU16(tmpi,op.u8[3]<<8+0x40);529          ICU32(tmpi,d3);530          ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,531                MDF_REG+RT_I64,res_reg,0,rip);532          done=TRUE;533        } else if (type_pointed_to<RT_I64) {//OR/XOR534          ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);535          ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,536                MDF_DISP+type_pointed_to,REG_RCX,0,rip);537          res_reg=REG_RAX;538          if (tmpi->ic_flags&ICF_LOCK)539            ICU8(tmpi,OC_LOCK_PREFIX);540          if (d3.u16[1]) {541            ICU16(tmpi,op.u8[3]<<8+0x40);542            ICU32(tmpi,d3);543          } else if (d3.u8[1]) {544            ICU24(tmpi,op.u8[3]<<16+0x4000+OC_OP_SIZE_PREFIX);545            ICU16(tmpi,d3);546          } else {547            ICU16(tmpi,op.u8[2]<<8+0x40);548            ICU8(tmpi,d3);549          }550          ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,551                MDF_REG+RT_I64,res_reg,0,rip);552          done=TRUE;553        }554      }555    }556    if (!done) {557      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,t3,r3,d3,rip);558      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t2,r2,d2,rip);559      ICMov(tmpi,MDF_REG+RT_I64,REG_RBX,0,560            MDF_DISP+type_pointed_to,REG_RCX,0,rip);561      res_reg=REG_RBX;562      if (tmpi->ic_flags&ICF_LOCK)563        ICU8(tmpi,OC_LOCK_PREFIX);564      ICU8(tmpi,0x48);565      ICU16(tmpi,0xC000+op.u8[0]+(res_reg&7)<<11);566      ICMov(tmpi,MDF_DISP+type_pointed_to,REG_RCX,0,567            MDF_REG+RT_I64,res_reg,0,rip);568    }569  }570  if (t1.mode)571    ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);572}573 574U0 ICShift(CIntermediateCode *tmpi,CICType t1,I64 r1,I64 d1,575        CICType t2,I64 r2,I64 d2,CICType t3,I64 r3,I64 d3,576        I64 us,I64 is,I64 rip)577{578  I64 i=0x48,res_reg;579  if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||580        tmpi->ic_flags & ICF_USE_UNSIGNED)581    is=us;582  if (t1&MDF_REG) {583    res_reg=r1;584    if (res_reg>7)585      i++;586  } else587    res_reg=REG_RAX;588  if (t3&MDF_IMM) {589    ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t2,r2,d2,rip);590    if (d3==1)591      ICU24(tmpi,i+is.u16[2]<<8+(res_reg&7)<<16);592    else {593      ICU24(tmpi,i+is.u16[0]<<8+(res_reg&7)<<16);594      ICU8(tmpi,d3);595    }596  } else {597    ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,rip);598    ICMov(tmpi,MDF_REG+RT_I64,res_reg,0,t2,r2,d2,rip);599    ICU24(tmpi,i+is.u16[1]<<8+(res_reg&7)<<16);600  }601  ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);602}603 604U0 ICShiftEqu(CIntermediateCode *tmpi,U8 type_pointed_to,605        CICType t1,I64 r1,I64 d1,606        CICType t2,I64 r2,I64 d2,607        CICType t3,I64 r3,I64 d3,I64 us,I64 is,I64 rip)608{609  I64 res_reg;610  if (tmpi->ic_class->raw_type&RTF_UNSIGNED ||611        tmpi->ic_flags & ICF_USE_UNSIGNED)612    is=us;613  if (tmpi->ic_flags & ICF_BY_VAL) {614    if (!(t3&MDF_IMM))615      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,rip);616    if (t2&MDF_REG)617      res_reg=r2;618    else {619      res_reg=REG_RAX;620      ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,621            t2&MDG_MASK+type_pointed_to,r2,d2,rip);622    }623    if (res_reg>7)624      ICU8(tmpi,0x49);625    else626      ICU8(tmpi,0x48);627    if (t3&MDF_IMM) {628      if (d3==1)629        ICU16(tmpi,is.u16[2]+(res_reg&7)<<8);630      else {631        ICU16(tmpi,is.u16[0]+(res_reg&7)<<8);632        ICU8(tmpi,d3);633      }634    } else635      ICU16(tmpi,is.u16[1]+(res_reg&7)<<8);636    ICMov(tmpi,t2&MDG_MASK+type_pointed_to,r2,d2,637          MDF_REG+RT_I64,res_reg,0,rip);638  } else {639    if (!(t3&MDF_IMM))640      ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,t3,r3,d3,rip);641    ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,t2,r2,d2,rip);642    ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,MDF_DISP+type_pointed_to,REG_RDX,0,rip);643    res_reg=REG_RAX;644    ICU8(tmpi,0x48);645    if (t3&MDF_IMM) {646      if (d3==1)647        ICU16(tmpi,is.u16[2]+(res_reg&7)<<8);648      else {649        ICU16(tmpi,is.u16[0]+(res_reg&7)<<8);650        ICU8(tmpi,d3);651      }652    } else653      ICU16(tmpi,is.u16[1]+(res_reg&7)<<8);654    ICMov(tmpi,655          MDF_DISP+type_pointed_to,REG_RDX,0,MDF_REG+RT_I64,res_reg,0,rip);656  }657  if (t1.mode)658    ICMov(tmpi,t1,r1,d1,MDF_REG+RT_I64,res_reg,0,rip);659}660