diff options
Diffstat (limited to 'deps/v8/src/compiler/arm/instruction-selector-arm.cc')
-rw-r--r-- | deps/v8/src/compiler/arm/instruction-selector-arm.cc | 235 |
1 files changed, 90 insertions, 145 deletions
diff --git a/deps/v8/src/compiler/arm/instruction-selector-arm.cc b/deps/v8/src/compiler/arm/instruction-selector-arm.cc index 277d9779c0..28d7a7fcd0 100644 --- a/deps/v8/src/compiler/arm/instruction-selector-arm.cc +++ b/deps/v8/src/compiler/arm/instruction-selector-arm.cc @@ -411,36 +411,33 @@ void VisitPairAtomicBinOp(InstructionSelector* selector, Node* node, Node* value = node->InputAt(2); Node* value_high = node->InputAt(3); AddressingMode addressing_mode = kMode_Offset_RR; - InstructionOperand inputs[] = {g.UseUniqueRegister(value), - g.UseUniqueRegister(value_high), - g.UseRegister(base), g.UseRegister(index)}; - InstructionOperand outputs[] = { - g.DefineAsFixed(NodeProperties::FindProjection(node, 0), r2), - g.DefineAsFixed(NodeProperties::FindProjection(node, 1), r3)}; - InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(r6), - g.TempRegister(r7), g.TempRegister()}; - InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); - selector->Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); -} - -void VisitNarrowAtomicBinOp(InstructionSelector* selector, Node* node, - ArchOpcode opcode) { - ArmOperandGenerator g(selector); - Node* base = node->InputAt(0); - Node* index = node->InputAt(1); - Node* value = node->InputAt(2); - AddressingMode addressing_mode = kMode_Offset_RR; - InstructionOperand inputs[3] = {g.UseRegister(base), g.UseRegister(index), - g.UseUniqueRegister(value)}; - InstructionOperand outputs[] = { - g.DefineAsFixed(NodeProperties::FindProjection(node, 0), r4), - g.DefineAsFixed(NodeProperties::FindProjection(node, 1), r5)}; - InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(), - g.TempRegister()}; + InstructionOperand inputs[] = { + g.UseUniqueRegister(value), g.UseUniqueRegister(value_high), + g.UseUniqueRegister(base), g.UseUniqueRegister(index)}; + Node* projection0 = NodeProperties::FindProjection(node, 0); + Node* projection1 = NodeProperties::FindProjection(node, 1); InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); - selector->Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); + if (projection1) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r2), + g.DefineAsFixed(projection1, r3)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(r6), + g.TempRegister(r7), g.TempRegister()}; + selector->Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); + } else if (projection0) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r2)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(r6), + g.TempRegister(r7), g.TempRegister(), + g.TempRegister(r3)}; + selector->Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); + } else { + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(r6), + g.TempRegister(r7), g.TempRegister(), + g.TempRegister(r2), g.TempRegister(r3)}; + selector->Emit(code, 0, nullptr, arraysize(inputs), inputs, + arraysize(temps), temps); + } } } // namespace @@ -2265,16 +2262,29 @@ void InstructionSelector::VisitWord32AtomicPairLoad(Node* node) { ArmOperandGenerator g(this); Node* base = node->InputAt(0); Node* index = node->InputAt(1); - InstructionOperand inputs[] = {g.UseRegister(base), g.UseRegister(index)}; - InstructionOperand outputs[] = { - g.DefineAsFixed(NodeProperties::FindProjection(node, 0), r0), - g.DefineAsFixed(NodeProperties::FindProjection(node, 1), r1)}; - InstructionOperand temps[] = {g.TempRegister()}; AddressingMode addressing_mode = kMode_Offset_RR; InstructionCode code = kArmWord32AtomicPairLoad | AddressingModeField::encode(addressing_mode); - Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); + InstructionOperand inputs[] = {g.UseUniqueRegister(base), + g.UseUniqueRegister(index)}; + Node* projection0 = NodeProperties::FindProjection(node, 0); + Node* projection1 = NodeProperties::FindProjection(node, 1); + if (projection1) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r0), + g.DefineAsFixed(projection1, r1)}; + InstructionOperand temps[] = {g.TempRegister()}; + Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); + } else if (projection0) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r0)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(r1)}; + Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); + } else { + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(r0), + g.TempRegister(r1)}; + Emit(code, 0, nullptr, arraysize(inputs), inputs, arraysize(temps), temps); + } } void InstructionSelector::VisitWord32AtomicPairStore(Node* node) { @@ -2314,39 +2324,6 @@ void InstructionSelector::VisitWord32AtomicPairXor(Node* node) { VisitPairAtomicBinOp(this, node, kArmWord32AtomicPairXor); } -void InstructionSelector::VisitWord64AtomicNarrowBinop(Node* node, - ArchOpcode uint8_op, - ArchOpcode uint16_op, - ArchOpcode uint32_op) { - MachineType type = AtomicOpType(node->op()); - DCHECK(type != MachineType::Uint64()); - ArchOpcode opcode = kArchNop; - if (type == MachineType::Uint32()) { - opcode = uint32_op; - } else if (type == MachineType::Uint16()) { - opcode = uint16_op; - } else if (type == MachineType::Uint8()) { - opcode = uint8_op; - } else { - UNREACHABLE(); - return; - } - VisitNarrowAtomicBinOp(this, node, opcode); -} - -#define VISIT_ATOMIC_BINOP(op) \ - void InstructionSelector::VisitWord64AtomicNarrow##op(Node* node) { \ - VisitWord64AtomicNarrowBinop(node, kArmWord64AtomicNarrow##op##Uint8, \ - kArmWord64AtomicNarrow##op##Uint16, \ - kArmWord64AtomicNarrow##op##Uint32); \ - } -VISIT_ATOMIC_BINOP(Add) -VISIT_ATOMIC_BINOP(Sub) -VISIT_ATOMIC_BINOP(And) -VISIT_ATOMIC_BINOP(Or) -VISIT_ATOMIC_BINOP(Xor) -#undef VISIT_ATOMIC_BINOP - void InstructionSelector::VisitWord32AtomicPairExchange(Node* node) { ArmOperandGenerator g(this); Node* base = node->InputAt(0); @@ -2354,95 +2331,63 @@ void InstructionSelector::VisitWord32AtomicPairExchange(Node* node) { Node* value = node->InputAt(2); Node* value_high = node->InputAt(3); AddressingMode addressing_mode = kMode_Offset_RR; - InstructionOperand inputs[] = {g.UseFixed(value, r0), - g.UseFixed(value_high, r1), - g.UseRegister(base), g.UseRegister(index)}; - InstructionOperand outputs[] = { - g.DefineAsFixed(NodeProperties::FindProjection(node, 0), r6), - g.DefineAsFixed(NodeProperties::FindProjection(node, 1), r7)}; - InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; + InstructionOperand inputs[] = { + g.UseFixed(value, r0), g.UseFixed(value_high, r1), + g.UseUniqueRegister(base), g.UseUniqueRegister(index)}; InstructionCode code = kArmWord32AtomicPairExchange | AddressingModeField::encode(addressing_mode); - Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); -} - -void InstructionSelector::VisitWord64AtomicNarrowExchange(Node* node) { - ArmOperandGenerator g(this); - Node* base = node->InputAt(0); - Node* index = node->InputAt(1); - Node* value = node->InputAt(2); - ArchOpcode opcode = kArchNop; - MachineType type = AtomicOpType(node->op()); - if (type == MachineType::Uint8()) { - opcode = kArmWord64AtomicNarrowExchangeUint8; - } else if (type == MachineType::Uint16()) { - opcode = kArmWord64AtomicNarrowExchangeUint16; - } else if (type == MachineType::Uint32()) { - opcode = kArmWord64AtomicNarrowExchangeUint32; + Node* projection0 = NodeProperties::FindProjection(node, 0); + Node* projection1 = NodeProperties::FindProjection(node, 1); + if (projection1) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r6), + g.DefineAsFixed(projection1, r7)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; + Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); + } else if (projection0) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r6)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(), + g.TempRegister(r7)}; + Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); } else { - UNREACHABLE(); - return; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(), + g.TempRegister(r6), g.TempRegister(r7)}; + Emit(code, 0, nullptr, arraysize(inputs), inputs, arraysize(temps), temps); } - AddressingMode addressing_mode = kMode_Offset_RR; - InstructionOperand inputs[] = {g.UseRegister(base), g.UseRegister(index), - g.UseUniqueRegister(value)}; - InstructionOperand outputs[] = { - g.DefineAsRegister(NodeProperties::FindProjection(node, 0)), - g.DefineAsRegister(NodeProperties::FindProjection(node, 1))}; - InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; - InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); - Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); } void InstructionSelector::VisitWord32AtomicPairCompareExchange(Node* node) { ArmOperandGenerator g(this); AddressingMode addressing_mode = kMode_Offset_RR; - InstructionOperand inputs[] = { - g.UseFixed(node->InputAt(2), r4), g.UseFixed(node->InputAt(3), r5), - g.UseFixed(node->InputAt(4), r8), g.UseFixed(node->InputAt(5), r9), - g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))}; - InstructionOperand outputs[] = { - g.DefineAsFixed(NodeProperties::FindProjection(node, 0), r2), - g.DefineAsFixed(NodeProperties::FindProjection(node, 1), r3)}; - InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; + InstructionOperand inputs[] = {g.UseFixed(node->InputAt(2), r4), + g.UseFixed(node->InputAt(3), r5), + g.UseFixed(node->InputAt(4), r8), + g.UseFixed(node->InputAt(5), r9), + g.UseUniqueRegister(node->InputAt(0)), + g.UseUniqueRegister(node->InputAt(1))}; InstructionCode code = kArmWord32AtomicPairCompareExchange | AddressingModeField::encode(addressing_mode); - Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); -} - -void InstructionSelector::VisitWord64AtomicNarrowCompareExchange(Node* node) { - ArmOperandGenerator g(this); - Node* base = node->InputAt(0); - Node* index = node->InputAt(1); - Node* old_value = node->InputAt(2); - Node* new_value = node->InputAt(3); - ArchOpcode opcode = kArchNop; - MachineType type = AtomicOpType(node->op()); - if (type == MachineType::Uint8()) { - opcode = kArmWord64AtomicNarrowCompareExchangeUint8; - } else if (type == MachineType::Uint16()) { - opcode = kArmWord64AtomicNarrowCompareExchangeUint16; - } else if (type == MachineType::Uint32()) { - opcode = kArmWord64AtomicNarrowCompareExchangeUint32; + Node* projection0 = NodeProperties::FindProjection(node, 0); + Node* projection1 = NodeProperties::FindProjection(node, 1); + if (projection1) { + InstructionOperand outputs[] = {g.DefineAsFixed(projection0, r2), + g.DefineAsFixed(projection1, r3)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; + Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); + } else if (projection0) { + InstructionOperand outputs[] = { + g.DefineAsFixed(NodeProperties::FindProjection(node, 0), r2)}; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(), + g.TempRegister(r3)}; + Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, + arraysize(temps), temps); } else { - UNREACHABLE(); - return; + InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(), + g.TempRegister(r2), g.TempRegister(r3)}; + Emit(code, 0, nullptr, arraysize(inputs), inputs, arraysize(temps), temps); } - AddressingMode addressing_mode = kMode_Offset_RR; - InstructionOperand inputs[] = {g.UseRegister(base), g.UseRegister(index), - g.UseUniqueRegister(old_value), - g.UseUniqueRegister(new_value)}; - InstructionOperand outputs[] = { - g.DefineAsRegister(NodeProperties::FindProjection(node, 0)), - g.DefineAsRegister(NodeProperties::FindProjection(node, 1))}; - InstructionOperand temps[] = {g.TempRegister(), g.TempRegister(), - g.TempRegister()}; - InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); - Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, - arraysize(temps), temps); } #define SIMD_TYPE_LIST(V) \ |