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