Commit a02e644c authored by chunyang.dai's avatar chunyang.dai Committed by Commit bot

X87: [turbofan] Add TruncationMode for TruncateFloat64ToInt32.

port 4b38c158 (r29527).

original commit message:

    We actually need round to zero truncation to implement the counterpart
    of LDoubleToI in TurboFan, which tries to convert a double to an integer
    as required for keyed load/store optimizations.

    Drive-by-cleanup: Reduce some code duplication in the InstructionSelector
    implementations.

BUG=

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

Cr-Commit-Position: refs/heads/master@{#29629}
parent 1b20d505
...@@ -422,11 +422,13 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { ...@@ -422,11 +422,13 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
__ mov(i.OutputRegister(), esp); __ mov(i.OutputRegister(), esp);
break; break;
case kArchTruncateDoubleToI: { case kArchTruncateDoubleToI: {
auto input = i.InputDoubleRegister(0); if (!instr->InputAt(0)->IsDoubleRegister()) {
USE(input); __ fld_d(i.InputOperand(0));
DCHECK(input.code() == 0); }
auto result_reg = i.OutputRegister(); __ TruncateX87TOSToI(i.OutputRegister());
__ TruncateX87TOSToI(result_reg); if (!instr->InputAt(0)->IsDoubleRegister()) {
__ fstp(0);
}
break; break;
} }
case kX87Add: case kX87Add:
......
...@@ -647,6 +647,23 @@ void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { ...@@ -647,6 +647,23 @@ void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) {
} }
void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) {
X87OperandGenerator g(this);
switch (TruncationModeOf(node->op())) {
case TruncationMode::kJavaScript:
Emit(kArchTruncateDoubleToI, g.DefineAsRegister(node),
g.Use(node->InputAt(0)));
return;
case TruncationMode::kRoundToZero:
Emit(kX87Float64ToInt32, g.DefineAsRegister(node),
g.Use(node->InputAt(0)));
return;
}
UNREACHABLE();
}
void InstructionSelector::VisitFloat32Add(Node* node) { void InstructionSelector::VisitFloat32Add(Node* node) {
X87OperandGenerator g(this); X87OperandGenerator g(this);
Emit(kX87PushFloat32, g.NoOutput(), g.Use(node->InputAt(0))); Emit(kX87PushFloat32, g.NoOutput(), g.Use(node->InputAt(0)));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment