Index: src/IceTargetLoweringX8632.cpp |
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp |
index 365788341c3271f5766f92a993e66d724e2059cb..0edcab567fbc7595b0dfb5a22ff7a17921e8d53a 100644 |
--- a/src/IceTargetLoweringX8632.cpp |
+++ b/src/IceTargetLoweringX8632.cpp |
@@ -2174,7 +2174,11 @@ Operand *TargetX8632::legalize(Operand *From, LegalMask Allowed, |
// need to go in uninitialized registers. |
From = Ctx->getConstantZero(From->getType()); |
} |
- if (!(Allowed & Legal_Imm)) { |
+ bool NeedsReg = !(Allowed & Legal_Imm) || |
+ // ConstantFloat and ConstantDouble are actually memory operands. |
+ (!(Allowed & Legal_Mem) && (From->getType() == IceType_f32 || |
+ From->getType() == IceType_f64)); |
+ if (NeedsReg) { |
Variable *Reg = makeReg(From->getType(), RegNum); |
_mov(Reg, From); |
From = Reg; |