Chromium Code Reviews| Index: src/compiler/mips/instruction-selector-mips.cc |
| diff --git a/src/compiler/mips/instruction-selector-mips.cc b/src/compiler/mips/instruction-selector-mips.cc |
| index 2a7020e9e632938f4070ad4bcef4a37b0b1b8b82..3095a3cbc81b6dd70622771761c42f37d54fff27 100644 |
| --- a/src/compiler/mips/instruction-selector-mips.cc |
| +++ b/src/compiler/mips/instruction-selector-mips.cc |
| @@ -536,8 +536,40 @@ void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) { |
| g.UseRegister(value->InputAt(0))); |
| return; |
| default: |
| - VisitRR(this, kMipsTruncWD, node); |
| + break; |
| + } |
| + if (value->opcode() == IrOpcode::kChangeFloat32ToFloat64) { |
| + Node* next = value->InputAt(0); |
| + if (CanCover(value, next)) { |
| + // Match ChangeFloat64ToInt32(ChangeFloat32ToFloat64(Float64Round##OP)) |
| + switch (next->opcode()) { |
| + case IrOpcode::kFloat32RoundDown: |
| + Emit(kMipsFloorWS, g.DefineAsRegister(node), |
| + g.UseRegister(next->InputAt(0))); |
| + return; |
| + case IrOpcode::kFloat32RoundUp: |
| + Emit(kMipsCeilWS, g.DefineAsRegister(node), |
| + g.UseRegister(next->InputAt(0))); |
| + return; |
| + case IrOpcode::kFloat32RoundTiesEven: |
| + Emit(kMipsRoundWS, g.DefineAsRegister(node), |
| + g.UseRegister(next->InputAt(0))); |
| + return; |
| + case IrOpcode::kFloat32RoundTruncate: |
| + Emit(kMipsTruncWS, g.DefineAsRegister(node), |
| + g.UseRegister(next->InputAt(0))); |
| + return; |
| + default: |
| + Emit(kMips64TruncWS, g.DefineAsRegister(node), |
|
Alan Li
2015/12/17 02:27:04
For mips32, it seems that you haven't implemented
dusan.milosavljevic
2015/12/17 13:44:10
Done.
|
| + g.UseRegister(value->InputAt(0))); |
| + return; |
| + } |
| + } else { |
| + // Match float32 -> float64 -> int32 representation change path. |
| + Emit(kMipsTruncWS, g.DefineAsRegister(node), |
| + g.UseRegister(value->InputAt(0))); |
| return; |
| + } |
| } |
| } |
| VisitRR(this, kMipsTruncWD, node); |
| @@ -550,6 +582,16 @@ void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { |
| void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { |
| + MipsOperandGenerator g(this); |
| + Node* value = node->InputAt(0); |
| + // Match TruncateFloat64ToFloat32(ChangeInt32ToFloat64) to corresponding |
| + // instruction. |
| + if (CanCover(node, value) && |
| + value->opcode() == IrOpcode::kChangeInt32ToFloat64) { |
| + Emit(kMipsCvtSW, g.DefineAsRegister(node), |
| + g.UseRegister(value->InputAt(0))); |
| + return; |
| + } |
| VisitRR(this, kMipsCvtSD, node); |
| } |