summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
diff options
context:
space:
mode:
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.cc55
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) {