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 | 180 |
1 files changed, 174 insertions, 6 deletions
diff --git a/deps/v8/src/compiler/arm/instruction-selector-arm.cc b/deps/v8/src/compiler/arm/instruction-selector-arm.cc index 5279d1eec1..def486af62 100644 --- a/deps/v8/src/compiler/arm/instruction-selector-arm.cc +++ b/deps/v8/src/compiler/arm/instruction-selector-arm.cc @@ -267,6 +267,9 @@ void VisitBinop(InstructionSelector* selector, Node* node, if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, cont->reason(), cont->frame_state()); + } else if (cont->IsTrap()) { + inputs[input_count++] = g.UseImmediate(cont->trap_id()); + selector->Emit(opcode, output_count, outputs, input_count, inputs); } else { selector->Emit(opcode, output_count, outputs, input_count, inputs); } @@ -501,6 +504,11 @@ void InstructionSelector::VisitStore(Node* node) { } } +void InstructionSelector::VisitProtectedStore(Node* node) { + // TODO(eholk) + UNIMPLEMENTED(); +} + void InstructionSelector::VisitUnalignedLoad(Node* node) { UnalignedLoadRepresentation load_rep = UnalignedLoadRepresentationOf(node->op()); @@ -885,6 +893,9 @@ void VisitShift(InstructionSelector* selector, Node* node, if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, cont->reason(), cont->frame_state()); + } else if (cont->IsTrap()) { + inputs[input_count++] = g.UseImmediate(cont->trap_id()); + selector->Emit(opcode, output_count, outputs, input_count, inputs); } else { selector->Emit(opcode, output_count, outputs, input_count, inputs); } @@ -1252,10 +1263,14 @@ void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node, InstructionOperand in[] = {temp_operand, result_operand, shift_31}; selector->EmitDeoptimize(opcode, 0, nullptr, 3, in, cont->reason(), cont->frame_state()); - } else { - DCHECK(cont->IsSet()); + } else if (cont->IsSet()) { selector->Emit(opcode, g.DefineAsRegister(cont->result()), temp_operand, result_operand, shift_31); + } else { + DCHECK(cont->IsTrap()); + InstructionOperand in[] = {temp_operand, result_operand, shift_31, + g.UseImmediate(cont->trap_id())}; + selector->Emit(opcode, 0, nullptr, 4, in); } } @@ -1643,9 +1658,12 @@ void VisitCompare(InstructionSelector* selector, InstructionCode opcode, } else if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, g.NoOutput(), left, right, cont->reason(), cont->frame_state()); - } else { - DCHECK(cont->IsSet()); + } else if (cont->IsSet()) { selector->Emit(opcode, g.DefineAsRegister(cont->result()), left, right); + } else { + DCHECK(cont->IsTrap()); + selector->Emit(opcode, g.NoOutput(), left, right, + g.UseImmediate(cont->trap_id())); } } @@ -1836,6 +1854,9 @@ void VisitWordCompare(InstructionSelector* selector, Node* node, if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, cont->reason(), cont->frame_state()); + } else if (cont->IsTrap()) { + inputs[input_count++] = g.UseImmediate(cont->trap_id()); + selector->Emit(opcode, output_count, outputs, input_count, inputs); } else { selector->Emit(opcode, output_count, outputs, input_count, inputs); } @@ -1992,10 +2013,13 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user, } else if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, g.NoOutput(), value_operand, value_operand, cont->reason(), cont->frame_state()); - } else { - DCHECK(cont->IsSet()); + } else if (cont->IsSet()) { selector->Emit(opcode, g.DefineAsRegister(cont->result()), value_operand, value_operand); + } else { + DCHECK(cont->IsTrap()); + selector->Emit(opcode, g.NoOutput(), value_operand, value_operand, + g.UseImmediate(cont->trap_id())); } } @@ -2019,6 +2043,19 @@ void InstructionSelector::VisitDeoptimizeUnless(Node* node) { VisitWordCompareZero(this, node, node->InputAt(0), &cont); } +void InstructionSelector::VisitTrapIf(Node* node, Runtime::FunctionId func_id) { + FlagsContinuation cont = + FlagsContinuation::ForTrap(kNotEqual, func_id, node->InputAt(1)); + VisitWordCompareZero(this, node, node->InputAt(0), &cont); +} + +void InstructionSelector::VisitTrapUnless(Node* node, + Runtime::FunctionId func_id) { + FlagsContinuation cont = + FlagsContinuation::ForTrap(kEqual, func_id, node->InputAt(1)); + VisitWordCompareZero(this, node, node->InputAt(0), &cont); +} + void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) { ArmOperandGenerator g(this); InstructionOperand value_operand = g.UseRegister(node->InputAt(0)); @@ -2249,6 +2286,137 @@ void InstructionSelector::VisitAtomicStore(Node* node) { Emit(code, 0, nullptr, input_count, inputs); } +void InstructionSelector::VisitCreateFloat32x4(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); +} + +void InstructionSelector::VisitFloat32x4ExtractLane(Node* node) { + ArmOperandGenerator g(this); + int32_t lane = OpParameter<int32_t>(node); + Emit(kArmFloat32x4ExtractLane, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); +} + +void InstructionSelector::VisitFloat32x4ReplaceLane(Node* node) { + ArmOperandGenerator g(this); + int32_t lane = OpParameter<int32_t>(node); + Emit(kArmFloat32x4ReplaceLane, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), + g.Use(node->InputAt(1))); +} + +void InstructionSelector::VisitFloat32x4FromInt32x4(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4FromInt32x4, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0))); +} + +void InstructionSelector::VisitFloat32x4FromUint32x4(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4FromUint32x4, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0))); +} + +void InstructionSelector::VisitFloat32x4Abs(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Abs, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0))); +} + +void InstructionSelector::VisitFloat32x4Neg(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Neg, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0))); +} + +void InstructionSelector::VisitFloat32x4Add(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Add, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitFloat32x4Sub(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Sub, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitFloat32x4Equal(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Eq, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitFloat32x4NotEqual(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmFloat32x4Ne, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitCreateInt32x4(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmInt32x4Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); +} + +void InstructionSelector::VisitInt32x4ExtractLane(Node* node) { + ArmOperandGenerator g(this); + int32_t lane = OpParameter<int32_t>(node); + Emit(kArmInt32x4ExtractLane, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); +} + +void InstructionSelector::VisitInt32x4ReplaceLane(Node* node) { + ArmOperandGenerator g(this); + int32_t lane = OpParameter<int32_t>(node); + Emit(kArmInt32x4ReplaceLane, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), + g.Use(node->InputAt(1))); +} + +void InstructionSelector::VisitInt32x4FromFloat32x4(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmInt32x4FromFloat32x4, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0))); +} + +void InstructionSelector::VisitUint32x4FromFloat32x4(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmUint32x4FromFloat32x4, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0))); +} + +void InstructionSelector::VisitInt32x4Add(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmInt32x4Add, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitInt32x4Sub(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmInt32x4Sub, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitInt32x4Equal(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmInt32x4Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), + g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitInt32x4NotEqual(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmInt32x4Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), + g.UseRegister(node->InputAt(1))); +} + +void InstructionSelector::VisitSimd32x4Select(Node* node) { + ArmOperandGenerator g(this); + Emit(kArmSimd32x4Select, g.DefineAsRegister(node), + g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), + g.UseRegister(node->InputAt(2))); +} + // static MachineOperatorBuilder::Flags InstructionSelector::SupportedMachineOperatorFlags() { |