Lines Matching full:env
133 static HReg lookupIRTemp(ISelEnv * env, IRTemp tmp) in lookupIRTemp() argument
136 vassert(tmp < env->n_vregmap); in lookupIRTemp()
137 return env->vregmap[tmp]; in lookupIRTemp()
140 static void lookupIRTemp64(HReg * vrHI, HReg * vrLO, ISelEnv * env, IRTemp tmp) in lookupIRTemp64() argument
143 vassert(tmp < env->n_vregmap); in lookupIRTemp64()
144 vassert(! hregIsInvalid(env->vregmapHI[tmp])); in lookupIRTemp64()
145 *vrLO = env->vregmap[tmp]; in lookupIRTemp64()
146 *vrHI = env->vregmapHI[tmp]; in lookupIRTemp64()
150 lookupIRTempPair(HReg * vrHI, HReg * vrLO, ISelEnv * env, IRTemp tmp) in lookupIRTempPair() argument
152 vassert(env->mode64); in lookupIRTempPair()
154 vassert(tmp < env->n_vregmap); in lookupIRTempPair()
155 vassert(! hregIsInvalid(env->vregmapHI[tmp])); in lookupIRTempPair()
156 *vrLO = env->vregmap[tmp]; in lookupIRTempPair()
157 *vrHI = env->vregmapHI[tmp]; in lookupIRTempPair()
160 static void addInstr(ISelEnv * env, MIPSInstr * instr) in addInstr() argument
162 addHInstr(env->code, instr); in addInstr()
169 static HReg newVRegI(ISelEnv * env) in newVRegI() argument
172 HRcGPR(env->mode64), 0/*enc*/, env->vreg_ctr); in newVRegI()
173 env->vreg_ctr++; in newVRegI()
177 static HReg newVRegD(ISelEnv * env) in newVRegD() argument
180 HRcFlt64, 0/*enc*/, env->vreg_ctr); in newVRegD()
181 env->vreg_ctr++; in newVRegD()
185 static HReg newVRegF(ISelEnv * env) in newVRegF() argument
188 HRcFPR(env->mode64), 0/*enc*/, env->vreg_ctr); in newVRegF()
189 env->vreg_ctr++; in newVRegF()
193 static void add_to_sp(ISelEnv * env, UInt n) in add_to_sp() argument
198 addInstr(env, MIPSInstr_Alu(Malu_DADD, sp, sp, MIPSRH_Imm(True, in add_to_sp()
201 addInstr(env, MIPSInstr_Alu(Malu_ADD, sp, sp, MIPSRH_Imm(True, in add_to_sp()
205 static void sub_from_sp(ISelEnv * env, UInt n) in sub_from_sp() argument
210 addInstr(env, MIPSInstr_Alu(Malu_DSUB, sp, sp, in sub_from_sp()
213 addInstr(env, MIPSInstr_Alu(Malu_SUB, sp, sp, in sub_from_sp()
234 static MIPSRH *iselWordExpr_RH_wrk(ISelEnv * env, Bool syned, IRExpr * e);
235 static MIPSRH *iselWordExpr_RH(ISelEnv * env, Bool syned, IRExpr * e);
239 static MIPSRH *iselWordExpr_RH5u_wrk(ISelEnv * env, IRExpr * e);
240 static MIPSRH *iselWordExpr_RH5u(ISelEnv * env, IRExpr * e);
244 static MIPSRH *iselWordExpr_RH6u_wrk(ISelEnv * env, IRExpr * e);
245 static MIPSRH *iselWordExpr_RH6u(ISelEnv * env, IRExpr * e);
248 static HReg iselWordExpr_R_wrk(ISelEnv * env, IRExpr * e);
249 static HReg iselWordExpr_R(ISelEnv * env, IRExpr * e);
252 static MIPSAMode *iselWordExpr_AMode_wrk(ISelEnv * env, IRExpr * e,
254 static MIPSAMode *iselWordExpr_AMode(ISelEnv * env, IRExpr * e, IRType xferTy);
256 static void iselInt64Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env,
258 static void iselInt64Expr(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e);
262 ISelEnv * env, IRExpr * e);
263 static void iselInt128Expr(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e);
265 static MIPSCondCode iselCondCode_wrk(ISelEnv * env, IRExpr * e);
266 static MIPSCondCode iselCondCode(ISelEnv * env, IRExpr * e);
268 static HReg iselDblExpr_wrk(ISelEnv * env, IRExpr * e);
269 static HReg iselDblExpr(ISelEnv * env, IRExpr * e);
271 static HReg iselFltExpr_wrk(ISelEnv * env, IRExpr * e);
272 static HReg iselFltExpr(ISelEnv * env, IRExpr * e);
274 static void set_MIPS_rounding_mode(ISelEnv * env, IRExpr * mode) in set_MIPS_rounding_mode() argument
285 HReg irrm = iselWordExpr_R(env, mode); in set_MIPS_rounding_mode()
286 HReg tmp = newVRegI(env); in set_MIPS_rounding_mode()
287 HReg fcsr_old = newVRegI(env); in set_MIPS_rounding_mode()
290 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, tmp, irrm, in set_MIPS_rounding_mode()
292 addInstr(env, MIPSInstr_Alu(Malu_XOR, tmp, irrm, MIPSRH_Reg(tmp))); in set_MIPS_rounding_mode()
293 addInstr(env, MIPSInstr_Alu(Malu_AND, irrm, tmp, MIPSRH_Imm(False, 3))); in set_MIPS_rounding_mode()
295 addInstr(env, MIPSInstr_MfFCSR(fcsr_old)); in set_MIPS_rounding_mode()
296 sub_from_sp(env, 8); /* Move SP down 8 bytes */ in set_MIPS_rounding_mode()
300 addInstr(env, MIPSInstr_Store(4, am_addr, fcsr_old, mode64)); in set_MIPS_rounding_mode()
303 addInstr(env, MIPSInstr_MtFCSR(irrm)); in set_MIPS_rounding_mode()
306 static void set_MIPS_rounding_default(ISelEnv * env) in set_MIPS_rounding_default() argument
308 HReg fcsr = newVRegI(env); in set_MIPS_rounding_default()
313 addInstr(env, MIPSInstr_Load(4, fcsr, am_addr, mode64)); in set_MIPS_rounding_default()
315 add_to_sp(env, 8); /* Reset SP */ in set_MIPS_rounding_default()
318 addInstr(env, MIPSInstr_MtFCSR(fcsr)); in set_MIPS_rounding_default()
355 static HReg mk_LoadRR32toFPR(ISelEnv * env, HReg r_srcHi, HReg r_srcLo) in mk_LoadRR32toFPR() argument
357 HReg fr_dst = newVRegD(env); in mk_LoadRR32toFPR()
363 sub_from_sp(env, 16); /* Move SP down 16 bytes */ in mk_LoadRR32toFPR()
369 addInstr(env, MIPSInstr_Store(4, am_addr0, r_srcLo, mode64)); in mk_LoadRR32toFPR()
370 addInstr(env, MIPSInstr_Store(4, am_addr1, r_srcHi, mode64)); in mk_LoadRR32toFPR()
372 addInstr(env, MIPSInstr_Store(4, am_addr0, r_srcHi, mode64)); in mk_LoadRR32toFPR()
373 addInstr(env, MIPSInstr_Store(4, am_addr1, r_srcLo, mode64)); in mk_LoadRR32toFPR()
381 addInstr(env, MIPSInstr_FpLdSt(True /*load */ , 8, fr_dst, am_addr0)); in mk_LoadRR32toFPR()
383 add_to_sp(env, 16); /* Reset SP */ in mk_LoadRR32toFPR()
396 ISelEnv* env, in doHelperCall() argument
519 aTy = typeOfIRExpr(env->type_env, arg); in doHelperCall()
523 addInstr(env, mk_iMOVds_RR(argregs[argreg], in doHelperCall()
524 iselWordExpr_R(env, arg))); in doHelperCall()
532 iselInt64Expr(&rHi, &rLo, env, arg); in doHelperCall()
534 addInstr(env, mk_iMOVds_RR( argregs[argreg++], rHi )); in doHelperCall()
536 addInstr(env, mk_iMOVds_RR( argregs[argreg], rLo)); in doHelperCall()
540 addInstr(env, mk_iMOVds_RR(argregs[argreg], in doHelperCall()
560 aTy = typeOfIRExpr(env->type_env, arg); in doHelperCall()
563 tmpregs[argreg] = iselWordExpr_R(env, arg); in doHelperCall()
571 iselInt64Expr(&raHi, &raLo, env, arg); in doHelperCall()
596 cc = iselCondCode(env, guard); in doHelperCall()
597 src = iselWordExpr_R(env, guard); in doHelperCall()
607 addInstr(env, mk_iMOVds_RR(argregs[i], tmpregs[i])); in doHelperCall()
650 addInstr(env, MIPSInstr_CallAlways(cc, target, argiregs, in doHelperCall()
653 addInstr(env, MIPSInstr_Call(cc, target, argiregs, src, *retloc)); in doHelperCall()
688 static Bool sane_AMode(ISelEnv * env, MIPSAMode * am) in sane_AMode() argument
705 static MIPSAMode *iselWordExpr_AMode(ISelEnv * env, IRExpr * e, IRType xferTy) in iselWordExpr_AMode() argument
707 MIPSAMode *am = iselWordExpr_AMode_wrk(env, e, xferTy); in iselWordExpr_AMode()
708 vassert(sane_AMode(env, am)); in iselWordExpr_AMode()
713 static MIPSAMode *iselWordExpr_AMode_wrk(ISelEnv * env, IRExpr * e, in iselWordExpr_AMode_wrk() argument
716 IRType ty = typeOfIRExpr(env->type_env, e); in iselWordExpr_AMode_wrk()
717 if (env->mode64) { in iselWordExpr_AMode_wrk()
729 iselWordExpr_R(env, e->Iex.Binop.arg1)); in iselWordExpr_AMode_wrk()
734 HReg r_base = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_AMode_wrk()
735 HReg r_idx = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_AMode_wrk()
748 iselWordExpr_R(env, e->Iex.Binop.arg1)); in iselWordExpr_AMode_wrk()
753 HReg r_base = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_AMode_wrk()
754 HReg r_idx = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_AMode_wrk()
762 return MIPSAMode_IR(0, iselWordExpr_R(env, e)); in iselWordExpr_AMode_wrk()
783 static HReg iselWordExpr_R(ISelEnv * env, IRExpr * e) in iselWordExpr_R() argument
785 HReg r = iselWordExpr_R_wrk(env, e); in iselWordExpr_R()
788 vassert(hregClass(r) == HRcGPR(env->mode64)); in iselWordExpr_R()
794 static HReg iselWordExpr_R_wrk(ISelEnv * env, IRExpr * e) in iselWordExpr_R_wrk() argument
797 IRType ty = typeOfIRExpr(env->type_env, e); in iselWordExpr_R_wrk()
805 return lookupIRTemp(env, e->Iex.RdTmp.tmp); in iselWordExpr_R_wrk()
809 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
810 MIPSAMode *am_addr = iselWordExpr_AMode(env, e->Iex.Load.addr, ty); in iselWordExpr_R_wrk()
816 addInstr(env, MIPSInstr_Load(toUChar(sizeofIRType(ty)), in iselWordExpr_R_wrk()
877 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
878 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
886 ri_srcR = iselWordExpr_RH(env, True /*signed */ , in iselWordExpr_R_wrk()
892 ri_srcR = iselWordExpr_RH(env, False /*unsigned */, in iselWordExpr_R_wrk()
898 addInstr(env, MIPSInstr_Alu(aluOp, r_dst, r_srcL, ri_srcR)); in iselWordExpr_R_wrk()
923 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
924 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
927 ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
929 ri_srcR = iselWordExpr_RH5u(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
935 HReg tmp = newVRegI(env); in iselWordExpr_R_wrk()
936 HReg r_srcL_se = newVRegI(env); in iselWordExpr_R_wrk()
944 addInstr(env, MIPSInstr_Shft(Mshft_SLL, False, tmp, in iselWordExpr_R_wrk()
946 addInstr(env, MIPSInstr_Shft(Mshft_SRA, False, r_srcL_se, in iselWordExpr_R_wrk()
949 addInstr(env, MIPSInstr_Shft(shftOp, True /*32bit shift */, in iselWordExpr_R_wrk()
952 addInstr(env, MIPSInstr_Shft(shftOp, True /*32bit shift */, in iselWordExpr_R_wrk()
956 addInstr(env, MIPSInstr_Shft(shftOp, False/*64bit shift */, in iselWordExpr_R_wrk()
984 HReg dst = newVRegI(env); in iselWordExpr_R_wrk()
985 HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
986 HReg r2 = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1045 addInstr(env, MIPSInstr_Cmp(syned, size32, dst, r1, r2, cc)); in iselWordExpr_R_wrk()
1050 HReg tmp = newVRegI(env); in iselWordExpr_R_wrk()
1051 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1052 HReg argL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1053 HReg argR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1054 MIPSRH *argRH = iselWordExpr_RH(env, False /*signed */ , in iselWordExpr_R_wrk()
1061 addInstr(env, MIPSInstr_Alu(Malu_SLT, tmp, argL, argRH)); in iselWordExpr_R_wrk()
1062 addInstr(env, mk_iMOVds_RR(r_dst, argL)); in iselWordExpr_R_wrk()
1063 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, r_dst, argR, tmp)); in iselWordExpr_R_wrk()
1069 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1070 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1071 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1072 addInstr(env, MIPSInstr_Mul(False/*Unsigned or Signed */ , in iselWordExpr_R_wrk()
1080 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1081 HReg tHi = newVRegI(env); in iselWordExpr_R_wrk()
1082 HReg tLo = newVRegI(env); in iselWordExpr_R_wrk()
1083 HReg tLo_1 = newVRegI(env); in iselWordExpr_R_wrk()
1084 HReg tHi_1 = newVRegI(env); in iselWordExpr_R_wrk()
1085 HReg mask = newVRegI(env); in iselWordExpr_R_wrk()
1090 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1091 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1092 addInstr(env, MIPSInstr_Mul(syned /*Unsigned or Signed */ , in iselWordExpr_R_wrk()
1097 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselWordExpr_R_wrk()
1098 addInstr(env, MIPSInstr_Mflo(tLo)); in iselWordExpr_R_wrk()
1100 addInstr(env, MIPSInstr_Shft(Mshft_SLL, False, tHi_1, in iselWordExpr_R_wrk()
1103 addInstr(env, MIPSInstr_LI(mask, 0xffffffff)); in iselWordExpr_R_wrk()
1104 addInstr(env, MIPSInstr_Alu(Malu_AND, tLo_1, tLo, in iselWordExpr_R_wrk()
1107 addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, tHi_1, in iselWordExpr_R_wrk()
1116 r_srcL = iselFltExpr(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1117 r_srcR = iselFltExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1119 r_srcL = iselDblExpr(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1120 r_srcR = iselDblExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1122 HReg tmp = newVRegI(env); in iselWordExpr_R_wrk()
1123 HReg r_ccMIPS = newVRegI(env); in iselWordExpr_R_wrk()
1124 HReg r_ccIR = newVRegI(env); in iselWordExpr_R_wrk()
1125 HReg r_ccIR_b0 = newVRegI(env); in iselWordExpr_R_wrk()
1126 HReg r_ccIR_b2 = newVRegI(env); in iselWordExpr_R_wrk()
1127 HReg r_ccIR_b6 = newVRegI(env); in iselWordExpr_R_wrk()
1131 addInstr(env, MIPSInstr_FpCompare(Mfp_CMP_EQ, tmp, r_srcL, r_srcR)); in iselWordExpr_R_wrk()
1132 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, r_ccMIPS, tmp, in iselWordExpr_R_wrk()
1135 addInstr(env, MIPSInstr_FpCompare(Mfp_CMP_UN, tmp, r_srcL, r_srcR)); in iselWordExpr_R_wrk()
1136 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccMIPS, r_ccMIPS, in iselWordExpr_R_wrk()
1139 addInstr(env, MIPSInstr_FpCompare(Mfp_CMP_LT, tmp, r_srcL, r_srcR)); in iselWordExpr_R_wrk()
1140 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, tmp, in iselWordExpr_R_wrk()
1142 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccMIPS, r_ccMIPS, in iselWordExpr_R_wrk()
1145 addInstr(env, MIPSInstr_FpCompare(Mfp_CMP_NGT, in iselWordExpr_R_wrk()
1147 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, tmp, tmp, in iselWordExpr_R_wrk()
1150 addInstr(env, MIPSInstr_Alu(Malu_NOR, tmp, tmp, MIPSRH_Reg(tmp))); in iselWordExpr_R_wrk()
1151 addInstr(env, MIPSInstr_Alu(Malu_AND, tmp, tmp, in iselWordExpr_R_wrk()
1153 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccMIPS, r_ccMIPS, in iselWordExpr_R_wrk()
1166 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True, r_ccIR_b0, r_ccMIPS, in iselWordExpr_R_wrk()
1168 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccIR_b0, r_ccMIPS, in iselWordExpr_R_wrk()
1170 addInstr(env, MIPSInstr_Alu(Malu_AND, r_ccIR_b0, r_ccIR_b0, in iselWordExpr_R_wrk()
1174 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, r_ccIR_b2, r_ccMIPS, in iselWordExpr_R_wrk()
1176 addInstr(env, MIPSInstr_Alu(Malu_AND, r_ccIR_b2, r_ccIR_b2, in iselWordExpr_R_wrk()
1180 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True, r_ccIR_b6, in iselWordExpr_R_wrk()
1182 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccIR_b6, r_ccMIPS, in iselWordExpr_R_wrk()
1184 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, r_ccIR_b6, r_ccIR_b6, in iselWordExpr_R_wrk()
1186 addInstr(env, MIPSInstr_Alu(Malu_AND, r_ccIR_b6, r_ccIR_b6, in iselWordExpr_R_wrk()
1190 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccIR, r_ccIR_b0, in iselWordExpr_R_wrk()
1192 addInstr(env, MIPSInstr_Alu(Malu_OR, r_ccIR, r_ccIR, in iselWordExpr_R_wrk()
1199 HReg tLo = newVRegI(env); in iselWordExpr_R_wrk()
1200 HReg tHi = newVRegI(env); in iselWordExpr_R_wrk()
1201 HReg mask = newVRegI(env); in iselWordExpr_R_wrk()
1202 HReg tLo_1 = newVRegI(env); in iselWordExpr_R_wrk()
1203 HReg tHi_1 = newVRegI(env); in iselWordExpr_R_wrk()
1204 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1207 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1208 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1210 addInstr(env, MIPSInstr_Div(syned, True, r_srcL, r_srcR)); in iselWordExpr_R_wrk()
1211 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselWordExpr_R_wrk()
1212 addInstr(env, MIPSInstr_Mflo(tLo)); in iselWordExpr_R_wrk()
1214 addInstr(env, MIPSInstr_Shft(Mshft_SLL, False, tHi_1, tHi, in iselWordExpr_R_wrk()
1217 addInstr(env, MIPSInstr_LI(mask, 0xffffffff)); in iselWordExpr_R_wrk()
1218 addInstr(env, MIPSInstr_Alu(Malu_AND, tLo_1, tLo, in iselWordExpr_R_wrk()
1221 addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, tHi_1, in iselWordExpr_R_wrk()
1229 HReg tHi = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1230 HReg tLo = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1231 HReg tLo_1 = newVRegI(env); in iselWordExpr_R_wrk()
1232 HReg tHi_1 = newVRegI(env); in iselWordExpr_R_wrk()
1233 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1252 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, tHi_1, tHi, in iselWordExpr_R_wrk()
1254 addInstr(env, MIPSInstr_Alu(Malu_AND, tLo_1, tLo, in iselWordExpr_R_wrk()
1256 addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, tHi_1, in iselWordExpr_R_wrk()
1263 HReg tHi = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1264 HReg tLo = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1265 HReg tLo_1 = newVRegI(env); in iselWordExpr_R_wrk()
1266 HReg tHi_1 = newVRegI(env); in iselWordExpr_R_wrk()
1267 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1268 HReg mask = newVRegI(env); in iselWordExpr_R_wrk()
1270 addInstr(env, MIPSInstr_Shft(Mshft_SLL, False, tHi_1, tHi, in iselWordExpr_R_wrk()
1273 addInstr(env, MIPSInstr_LI(mask, 0xffffffff)); in iselWordExpr_R_wrk()
1274 addInstr(env, MIPSInstr_Alu(Malu_AND, tLo_1, tLo, in iselWordExpr_R_wrk()
1276 addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, tHi_1, in iselWordExpr_R_wrk()
1284 HReg valS = newVRegI(env); in iselWordExpr_R_wrk()
1285 HReg tmpF = newVRegF(env); in iselWordExpr_R_wrk()
1286 HReg valF = iselFltExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1289 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1290 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTLS, tmpF, valF)); in iselWordExpr_R_wrk()
1291 set_MIPS_rounding_default(env); in iselWordExpr_R_wrk()
1295 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_dmfc1, valS, tmpF)); in iselWordExpr_R_wrk()
1303 valD = iselFltExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1305 valD = iselDblExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1306 HReg valS = newVRegF(env); in iselWordExpr_R_wrk()
1307 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1310 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1311 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTWD, valS, valD)); in iselWordExpr_R_wrk()
1312 set_MIPS_rounding_default(env); in iselWordExpr_R_wrk()
1316 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mfc1, r_dst, valS)); in iselWordExpr_R_wrk()
1351 HReg regL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1352 HReg regR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1353 HReg res = newVRegI(env); in iselWordExpr_R_wrk()
1354 addInstr(env, mk_iMOVds_RR(hregMIPS_GPR4(env->mode64), regL)); in iselWordExpr_R_wrk()
1355 addInstr(env, mk_iMOVds_RR(hregMIPS_GPR5(env->mode64), regR)); in iselWordExpr_R_wrk()
1358 addInstr(env, MIPSInstr_CallAlways( MIPScc_AL, in iselWordExpr_R_wrk()
1361 addInstr(env, mk_iMOVds_RR(res, hregMIPS_GPR2(env->mode64))); in iselWordExpr_R_wrk()
1381 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1382 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1426 addInstr(env, MIPSInstr_Shft(Mshft_SLL, sz32, r_dst, r_src, in iselWordExpr_R_wrk()
1428 addInstr(env, MIPSInstr_Shft(Mshft_SRA, sz32, r_dst, r_dst, in iselWordExpr_R_wrk()
1435 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1436 HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1439 addInstr(env, MIPSInstr_LI(r_dst, 0x1)); in iselWordExpr_R_wrk()
1440 addInstr(env, MIPSInstr_Alu(Malu_SUB, r_dst, r_dst, r_srcR)); in iselWordExpr_R_wrk()
1448 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1449 HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1452 addInstr(env, MIPSInstr_Alu(Malu_NOR, r_dst, r_srcL, r_srcR)); in iselWordExpr_R_wrk()
1457 HReg fr_src = iselFltExpr(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1458 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1462 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mfc1, r_dst, fr_src)); in iselWordExpr_R_wrk()
1469 HReg fr_src = iselFltExpr(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1470 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1474 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_dmfc1, r_dst, fr_src)); in iselWordExpr_R_wrk()
1482 valD = iselFltExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1484 valD = iselDblExpr(env, e->Iex.Binop.arg2); in iselWordExpr_R_wrk()
1485 HReg valS = newVRegF(env); in iselWordExpr_R_wrk()
1486 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1488 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselWordExpr_R_wrk()
1489 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTWD, valS, valD)); in iselWordExpr_R_wrk()
1490 set_MIPS_rounding_default(env); in iselWordExpr_R_wrk()
1494 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mfc1, r_dst, valS)); in iselWordExpr_R_wrk()
1503 return iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1506 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1507 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1508 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselWordExpr_R_wrk()
1518 r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1519 r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1520 addInstr(env, MIPSInstr_Alu(Malu_AND, r_dst, r_src, in iselWordExpr_R_wrk()
1526 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1527 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1528 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselWordExpr_R_wrk()
1541 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1542 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1566 addInstr(env, MIPSInstr_Alu(Malu_AND, r_dst, r_src, in iselWordExpr_R_wrk()
1572 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1573 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1575 addInstr(env, MIPSInstr_Shft(Mshft_SLL, False /*!32bit shift */, in iselWordExpr_R_wrk()
1577 addInstr(env, MIPSInstr_Shft(Mshft_SRL, False /*!32bit shift */, in iselWordExpr_R_wrk()
1583 if (env->mode64) { in iselWordExpr_R_wrk()
1584 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1585 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1586 addInstr(env, MIPSInstr_Shft(Mshft_SRA, False /*64bit shift */, in iselWordExpr_R_wrk()
1591 iselInt64Expr(&rHi, &rLo, env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1597 if (env->mode64) { in iselWordExpr_R_wrk()
1598 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1599 r_dst = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1603 iselInt64Expr(&rHi, &rLo, env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1609 vassert(env->mode64); in iselWordExpr_R_wrk()
1610 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1611 r_dst = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1616 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1617 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1619 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /*!32bit shift */, in iselWordExpr_R_wrk()
1626 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1627 HReg tmp = newVRegI(env); in iselWordExpr_R_wrk()
1628 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1631 addInstr(env, MIPSInstr_Alu(Malu_AND, tmp, r_src, in iselWordExpr_R_wrk()
1633 addInstr(env, MIPSInstr_Cmp(False, True, r_dst, tmp, in iselWordExpr_R_wrk()
1639 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1640 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1642 addInstr(env, MIPSInstr_Cmp(False, True, r_dst, r_src, in iselWordExpr_R_wrk()
1648 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1649 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1651 addInstr(env, MIPSInstr_Alu(Malu_SUB, r_dst, hregMIPS_GPR0(mode64), in iselWordExpr_R_wrk()
1654 addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, r_dst, in iselWordExpr_R_wrk()
1656 addInstr(env, MIPSInstr_Shft(Mshft_SRA, True, r_dst, r_dst, in iselWordExpr_R_wrk()
1667 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1668 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1670 addInstr(env, MIPSInstr_Alu(op, r_dst, in iselWordExpr_R_wrk()
1673 addInstr(env, MIPSInstr_Alu(Malu_OR, r_dst, r_dst, in iselWordExpr_R_wrk()
1681 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1682 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1684 addInstr(env, MIPSInstr_Unary(op, r_dst, r_src)); in iselWordExpr_R_wrk()
1690 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1692 if (env->mode64) { in iselWordExpr_R_wrk()
1693 r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1695 r_src = newVRegI(env); in iselWordExpr_R_wrk()
1696 iselInt64Expr(&hi, &lo, env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1697 addInstr(env, MIPSInstr_Alu(Malu_OR, r_src, lo, MIPSRH_Reg(hi))); in iselWordExpr_R_wrk()
1699 addInstr(env, MIPSInstr_Cmp(False, !(env->mode64), r_dst, r_src, in iselWordExpr_R_wrk()
1706 HReg tmp2 = newVRegI(env); in iselWordExpr_R_wrk()
1707 vassert(env->mode64); in iselWordExpr_R_wrk()
1708 tmp1 = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1710 addInstr(env, MIPSInstr_Alu(Malu_DSUB, tmp2, hregMIPS_GPR0(mode64), in iselWordExpr_R_wrk()
1713 addInstr(env, MIPSInstr_Alu(Malu_OR, tmp2, tmp2, MIPSRH_Reg(tmp1))); in iselWordExpr_R_wrk()
1714 addInstr(env, MIPSInstr_Shft(Mshft_SRA, False, tmp2, tmp2, in iselWordExpr_R_wrk()
1722 iselInt128Expr(&rHi, &rLo, env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1729 iselInt128Expr(&rHi, &rLo, env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1762 HReg regL = iselWordExpr_R(env, e->Iex.Unop.arg); in iselWordExpr_R_wrk()
1763 HReg res = newVRegI(env); in iselWordExpr_R_wrk()
1764 addInstr(env, mk_iMOVds_RR(hregMIPS_GPR4(env->mode64), regL)); in iselWordExpr_R_wrk()
1766 addInstr(env, MIPSInstr_CallAlways( MIPScc_AL, in iselWordExpr_R_wrk()
1769 addInstr(env, mk_iMOVds_RR(res, hregMIPS_GPR2(env->mode64))); in iselWordExpr_R_wrk()
1780 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1784 addInstr(env, MIPSInstr_Load(toUChar(sizeofIRType(ty)), r_dst, am_addr, in iselWordExpr_R_wrk()
1795 typeOfIRExpr(env->type_env, e->Iex.ITE.cond) == Ity_I1) { in iselWordExpr_R_wrk()
1796 HReg r_dst = iselWordExpr_R(env, e->Iex.ITE.iffalse); in iselWordExpr_R_wrk()
1797 HReg r1 = iselWordExpr_R(env, e->Iex.ITE.iftrue); in iselWordExpr_R_wrk()
1798 HReg r_cond = iselWordExpr_R(env, e->Iex.ITE.cond); in iselWordExpr_R_wrk()
1803 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, r_dst, r1, r_cond)); in iselWordExpr_R_wrk()
1813 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1833 addInstr(env, MIPSInstr_LI(r_dst, (ULong) l)); in iselWordExpr_R_wrk()
1839 HReg r_dst = newVRegI(env); in iselWordExpr_R_wrk()
1851 doHelperCall(&addToSp, &rloc, env, NULL/*guard*/, e->Iex.CCall.cee, in iselWordExpr_R_wrk()
1857 addInstr(env, mk_iMOVds_RR(r_dst, hregMIPS_GPR2(mode64))); in iselWordExpr_R_wrk()
1884 static MIPSRH *iselWordExpr_RH(ISelEnv * env, Bool syned, IRExpr * e) in iselWordExpr_RH() argument
1886 MIPSRH *ri = iselWordExpr_RH_wrk(env, syned, e); in iselWordExpr_RH()
1895 vassert(hregClass(ri->Mrh.Reg.reg) == HRcGPR(env->mode64)); in iselWordExpr_RH()
1904 static MIPSRH *iselWordExpr_RH_wrk(ISelEnv * env, Bool syned, IRExpr * e) in iselWordExpr_RH_wrk() argument
1908 IRType ty = typeOfIRExpr(env->type_env, e); in iselWordExpr_RH_wrk()
1910 ((ty == Ity_I64) && env->mode64)); in iselWordExpr_RH_wrk()
1919 vassert(env->mode64); in iselWordExpr_RH_wrk()
1945 return MIPSRH_Reg(iselWordExpr_R(env, e)); in iselWordExpr_RH_wrk()
1954 static MIPSRH *iselWordExpr_RH5u(ISelEnv * env, IRExpr * e) in iselWordExpr_RH5u() argument
1957 ri = iselWordExpr_RH5u_wrk(env, e); in iselWordExpr_RH5u()
1974 static MIPSRH *iselWordExpr_RH5u_wrk(ISelEnv * env, IRExpr * e) in iselWordExpr_RH5u_wrk() argument
1976 IRType ty = typeOfIRExpr(env->type_env, e); in iselWordExpr_RH5u_wrk()
1987 return MIPSRH_Reg(iselWordExpr_R(env, e)); in iselWordExpr_RH5u_wrk()
1993 static MIPSRH *iselWordExpr_RH6u ( ISelEnv * env, IRExpr * e ) in iselWordExpr_RH6u() argument
1996 ri = iselWordExpr_RH6u_wrk(env, e); in iselWordExpr_RH6u()
2004 vassert(hregClass(ri->Mrh.Reg.reg) == HRcGPR(env->mode64)); in iselWordExpr_RH6u()
2013 static MIPSRH *iselWordExpr_RH6u_wrk ( ISelEnv * env, IRExpr * e ) in iselWordExpr_RH6u_wrk() argument
2015 IRType ty = typeOfIRExpr(env->type_env, e); in iselWordExpr_RH6u_wrk()
2028 return MIPSRH_Reg(iselWordExpr_R(env, e)); in iselWordExpr_RH6u_wrk()
2037 static MIPSCondCode iselCondCode(ISelEnv * env, IRExpr * e) in iselCondCode() argument
2039 MIPSCondCode cc = iselCondCode_wrk(env,e); in iselCondCode()
2045 static MIPSCondCode iselCondCode_wrk(ISelEnv * env, IRExpr * e) in iselCondCode_wrk() argument
2048 vassert(typeOfIRExpr(env->type_env, e) == Ity_I1); in iselCondCode_wrk()
2068 HReg dst = newVRegI(env); in iselCondCode_wrk()
2069 HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselCondCode_wrk()
2070 HReg r2 = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselCondCode_wrk()
2122 addInstr(env, MIPSInstr_Cmp(syned, size32, dst, r1, r2, cc)); in iselCondCode_wrk()
2126 addInstr(env, MIPSInstr_Store(4, in iselCondCode_wrk()
2133 HReg r_dst = newVRegI(env); in iselCondCode_wrk()
2134 HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg); in iselCondCode_wrk()
2137 addInstr(env, MIPSInstr_LI(r_dst, 0x1)); in iselCondCode_wrk()
2138 addInstr(env, MIPSInstr_Alu(Malu_SUB, r_dst, r_dst, r_srcR)); in iselCondCode_wrk()
2142 addInstr(env, MIPSInstr_Store(4, in iselCondCode_wrk()
2149 HReg r_dst = iselWordExpr_R_wrk(env, e); in iselCondCode_wrk()
2153 addInstr(env, MIPSInstr_Store(4, in iselCondCode_wrk()
2175 static void iselInt128Expr(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e) in iselInt128Expr() argument
2177 vassert(env->mode64); in iselInt128Expr()
2178 iselInt128Expr_wrk(rHi, rLo, env, e); in iselInt128Expr()
2179 vassert(hregClass(*rHi) == HRcGPR(env->mode64)); in iselInt128Expr()
2181 vassert(hregClass(*rLo) == HRcGPR(env->mode64)); in iselInt128Expr()
2186 static void iselInt128Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env, in iselInt128Expr_wrk() argument
2190 vassert(typeOfIRExpr(env->type_env, e) == Ity_I128); in iselInt128Expr_wrk()
2194 lookupIRTempPair(rHi, rLo, env, e->Iex.RdTmp.tmp); in iselInt128Expr_wrk()
2204 HReg tLo = newVRegI(env); in iselInt128Expr_wrk()
2205 HReg tHi = newVRegI(env); in iselInt128Expr_wrk()
2207 HReg r_dst = newVRegI(env); in iselInt128Expr_wrk()
2208 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselInt128Expr_wrk()
2209 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt128Expr_wrk()
2210 addInstr(env, MIPSInstr_Mul(syned, True, False /*64bit mul */ , in iselInt128Expr_wrk()
2212 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselInt128Expr_wrk()
2213 addInstr(env, MIPSInstr_Mflo(tLo)); in iselInt128Expr_wrk()
2221 *rHi = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselInt128Expr_wrk()
2222 *rLo = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt128Expr_wrk()
2226 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselInt128Expr_wrk()
2227 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt128Expr_wrk()
2228 HReg tLo = newVRegI(env); in iselInt128Expr_wrk()
2229 HReg tHi = newVRegI(env); in iselInt128Expr_wrk()
2232 addInstr(env, MIPSInstr_Div(syned, False, r_srcL, r_srcR)); in iselInt128Expr_wrk()
2233 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselInt128Expr_wrk()
2234 addInstr(env, MIPSInstr_Mflo(tLo)); in iselInt128Expr_wrk()
2244 iselInt128Expr(&rHi1, &rLo1, env, e->Iex.Binop.arg1); in iselInt128Expr_wrk()
2246 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt128Expr_wrk()
2247 HReg tLo = newVRegI(env); in iselInt128Expr_wrk()
2248 HReg tHi = newVRegI(env); in iselInt128Expr_wrk()
2251 addInstr(env, MIPSInstr_Div(syned, False, rLo1, r_srcR)); in iselInt128Expr_wrk()
2252 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselInt128Expr_wrk()
2253 addInstr(env, MIPSInstr_Mflo(tLo)); in iselInt128Expr_wrk()
2276 static void iselInt64Expr(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e) in iselInt64Expr() argument
2278 vassert(!env->mode64); in iselInt64Expr()
2279 iselInt64Expr_wrk(rHi, rLo, env, e); in iselInt64Expr()
2287 static void iselInt64Expr_wrk(HReg * rHi, HReg * rLo, ISelEnv * env, IRExpr * e) in iselInt64Expr_wrk() argument
2290 vassert(typeOfIRExpr(env->type_env, e) == Ity_I64); in iselInt64Expr_wrk()
2294 lookupIRTemp64(rHi, rLo, env, e->Iex.RdTmp.tmp); in iselInt64Expr_wrk()
2299 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2300 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2301 HReg r_addr = iselWordExpr_R(env, e->Iex.Load.addr); in iselInt64Expr_wrk()
2302 addInstr(env, MIPSInstr_Load(4, tHi, MIPSAMode_IR(0, r_addr), mode64)); in iselInt64Expr_wrk()
2303 addInstr(env, MIPSInstr_Load(4, tLo, MIPSAMode_IR(4, r_addr), mode64)); in iselInt64Expr_wrk()
2314 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2315 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2320 addInstr(env, MIPSInstr_LI(tLo, (ULong) wLo)); in iselInt64Expr_wrk()
2324 addInstr(env, MIPSInstr_LI(tHi, (ULong) wHi)); in iselInt64Expr_wrk()
2325 addInstr(env, MIPSInstr_LI(tLo, (ULong) wLo)); in iselInt64Expr_wrk()
2335 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2336 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2340 addInstr(env, MIPSInstr_Load(4, tLo, am_addr, mode64)); in iselInt64Expr_wrk()
2341 addInstr(env, MIPSInstr_Load(4, tHi, nextMIPSAModeInt(am_addr), mode64)); in iselInt64Expr_wrk()
2349 vassert(typeOfIRExpr(env->type_env, e->Iex.ITE.cond) == Ity_I1); in iselInt64Expr_wrk()
2352 HReg desLo = newVRegI(env); in iselInt64Expr_wrk()
2353 HReg desHi = newVRegI(env); in iselInt64Expr_wrk()
2354 HReg cond = iselWordExpr_R(env, e->Iex.ITE.cond); in iselInt64Expr_wrk()
2358 iselInt64Expr(&expr0Hi, &expr0Lo, env, e->Iex.ITE.iffalse); in iselInt64Expr_wrk()
2359 iselInt64Expr(&expr1Hi, &expr1Lo, env, e->Iex.ITE.iftrue); in iselInt64Expr_wrk()
2365 addInstr(env, mk_iMOVds_RR(desLo, expr0Lo)); in iselInt64Expr_wrk()
2366 addInstr(env, mk_iMOVds_RR(desHi, expr0Hi)); in iselInt64Expr_wrk()
2367 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, desLo, expr1Lo, cond)); in iselInt64Expr_wrk()
2368 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, desHi, expr1Hi, cond)); in iselInt64Expr_wrk()
2384 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2385 HReg tHi1 = newVRegI(env); in iselInt64Expr_wrk()
2386 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2388 carryBit = newVRegI(env); in iselInt64Expr_wrk()
2393 iselInt64Expr(&xHi, &xLo, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2394 iselInt64Expr(&yHi, &yLo, env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2395 addInstr(env, MIPSInstr_Alu(Malu_ADD, tLo, xLo, MIPSRH_Reg(yLo))); in iselInt64Expr_wrk()
2398 addInstr(env, MIPSInstr_Cmp(False, size32, carryBit, tLo, xLo, cc)); in iselInt64Expr_wrk()
2400 addInstr(env, MIPSInstr_Alu(Malu_ADD, tHi1, xHi, MIPSRH_Reg(yHi))); in iselInt64Expr_wrk()
2401 addInstr(env, MIPSInstr_Alu(Malu_ADD, tHi, tHi1, in iselInt64Expr_wrk()
2413 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2414 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2416 borrow = newVRegI(env); in iselInt64Expr_wrk()
2418 iselInt64Expr(&xHi, &xLo, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2419 iselInt64Expr(&yHi, &yLo, env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2421 addInstr(env, MIPSInstr_Alu(Malu_SUB, tLo, xLo, MIPSRH_Reg(yLo))); in iselInt64Expr_wrk()
2424 addInstr(env, MIPSInstr_Cmp(False, size32, borrow, xLo, yLo, cc)); in iselInt64Expr_wrk()
2426 addInstr(env, MIPSInstr_Alu(Malu_ADD, yHi, yHi, in iselInt64Expr_wrk()
2428 addInstr(env, MIPSInstr_Alu(Malu_SUB, tHi, xHi, MIPSRH_Reg(yHi))); in iselInt64Expr_wrk()
2436 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2437 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2438 HReg r_dst = newVRegI(env); in iselInt64Expr_wrk()
2440 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2441 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2443 addInstr(env, MIPSInstr_Mul(syned /*Unsigned or Signed */, in iselInt64Expr_wrk()
2446 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselInt64Expr_wrk()
2447 addInstr(env, MIPSInstr_Mflo(tLo)); in iselInt64Expr_wrk()
2456 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2457 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2459 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2461 iselInt64Expr(&r_sHi, &r_sLo, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2462 addInstr(env, MIPSInstr_Div(syned, True, r_sLo, r_srcR)); in iselInt64Expr_wrk()
2463 addInstr(env, MIPSInstr_Mfhi(tHi)); in iselInt64Expr_wrk()
2464 addInstr(env, MIPSInstr_Mflo(tLo)); in iselInt64Expr_wrk()
2473 *rHi = iselWordExpr_R(env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2474 *rLo = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2482 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2483 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2486 iselInt64Expr(&xHi, &xLo, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2487 iselInt64Expr(&yHi, &yLo, env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2488 addInstr(env, MIPSInstr_Alu(op, tHi, xHi, MIPSRH_Reg(yHi))); in iselInt64Expr_wrk()
2489 addInstr(env, MIPSInstr_Alu(op, tLo, xLo, MIPSRH_Reg(yLo))); in iselInt64Expr_wrk()
2511 HReg a0tmp = newVRegI(env); in iselInt64Expr_wrk()
2512 HReg a2 = newVRegI(env); in iselInt64Expr_wrk()
2513 HReg a3 = newVRegI(env); in iselInt64Expr_wrk()
2514 HReg v0 = newVRegI(env); in iselInt64Expr_wrk()
2515 HReg v1 = newVRegI(env); in iselInt64Expr_wrk()
2516 HReg zero = newVRegI(env); in iselInt64Expr_wrk()
2519 iselInt64Expr(&a1, &a0, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2520 sa = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2523 addInstr(env, MIPSInstr_LI(a2, sa->Mrh.Imm.imm16)); in iselInt64Expr_wrk()
2526 addInstr(env, MIPSInstr_Alu(Malu_AND, a2, sa->Mrh.Reg.reg, in iselInt64Expr_wrk()
2530 addInstr(env, MIPSInstr_LI(zero, 0x00000000)); in iselInt64Expr_wrk()
2532 addInstr(env, MIPSInstr_Alu(Malu_NOR, v0, zero, MIPSRH_Reg(a2))); in iselInt64Expr_wrk()
2534 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2537 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2540 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2543 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2546 addInstr(env, MIPSInstr_Alu(Malu_AND, a0tmp, a2, in iselInt64Expr_wrk()
2549 addInstr(env, MIPSInstr_Alu(Malu_OR, v0, a3, MIPSRH_Reg(v0))); in iselInt64Expr_wrk()
2552 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, v0, v1, a0tmp)); in iselInt64Expr_wrk()
2554 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, v1, zero, a0tmp)); in iselInt64Expr_wrk()
2575 HReg a2 = newVRegI(env); in iselInt64Expr_wrk()
2576 HReg a2tmp = newVRegI(env); in iselInt64Expr_wrk()
2577 HReg a3 = newVRegI(env); in iselInt64Expr_wrk()
2578 HReg v0 = newVRegI(env); in iselInt64Expr_wrk()
2579 HReg v1 = newVRegI(env); in iselInt64Expr_wrk()
2580 HReg zero = newVRegI(env); in iselInt64Expr_wrk()
2583 iselInt64Expr(&a0, &a1, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2584 sa = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2587 addInstr(env, MIPSInstr_LI(a2, sa->Mrh.Imm.imm16)); in iselInt64Expr_wrk()
2590 addInstr(env, MIPSInstr_Alu(Malu_AND, a2, sa->Mrh.Reg.reg, in iselInt64Expr_wrk()
2594 addInstr(env, MIPSInstr_LI(zero, 0x00000000)); in iselInt64Expr_wrk()
2596 addInstr(env, MIPSInstr_Alu(Malu_NOR, v0, zero, MIPSRH_Reg(a2))); in iselInt64Expr_wrk()
2598 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2601 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2604 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2607 addInstr(env, MIPSInstr_Alu(Malu_AND, v0, a2, in iselInt64Expr_wrk()
2610 addInstr(env, MIPSInstr_Alu(Malu_OR, v1, a3, MIPSRH_Reg(v1))); in iselInt64Expr_wrk()
2612 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2616 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, v1, a2tmp, v0)); in iselInt64Expr_wrk()
2618 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, a2tmp, zero, v0)); in iselInt64Expr_wrk()
2620 addInstr(env, mk_iMOVds_RR(v0, a2tmp)); in iselInt64Expr_wrk()
2644 HReg a2 = newVRegI(env); in iselInt64Expr_wrk()
2645 HReg a3 = newVRegI(env); in iselInt64Expr_wrk()
2646 HReg v0 = newVRegI(env); in iselInt64Expr_wrk()
2647 HReg v1 = newVRegI(env); in iselInt64Expr_wrk()
2648 HReg zero = newVRegI(env); in iselInt64Expr_wrk()
2651 iselInt64Expr(&a1, &a0, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2652 sa = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2655 addInstr(env, MIPSInstr_LI(a2, sa->Mrh.Imm.imm16)); in iselInt64Expr_wrk()
2658 addInstr(env, MIPSInstr_Alu(Malu_AND, a2, sa->Mrh.Reg.reg, in iselInt64Expr_wrk()
2662 addInstr(env, MIPSInstr_LI(zero, 0x00000000)); in iselInt64Expr_wrk()
2664 addInstr(env, MIPSInstr_Alu(Malu_NOR, v0, zero, MIPSRH_Reg(a2))); in iselInt64Expr_wrk()
2666 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2669 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2672 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2675 addInstr(env, MIPSInstr_Alu(Malu_AND, v0, a2, in iselInt64Expr_wrk()
2678 addInstr(env, MIPSInstr_Alu(Malu_OR, v1, a3, MIPSRH_Reg(v1))); in iselInt64Expr_wrk()
2680 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2684 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, v1, a2, v0)); in iselInt64Expr_wrk()
2686 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, a2, zero, v0)); in iselInt64Expr_wrk()
2687 addInstr(env, mk_iMOVds_RR(v0, a2)); in iselInt64Expr_wrk()
2710 HReg a0tmp = newVRegI(env); in iselInt64Expr_wrk()
2711 HReg a1tmp = newVRegI(env); in iselInt64Expr_wrk()
2712 HReg a2 = newVRegI(env); in iselInt64Expr_wrk()
2713 HReg a3 = newVRegI(env); in iselInt64Expr_wrk()
2714 HReg v0 = newVRegI(env); in iselInt64Expr_wrk()
2715 HReg v1 = newVRegI(env); in iselInt64Expr_wrk()
2716 HReg zero = newVRegI(env); in iselInt64Expr_wrk()
2719 iselInt64Expr(&a1, &a0, env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2720 sa = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2723 addInstr(env, MIPSInstr_LI(a2, sa->Mrh.Imm.imm16)); in iselInt64Expr_wrk()
2726 addInstr(env, MIPSInstr_Alu(Malu_AND, a2, sa->Mrh.Reg.reg, in iselInt64Expr_wrk()
2730 addInstr(env, MIPSInstr_LI(zero, 0x00000000)); in iselInt64Expr_wrk()
2732 addInstr(env, MIPSInstr_Alu(Malu_NOR, v0, zero, MIPSRH_Reg(a2))); in iselInt64Expr_wrk()
2734 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2737 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True /* 32bit shift */, in iselInt64Expr_wrk()
2740 addInstr(env, MIPSInstr_Shft(Mshft_SRL, True /* 32bit shift */, in iselInt64Expr_wrk()
2743 addInstr(env, MIPSInstr_Shft(Mshft_SRA, True /* 32bit shift */, in iselInt64Expr_wrk()
2746 addInstr(env, MIPSInstr_Alu(Malu_AND, a0tmp, a2, in iselInt64Expr_wrk()
2749 addInstr(env, MIPSInstr_Shft(Mshft_SRA, True /* 32bit shift */, in iselInt64Expr_wrk()
2752 addInstr(env, MIPSInstr_Alu(Malu_OR, v0, a3, MIPSRH_Reg(v0))); in iselInt64Expr_wrk()
2755 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, v0, v1, a0tmp)); in iselInt64Expr_wrk()
2757 addInstr(env, MIPSInstr_MoveCond(MMoveCond_movn, v1, a1tmp, a0tmp)); in iselInt64Expr_wrk()
2765 HReg tmpD = newVRegD(env); in iselInt64Expr_wrk()
2766 HReg valF = iselFltExpr(env, e->Iex.Binop.arg2); in iselInt64Expr_wrk()
2767 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2768 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2772 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselInt64Expr_wrk()
2773 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTLS, tmpD, valF)); in iselInt64Expr_wrk()
2774 set_MIPS_rounding_default(env); in iselInt64Expr_wrk()
2776 sub_from_sp(env, 16); /* Move SP down 16 bytes */ in iselInt64Expr_wrk()
2780 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 8, tmpD, in iselInt64Expr_wrk()
2784 addInstr(env, MIPSInstr_Load(4, tLo, am_addr, mode64)); in iselInt64Expr_wrk()
2785 addInstr(env, MIPSInstr_Load(4, tHi, nextMIPSAModeFloat(am_addr), in iselInt64Expr_wrk()
2788 addInstr(env, MIPSInstr_Load(4, tHi, am_addr, mode64)); in iselInt64Expr_wrk()
2789 addInstr(env, MIPSInstr_Load(4, tLo, nextMIPSAModeFloat(am_addr), in iselInt64Expr_wrk()
2794 add_to_sp(env, 16); in iselInt64Expr_wrk()
2811 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2812 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2813 HReg src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2814 HReg tmp = newVRegI(env); in iselInt64Expr_wrk()
2816 addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, tmp, src, in iselInt64Expr_wrk()
2818 addInstr(env, MIPSInstr_Shft(Mshft_SRA, True, tmp, tmp, in iselInt64Expr_wrk()
2821 addInstr(env, mk_iMOVds_RR(tHi, tmp)); in iselInt64Expr_wrk()
2822 addInstr(env, mk_iMOVds_RR(tLo, tmp)); in iselInt64Expr_wrk()
2831 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2832 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2833 HReg src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2834 addInstr(env, mk_iMOVds_RR(tHi, src)); in iselInt64Expr_wrk()
2835 addInstr(env, mk_iMOVds_RR(tLo, src)); in iselInt64Expr_wrk()
2836 addInstr(env, MIPSInstr_Shft(Mshft_SRA, True, tHi, tHi, in iselInt64Expr_wrk()
2845 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2846 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2847 HReg src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2848 addInstr(env, MIPSInstr_Alu(Malu_AND, tLo, src, in iselInt64Expr_wrk()
2850 addInstr(env, MIPSInstr_Alu(Malu_ADD, tHi, hregMIPS_GPR0(mode64), in iselInt64Expr_wrk()
2859 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2860 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2861 HReg src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2862 addInstr(env, mk_iMOVds_RR(tLo, src)); in iselInt64Expr_wrk()
2863 addInstr(env, MIPSInstr_Alu(Malu_ADD, tHi, hregMIPS_GPR0(mode64), in iselInt64Expr_wrk()
2872 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2873 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2874 HReg tmp = newVRegI(env); in iselInt64Expr_wrk()
2875 HReg tmp1 = newVRegI(env); in iselInt64Expr_wrk()
2876 HReg tmp2 = newVRegI(env); in iselInt64Expr_wrk()
2877 HReg zero = newVRegI(env); in iselInt64Expr_wrk()
2881 iselInt64Expr(&yHi, &yLo, env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2883 addInstr(env, MIPSInstr_LI(zero, 0x00000000)); in iselInt64Expr_wrk()
2886 addInstr(env, MIPSInstr_Alu(Malu_SUB, tmp2, zero, MIPSRH_Reg(yLo))); in iselInt64Expr_wrk()
2887 addInstr(env, MIPSInstr_Cmp(False, True, tmp1, zero, tmp2, cc)); in iselInt64Expr_wrk()
2888 addInstr(env, MIPSInstr_Alu(Malu_SUB, tmp, zero, MIPSRH_Reg(yHi))); in iselInt64Expr_wrk()
2889 addInstr(env, MIPSInstr_Alu(Malu_SUB, tmp1, tmp, MIPSRH_Reg(tmp1))); in iselInt64Expr_wrk()
2894 addInstr(env, MIPSInstr_Alu(Malu_OR, tHi, yHi, MIPSRH_Reg(tmp1))); in iselInt64Expr_wrk()
2895 addInstr(env, MIPSInstr_Alu(Malu_OR, tLo, yLo, MIPSRH_Reg(tmp2))); in iselInt64Expr_wrk()
2903 HReg tmp1 = newVRegI(env); in iselInt64Expr_wrk()
2904 HReg tmp2 = newVRegI(env); in iselInt64Expr_wrk()
2906 iselInt64Expr(&srcHi, &srcLo, env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2908 addInstr(env, MIPSInstr_Alu(Malu_OR, tmp1, srcLo, in iselInt64Expr_wrk()
2912 addInstr(env, MIPSInstr_Alu(Malu_SUB, tmp2, hregMIPS_GPR0(mode64), in iselInt64Expr_wrk()
2915 addInstr(env, MIPSInstr_Alu(Malu_OR, tmp2, tmp2, MIPSRH_Reg(tmp1))); in iselInt64Expr_wrk()
2916 addInstr(env, MIPSInstr_Shft(Mshft_SRA, True, tmp2, tmp2, in iselInt64Expr_wrk()
2924 HReg tLo = newVRegI(env); in iselInt64Expr_wrk()
2925 HReg tHi = newVRegI(env); in iselInt64Expr_wrk()
2927 HReg fr_src = iselDblExpr(env, e->Iex.Unop.arg); in iselInt64Expr_wrk()
2929 sub_from_sp(env, 16); /* Move SP down 16 bytes */ in iselInt64Expr_wrk()
2933 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 8, fr_src, in iselInt64Expr_wrk()
2937 addInstr(env, MIPSInstr_Load(4, tLo, am_addr, mode64)); in iselInt64Expr_wrk()
2938 addInstr(env, MIPSInstr_Load(4, tHi, nextMIPSAModeFloat(am_addr), in iselInt64Expr_wrk()
2941 addInstr(env, MIPSInstr_Load(4, tHi, am_addr, mode64)); in iselInt64Expr_wrk()
2942 addInstr(env, MIPSInstr_Load(4, tLo, nextMIPSAModeFloat(am_addr), in iselInt64Expr_wrk()
2947 add_to_sp(env, 16); in iselInt64Expr_wrk()
2973 static HReg iselFltExpr(ISelEnv * env, IRExpr * e) in iselFltExpr() argument
2975 HReg r = iselFltExpr_wrk(env, e); in iselFltExpr()
2981 static HReg iselFltExpr_wrk(ISelEnv * env, IRExpr * e) in iselFltExpr_wrk() argument
2983 IRType ty = typeOfIRExpr(env->type_env, e); in iselFltExpr_wrk()
2987 return lookupIRTemp(env, e->Iex.RdTmp.tmp); in iselFltExpr_wrk()
2994 MIPSAMode *am_addr = iselWordExpr_AMode(env, e->Iex.Load.addr, ty); in iselFltExpr_wrk()
2996 r_dst = newVRegD(env); in iselFltExpr_wrk()
2997 addInstr(env, MIPSInstr_FpLdSt(True /*load */, 8, r_dst, am_addr)); in iselFltExpr_wrk()
2999 r_dst = newVRegF(env); in iselFltExpr_wrk()
3000 addInstr(env, MIPSInstr_FpLdSt(True /*load */, 4, r_dst, am_addr)); in iselFltExpr_wrk()
3010 r_dst = newVRegD(env); in iselFltExpr_wrk()
3011 addInstr(env, MIPSInstr_FpLdSt(True /*load */, 8, r_dst, am_addr)); in iselFltExpr_wrk()
3013 r_dst = newVRegF(env); in iselFltExpr_wrk()
3014 addInstr(env, MIPSInstr_FpLdSt(True /*load */, 4, r_dst, am_addr)); in iselFltExpr_wrk()
3022 HReg fr_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3023 HReg r_dst = newVRegF(env); in iselFltExpr_wrk()
3027 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mtc1, r_dst, fr_src)); in iselFltExpr_wrk()
3033 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3034 HReg dst = newVRegD(env); in iselFltExpr_wrk()
3036 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTDS, dst, src)); in iselFltExpr_wrk()
3042 HReg fr_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3043 r_dst = newVRegF(env); in iselFltExpr_wrk()
3046 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_dmtc1, r_dst, fr_src)); in iselFltExpr_wrk()
3049 r_dst = newVRegD(env); in iselFltExpr_wrk()
3050 iselInt64Expr(&Hi, &Lo, env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3051 r_dst = mk_LoadRR32toFPR(env, Hi, Lo); /* 2*I32 -> F64 */ in iselFltExpr_wrk()
3057 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3058 HReg tmp = newVRegF(env); in iselFltExpr_wrk()
3059 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3063 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mtc1, tmp, r_src)); in iselFltExpr_wrk()
3066 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTDW, dst, tmp)); in iselFltExpr_wrk()
3073 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3074 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3075 addInstr(env, MIPSInstr_FpUnary(sz32 ? Mfp_ABSS : Mfp_ABSD, dst, src)); in iselFltExpr_wrk()
3081 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3082 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3083 addInstr(env, MIPSInstr_FpUnary(sz32 ? Mfp_NEGS : Mfp_NEGD, dst, src)); in iselFltExpr_wrk()
3088 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3089 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3090 addInstr(env, MIPSInstr_FpConvert(Mfp_TRULD, dst, src)); in iselFltExpr_wrk()
3095 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3096 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3097 addInstr(env, MIPSInstr_FpConvert(Mfp_ROUNDLD, dst, src)); in iselFltExpr_wrk()
3102 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3103 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3104 addInstr(env, MIPSInstr_FpConvert(Mfp_FLOORLD, dst, src)); in iselFltExpr_wrk()
3109 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3110 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3111 addInstr(env, MIPSInstr_FpConvert(Mfp_CEILLD, dst, src)); in iselFltExpr_wrk()
3131 HReg argL = iselFltExpr(env, e->Iex.Triop.details->arg2); in iselFltExpr_wrk()
3132 HReg argR = iselFltExpr(env, e->Iex.Triop.details->arg3); in iselFltExpr_wrk()
3133 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3166 set_MIPS_rounding_mode(env, e->Iex.Triop.details->arg1); in iselFltExpr_wrk()
3167 addInstr(env, MIPSInstr_FpBinary(op, dst, argL, argR)); in iselFltExpr_wrk()
3168 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3181 valD = iselFltExpr(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3183 valD = iselDblExpr(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3184 HReg valS = newVRegF(env); in iselFltExpr_wrk()
3186 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3187 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTSD, valS, valD)); in iselFltExpr_wrk()
3188 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3193 HReg valS = newVRegF(env); in iselFltExpr_wrk()
3194 HReg valF = iselFltExpr(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3196 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3197 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTWS, valS, valF)); in iselFltExpr_wrk()
3198 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3203 HReg valS = newVRegF(env); in iselFltExpr_wrk()
3204 HReg valF = iselFltExpr(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3206 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3207 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTLD, valS, valF)); in iselFltExpr_wrk()
3208 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3213 HReg r_dst = newVRegF(env); in iselFltExpr_wrk()
3214 HReg fr_src = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3215 HReg tmp = newVRegF(env); in iselFltExpr_wrk()
3219 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mtc1, tmp, fr_src)); in iselFltExpr_wrk()
3221 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3222 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTSW, r_dst, tmp)); in iselFltExpr_wrk()
3223 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3229 HReg r_dst = newVRegF(env); in iselFltExpr_wrk()
3233 tmp = newVRegF(env); in iselFltExpr_wrk()
3234 fr_src = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3236 sub_from_sp(env, 8); in iselFltExpr_wrk()
3240 addInstr(env, MIPSInstr_Store(8, am_addr, fr_src, mode64)); in iselFltExpr_wrk()
3243 addInstr(env, MIPSInstr_FpLdSt(True /*load */, 8, tmp, am_addr)); in iselFltExpr_wrk()
3246 add_to_sp(env, 8); in iselFltExpr_wrk()
3249 tmp = newVRegD(env); in iselFltExpr_wrk()
3250 iselInt64Expr(&Hi, &Lo, env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3251 tmp = mk_LoadRR32toFPR(env, Hi, Lo); /* 2*I32 -> F64 */ in iselFltExpr_wrk()
3254 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3255 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTDL, r_dst, tmp)); in iselFltExpr_wrk()
3256 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3262 HReg r_dst = newVRegF(env); in iselFltExpr_wrk()
3266 tmp = newVRegF(env); in iselFltExpr_wrk()
3267 fr_src = iselWordExpr_R(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3269 sub_from_sp(env, 8); in iselFltExpr_wrk()
3273 addInstr(env, MIPSInstr_Store(8, am_addr, fr_src, mode64)); in iselFltExpr_wrk()
3276 addInstr(env, MIPSInstr_FpLdSt(True /*load */, 8, tmp, am_addr)); in iselFltExpr_wrk()
3279 add_to_sp(env, 8); in iselFltExpr_wrk()
3282 tmp = newVRegD(env); in iselFltExpr_wrk()
3283 iselInt64Expr(&Hi, &Lo, env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3284 tmp = mk_LoadRR32toFPR(env, Hi, Lo); /* 2*I32 -> F64 */ in iselFltExpr_wrk()
3287 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3288 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTSL, r_dst, tmp)); in iselFltExpr_wrk()
3289 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3297 HReg src = iselFltExpr(env, e->Iex.Binop.arg2); in iselFltExpr_wrk()
3298 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3299 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselFltExpr_wrk()
3300 addInstr(env, MIPSInstr_FpUnary(sz32 ? Mfp_SQRTS : Mfp_SQRTD, dst, in iselFltExpr_wrk()
3302 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3334 HReg dst = newVRegF(env); in iselFltExpr_wrk()
3335 HReg src1 = iselFltExpr(env, e->Iex.Qop.details->arg2); in iselFltExpr_wrk()
3336 HReg src2 = iselFltExpr(env, e->Iex.Qop.details->arg3); in iselFltExpr_wrk()
3337 HReg src3 = iselFltExpr(env, e->Iex.Qop.details->arg4); in iselFltExpr_wrk()
3338 set_MIPS_rounding_mode(env, e->Iex.Qop.details->arg1); in iselFltExpr_wrk()
3339 addInstr(env, MIPSInstr_FpTernary(op, dst, in iselFltExpr_wrk()
3341 set_MIPS_rounding_default(env); in iselFltExpr_wrk()
3379 HReg fsrc = iselDblExpr(env, e->Iex.Unop.arg); in iselFltExpr_wrk()
3380 HReg fdst = newVRegF(env); in iselFltExpr_wrk()
3383 sub_from_sp(env, 16); in iselFltExpr_wrk()
3385 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 4, fsrc, zero_r1)); in iselFltExpr_wrk()
3387 addInstr(env, MIPSInstr_FpLdSt(True /*load */ , 4, fdst, zero_r1)); in iselFltExpr_wrk()
3388 add_to_sp(env, 16); in iselFltExpr_wrk()
3395 && typeOfIRExpr(env->type_env, e->Iex.ITE.cond) == Ity_I1) { in iselFltExpr_wrk()
3397 HReg r0 = iselFltExpr(env, e->Iex.ITE.iffalse); in iselFltExpr_wrk()
3398 HReg r1 = iselFltExpr(env, e->Iex.ITE.iftrue); in iselFltExpr_wrk()
3399 HReg r_cond = iselWordExpr_R(env, e->Iex.ITE.cond); in iselFltExpr_wrk()
3400 HReg r_dst = newVRegF(env); in iselFltExpr_wrk()
3401 addInstr(env, MIPSInstr_FpUnary(Mfp_MOVD, r_dst, r0)); in iselFltExpr_wrk()
3402 addInstr(env, MIPSInstr_MoveCond(MFpMoveCond_movnd, r_dst, r1, in iselFltExpr_wrk()
3413 static HReg iselDblExpr(ISelEnv * env, IRExpr * e) in iselDblExpr() argument
3415 HReg r = iselDblExpr_wrk(env, e); in iselDblExpr()
3422 static HReg iselDblExpr_wrk(ISelEnv * env, IRExpr * e) in iselDblExpr_wrk() argument
3424 IRType ty = typeOfIRExpr(env->type_env, e); in iselDblExpr_wrk()
3429 return lookupIRTemp(env, e->Iex.RdTmp.tmp); in iselDblExpr_wrk()
3434 HReg r_dst = newVRegD(env); in iselDblExpr_wrk()
3437 am_addr = iselWordExpr_AMode(env, e->Iex.Load.addr, ty); in iselDblExpr_wrk()
3438 addInstr(env, MIPSInstr_FpLdSt(True /*load */ , 8, r_dst, am_addr)); in iselDblExpr_wrk()
3445 HReg r_dst = newVRegD(env); in iselDblExpr_wrk()
3448 addInstr(env, MIPSInstr_FpLdSt(True /*load */ , 8, r_dst, am_addr)); in iselDblExpr_wrk()
3463 HReg src = iselFltExpr(env, e->Iex.Unop.arg); in iselDblExpr_wrk()
3464 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3466 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTDS, dst, src)); in iselDblExpr_wrk()
3471 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3473 iselInt64Expr(&Hi, &Lo, env, e->Iex.Unop.arg); in iselDblExpr_wrk()
3475 dst = mk_LoadRR32toFPR(env, Hi, Lo); /* 2*I32 -> F64 */ in iselDblExpr_wrk()
3480 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3481 HReg tmp = newVRegF(env); in iselDblExpr_wrk()
3482 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); in iselDblExpr_wrk()
3486 addInstr(env, MIPSInstr_FpGpMove(MFpGpMove_mtc1, tmp, r_src)); in iselDblExpr_wrk()
3489 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTDW, dst, tmp)); in iselDblExpr_wrk()
3498 HReg src = iselDblExpr(env, e->Iex.Unop.arg); in iselDblExpr_wrk()
3499 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3500 addInstr(env, MIPSInstr_FpUnary(fpop, dst, src)); in iselDblExpr_wrk()
3508 HReg src = iselDblExpr(env, e->Iex.Binop.arg2); in iselDblExpr_wrk()
3509 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3511 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselDblExpr_wrk()
3512 addInstr(env, MIPSInstr_FpConvert(Mfp_CVTLD, dst, src)); in iselDblExpr_wrk()
3513 set_MIPS_rounding_default(env); in iselDblExpr_wrk()
3519 HReg src = iselDblExpr(env, e->Iex.Binop.arg2); in iselDblExpr_wrk()
3520 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3521 set_MIPS_rounding_mode(env, e->Iex.Binop.arg1); in iselDblExpr_wrk()
3522 addInstr(env, MIPSInstr_FpUnary(Mfp_SQRTD, dst, src)); in iselDblExpr_wrk()
3523 set_MIPS_rounding_default(env); in iselDblExpr_wrk()
3541 HReg argL = iselDblExpr(env, e->Iex.Triop.details->arg2); in iselDblExpr_wrk()
3542 HReg argR = iselDblExpr(env, e->Iex.Triop.details->arg3); in iselDblExpr_wrk()
3543 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3563 set_MIPS_rounding_mode(env, e->Iex.Triop.details->arg1); in iselDblExpr_wrk()
3564 addInstr(env, MIPSInstr_FpBinary(op, dst, argL, argR)); in iselDblExpr_wrk()
3565 set_MIPS_rounding_default(env); in iselDblExpr_wrk()
3596 HReg dst = newVRegD(env); in iselDblExpr_wrk()
3597 HReg src1 = iselDblExpr(env, e->Iex.Qop.details->arg2); in iselDblExpr_wrk()
3598 HReg src2 = iselDblExpr(env, e->Iex.Qop.details->arg3); in iselDblExpr_wrk()
3599 HReg src3 = iselDblExpr(env, e->Iex.Qop.details->arg4); in iselDblExpr_wrk()
3600 set_MIPS_rounding_mode(env, e->Iex.Qop.details->arg1); in iselDblExpr_wrk()
3601 addInstr(env, MIPSInstr_FpTernary(op, dst, in iselDblExpr_wrk()
3603 set_MIPS_rounding_default(env); in iselDblExpr_wrk()
3615 && typeOfIRExpr(env->type_env, e->Iex.ITE.cond) == Ity_I1) { in iselDblExpr_wrk()
3616 HReg r0 = iselDblExpr(env, e->Iex.ITE.iffalse); in iselDblExpr_wrk()
3617 HReg r1 = iselDblExpr(env, e->Iex.ITE.iftrue); in iselDblExpr_wrk()
3618 HReg r_cond = iselWordExpr_R(env, e->Iex.ITE.cond); in iselDblExpr_wrk()
3619 HReg r_dst = newVRegD(env); in iselDblExpr_wrk()
3621 addInstr(env, MIPSInstr_FpUnary(Mfp_MOVD, r_dst, r0)); in iselDblExpr_wrk()
3622 addInstr(env, MIPSInstr_MoveCond(MFpMoveCond_movnd, r_dst, r1, in iselDblExpr_wrk()
3637 static void iselStmt(ISelEnv * env, IRStmt * stmt) in iselStmt() argument
3650 IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data); in iselStmt()
3653 am_addr = iselWordExpr_AMode(env, stmt->Ist.Store.addr, tyd); in iselStmt()
3657 HReg r_src = iselWordExpr_R(env, stmt->Ist.Store.data); in iselStmt()
3658 addInstr(env, MIPSInstr_Store(toUChar(sizeofIRType(tyd)), in iselStmt()
3664 HReg r_addr = iselWordExpr_R(env, stmt->Ist.Store.addr); in iselStmt()
3666 iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data); in iselStmt()
3668 addInstr(env, MIPSInstr_Store(toUChar(sizeofIRType(Ity_I32)), in iselStmt()
3670 addInstr(env, MIPSInstr_Store(toUChar(sizeofIRType(Ity_I32)), in iselStmt()
3675 HReg fr_src = iselFltExpr(env, stmt->Ist.Store.data); in iselStmt()
3676 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 4, fr_src, in iselStmt()
3681 HReg fr_src = iselFltExpr(env, stmt->Ist.Store.data); in iselStmt()
3682 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 8, fr_src, in iselStmt()
3687 HReg fr_src = iselDblExpr(env, stmt->Ist.Store.data); in iselStmt()
3688 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 8, fr_src, in iselStmt()
3698 IRType ty = typeOfIRExpr(env->type_env, stmt->Ist.Put.data); in iselStmt()
3702 HReg r_src = iselWordExpr_R(env, stmt->Ist.Put.data); in iselStmt()
3705 addInstr(env, MIPSInstr_Store(toUChar(sizeofIRType(ty)), in iselStmt()
3716 iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Put.data); in iselStmt()
3717 addInstr(env, MIPSInstr_Store(toUChar(sizeofIRType(Ity_I32)), in iselStmt()
3719 addInstr(env, MIPSInstr_Store(toUChar(sizeofIRType(Ity_I32)), in iselStmt()
3726 HReg fr_src = iselFltExpr(env, stmt->Ist.Put.data); in iselStmt()
3729 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 4, fr_src, in iselStmt()
3735 HReg fr_src = iselFltExpr(env, stmt->Ist.Put.data); in iselStmt()
3738 addInstr(env, MIPSInstr_FpLdSt(False /*store */ , 8, fr_src, in iselStmt()
3748 IRType ty = typeOfIRTemp(env->type_env, tmp); in iselStmt()
3751 HReg r_dst = lookupIRTemp(env, tmp); in iselStmt()
3752 HReg r_src = iselWordExpr_R(env, stmt->Ist.WrTmp.data); in iselStmt()
3753 addInstr(env, mk_iMOVds_RR(r_dst, r_src)); in iselStmt()
3759 HReg r_dst = lookupIRTemp(env, tmp); in iselStmt()
3760 HReg r_src = iselWordExpr_R(env, stmt->Ist.WrTmp.data); in iselStmt()
3761 addInstr(env, mk_iMOVds_RR(r_dst, r_src)); in iselStmt()
3765 iselInt64Expr(&rHi, &rLo, env, stmt->Ist.WrTmp.data); in iselStmt()
3766 lookupIRTemp64(&dstHi, &dstLo, env, tmp); in iselStmt()
3767 addInstr(env, mk_iMOVds_RR(dstHi, rHi)); in iselStmt()
3768 addInstr(env, mk_iMOVds_RR(dstLo, rLo)); in iselStmt()
3775 iselInt128Expr(&rHi, &rLo, env, stmt->Ist.WrTmp.data); in iselStmt()
3776 lookupIRTempPair(&dstHi, &dstLo, env, tmp); in iselStmt()
3777 addInstr(env, mk_iMOVds_RR(dstHi, rHi)); in iselStmt()
3778 addInstr(env, mk_iMOVds_RR(dstLo, rLo)); in iselStmt()
3783 HReg fr_dst = lookupIRTemp(env, tmp); in iselStmt()
3784 HReg fr_src = iselFltExpr(env, stmt->Ist.WrTmp.data); in iselStmt()
3785 addInstr(env, MIPSInstr_FpUnary(Mfp_MOVS, fr_dst, fr_src)); in iselStmt()
3791 HReg src = iselFltExpr(env, stmt->Ist.WrTmp.data); in iselStmt()
3792 HReg dst = lookupIRTemp(env, tmp); in iselStmt()
3793 addInstr(env, MIPSInstr_FpUnary(Mfp_MOVD, dst, src)); in iselStmt()
3796 HReg src = iselDblExpr(env, stmt->Ist.WrTmp.data); in iselStmt()
3797 HReg dst = lookupIRTemp(env, tmp); in iselStmt()
3798 addInstr(env, MIPSInstr_FpUnary(Mfp_MOVD, dst, src)); in iselStmt()
3812 retty = typeOfIRTemp(env->type_env, d->tmp); in iselStmt()
3833 doHelperCall( &addToSp, &rloc, env, d->guard, d->cee, retty, d->args ); in iselStmt()
3848 HReg r_dst = lookupIRTemp(env, d->tmp); in iselStmt()
3849 addInstr(env, mk_iMOVds_RR(r_dst, hregMIPS_GPR2(mode64))); in iselStmt()
3858 HReg r_dst = lookupIRTemp(env, d->tmp); in iselStmt()
3859 addInstr(env, mk_iMOVds_RR(r_dst, hregMIPS_GPR2(mode64))); in iselStmt()
3864 HReg rHi = newVRegI(env); in iselStmt()
3865 HReg rLo = newVRegI(env); in iselStmt()
3867 addInstr(env, mk_iMOVds_RR(rLo, hregMIPS_GPR2(mode64))); in iselStmt()
3868 addInstr(env, mk_iMOVds_RR(rHi, hregMIPS_GPR3(mode64))); in iselStmt()
3869 lookupIRTemp64(&dstHi, &dstLo, env, d->tmp); in iselStmt()
3870 addInstr(env, mk_iMOVds_RR(dstHi, rHi)); in iselStmt()
3871 addInstr(env, mk_iMOVds_RR(dstLo, rLo)); in iselStmt()
3883 HReg dst = lookupIRTemp(env, d->tmp); in iselStmt()
3885 addInstr(env, MIPSInstr_Load(mode64 ? 8 : 4, dst, am, mode64)); in iselStmt()
3886 add_to_sp(env, addToSp); in iselStmt()
3903 IRType tyRes = typeOfIRTemp(env->type_env, res); in iselStmt()
3904 IRType tyAddr = typeOfIRExpr(env->type_env, stmt->Ist.LLSC.addr); in iselStmt()
3913 r_addr = iselWordExpr_AMode(env, stmt->Ist.LLSC.addr, tyAddr); in iselStmt()
3915 HReg r_dst = lookupIRTemp(env, res); in iselStmt()
3917 addInstr(env, MIPSInstr_LoadL(4, r_dst, r_addr, mode64)); in iselStmt()
3920 addInstr(env, MIPSInstr_LoadL(8, r_dst, r_addr, mode64)); in iselStmt()
3926 r_addr = iselWordExpr_AMode(env, stmt->Ist.LLSC.addr, tyAddr); in iselStmt()
3927 HReg r_src = iselWordExpr_R(env, stmt->Ist.LLSC.storedata); in iselStmt()
3928 HReg r_dst = lookupIRTemp(env, res); in iselStmt()
3929 IRType tyData = typeOfIRExpr(env->type_env, in iselStmt()
3933 addInstr(env, mk_iMOVds_RR(r_dst, r_src)); in iselStmt()
3934 addInstr(env, MIPSInstr_StoreC(4, r_addr, r_dst, mode64)); in iselStmt()
3937 addInstr(env, mk_iMOVds_RR(r_dst, r_src)); in iselStmt()
3938 addInstr(env, MIPSInstr_StoreC(8, r_addr, r_dst, mode64)); in iselStmt()
3948 HReg old = lookupIRTemp(env, cas->oldLo); in iselStmt()
3949 HReg addr = iselWordExpr_R(env, cas->addr); in iselStmt()
3950 HReg expd = iselWordExpr_R(env, cas->expdLo); in iselStmt()
3951 HReg data = iselWordExpr_R(env, cas->dataLo); in iselStmt()
3952 if (typeOfIRTemp(env->type_env, cas->oldLo) == Ity_I64) { in iselStmt()
3953 addInstr(env, MIPSInstr_Cas(8, old, addr, expd, data, mode64)); in iselStmt()
3954 } else if (typeOfIRTemp(env->type_env, cas->oldLo) == Ity_I32) { in iselStmt()
3955 addInstr(env, MIPSInstr_Cas(4, old, addr, expd, data, mode64)); in iselStmt()
3984 MIPSCondCode cc = iselCondCode(env, stmt->Ist.Exit.guard); in iselStmt()
3992 if (env->chainingAllowed) { in iselStmt()
3998 ? (((Addr64)stmt->Ist.Exit.dst->Ico.U64) > (Addr64)env->max_ga) in iselStmt()
3999 : (((Addr32)stmt->Ist.Exit.dst->Ico.U32) > (Addr32)env->max_ga); in iselStmt()
4001 addInstr(env, MIPSInstr_XDirect( in iselStmt()
4009 HReg r = iselWordExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst)); in iselStmt()
4010 addInstr(env, MIPSInstr_XAssisted(r, amPC, cc, Ijk_Boring)); in iselStmt()
4031 HReg r = iselWordExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst)); in iselStmt()
4032 addInstr(env, MIPSInstr_XAssisted(r, amPC, cc, in iselStmt()
4058 static void iselNext ( ISelEnv* env, in iselNext() argument
4072 vassert(cdst->tag == (env->mode64 ? Ico_U64 :Ico_U32)); in iselNext()
4075 MIPSAMode* amPC = MIPSAMode_IR(offsIP, GuestStatePointer(env->mode64)); in iselNext()
4076 if (env->chainingAllowed) { in iselNext()
4081 = env->mode64 in iselNext()
4082 ? (((Addr64)cdst->Ico.U64) > (Addr64)env->max_ga) in iselNext()
4083 : (((Addr32)cdst->Ico.U32) > (Addr32)env->max_ga); in iselNext()
4085 addInstr(env, MIPSInstr_XDirect( in iselNext()
4086 env->mode64 ? (Addr64)cdst->Ico.U64 in iselNext()
4093 HReg r = iselWordExpr_R(env, next); in iselNext()
4094 addInstr(env, MIPSInstr_XAssisted(r, amPC, MIPScc_AL, in iselNext()
4104 HReg r = iselWordExpr_R(env, next); in iselNext()
4106 GuestStatePointer(env->mode64)); in iselNext()
4107 if (env->chainingAllowed) { in iselNext()
4108 addInstr(env, MIPSInstr_XIndir(r, amPC, MIPScc_AL)); in iselNext()
4110 addInstr(env, MIPSInstr_XAssisted(r, amPC, MIPScc_AL, in iselNext()
4134 HReg r = iselWordExpr_R(env, next); in iselNext()
4135 MIPSAMode* amPC = MIPSAMode_IR(offsIP, GuestStatePointer(env->mode64)); in iselNext()
4136 addInstr(env, MIPSInstr_XAssisted(r, amPC, MIPScc_AL, jk)); in iselNext()
4168 ISelEnv* env; in iselSB_MIPS() local
4189 env = LibVEX_Alloc_inline(sizeof(ISelEnv)); in iselSB_MIPS()
4190 env->vreg_ctr = 0; in iselSB_MIPS()
4191 env->mode64 = mode64; in iselSB_MIPS()
4192 env->fp_mode64 = fp_mode64; in iselSB_MIPS()
4195 env->code = newHInstrArray(); in iselSB_MIPS()
4197 /* Copy BB's type env. */ in iselSB_MIPS()
4198 env->type_env = bb->tyenv; in iselSB_MIPS()
4202 env->n_vregmap = bb->tyenv->types_used; in iselSB_MIPS()
4203 env->vregmap = LibVEX_Alloc_inline(env->n_vregmap * sizeof(HReg)); in iselSB_MIPS()
4204 env->vregmapHI = LibVEX_Alloc_inline(env->n_vregmap * sizeof(HReg)); in iselSB_MIPS()
4207 env->hwcaps = hwcaps_host; in iselSB_MIPS()
4208 env->chainingAllowed = chainingAllowed; in iselSB_MIPS()
4209 env->hwcaps = hwcaps_host; in iselSB_MIPS()
4210 env->max_ga = max_ga; in iselSB_MIPS()
4215 for (i = 0; i < env->n_vregmap; i++) { in iselSB_MIPS()
4259 env->vregmap[i] = hreg; in iselSB_MIPS()
4260 env->vregmapHI[i] = hregHI; in iselSB_MIPS()
4262 env->vreg_ctr = j; in iselSB_MIPS()
4267 addInstr(env, MIPSInstr_EvCheck(amCounter, amFailAddr)); in iselSB_MIPS()
4274 addInstr(env, MIPSInstr_ProfInc()); in iselSB_MIPS()
4279 iselStmt(env, bb->stmts[i]); in iselSB_MIPS()
4281 iselNext(env, bb->next, bb->jumpkind, bb->offsIP); in iselSB_MIPS()
4284 env->code->n_vregs = env->vreg_ctr; in iselSB_MIPS()
4285 return env->code; in iselSB_MIPS()