Index: src/compiler/ppc/instruction-selector-ppc.cc |
diff --git a/src/compiler/ppc/instruction-selector-ppc.cc b/src/compiler/ppc/instruction-selector-ppc.cc |
index ae4c97a9ee5ad79329da5dadcfa29dd4da72a44a..9d576bafb7278d32c5baa049adf978f4ee4fce45 100644 |
--- a/src/compiler/ppc/instruction-selector-ppc.cc |
+++ b/src/compiler/ppc/instruction-selector-ppc.cc |
@@ -67,25 +67,16 @@ class PPCOperandGenerator FINAL : public OperandGenerator { |
}; |
-static void VisitRRFloat64(InstructionSelector* selector, ArchOpcode opcode, |
- Node* node) { |
- PPCOperandGenerator g(selector); |
- selector->Emit(opcode, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
-} |
- |
+namespace { |
-static void VisitRRR(InstructionSelector* selector, Node* node, |
- ArchOpcode opcode) { |
+void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
PPCOperandGenerator g(selector); |
selector->Emit(opcode, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0)), |
- g.UseRegister(node->InputAt(1))); |
+ g.UseRegister(node->InputAt(0))); |
} |
-static void VisitRRRFloat64(InstructionSelector* selector, Node* node, |
- ArchOpcode opcode) { |
+void VisitRRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
PPCOperandGenerator g(selector); |
selector->Emit(opcode, g.DefineAsRegister(node), |
g.UseRegister(node->InputAt(0)), |
@@ -93,8 +84,8 @@ static void VisitRRRFloat64(InstructionSelector* selector, Node* node, |
} |
-static void VisitRRO(InstructionSelector* selector, Node* node, |
- ArchOpcode opcode, ImmediateMode operand_mode) { |
+void VisitRRO(InstructionSelector* selector, ArchOpcode opcode, Node* node, |
+ ImmediateMode operand_mode) { |
PPCOperandGenerator g(selector); |
selector->Emit(opcode, g.DefineAsRegister(node), |
g.UseRegister(node->InputAt(0)), |
@@ -104,9 +95,9 @@ static void VisitRRO(InstructionSelector* selector, Node* node, |
// Shared routine for multiple binary operations. |
template <typename Matcher> |
-static void VisitBinop(InstructionSelector* selector, Node* node, |
- InstructionCode opcode, ImmediateMode operand_mode, |
- FlagsContinuation* cont) { |
+void VisitBinop(InstructionSelector* selector, Node* node, |
+ InstructionCode opcode, ImmediateMode operand_mode, |
+ FlagsContinuation* cont) { |
PPCOperandGenerator g(selector); |
Matcher m(node); |
InstructionOperand inputs[4]; |
@@ -139,12 +130,14 @@ static void VisitBinop(InstructionSelector* selector, Node* node, |
// Shared routine for multiple binary operations. |
template <typename Matcher> |
-static void VisitBinop(InstructionSelector* selector, Node* node, |
- ArchOpcode opcode, ImmediateMode operand_mode) { |
+void VisitBinop(InstructionSelector* selector, Node* node, ArchOpcode opcode, |
+ ImmediateMode operand_mode) { |
FlagsContinuation cont; |
VisitBinop<Matcher>(selector, node, opcode, operand_mode, &cont); |
} |
+} // namespace |
+ |
void InstructionSelector::VisitLoad(Node* node) { |
MachineType rep = RepresentationOf(OpParameter<LoadRepresentation>(node)); |
@@ -160,7 +153,7 @@ void InstructionSelector::VisitLoad(Node* node) { |
opcode = kPPC_LoadFloat32; |
break; |
case kRepFloat64: |
- opcode = kPPC_LoadFloat64; |
+ opcode = kPPC_LoadDouble; |
break; |
case kRepBit: // Fall through. |
case kRepWord8: |
@@ -230,7 +223,7 @@ void InstructionSelector::VisitStore(Node* node) { |
opcode = kPPC_StoreFloat32; |
break; |
case kRepFloat64: |
- opcode = kPPC_StoreFloat64; |
+ opcode = kPPC_StoreDouble; |
break; |
case kRepBit: // Fall through. |
case kRepWord8: |
@@ -348,17 +341,11 @@ static void VisitLogical(InstructionSelector* selector, Node* node, Matcher* m, |
// Map instruction to equivalent operation with inverted right input. |
ArchOpcode inv_opcode = opcode; |
switch (opcode) { |
- case kPPC_And32: |
- inv_opcode = kPPC_AndComplement32; |
+ case kPPC_And: |
+ inv_opcode = kPPC_AndComplement; |
break; |
- case kPPC_And64: |
- inv_opcode = kPPC_AndComplement64; |
- break; |
- case kPPC_Or32: |
- inv_opcode = kPPC_OrComplement32; |
- break; |
- case kPPC_Or64: |
- inv_opcode = kPPC_OrComplement64; |
+ case kPPC_Or: |
+ inv_opcode = kPPC_OrComplement; |
break; |
default: |
UNREACHABLE(); |
@@ -451,7 +438,7 @@ void InstructionSelector::VisitWord32And(Node* node) { |
} |
} |
VisitLogical<Int32BinopMatcher>( |
- this, node, &m, kPPC_And32, CanCover(node, m.left().node()), |
+ this, node, &m, kPPC_And, CanCover(node, m.left().node()), |
CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
} |
@@ -508,7 +495,7 @@ void InstructionSelector::VisitWord64And(Node* node) { |
} |
} |
VisitLogical<Int64BinopMatcher>( |
- this, node, &m, kPPC_And64, CanCover(node, m.left().node()), |
+ this, node, &m, kPPC_And, CanCover(node, m.left().node()), |
CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
} |
#endif |
@@ -517,7 +504,7 @@ void InstructionSelector::VisitWord64And(Node* node) { |
void InstructionSelector::VisitWord32Or(Node* node) { |
Int32BinopMatcher m(node); |
VisitLogical<Int32BinopMatcher>( |
- this, node, &m, kPPC_Or32, CanCover(node, m.left().node()), |
+ this, node, &m, kPPC_Or, CanCover(node, m.left().node()), |
CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
} |
@@ -526,7 +513,7 @@ void InstructionSelector::VisitWord32Or(Node* node) { |
void InstructionSelector::VisitWord64Or(Node* node) { |
Int64BinopMatcher m(node); |
VisitLogical<Int64BinopMatcher>( |
- this, node, &m, kPPC_Or64, CanCover(node, m.left().node()), |
+ this, node, &m, kPPC_Or, CanCover(node, m.left().node()), |
CanCover(node, m.right().node()), kInt16Imm_Unsigned); |
} |
#endif |
@@ -536,9 +523,9 @@ void InstructionSelector::VisitWord32Xor(Node* node) { |
PPCOperandGenerator g(this); |
Int32BinopMatcher m(node); |
if (m.right().Is(-1)) { |
- Emit(kPPC_Not32, g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
+ Emit(kPPC_Not, g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
} else { |
- VisitBinop<Int32BinopMatcher>(this, node, kPPC_Xor32, kInt16Imm_Unsigned); |
+ VisitBinop<Int32BinopMatcher>(this, node, kPPC_Xor, kInt16Imm_Unsigned); |
} |
} |
@@ -548,9 +535,9 @@ void InstructionSelector::VisitWord64Xor(Node* node) { |
PPCOperandGenerator g(this); |
Int64BinopMatcher m(node); |
if (m.right().Is(-1)) { |
- Emit(kPPC_Not64, g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
+ Emit(kPPC_Not, g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
} else { |
- VisitBinop<Int64BinopMatcher>(this, node, kPPC_Xor64, kInt16Imm_Unsigned); |
+ VisitBinop<Int64BinopMatcher>(this, node, kPPC_Xor, kInt16Imm_Unsigned); |
} |
} |
#endif |
@@ -577,7 +564,7 @@ void InstructionSelector::VisitWord32Shl(Node* node) { |
} |
} |
} |
- VisitRRO(this, node, kPPC_ShiftLeft32, kShift32Imm); |
+ VisitRRO(this, kPPC_ShiftLeft32, node, kShift32Imm); |
} |
@@ -622,7 +609,7 @@ void InstructionSelector::VisitWord64Shl(Node* node) { |
} |
} |
} |
- VisitRRO(this, node, kPPC_ShiftLeft64, kShift64Imm); |
+ VisitRRO(this, kPPC_ShiftLeft64, node, kShift64Imm); |
} |
#endif |
@@ -649,7 +636,7 @@ void InstructionSelector::VisitWord32Shr(Node* node) { |
} |
} |
} |
- VisitRRO(this, node, kPPC_ShiftRight32, kShift32Imm); |
+ VisitRRO(this, kPPC_ShiftRight32, node, kShift32Imm); |
} |
@@ -690,7 +677,7 @@ void InstructionSelector::VisitWord64Shr(Node* node) { |
} |
} |
} |
- VisitRRO(this, node, kPPC_ShiftRight64, kShift64Imm); |
+ VisitRRO(this, kPPC_ShiftRight64, node, kShift64Imm); |
} |
#endif |
@@ -711,27 +698,27 @@ void InstructionSelector::VisitWord32Sar(Node* node) { |
return; |
} |
} |
- VisitRRO(this, node, kPPC_ShiftRightAlg32, kShift32Imm); |
+ VisitRRO(this, kPPC_ShiftRightAlg32, node, kShift32Imm); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitWord64Sar(Node* node) { |
- VisitRRO(this, node, kPPC_ShiftRightAlg64, kShift64Imm); |
+ VisitRRO(this, kPPC_ShiftRightAlg64, node, kShift64Imm); |
} |
#endif |
// TODO(mbrandy): Absorb logical-and into rlwinm? |
void InstructionSelector::VisitWord32Ror(Node* node) { |
- VisitRRO(this, node, kPPC_RotRight32, kShift32Imm); |
+ VisitRRO(this, kPPC_RotRight32, node, kShift32Imm); |
} |
#if V8_TARGET_ARCH_PPC64 |
// TODO(mbrandy): Absorb logical-and into rldic? |
void InstructionSelector::VisitWord64Ror(Node* node) { |
- VisitRRO(this, node, kPPC_RotRight64, kShift64Imm); |
+ VisitRRO(this, kPPC_RotRight64, node, kShift64Imm); |
} |
#endif |
@@ -743,13 +730,13 @@ void InstructionSelector::VisitWord32Clz(Node* node) { |
void InstructionSelector::VisitInt32Add(Node* node) { |
- VisitBinop<Int32BinopMatcher>(this, node, kPPC_Add32, kInt16Imm); |
+ VisitBinop<Int32BinopMatcher>(this, node, kPPC_Add, kInt16Imm); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitInt64Add(Node* node) { |
- VisitBinop<Int64BinopMatcher>(this, node, kPPC_Add64, kInt16Imm); |
+ VisitBinop<Int64BinopMatcher>(this, node, kPPC_Add, kInt16Imm); |
} |
#endif |
@@ -758,9 +745,9 @@ void InstructionSelector::VisitInt32Sub(Node* node) { |
PPCOperandGenerator g(this); |
Int32BinopMatcher m(node); |
if (m.left().Is(0)) { |
- Emit(kPPC_Neg32, g.DefineAsRegister(node), g.UseRegister(m.right().node())); |
+ Emit(kPPC_Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node())); |
} else { |
- VisitBinop<Int32BinopMatcher>(this, node, kPPC_Sub32, kInt16Imm_Negate); |
+ VisitBinop<Int32BinopMatcher>(this, node, kPPC_Sub, kInt16Imm_Negate); |
} |
} |
@@ -770,22 +757,22 @@ void InstructionSelector::VisitInt64Sub(Node* node) { |
PPCOperandGenerator g(this); |
Int64BinopMatcher m(node); |
if (m.left().Is(0)) { |
- Emit(kPPC_Neg64, g.DefineAsRegister(node), g.UseRegister(m.right().node())); |
+ Emit(kPPC_Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node())); |
} else { |
- VisitBinop<Int64BinopMatcher>(this, node, kPPC_Sub64, kInt16Imm_Negate); |
+ VisitBinop<Int64BinopMatcher>(this, node, kPPC_Sub, kInt16Imm_Negate); |
} |
} |
#endif |
void InstructionSelector::VisitInt32Mul(Node* node) { |
- VisitRRR(this, node, kPPC_Mul32); |
+ VisitRRR(this, kPPC_Mul32, node); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitInt64Mul(Node* node) { |
- VisitRRR(this, node, kPPC_Mul64); |
+ VisitRRR(this, kPPC_Mul64, node); |
} |
#endif |
@@ -805,94 +792,82 @@ void InstructionSelector::VisitUint32MulHigh(Node* node) { |
void InstructionSelector::VisitInt32Div(Node* node) { |
- VisitRRR(this, node, kPPC_Div32); |
+ VisitRRR(this, kPPC_Div32, node); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitInt64Div(Node* node) { |
- VisitRRR(this, node, kPPC_Div64); |
+ VisitRRR(this, kPPC_Div64, node); |
} |
#endif |
void InstructionSelector::VisitUint32Div(Node* node) { |
- VisitRRR(this, node, kPPC_DivU32); |
+ VisitRRR(this, kPPC_DivU32, node); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitUint64Div(Node* node) { |
- VisitRRR(this, node, kPPC_DivU64); |
+ VisitRRR(this, kPPC_DivU64, node); |
} |
#endif |
void InstructionSelector::VisitInt32Mod(Node* node) { |
- VisitRRR(this, node, kPPC_Mod32); |
+ VisitRRR(this, kPPC_Mod32, node); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitInt64Mod(Node* node) { |
- VisitRRR(this, node, kPPC_Mod64); |
+ VisitRRR(this, kPPC_Mod64, node); |
} |
#endif |
void InstructionSelector::VisitUint32Mod(Node* node) { |
- VisitRRR(this, node, kPPC_ModU32); |
+ VisitRRR(this, kPPC_ModU32, node); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitUint64Mod(Node* node) { |
- VisitRRR(this, node, kPPC_ModU64); |
+ VisitRRR(this, kPPC_ModU64, node); |
} |
#endif |
void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { |
- PPCOperandGenerator g(this); |
- Emit(kPPC_Float32ToFloat64, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kPPC_Float32ToDouble, node); |
} |
void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) { |
- PPCOperandGenerator g(this); |
- Emit(kPPC_Int32ToFloat64, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kPPC_Int32ToDouble, node); |
} |
void InstructionSelector::VisitChangeUint32ToFloat64(Node* node) { |
- PPCOperandGenerator g(this); |
- Emit(kPPC_Uint32ToFloat64, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kPPC_Uint32ToDouble, node); |
} |
void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) { |
- PPCOperandGenerator g(this); |
- Emit(kPPC_Float64ToInt32, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kPPC_DoubleToInt32, node); |
} |
void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { |
- PPCOperandGenerator g(this); |
- Emit(kPPC_Float64ToUint32, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kPPC_DoubleToUint32, node); |
} |
#if V8_TARGET_ARCH_PPC64 |
void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { |
// TODO(mbrandy): inspect input to see if nop is appropriate. |
- PPCOperandGenerator g(this); |
- Emit(kPPC_ExtendSignWord32, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kPPC_ExtendSignWord32, node); |
} |
@@ -907,7 +882,7 @@ void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { |
void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { |
PPCOperandGenerator g(this); |
- Emit(kPPC_Float64ToFloat32, g.DefineAsRegister(node), |
+ Emit(kPPC_DoubleToFloat32, g.DefineAsRegister(node), |
g.UseRegister(node->InputAt(0))); |
} |
@@ -922,9 +897,19 @@ void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) { |
#endif |
+void InstructionSelector::VisitFloat32Add(Node* node) { |
+ VisitRRR(this, kPPC_AddDouble, node); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Add(Node* node) { |
// TODO(mbrandy): detect multiply-add |
- VisitRRRFloat64(this, node, kPPC_AddFloat64); |
+ VisitRRR(this, kPPC_AddDouble, node); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32Sub(Node* node) { |
+ VisitRRR(this, kPPC_SubDouble, node); |
} |
@@ -939,62 +924,87 @@ void InstructionSelector::VisitFloat64Sub(Node* node) { |
Float64BinopMatcher mright0(m.right().InputAt(0)); |
if (mright0.left().IsMinusZero()) { |
// -floor(-x) = ceil(x) |
- Emit(kPPC_CeilFloat64, g.DefineAsRegister(node), |
+ Emit(kPPC_CeilDouble, g.DefineAsRegister(node), |
g.UseRegister(mright0.right().node())); |
return; |
} |
} |
} |
- VisitRRRFloat64(this, node, kPPC_SubFloat64); |
+ VisitRRR(this, kPPC_SubDouble, node); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32Mul(Node* node) { |
+ VisitRRR(this, kPPC_MulDouble, node); |
} |
void InstructionSelector::VisitFloat64Mul(Node* node) { |
// TODO(mbrandy): detect negate |
- VisitRRRFloat64(this, node, kPPC_MulFloat64); |
+ VisitRRR(this, kPPC_MulDouble, node); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32Div(Node* node) { |
+ VisitRRR(this, kPPC_DivDouble, node); |
} |
void InstructionSelector::VisitFloat64Div(Node* node) { |
- VisitRRRFloat64(this, node, kPPC_DivFloat64); |
+ VisitRRR(this, kPPC_DivDouble, node); |
} |
void InstructionSelector::VisitFloat64Mod(Node* node) { |
PPCOperandGenerator g(this); |
- Emit(kPPC_ModFloat64, g.DefineAsFixed(node, d1), |
+ Emit(kPPC_ModDouble, g.DefineAsFixed(node, d1), |
g.UseFixed(node->InputAt(0), d1), |
g.UseFixed(node->InputAt(1), d2))->MarkAsCall(); |
} |
+void InstructionSelector::VisitFloat32Max(Node* node) { |
+ VisitRRR(this, kPPC_MaxDouble, node); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Max(Node* node) { |
- VisitRRRFloat64(this, node, kPPC_MaxFloat64); |
+ VisitRRR(this, kPPC_MaxDouble, node); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32Min(Node* node) { |
+ VisitRRR(this, kPPC_MinDouble, node); |
} |
void InstructionSelector::VisitFloat64Min(Node* node) { |
- VisitRRRFloat64(this, node, kPPC_MinFloat64); |
+ VisitRRR(this, kPPC_MinDouble, node); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32Sqrt(Node* node) { |
+ VisitRR(this, kPPC_SqrtDouble, node); |
} |
void InstructionSelector::VisitFloat64Sqrt(Node* node) { |
- VisitRRFloat64(this, kPPC_SqrtFloat64, node); |
+ VisitRR(this, kPPC_SqrtDouble, node); |
} |
void InstructionSelector::VisitFloat64RoundDown(Node* node) { |
- VisitRRFloat64(this, kPPC_FloorFloat64, node); |
+ VisitRR(this, kPPC_FloorDouble, node); |
} |
void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { |
- VisitRRFloat64(this, kPPC_TruncateFloat64, node); |
+ VisitRR(this, kPPC_TruncateDouble, node); |
} |
void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { |
- VisitRRFloat64(this, kPPC_RoundFloat64, node); |
+ VisitRR(this, kPPC_RoundDouble, node); |
} |
@@ -1037,10 +1047,12 @@ static bool CompareLogical(FlagsContinuation* cont) { |
} |
+namespace { |
+ |
// Shared routine for multiple compare operations. |
-static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
- InstructionOperand left, InstructionOperand right, |
- FlagsContinuation* cont) { |
+void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
+ InstructionOperand left, InstructionOperand right, |
+ FlagsContinuation* cont) { |
PPCOperandGenerator g(selector); |
opcode = cont->Encode(opcode); |
if (cont->IsBranch()) { |
@@ -1054,9 +1066,9 @@ static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
// Shared routine for multiple word compare operations. |
-static void VisitWordCompare(InstructionSelector* selector, Node* node, |
- InstructionCode opcode, FlagsContinuation* cont, |
- bool commutative, ImmediateMode immediate_mode) { |
+void VisitWordCompare(InstructionSelector* selector, Node* node, |
+ InstructionCode opcode, FlagsContinuation* cont, |
+ bool commutative, ImmediateMode immediate_mode) { |
PPCOperandGenerator g(selector); |
Node* left = node->InputAt(0); |
Node* right = node->InputAt(1); |
@@ -1076,37 +1088,48 @@ static void VisitWordCompare(InstructionSelector* selector, Node* node, |
} |
-static void VisitWord32Compare(InstructionSelector* selector, Node* node, |
- FlagsContinuation* cont) { |
+void VisitWord32Compare(InstructionSelector* selector, Node* node, |
+ FlagsContinuation* cont) { |
ImmediateMode mode = (CompareLogical(cont) ? kInt16Imm_Unsigned : kInt16Imm); |
VisitWordCompare(selector, node, kPPC_Cmp32, cont, false, mode); |
} |
#if V8_TARGET_ARCH_PPC64 |
-static void VisitWord64Compare(InstructionSelector* selector, Node* node, |
- FlagsContinuation* cont) { |
+void VisitWord64Compare(InstructionSelector* selector, Node* node, |
+ FlagsContinuation* cont) { |
ImmediateMode mode = (CompareLogical(cont) ? kInt16Imm_Unsigned : kInt16Imm); |
VisitWordCompare(selector, node, kPPC_Cmp64, cont, false, mode); |
} |
#endif |
-// Shared routine for multiple float compare operations. |
-static void VisitFloat64Compare(InstructionSelector* selector, Node* node, |
- FlagsContinuation* cont) { |
+// Shared routine for multiple float32 compare operations. |
+void VisitFloat32Compare(InstructionSelector* selector, Node* node, |
+ FlagsContinuation* cont) { |
PPCOperandGenerator g(selector); |
Node* left = node->InputAt(0); |
Node* right = node->InputAt(1); |
- VisitCompare(selector, kPPC_CmpFloat64, g.UseRegister(left), |
+ VisitCompare(selector, kPPC_CmpDouble, g.UseRegister(left), |
+ g.UseRegister(right), cont); |
+} |
+ |
+ |
+// Shared routine for multiple float64 compare operations. |
+void VisitFloat64Compare(InstructionSelector* selector, Node* node, |
+ FlagsContinuation* cont) { |
+ PPCOperandGenerator g(selector); |
+ Node* left = node->InputAt(0); |
+ Node* right = node->InputAt(1); |
+ VisitCompare(selector, kPPC_CmpDouble, g.UseRegister(left), |
g.UseRegister(right), cont); |
} |
// Shared routine for word comparisons against zero. |
-static void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
- Node* value, InstructionCode opcode, |
- FlagsContinuation* cont) { |
+void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
+ Node* value, InstructionCode opcode, |
+ FlagsContinuation* cont) { |
while (selector->CanCover(user, value)) { |
switch (value->opcode()) { |
case IrOpcode::kWord32Equal: { |
@@ -1148,6 +1171,15 @@ static void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); |
return VisitWord64Compare(selector, value, cont); |
#endif |
+ case IrOpcode::kFloat32Equal: |
+ cont->OverwriteAndNegateIfEqual(kEqual); |
+ return VisitFloat32Compare(selector, value, cont); |
+ case IrOpcode::kFloat32LessThan: |
+ cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); |
+ return VisitFloat32Compare(selector, value, cont); |
+ case IrOpcode::kFloat32LessThanOrEqual: |
+ cont->OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual); |
+ return VisitFloat32Compare(selector, value, cont); |
case IrOpcode::kFloat64Equal: |
cont->OverwriteAndNegateIfEqual(kEqual); |
return VisitFloat64Compare(selector, value, cont); |
@@ -1228,19 +1260,21 @@ static void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
} |
-static void VisitWord32CompareZero(InstructionSelector* selector, Node* user, |
- Node* value, FlagsContinuation* cont) { |
+void VisitWord32CompareZero(InstructionSelector* selector, Node* user, |
+ Node* value, FlagsContinuation* cont) { |
VisitWordCompareZero(selector, user, value, kPPC_Cmp32, cont); |
} |
#if V8_TARGET_ARCH_PPC64 |
-static void VisitWord64CompareZero(InstructionSelector* selector, Node* user, |
- Node* value, FlagsContinuation* cont) { |
+void VisitWord64CompareZero(InstructionSelector* selector, Node* user, |
+ Node* value, FlagsContinuation* cont) { |
VisitWordCompareZero(selector, user, value, kPPC_Cmp64, cont); |
} |
#endif |
+} // namespace |
+ |
void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, |
BasicBlock* fbranch) { |
@@ -1265,7 +1299,7 @@ void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) { |
InstructionOperand index_operand = value_operand; |
if (sw.min_value) { |
index_operand = g.TempRegister(); |
- Emit(kPPC_Sub32, index_operand, value_operand, |
+ Emit(kPPC_Sub, index_operand, value_operand, |
g.TempImmediate(sw.min_value)); |
} |
// Generate a table lookup. |
@@ -1341,6 +1375,24 @@ void InstructionSelector::VisitUint64LessThan(Node* node) { |
#endif |
+void InstructionSelector::VisitFloat32Equal(Node* node) { |
+ FlagsContinuation cont(kEqual, node); |
+ VisitFloat32Compare(this, node, &cont); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32LessThan(Node* node) { |
+ FlagsContinuation cont(kUnsignedLessThan, node); |
+ VisitFloat32Compare(this, node, &cont); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32LessThanOrEqual(Node* node) { |
+ FlagsContinuation cont(kUnsignedLessThanOrEqual, node); |
+ VisitFloat32Compare(this, node, &cont); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Equal(Node* node) { |
FlagsContinuation cont(kEqual, node); |
VisitFloat64Compare(this, node, &cont); |
@@ -1419,14 +1471,14 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
void InstructionSelector::VisitFloat64ExtractLowWord32(Node* node) { |
PPCOperandGenerator g(this); |
- Emit(kPPC_Float64ExtractLowWord32, g.DefineAsRegister(node), |
+ Emit(kPPC_DoubleExtractLowWord32, g.DefineAsRegister(node), |
g.UseRegister(node->InputAt(0))); |
} |
void InstructionSelector::VisitFloat64ExtractHighWord32(Node* node) { |
PPCOperandGenerator g(this); |
- Emit(kPPC_Float64ExtractHighWord32, g.DefineAsRegister(node), |
+ Emit(kPPC_DoubleExtractHighWord32, g.DefineAsRegister(node), |
g.UseRegister(node->InputAt(0))); |
} |
@@ -1438,11 +1490,11 @@ void InstructionSelector::VisitFloat64InsertLowWord32(Node* node) { |
if (left->opcode() == IrOpcode::kFloat64InsertHighWord32 && |
CanCover(node, left)) { |
left = left->InputAt(1); |
- Emit(kPPC_Float64Construct, g.DefineAsRegister(node), g.UseRegister(left), |
+ Emit(kPPC_DoubleConstruct, g.DefineAsRegister(node), g.UseRegister(left), |
g.UseRegister(right)); |
return; |
} |
- Emit(kPPC_Float64InsertLowWord32, g.DefineSameAsFirst(node), |
+ Emit(kPPC_DoubleInsertLowWord32, g.DefineSameAsFirst(node), |
g.UseRegister(left), g.UseRegister(right)); |
} |
@@ -1454,11 +1506,11 @@ void InstructionSelector::VisitFloat64InsertHighWord32(Node* node) { |
if (left->opcode() == IrOpcode::kFloat64InsertLowWord32 && |
CanCover(node, left)) { |
left = left->InputAt(1); |
- Emit(kPPC_Float64Construct, g.DefineAsRegister(node), g.UseRegister(right), |
+ Emit(kPPC_DoubleConstruct, g.DefineAsRegister(node), g.UseRegister(right), |
g.UseRegister(left)); |
return; |
} |
- Emit(kPPC_Float64InsertHighWord32, g.DefineSameAsFirst(node), |
+ Emit(kPPC_DoubleInsertHighWord32, g.DefineSameAsFirst(node), |
g.UseRegister(left), g.UseRegister(right)); |
} |
@@ -1466,7 +1518,9 @@ void InstructionSelector::VisitFloat64InsertHighWord32(Node* node) { |
// static |
MachineOperatorBuilder::Flags |
InstructionSelector::SupportedMachineOperatorFlags() { |
- return MachineOperatorBuilder::kFloat64Max | |
+ return MachineOperatorBuilder::kFloat32Max | |
+ MachineOperatorBuilder::kFloat32Min | |
+ MachineOperatorBuilder::kFloat64Max | |
MachineOperatorBuilder::kFloat64Min | |
MachineOperatorBuilder::kFloat64RoundDown | |
MachineOperatorBuilder::kFloat64RoundTruncate | |