diff options
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.cc | 31 |
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. |