[x86] Slow case of TruncateDoubleToI shouldn't be inline.
authorBenedikt Meurer <bmeurer@chromium.org>
Fri, 5 Dec 2014 09:29:27 +0000 (10:29 +0100)
committerBenedikt Meurer <bmeurer@chromium.org>
Fri, 5 Dec 2014 09:29:36 +0000 (09:29 +0000)
R=svenpanne@chromium.org

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

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

src/compiler/ia32/code-generator-ia32.cc
src/compiler/x64/code-generator-x64.cc

index da78ba11c4d6fd8b48a9ed3d3c07287e80aa4c03..aa1cd547f87a01bddeee98aaa703e5374d691228 100644 (file)
@@ -191,6 +191,25 @@ class OutOfLineLoadFloat FINAL : public OutOfLineCode {
   XMMRegister const result_;
 };
 
+
+class OutOfLineTruncateDoubleToI FINAL : public OutOfLineCode {
+ public:
+  OutOfLineTruncateDoubleToI(CodeGenerator* gen, Register result,
+                             XMMRegister input)
+      : OutOfLineCode(gen), result_(result), input_(input) {}
+
+  void Generate() FINAL {
+    __ sub(esp, Immediate(kDoubleSize));
+    __ movsd(MemOperand(esp, 0), input_);
+    __ SlowTruncateToI(result_, esp, 0);
+    __ add(esp, Immediate(kDoubleSize));
+  }
+
+ private:
+  Register const result_;
+  XMMRegister const input_;
+};
+
 }  // namespace
 
 
@@ -301,9 +320,16 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
     case kArchStackPointer:
       __ mov(i.OutputRegister(), esp);
       break;
-    case kArchTruncateDoubleToI:
-      __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0));
+    case kArchTruncateDoubleToI: {
+      auto result = i.OutputRegister();
+      auto input = i.InputDoubleRegister(0);
+      auto ool = new (zone()) OutOfLineTruncateDoubleToI(this, result, input);
+      __ cvttsd2si(result, Operand(input));
+      __ cmp(result, 1);
+      __ j(overflow, ool->entry());
+      __ bind(ool->exit());
       break;
+    }
     case kIA32Add:
       if (HasImmediateInput(instr, 1)) {
         __ add(i.InputOperand(0), i.InputImmediate(1));
index 4a96fe866bf2b1ee442f33d6ffab8ef294a4391a..fd02916fa22257b2c6ace4ded72d6d1aa9ff01c1 100644 (file)
@@ -155,6 +155,25 @@ class OutOfLineLoadFloat FINAL : public OutOfLineCode {
   XMMRegister const result_;
 };
 
+
+class OutOfLineTruncateDoubleToI FINAL : public OutOfLineCode {
+ public:
+  OutOfLineTruncateDoubleToI(CodeGenerator* gen, Register result,
+                             XMMRegister input)
+      : OutOfLineCode(gen), result_(result), input_(input) {}
+
+  void Generate() FINAL {
+    __ subp(rsp, Immediate(kDoubleSize));
+    __ movsd(MemOperand(rsp, 0), input_);
+    __ SlowTruncateToI(result_, rsp, 0);
+    __ addp(rsp, Immediate(kDoubleSize));
+  }
+
+ private:
+  Register const result_;
+  XMMRegister const input_;
+};
+
 }  // namespace
 
 
@@ -355,9 +374,16 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
     case kArchStackPointer:
       __ movq(i.OutputRegister(), rsp);
       break;
-    case kArchTruncateDoubleToI:
-      __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0));
+    case kArchTruncateDoubleToI: {
+      auto result = i.OutputRegister();
+      auto input = i.InputDoubleRegister(0);
+      auto ool = new (zone()) OutOfLineTruncateDoubleToI(this, result, input);
+      __ cvttsd2siq(result, input);
+      __ cmpq(result, Immediate(1));
+      __ j(overflow, ool->entry());
+      __ bind(ool->exit());
       break;
+    }
     case kX64Add32:
       ASSEMBLE_BINOP(addl);
       break;