hschumann2/TempleOS-Source-Code
0838
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 