diff options
Diffstat (limited to 'deps/v8/src/compiler/s390/instruction-selector-s390.cc')
-rw-r--r-- | deps/v8/src/compiler/s390/instruction-selector-s390.cc | 321 |
1 files changed, 210 insertions, 111 deletions
diff --git a/deps/v8/src/compiler/s390/instruction-selector-s390.cc b/deps/v8/src/compiler/s390/instruction-selector-s390.cc index 54f5a0c68b..457c5a1d82 100644 --- a/deps/v8/src/compiler/s390/instruction-selector-s390.cc +++ b/deps/v8/src/compiler/s390/instruction-selector-s390.cc @@ -613,7 +613,8 @@ void VisitUnaryOp(InstructionSelector* selector, Node* node, if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, - cont->kind(), cont->reason(), cont->frame_state()); + cont->kind(), cont->reason(), cont->feedback(), + cont->frame_state()); } else if (cont->IsTrap()) { inputs[input_count++] = g.UseImmediate(cont->trap_id()); selector->Emit(opcode, output_count, outputs, input_count, inputs); @@ -688,7 +689,8 @@ void VisitBinOp(InstructionSelector* selector, Node* node, if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, - cont->kind(), cont->reason(), cont->frame_state()); + cont->kind(), cont->reason(), cont->feedback(), + cont->frame_state()); } else if (cont->IsTrap()) { inputs[input_count++] = g.UseImmediate(cont->trap_id()); selector->Emit(opcode, output_count, outputs, input_count, inputs); @@ -850,99 +852,6 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) { UNREACHABLE(); } // Architecture supports unaligned access, therefore VisitStore is used instead void InstructionSelector::VisitUnalignedStore(Node* node) { UNREACHABLE(); } -void InstructionSelector::VisitCheckedLoad(Node* node) { - CheckedLoadRepresentation load_rep = CheckedLoadRepresentationOf(node->op()); - S390OperandGenerator g(this); - Node* const base = node->InputAt(0); - Node* const offset = node->InputAt(1); - Node* const length = node->InputAt(2); - ArchOpcode opcode = kArchNop; - switch (load_rep.representation()) { - case MachineRepresentation::kWord8: - opcode = load_rep.IsSigned() ? kCheckedLoadInt8 : kCheckedLoadUint8; - break; - case MachineRepresentation::kWord16: - opcode = load_rep.IsSigned() ? kCheckedLoadInt16 : kCheckedLoadUint16; - break; - case MachineRepresentation::kWord32: - opcode = kCheckedLoadWord32; - break; -#if V8_TARGET_ARCH_S390X - case MachineRepresentation::kWord64: - opcode = kCheckedLoadWord64; - break; -#endif - case MachineRepresentation::kFloat32: - opcode = kCheckedLoadFloat32; - break; - case MachineRepresentation::kFloat64: - opcode = kCheckedLoadFloat64; - break; - case MachineRepresentation::kBit: // Fall through. - case MachineRepresentation::kTaggedSigned: // Fall through. - case MachineRepresentation::kTaggedPointer: // Fall through. - case MachineRepresentation::kTagged: // Fall through. -#if !V8_TARGET_ARCH_S390X - case MachineRepresentation::kWord64: // Fall through. -#endif - case MachineRepresentation::kSimd128: // Fall through. - case MachineRepresentation::kNone: - UNREACHABLE(); - return; - } - AddressingMode addressingMode = kMode_MRR; - Emit(opcode | AddressingModeField::encode(addressingMode), - g.DefineAsRegister(node), g.UseRegister(base), g.UseRegister(offset), - g.UseOperand(length, OperandMode::kUint32Imm)); -} - -void InstructionSelector::VisitCheckedStore(Node* node) { - MachineRepresentation rep = CheckedStoreRepresentationOf(node->op()); - S390OperandGenerator g(this); - Node* const base = node->InputAt(0); - Node* const offset = node->InputAt(1); - Node* const length = node->InputAt(2); - Node* const value = node->InputAt(3); - ArchOpcode opcode = kArchNop; - switch (rep) { - case MachineRepresentation::kWord8: - opcode = kCheckedStoreWord8; - break; - case MachineRepresentation::kWord16: - opcode = kCheckedStoreWord16; - break; - case MachineRepresentation::kWord32: - opcode = kCheckedStoreWord32; - break; -#if V8_TARGET_ARCH_S390X - case MachineRepresentation::kWord64: - opcode = kCheckedStoreWord64; - break; -#endif - case MachineRepresentation::kFloat32: - opcode = kCheckedStoreFloat32; - break; - case MachineRepresentation::kFloat64: - opcode = kCheckedStoreFloat64; - break; - case MachineRepresentation::kBit: // Fall through. - case MachineRepresentation::kTaggedSigned: // Fall through. - case MachineRepresentation::kTaggedPointer: // Fall through. - case MachineRepresentation::kTagged: // Fall through. -#if !V8_TARGET_ARCH_S390X - case MachineRepresentation::kWord64: // Fall through. -#endif - case MachineRepresentation::kSimd128: // Fall through. - case MachineRepresentation::kNone: - UNREACHABLE(); - return; - } - AddressingMode addressingMode = kMode_MRR; - Emit(opcode | AddressingModeField::encode(addressingMode), g.NoOutput(), - g.UseRegister(base), g.UseRegister(offset), - g.UseOperand(length, OperandMode::kUint32Imm), g.UseRegister(value)); -} - #if 0 static inline bool IsContiguousMask32(uint32_t value, int* mb, int* me) { int mask_width = base::bits::CountPopulation(value); @@ -987,7 +896,7 @@ void InstructionSelector::VisitWord64And(Node* node) { if (m.left().IsWord64Shr()) { // Adjust the mask such that it doesn't include any rotated bits. if (mb > 63 - sh) mb = 63 - sh; - sh = (64 - sh) & 0x3f; + sh = (64 - sh) & 0x3F; } else { // Adjust the mask such that it doesn't include any rotated bits. if (me < sh) me = sh; @@ -1075,7 +984,7 @@ void InstructionSelector::VisitWord64Shr(Node* node) { IsContiguousMask64((uint64_t)(mleft.right().Value()) >> sh, &mb, &me)) { // Adjust the mask such that it doesn't include any rotated bits. if (mb > 63 - sh) mb = 63 - sh; - sh = (64 - sh) & 0x3f; + sh = (64 - sh) & 0x3F; if (mb >= me) { bool match = false; ArchOpcode opcode; @@ -1249,6 +1158,8 @@ void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } #endif +void InstructionSelector::VisitSpeculationFence(Node* node) { UNREACHABLE(); } + void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) { VisitWord32UnaryOp(this, node, kS390_Abs32, OperandMode::kNone); } @@ -1728,7 +1639,8 @@ void VisitCompare(InstructionSelector* selector, InstructionCode opcode, g.Label(cont->true_block()), g.Label(cont->false_block())); } else if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, g.NoOutput(), left, right, cont->kind(), - cont->reason(), cont->frame_state()); + cont->reason(), cont->feedback(), + cont->frame_state()); } else if (cont->IsSet()) { selector->Emit(opcode, g.DefineAsRegister(cont->result()), left, right); } else { @@ -1816,7 +1728,8 @@ void VisitWordCompare(InstructionSelector* selector, Node* node, DCHECK(input_count <= 8 && output_count <= 1); if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, 0, nullptr, input_count, inputs, - cont->kind(), cont->reason(), cont->frame_state()); + cont->kind(), cont->reason(), cont->feedback(), + cont->frame_state()); } else { selector->Emit(opcode, output_count, outputs, input_count, inputs); } @@ -1921,7 +1834,8 @@ void VisitLoadAndTest(InstructionSelector* selector, InstructionCode opcode, opcode = cont->Encode(opcode); if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, - cont->kind(), cont->reason(), cont->frame_state()); + cont->kind(), cont->reason(), cont->feedback(), + cont->frame_state()); } else { selector->Emit(opcode, output_count, outputs, input_count, inputs); } @@ -2183,14 +2097,14 @@ void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, void InstructionSelector::VisitDeoptimizeIf(Node* node) { DeoptimizeParameters p = DeoptimizeParametersOf(node->op()); FlagsContinuation cont = FlagsContinuation::ForDeoptimize( - kNotEqual, p.kind(), p.reason(), node->InputAt(1)); + kNotEqual, p.kind(), p.reason(), p.feedback(), node->InputAt(1)); VisitWord32CompareZero(this, node, node->InputAt(0), &cont); } void InstructionSelector::VisitDeoptimizeUnless(Node* node) { DeoptimizeParameters p = DeoptimizeParametersOf(node->op()); FlagsContinuation cont = FlagsContinuation::ForDeoptimize( - kEqual, p.kind(), p.reason(), node->InputAt(1)); + kEqual, p.kind(), p.reason(), p.feedback(), node->InputAt(1)); VisitWord32CompareZero(this, node, node->InputAt(0), &cont); } @@ -2351,7 +2265,7 @@ void InstructionSelector::EmitPrepareArguments( // Poke any stack arguments. int slot = kStackFrameExtraParamSlot; for (PushParameter input : (*arguments)) { - Emit(kS390_StoreToStackSlot, g.NoOutput(), g.UseRegister(input.node()), + Emit(kS390_StoreToStackSlot, g.NoOutput(), g.UseRegister(input.node), g.TempImmediate(slot)); ++slot; } @@ -2361,19 +2275,20 @@ void InstructionSelector::EmitPrepareArguments( int slot = 0; for (PushParameter input : *arguments) { - if (input.node() == nullptr) continue; - num_slots += - input.type().representation() == MachineRepresentation::kFloat64 - ? kDoubleSize / kPointerSize - : 1; + if (input.node == nullptr) continue; + num_slots += input.location.GetType().representation() == + MachineRepresentation::kFloat64 + ? kDoubleSize / kPointerSize + : 1; } Emit(kS390_StackClaim, g.NoOutput(), g.TempImmediate(num_slots)); for (PushParameter input : *arguments) { // Skip any alignment holes in pushed nodes. - if (input.node()) { - Emit(kS390_StoreToStackSlot, g.NoOutput(), g.UseRegister(input.node()), + if (input.node) { + Emit(kS390_StoreToStackSlot, g.NoOutput(), g.UseRegister(input.node), g.TempImmediate(slot)); - slot += input.type().representation() == MachineRepresentation::kFloat64 + slot += input.location.GetType().representation() == + MachineRepresentation::kFloat64 ? (kDoubleSize / kPointerSize) : 1; } @@ -2489,6 +2404,190 @@ void InstructionSelector::VisitAtomicOr(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitAtomicXor(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitI32x4Splat(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4ExtractLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4ReplaceLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Add(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Sub(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Shl(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4ShrS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Mul(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4MaxS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4MinS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Eq(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Ne(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4MinU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4MaxU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4ShrU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4Neg(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4GtS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4GeS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4GtU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4GeU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8Splat(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8ExtractLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8ReplaceLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8Shl(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8ShrS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8ShrU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8Add(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8AddSaturateS(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI16x8Sub(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8SubSaturateS(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI16x8Mul(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8MinS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8MaxS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8Eq(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8Ne(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8AddSaturateU(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI16x8SubSaturateU(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI16x8MinU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8MaxU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8Neg(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8GtS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8GeS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8GtU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8GeU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16Neg(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16Splat(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16ExtractLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16ReplaceLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16Add(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16AddSaturateS(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI8x16Sub(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16SubSaturateS(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI8x16MinS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16MaxS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16Eq(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16Ne(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16GtS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16GeS(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16AddSaturateU(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI8x16SubSaturateU(Node* node) { + UNIMPLEMENTED(); +} + +void InstructionSelector::VisitI8x16MinU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16MaxU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16GtU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI8x16GeU(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitS128And(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitS128Or(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitS128Xor(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitS128Not(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitS128Zero(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Eq(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Ne(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Lt(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Le(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Splat(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4ExtractLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4ReplaceLane(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::EmitPrepareResults(ZoneVector<PushParameter>* results, + const CallDescriptor* descriptor, + Node* node) { + // TODO(John): Port. +} + +void InstructionSelector::VisitF32x4Add(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Sub(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Mul(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Min(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitF32x4Max(Node* node) { UNIMPLEMENTED(); } + // static MachineOperatorBuilder::Flags InstructionSelector::SupportedMachineOperatorFlags() { |