summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc')
-rw-r--r--deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc31
1 files changed, 22 insertions, 9 deletions
diff --git a/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc b/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
index 83f5b5ecb4..130831675f 100644
--- a/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
+++ b/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
@@ -168,7 +168,7 @@ void EmitLoad(InstructionSelector* selector, Node* node, InstructionCode opcode,
selector->CanAddressRelativeToRootsRegister(m.ResolvedValue())) {
ptrdiff_t const delta =
g.GetIntegerConstantValue(index) +
- TurboAssemblerBase::RootRegisterOffsetForExternalReference(
+ MacroAssemblerBase::RootRegisterOffsetForExternalReference(
selector->isolate(), m.ResolvedValue());
// Check that the delta is a 32-bit integer due to the limitations of
// immediate operands.
@@ -181,6 +181,13 @@ void EmitLoad(InstructionSelector* selector, Node* node, InstructionCode opcode,
}
}
+ if (base != nullptr && base->opcode() == IrOpcode::kLoadRootRegister) {
+ selector->Emit(opcode | AddressingModeField::encode(kMode_Root),
+ g.DefineAsRegister(output == nullptr ? node : output),
+ g.UseImmediate(index));
+ return;
+ }
+
if (g.CanBeImmediate(index, opcode)) {
selector->Emit(opcode | AddressingModeField::encode(kMode_MRI),
g.DefineAsRegister(output == nullptr ? node : output),
@@ -280,10 +287,10 @@ void InstructionSelector::VisitLoad(Node* node) {
opcode = kRiscvLoadDecompressTaggedSigned;
break;
case MachineRepresentation::kTaggedPointer:
- opcode = kRiscvLoadDecompressTaggedPointer;
+ opcode = kRiscvLoadDecompressTagged;
break;
case MachineRepresentation::kTagged:
- opcode = kRiscvLoadDecompressAnyTagged;
+ opcode = kRiscvLoadDecompressTagged;
break;
#else
case MachineRepresentation::kTaggedSigned: // Fall through.
@@ -338,7 +345,7 @@ void InstructionSelector::VisitStore(Node* node) {
InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
size_t const temp_count = arraysize(temps);
InstructionCode code = kArchStoreWithWriteBarrier;
- code |= MiscField::encode(static_cast<int>(record_write_mode));
+ code |= RecordWriteModeField::encode(record_write_mode);
Emit(code, 0, nullptr, input_count, inputs, temp_count, temps);
} else {
ArchOpcode opcode;
@@ -387,17 +394,23 @@ void InstructionSelector::VisitStore(Node* node) {
UNREACHABLE();
}
+ if (base != nullptr && base->opcode() == IrOpcode::kLoadRootRegister) {
+ Emit(opcode | AddressingModeField::encode(kMode_Root), g.NoOutput(),
+ g.UseRegisterOrImmediateZero(value), g.UseImmediate(index));
+ return;
+ }
+
if (g.CanBeImmediate(index, opcode)) {
Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
- g.UseRegister(base), g.UseImmediate(index),
- g.UseRegisterOrImmediateZero(value));
+ g.UseRegisterOrImmediateZero(value), g.UseRegister(base),
+ g.UseImmediate(index));
} else {
InstructionOperand addr_reg = g.TempRegister();
Emit(kRiscvAdd64 | AddressingModeField::encode(kMode_None), addr_reg,
g.UseRegister(index), g.UseRegister(base));
// Emit desired store opcode, using temp addr_reg.
Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
- addr_reg, g.TempImmediate(0), g.UseRegisterOrImmediateZero(value));
+ g.UseRegisterOrImmediateZero(value), addr_reg, g.TempImmediate(0));
}
}
}
@@ -1938,10 +1951,10 @@ void InstructionSelector::VisitWord64AtomicLoad(Node* node) {
opcode = kRiscv64LdDecompressTaggedSigned;
break;
case MachineRepresentation::kTaggedPointer:
- opcode = kRiscv64LdDecompressTaggedPointer;
+ opcode = kRiscv64LdDecompressTagged;
break;
case MachineRepresentation::kTagged:
- opcode = kRiscv64LdDecompressAnyTagged;
+ opcode = kRiscv64LdDecompressTagged;
break;
#else
case MachineRepresentation::kTaggedSigned: // Fall through.