[x64] Smi zero can be used as an immediate.
authorbmeurer <bmeurer@chromium.org>
Wed, 3 Jun 2015 11:23:06 +0000 (04:23 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 3 Jun 2015 11:23:15 +0000 (11:23 +0000)
R=jarin@chromium.org

Review URL: https://codereview.chromium.org/1150853009

Cr-Commit-Position: refs/heads/master@{#28786}

src/compiler/x64/code-generator-x64.cc
src/compiler/x64/instruction-selector-x64.cc

index 2105d66e4714ba709efc1c1efca36ef31625bf1a..b4d200b39d8056c9b05a83eb7a7a110a94caed0a 100644 (file)
@@ -38,7 +38,12 @@ class X64OperandConverter : public InstructionOperandConverter {
   Operand OutputOperand() { return ToOperand(instr_->Output()); }
 
   Immediate ToImmediate(InstructionOperand* operand) {
-    return Immediate(ToConstant(operand).ToInt32());
+    Constant constant = ToConstant(operand);
+    if (constant.type() == Constant::kFloat64) {
+      DCHECK_EQ(0, bit_cast<int64_t>(constant.ToFloat64()));
+      return Immediate(0);
+    }
+    return Immediate(constant.ToInt32());
   }
 
   Operand ToOperand(InstructionOperand* op, int extra = 0) {
index df0f8809a7bb87c2c3c33246959cbea2eb8ec2f8..c841acebc0667ea95086a3c29a825650f70d1643 100644 (file)
@@ -27,6 +27,10 @@ class X64OperandGenerator final : public OperandGenerator {
         const int64_t value = OpParameter<int64_t>(node);
         return value == static_cast<int64_t>(static_cast<int32_t>(value));
       }
+      case IrOpcode::kNumberConstant: {
+        const double value = OpParameter<double>(node);
+        return bit_cast<int64_t>(value) == 0;
+      }
       default:
         return false;
     }