return dst;
break;
-
}
if (e->Iex.Binop.op == Iop_Max32U) {
return r_dst;
}
- }
+
+ if (e->Iex.Binop.op == Iop_F64toI32S) {
+ HReg valD = iselDblExpr(env, e->Iex.Binop.arg2);
+ HReg valS = newVRegF(env);
+ HReg r_dst = newVRegI(env);
+ MIPSAMode *am_addr;
+
+ set_MIPS_rounding_mode(env, e->Iex.Binop.arg1);
+ addInstr(env, MIPSInstr_FpConvert(Mfp_CVTWD, valS, valD));
+ set_MIPS_rounding_default(env);
+
+ sub_from_sp(env, 16); // Move SP down 16 bytes
+ am_addr = MIPSAMode_IR(0, StackPointer(mode64));
+
+ // store as F32
+ addInstr(env, MIPSInstr_FpLdSt(False/*store */ , 4, valS, am_addr));
+ // load as I32
+ addInstr(env, MIPSInstr_Load(4, r_dst, am_addr, mode64));
+
+ add_to_sp(env, 16); // Reset SP
+
+ return r_dst;
+ }
+
break;
+ }
/* --------- UNARY OP --------- */
case Iex_Unop: {
add_to_sp(env, 16); // Reset SP
return r_dst;
}
-
- case Iop_F64toI32S: {
- HReg valD = iselDblExpr(env, e->Iex.Binop.arg2);
- HReg valS = newVRegF(env);
- HReg r_dst = newVRegI(env);
- MIPSAMode *am_addr;
-
- set_MIPS_rounding_mode(env, e->Iex.Binop.arg1);
- addInstr(env, MIPSInstr_FpConvert(Mfp_CVTWD, valS, valD));
- set_MIPS_rounding_default(env);
-
- sub_from_sp(env, 16); // Move SP down 16 bytes
- am_addr = MIPSAMode_IR(0, StackPointer(mode64));
-
- // store as F32
- addInstr(env, MIPSInstr_FpLdSt(False/*store */ , 4, valS, am_addr));
- // load as I32
- addInstr(env, MIPSInstr_Load(4, r_dst, am_addr, mode64));
-
- add_to_sp(env, 16); // Reset SP
-
- return r_dst;
- }
case Iop_32to8:
case Iop_32to16: