diff options
Diffstat (limited to 'deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc')
-rw-r--r-- | deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc index bea1475584..eb9195b0d1 100644 --- a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc +++ b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc @@ -18,7 +18,7 @@ #include "src/codegen/ia32/assembler-ia32.h" #include "src/codegen/ia32/register-ia32.h" #include "src/codegen/machine-type.h" -#include "src/codegen/turbo-assembler.h" +#include "src/codegen/macro-assembler-base.h" #include "src/common/globals.h" #include "src/compiler/backend/instruction-codes.h" #include "src/compiler/backend/instruction-selector-impl.h" @@ -208,7 +208,7 @@ class IA32OperandGenerator final : public OperandGenerator { m.object().ResolvedValue())) { ptrdiff_t const delta = m.index().ResolvedValue() + - TurboAssemblerBase::RootRegisterOffsetForExternalReference( + MacroAssemblerBase::RootRegisterOffsetForExternalReference( selector()->isolate(), m.object().ResolvedValue()); if (is_int32(delta)) { inputs[(*input_count)++] = TempImmediate(static_cast<int32_t>(delta)); @@ -219,7 +219,14 @@ class IA32OperandGenerator final : public OperandGenerator { BaseWithIndexAndDisplacement32Matcher m(node, AddressOption::kAllowAll); DCHECK(m.matches()); - if ((m.displacement() == nullptr || CanBeImmediate(m.displacement()))) { + if (m.base() != nullptr && + m.base()->opcode() == IrOpcode::kLoadRootRegister) { + DCHECK_EQ(m.index(), nullptr); + DCHECK_EQ(m.scale(), 0); + inputs[(*input_count)++] = UseImmediate(m.displacement()); + return kMode_Root; + } else if ((m.displacement() == nullptr || + CanBeImmediate(m.displacement()))) { return GenerateMemoryOperandInputs( m.index(), m.scale(), m.base(), m.displacement(), m.displacement_mode(), inputs, input_count, register_mode); @@ -714,7 +721,7 @@ void VisitStoreCommon(InstructionSelector* selector, Node* node, InstructionCode code = is_seqcst ? kArchAtomicStoreWithWriteBarrier : kArchStoreWithWriteBarrier; code |= AddressingModeField::encode(addressing_mode); - code |= MiscField::encode(static_cast<int>(record_write_mode)); + code |= RecordWriteModeField::encode(record_write_mode); selector->Emit(code, 0, nullptr, arraysize(inputs), inputs, temp_count, temps); } else if (is_seqcst) { @@ -3261,23 +3268,22 @@ void InstructionSelector::VisitF64x2PromoteLowF32x4(Node* node) { } namespace { -// pblendvb is a correct implementation for all the various relaxed lane select, -// see https://github.com/WebAssembly/relaxed-simd/issues/17. -void VisitRelaxedLaneSelect(InstructionSelector* selector, Node* node) { +void VisitRelaxedLaneSelect(InstructionSelector* selector, Node* node, + InstructionCode code = kIA32Pblendvb) { IA32OperandGenerator g(selector); - // pblendvb copies src2 when mask is set, opposite from Wasm semantics. - // node's inputs are: mask, lhs, rhs (determined in wasm-compiler.cc). + // pblendvb/blendvps/blendvpd copies src2 when mask is set, opposite from Wasm + // semantics. node's inputs are: mask, lhs, rhs (determined in + // wasm-compiler.cc). if (selector->IsSupported(AVX)) { - selector->Emit(kIA32Pblendvb, g.DefineAsRegister(node), - g.UseRegister(node->InputAt(2)), - g.UseRegister(node->InputAt(1)), - g.UseRegister(node->InputAt(0))); + selector->Emit( + code, g.DefineAsRegister(node), g.UseRegister(node->InputAt(2)), + g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(0))); } else { - // SSE4.1 pblendvb requires xmm0 to hold the mask as an implicit operand. - selector->Emit(kIA32Pblendvb, g.DefineSameAsFirst(node), - g.UseRegister(node->InputAt(2)), - g.UseRegister(node->InputAt(1)), - g.UseFixed(node->InputAt(0), xmm0)); + // SSE4.1 pblendvb/blendvps/blendvpd requires xmm0 to hold the mask as an + // implicit operand. + selector->Emit( + code, g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(2)), + g.UseRegister(node->InputAt(1)), g.UseFixed(node->InputAt(0), xmm0)); } } } // namespace @@ -3289,10 +3295,10 @@ void InstructionSelector::VisitI16x8RelaxedLaneSelect(Node* node) { VisitRelaxedLaneSelect(this, node); } void InstructionSelector::VisitI32x4RelaxedLaneSelect(Node* node) { - VisitRelaxedLaneSelect(this, node); + VisitRelaxedLaneSelect(this, node, kIA32Blendvps); } void InstructionSelector::VisitI64x2RelaxedLaneSelect(Node* node) { - VisitRelaxedLaneSelect(this, node); + VisitRelaxedLaneSelect(this, node, kIA32Blendvpd); } void InstructionSelector::VisitF64x2Qfma(Node* node) { @@ -3317,6 +3323,15 @@ void InstructionSelector::VisitI16x8DotI8x16I7x16S(Node* node) { g.UseUniqueRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); } +void InstructionSelector::VisitI32x4DotI8x16I7x16AddS(Node* node) { + IA32OperandGenerator g(this); + InstructionOperand temps[] = {g.TempSimd128Register()}; + Emit(kIA32I32x4DotI8x16I7x16AddS, g.DefineSameAsInput(node, 2), + g.UseUniqueRegister(node->InputAt(0)), + g.UseUniqueRegister(node->InputAt(1)), + g.UseUniqueRegister(node->InputAt(2)), arraysize(temps), temps); +} + void InstructionSelector::AddOutputToSelectContinuation(OperandGenerator* g, int first_input_index, Node* node) { |