[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:
parent
05a6d87ee4
commit
5866c5c2f0
@ -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));
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user