[x86] Slow case of TruncateDoubleToI shouldn't be inline.

R=svenpanne@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#25676}
This commit is contained in:
Benedikt Meurer 2014-12-05 10:29:27 +01:00
parent 05a6d87ee4
commit 5866c5c2f0
2 changed files with 56 additions and 4 deletions

View 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));

View 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;