diff options
Diffstat (limited to 'deps/v8/src/compiler/ppc/instruction-selector-ppc.cc')
-rw-r--r-- | deps/v8/src/compiler/ppc/instruction-selector-ppc.cc | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/deps/v8/src/compiler/ppc/instruction-selector-ppc.cc b/deps/v8/src/compiler/ppc/instruction-selector-ppc.cc index f6ebbdf5d6..244e6f44c5 100644 --- a/deps/v8/src/compiler/ppc/instruction-selector-ppc.cc +++ b/deps/v8/src/compiler/ppc/instruction-selector-ppc.cc @@ -200,6 +200,7 @@ void InstructionSelector::VisitLoad(Node* node) { #else case MachineRepresentation::kWord64: // Fall through. #endif + case MachineRepresentation::kSimd128: // Fall through. case MachineRepresentation::kNone: UNREACHABLE(); return; @@ -227,13 +228,25 @@ void InstructionSelector::VisitStore(Node* node) { WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); MachineRepresentation rep = store_rep.representation(); - // TODO(ppc): I guess this could be done in a better way. if (write_barrier_kind != kNoWriteBarrier) { DCHECK_EQ(MachineRepresentation::kTagged, rep); + AddressingMode addressing_mode; InstructionOperand inputs[3]; size_t input_count = 0; inputs[input_count++] = g.UseUniqueRegister(base); - inputs[input_count++] = g.UseUniqueRegister(offset); + // OutOfLineRecordWrite uses the offset in an 'add' instruction as well as + // for the store itself, so we must check compatibility with both. + if (g.CanBeImmediate(offset, kInt16Imm) +#if V8_TARGET_ARCH_PPC64 + && g.CanBeImmediate(offset, kInt16Imm_4ByteAligned) +#endif + ) { + inputs[input_count++] = g.UseImmediate(offset); + addressing_mode = kMode_MRI; + } else { + inputs[input_count++] = g.UseUniqueRegister(offset); + addressing_mode = kMode_MRR; + } inputs[input_count++] = (write_barrier_kind == kMapWriteBarrier) ? g.UseRegister(value) : g.UseUniqueRegister(value); @@ -255,6 +268,7 @@ void InstructionSelector::VisitStore(Node* node) { InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; size_t const temp_count = arraysize(temps); InstructionCode code = kArchStoreWithWriteBarrier; + code |= AddressingModeField::encode(addressing_mode); code |= MiscField::encode(static_cast<int>(record_write_mode)); Emit(code, 0, nullptr, input_count, inputs, temp_count, temps); } else { @@ -289,6 +303,7 @@ void InstructionSelector::VisitStore(Node* node) { #else case MachineRepresentation::kWord64: // Fall through. #endif + case MachineRepresentation::kSimd128: // Fall through. case MachineRepresentation::kNone: UNREACHABLE(); return; @@ -340,6 +355,7 @@ void InstructionSelector::VisitCheckedLoad(Node* node) { #if !V8_TARGET_ARCH_PPC64 case MachineRepresentation::kWord64: // Fall through. #endif + case MachineRepresentation::kSimd128: // Fall through. case MachineRepresentation::kNone: UNREACHABLE(); return; @@ -385,6 +401,7 @@ void InstructionSelector::VisitCheckedStore(Node* node) { #if !V8_TARGET_ARCH_PPC64 case MachineRepresentation::kWord64: // Fall through. #endif + case MachineRepresentation::kSimd128: // Fall through. case MachineRepresentation::kNone: UNREACHABLE(); return; @@ -825,6 +842,14 @@ void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); } #endif +void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } + + +#if V8_TARGET_ARCH_PPC64 +void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } +#endif + + void InstructionSelector::VisitInt32Add(Node* node) { VisitBinop<Int32BinopMatcher>(this, node, kPPC_Add, kInt16Imm); } @@ -940,6 +965,16 @@ void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { } +void InstructionSelector::VisitRoundInt32ToFloat32(Node* node) { + VisitRR(this, kPPC_Int32ToFloat32, node); +} + + +void InstructionSelector::VisitRoundUint32ToFloat32(Node* node) { + VisitRR(this, kPPC_Uint32ToFloat32, node); +} + + void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) { VisitRR(this, kPPC_Int32ToDouble, node); } @@ -1010,6 +1045,16 @@ void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) { } +void InstructionSelector::VisitTruncateFloat32ToInt32(Node* node) { + VisitRR(this, kPPC_DoubleToInt32, node); +} + + +void InstructionSelector::VisitTruncateFloat32ToUint32(Node* node) { + VisitRR(this, kPPC_DoubleToUint32, node); +} + + #if V8_TARGET_ARCH_PPC64 void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) { // TODO(mbrandy): inspect input to see if nop is appropriate. |