[riscv64][codegen] Add static interface descriptors
Port 2871e05cc3
Bug: v8:11420
Change-Id: Iaf7a4bc64cecdfc11decefd19c7e741a90003c6d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2834632
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: Brice Dobry <brice.dobry@futurewei.com>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: Camillo Bruni <cbruni@chromium.org>
Commit-Queue: Yahan Lu <yahan@iscas.ac.cn>
Cr-Commit-Position: refs/heads/master@{#74113}
This commit is contained in:
parent
0aacfb2a6e
commit
b30fa8a77e
2
BUILD.gn
2
BUILD.gn
@ -4301,7 +4301,7 @@ v8_source_set("v8_base_without_compiler") {
|
||||
"src/codegen/riscv64/assembler-riscv64.cc",
|
||||
"src/codegen/riscv64/constants-riscv64.cc",
|
||||
"src/codegen/riscv64/cpu-riscv64.cc",
|
||||
"src/codegen/riscv64/interface-descriptors-riscv64.cc",
|
||||
"src/codegen/riscv64/interface-descriptors-riscv64-inl.h",
|
||||
"src/codegen/riscv64/macro-assembler-riscv64.cc",
|
||||
"src/compiler/backend/riscv64/code-generator-riscv64.cc",
|
||||
"src/compiler/backend/riscv64/instruction-scheduler-riscv64.cc",
|
||||
|
@ -14,14 +14,13 @@ namespace baseline {
|
||||
#define __ basm_.
|
||||
|
||||
void BaselineCompiler::Prologue() {
|
||||
__ masm()->li(kInterpreterBytecodeArrayRegister, Operand(bytecode_));
|
||||
DCHECK_EQ(kJSFunctionRegister, kJavaScriptCallTargetRegister);
|
||||
// Enter the frame here, since CallBuiltin will override lr.
|
||||
__ masm()->EnterFrame(StackFrame::MANUAL);
|
||||
CallBuiltin(Builtins::kBaselineOutOfLinePrologue, kContextRegister,
|
||||
kJSFunctionRegister, kJavaScriptCallArgCountRegister,
|
||||
kInterpreterBytecodeArrayRegister,
|
||||
kJavaScriptCallNewTargetRegister);
|
||||
__ masm()->EnterFrame(StackFrame::BASELINE);
|
||||
DCHECK_EQ(kJSFunctionRegister, kJavaScriptCallTargetRegister);
|
||||
int max_frame_size = bytecode_->frame_size() + max_call_args_;
|
||||
CallBuiltin<Builtins::kBaselineOutOfLinePrologue>(
|
||||
kContextRegister, kJSFunctionRegister, kJavaScriptCallArgCountRegister,
|
||||
max_frame_size, kJavaScriptCallNewTargetRegister, bytecode_);
|
||||
PrologueFillFrame();
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include "src/api/api-arguments.h"
|
||||
#include "src/codegen/code-factory.h"
|
||||
#include "src/codegen/interface-descriptors-inl.h"
|
||||
#include "src/debug/debug.h"
|
||||
#include "src/deoptimizer/deoptimizer.h"
|
||||
#include "src/execution/frame-constants.h"
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include "src/codegen/mips64/interface-descriptors-mips64-inl.h"
|
||||
#elif V8_TARGET_ARCH_MIPS
|
||||
#include "src/codegen/mips/interface-descriptors-mips-inl.h"
|
||||
#elif V8_TARGET_ARCH_RISCV64
|
||||
#include "src/codegen/riscv64/interface-descriptors-riscv64-inl.h"
|
||||
#else
|
||||
#error Unsupported target architecture.
|
||||
#endif
|
||||
@ -270,7 +272,7 @@ constexpr auto BaselineOutOfLinePrologueDescriptor::registers() {
|
||||
// TODO(v8:11421): Implement on other platforms.
|
||||
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_IA32 || \
|
||||
V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || \
|
||||
V8_TARGET_ARCH_S390
|
||||
V8_TARGET_ARCH_S390 || V8_TARGET_ARCH_RISCV64
|
||||
return RegisterArray(
|
||||
kContextRegister, kJSFunctionRegister, kJavaScriptCallArgCountRegister,
|
||||
kJavaScriptCallExtraArg1Register, kJavaScriptCallNewTargetRegister,
|
||||
@ -285,7 +287,7 @@ constexpr auto BaselineLeaveFrameDescriptor::registers() {
|
||||
// TODO(v8:11421): Implement on other platforms.
|
||||
#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || \
|
||||
V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || \
|
||||
V8_TARGET_ARCH_S390
|
||||
V8_TARGET_ARCH_S390 || V8_TARGET_ARCH_RISCV64
|
||||
return RegisterArray(ParamsSizeRegister(), WeightRegister());
|
||||
#else
|
||||
return DefaultRegisterArray();
|
||||
|
270
src/codegen/riscv64/interface-descriptors-riscv64-inl.h
Normal file
270
src/codegen/riscv64/interface-descriptors-riscv64-inl.h
Normal file
@ -0,0 +1,270 @@
|
||||
// Copyright 2021 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef V8_CODEGEN_RISCV64_INTERFACE_DESCRIPTORS_RISCV64_INL_H_
|
||||
#define V8_CODEGEN_RISCV64_INTERFACE_DESCRIPTORS_RISCV64_INL_H_
|
||||
|
||||
#if V8_TARGET_ARCH_RISCV64
|
||||
|
||||
#include "src/base/template-utils.h"
|
||||
#include "src/codegen/interface-descriptors.h"
|
||||
#include "src/execution/frames.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
constexpr auto CallInterfaceDescriptor::DefaultRegisterArray() {
|
||||
auto registers = RegisterArray(a0, a1, a2, a3, a4);
|
||||
STATIC_ASSERT(registers.size() == kMaxBuiltinRegisterParams);
|
||||
return registers;
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto RecordWriteDescriptor::registers() {
|
||||
return RegisterArray(a0, a1, a2, a3, kReturnRegister0);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto DynamicCheckMapsDescriptor::registers() {
|
||||
return RegisterArray(kReturnRegister0, a1, a2, a3, cp);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto EphemeronKeyBarrierDescriptor::registers() {
|
||||
return RegisterArray(a0, a1, a2, a3, kReturnRegister0);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr Register LoadDescriptor::ReceiverRegister() { return a1; }
|
||||
// static
|
||||
constexpr Register LoadDescriptor::NameRegister() { return a2; }
|
||||
// static
|
||||
constexpr Register LoadDescriptor::SlotRegister() { return a0; }
|
||||
|
||||
// static
|
||||
constexpr Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
|
||||
|
||||
// static
|
||||
constexpr Register
|
||||
LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
|
||||
return a4;
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr Register StoreDescriptor::ReceiverRegister() { return a1; }
|
||||
// static
|
||||
constexpr Register StoreDescriptor::NameRegister() { return a2; }
|
||||
// static
|
||||
constexpr Register StoreDescriptor::ValueRegister() { return a0; }
|
||||
// static
|
||||
constexpr Register StoreDescriptor::SlotRegister() { return a4; }
|
||||
|
||||
// static
|
||||
constexpr Register StoreWithVectorDescriptor::VectorRegister() { return a3; }
|
||||
|
||||
// static
|
||||
constexpr Register StoreTransitionDescriptor::MapRegister() { return a5; }
|
||||
|
||||
// static
|
||||
constexpr Register ApiGetterDescriptor::HolderRegister() { return a0; }
|
||||
// static
|
||||
constexpr Register ApiGetterDescriptor::CallbackRegister() { return a3; }
|
||||
|
||||
// static
|
||||
constexpr Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
|
||||
// static
|
||||
constexpr Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
|
||||
|
||||
// static
|
||||
constexpr Register BaselineLeaveFrameDescriptor::ParamsSizeRegister() {
|
||||
return a2;
|
||||
}
|
||||
// static
|
||||
constexpr Register BaselineLeaveFrameDescriptor::WeightRegister() { return a3; }
|
||||
|
||||
// static
|
||||
// static
|
||||
constexpr Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
|
||||
|
||||
// static
|
||||
constexpr auto TypeofDescriptor::registers() { return RegisterArray(a3); }
|
||||
|
||||
// static
|
||||
constexpr auto CallTrampolineDescriptor::registers() {
|
||||
// a1: target
|
||||
// a0: number of arguments
|
||||
return RegisterArray(a1, a0);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto CallVarargsDescriptor::registers() {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a4 : arguments list length (untagged)
|
||||
// a2 : arguments list (FixedArray)
|
||||
return RegisterArray(a1, a0, a4, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto CallForwardVarargsDescriptor::registers() {
|
||||
// a1: target
|
||||
// a0: number of arguments
|
||||
// a2: start index (to supported rest parameters)
|
||||
return RegisterArray(a1, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto CallFunctionTemplateDescriptor::registers() {
|
||||
// a1 : function template info
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
return RegisterArray(a1, a0);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto CallWithSpreadDescriptor::registers() {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a2 : the object to spread
|
||||
return RegisterArray(a1, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto CallWithArrayLikeDescriptor::registers() {
|
||||
// a1 : the target to call
|
||||
// a2 : the arguments list
|
||||
return RegisterArray(a1, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ConstructVarargsDescriptor::registers() {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a3 : the new target
|
||||
// a4 : arguments list length (untagged)
|
||||
// a2 : arguments list (FixedArray)
|
||||
return RegisterArray(a1, a3, a0, a4, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ConstructForwardVarargsDescriptor::registers() {
|
||||
// a3: new target
|
||||
// a1: target
|
||||
// a0: number of arguments
|
||||
// a2: start index (to supported rest parameters)
|
||||
return RegisterArray(a1, a3, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ConstructWithSpreadDescriptor::registers() {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a3 : the new target
|
||||
// a2 : the object to spread
|
||||
return RegisterArray(a1, a3, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ConstructWithArrayLikeDescriptor::registers() {
|
||||
// a1 : the target to call
|
||||
// a3 : the new target
|
||||
// a2 : the arguments list
|
||||
return RegisterArray(a1, a3, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ConstructStubDescriptor::registers() {
|
||||
// a3: new target
|
||||
// a1: target
|
||||
// a0: number of arguments
|
||||
// a2: allocation site or undefined
|
||||
return RegisterArray(a1, a3, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto AbortDescriptor::registers() { return RegisterArray(a0); }
|
||||
|
||||
// static
|
||||
constexpr auto CompareDescriptor::registers() {
|
||||
// a1: left operand
|
||||
// a0: right operand
|
||||
return RegisterArray(a1, a0);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto Compare_BaselineDescriptor::registers() {
|
||||
// a1: left operand
|
||||
// a0: right operand
|
||||
// a2: feedback slot
|
||||
return RegisterArray(a1, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto BinaryOpDescriptor::registers() {
|
||||
// a1: left operand
|
||||
// a0: right operand
|
||||
return RegisterArray(a1, a0);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto BinaryOp_BaselineDescriptor::registers() {
|
||||
// a1: left operand
|
||||
// a0: right operand
|
||||
// a2: feedback slot
|
||||
return RegisterArray(a1, a0, a2);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ApiCallbackDescriptor::registers() {
|
||||
return RegisterArray(a1, // kApiFunctionAddress
|
||||
a2, // kArgc
|
||||
a3, // kCallData
|
||||
a0); // kHolder
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto InterpreterDispatchDescriptor::registers() {
|
||||
return RegisterArray(
|
||||
kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
|
||||
kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister);
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto InterpreterPushArgsThenCallDescriptor::registers() {
|
||||
return RegisterArray(a0, // argument count (not including receiver)
|
||||
a2, // address of first argument
|
||||
a1); // the target callable to be call
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto InterpreterPushArgsThenConstructDescriptor::registers() {
|
||||
return RegisterArray(
|
||||
a0, // argument count (not including receiver)
|
||||
a4, // address of the first argument
|
||||
a1, // constructor to call
|
||||
a3, // new target
|
||||
a2); // allocation site feedback if available, undefined otherwise
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto ResumeGeneratorDescriptor::registers() {
|
||||
return RegisterArray(a0, // the value to pass to the generator
|
||||
a1); // the JSGeneratorObject to resume
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto FrameDropperTrampolineDescriptor::registers() {
|
||||
return RegisterArray(a1); // loaded new FP
|
||||
}
|
||||
|
||||
// static
|
||||
constexpr auto RunMicrotasksEntryDescriptor::registers() {
|
||||
return RegisterArray(a0, a1);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_TARGET_ARCH_RISCV64
|
||||
|
||||
#endif // V8_CODEGEN_RISCV64_INTERFACE_DESCRIPTORS_RISCV64_INL_H_
|
@ -1,322 +0,0 @@
|
||||
// Copyright 2021 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#if V8_TARGET_ARCH_RISCV64
|
||||
|
||||
#include "src/codegen/interface-descriptors.h"
|
||||
#include "src/execution/frames.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
|
||||
|
||||
void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data, int register_parameter_count) {
|
||||
const Register default_stub_registers[] = {a0, a1, a2, a3, a4};
|
||||
CHECK_LE(static_cast<size_t>(register_parameter_count),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(register_parameter_count,
|
||||
default_stub_registers);
|
||||
}
|
||||
|
||||
void WasmI32AtomicWait32Descriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
const Register default_stub_registers[] = {a0, a1, a2, a3};
|
||||
CHECK_EQ(static_cast<size_t>(kParameterCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
void WasmI64AtomicWait32Descriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
const Register default_stub_registers[] = {a0, a1, a2, a3, a4};
|
||||
CHECK_EQ(static_cast<size_t>(kParameterCount - kStackArgumentsCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount - kStackArgumentsCount,
|
||||
default_stub_registers);
|
||||
}
|
||||
|
||||
void RecordWriteDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
const Register default_stub_registers[] = {a0, a1, a2, a3, kReturnRegister0};
|
||||
|
||||
data->RestrictAllocatableRegisters(default_stub_registers,
|
||||
arraysize(default_stub_registers));
|
||||
|
||||
CHECK_LE(static_cast<size_t>(kParameterCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
void EphemeronKeyBarrierDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
const Register default_stub_registers[] = {a0, a1, a2, a3, kReturnRegister0};
|
||||
|
||||
data->RestrictAllocatableRegisters(default_stub_registers,
|
||||
arraysize(default_stub_registers));
|
||||
|
||||
CHECK_LE(static_cast<size_t>(kParameterCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
void DynamicCheckMapsDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register default_stub_registers[] = {kReturnRegister0, a1, a2, a3, cp};
|
||||
|
||||
data->RestrictAllocatableRegisters(default_stub_registers,
|
||||
arraysize(default_stub_registers));
|
||||
|
||||
CHECK_LE(static_cast<size_t>(kParameterCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
const Register LoadDescriptor::ReceiverRegister() { return a1; }
|
||||
const Register LoadDescriptor::NameRegister() { return a2; }
|
||||
const Register LoadDescriptor::SlotRegister() { return a0; }
|
||||
|
||||
const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
|
||||
|
||||
const Register
|
||||
LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() {
|
||||
return a4;
|
||||
}
|
||||
|
||||
const Register StoreDescriptor::ReceiverRegister() { return a1; }
|
||||
const Register StoreDescriptor::NameRegister() { return a2; }
|
||||
const Register StoreDescriptor::ValueRegister() { return a0; }
|
||||
const Register StoreDescriptor::SlotRegister() { return a4; }
|
||||
|
||||
const Register StoreWithVectorDescriptor::VectorRegister() { return a3; }
|
||||
|
||||
const Register StoreTransitionDescriptor::SlotRegister() { return a4; }
|
||||
const Register StoreTransitionDescriptor::VectorRegister() { return a3; }
|
||||
const Register StoreTransitionDescriptor::MapRegister() { return a5; }
|
||||
|
||||
const Register ApiGetterDescriptor::HolderRegister() { return a0; }
|
||||
const Register ApiGetterDescriptor::CallbackRegister() { return a3; }
|
||||
|
||||
const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
|
||||
const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
|
||||
|
||||
// static
|
||||
const Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
|
||||
|
||||
void TypeofDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {a3};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CallTrampolineDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1: target
|
||||
// a0: number of arguments
|
||||
Register registers[] = {a1, a0};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CallVarargsDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a4 : arguments list length (untagged)
|
||||
// a2 : arguments list (FixedArray)
|
||||
Register registers[] = {a1, a0, a4, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CallForwardVarargsDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1: the target to call
|
||||
// a0: number of arguments
|
||||
// a2: start index (to support rest parameters)
|
||||
Register registers[] = {a1, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CallFunctionTemplateDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1 : function template info
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
Register registers[] = {a1, a0};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CallWithSpreadDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a2 : the object to spread
|
||||
Register registers[] = {a1, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CallWithArrayLikeDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1 : the target to call
|
||||
// a2 : the arguments list
|
||||
Register registers[] = {a1, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ConstructVarargsDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a3 : the new target
|
||||
// a4 : arguments list length (untagged)
|
||||
// a2 : arguments list (FixedArray)
|
||||
Register registers[] = {a1, a3, a0, a4, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ConstructForwardVarargsDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1: the target to call
|
||||
// a3: new target
|
||||
// a0: number of arguments
|
||||
// a2: start index (to support rest parameters)
|
||||
Register registers[] = {a1, a3, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ConstructWithSpreadDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a0 : number of arguments (on the stack, not including receiver)
|
||||
// a1 : the target to call
|
||||
// a3 : the new target
|
||||
// a2 : the object to spread
|
||||
Register registers[] = {a1, a3, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1 : the target to call
|
||||
// a3 : the new target
|
||||
// a2 : the arguments list
|
||||
Register registers[] = {a1, a3, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ConstructStubDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1: target
|
||||
// a3: new target
|
||||
// a0: number of arguments
|
||||
// a2: allocation site or undefined
|
||||
Register registers[] = {a1, a3, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void AbortDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {a0};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void CompareDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {a1, a0};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void BinaryOpDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {a1, a0};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ApiCallbackDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {
|
||||
a1, // kApiFunctionAddress
|
||||
a2, // kArgc
|
||||
a3, // kCallData
|
||||
a0, // kHolder
|
||||
};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void InterpreterDispatchDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {
|
||||
kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
|
||||
kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void InterpreterPushArgsThenCallDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {
|
||||
a0, // argument count (not including receiver)
|
||||
a2, // address of first argument
|
||||
a1 // the target callable to be call
|
||||
};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {
|
||||
a0, // argument count (not including receiver)
|
||||
a4, // address of the first argument
|
||||
a1, // constructor to call
|
||||
a3, // new target
|
||||
a2, // allocation site feedback if available, undefined otherwise
|
||||
};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void ResumeGeneratorDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {
|
||||
a0, // the value to pass to the generator
|
||||
a1 // the JSGeneratorObject to resume
|
||||
};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void BinaryOp_BaselineDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1: left operand
|
||||
// a0: right operand
|
||||
// a2: feedback slot
|
||||
Register registers[] = {a1, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void Compare_BaselineDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// a1: left operand
|
||||
// a0: right operand
|
||||
// a2: feedback slot
|
||||
Register registers[] = {a1, a0, a2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void FrameDropperTrampolineDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {
|
||||
a1, // loaded new FP
|
||||
};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void RunMicrotasksEntryDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
Register registers[] = {a0, a1};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
const Register BaselineLeaveFrameDescriptor::ParamsSizeRegister() { return a2; }
|
||||
const Register BaselineLeaveFrameDescriptor::WeightRegister() { return a3; }
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_TARGET_ARCH_RISCV64
|
@ -12,6 +12,7 @@
|
||||
#include "src/codegen/callable.h"
|
||||
#include "src/codegen/code-factory.h"
|
||||
#include "src/codegen/external-reference-table.h"
|
||||
#include "src/codegen/interface-descriptors-inl.h"
|
||||
#include "src/codegen/macro-assembler.h"
|
||||
#include "src/codegen/register-configuration.h"
|
||||
#include "src/debug/debug.h"
|
||||
|
@ -2917,9 +2917,8 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table,
|
||||
|
||||
void InstructionSelector::VisitI8x16Shuffle(Node* node) {
|
||||
uint8_t shuffle[kSimd128Size];
|
||||
auto param = ShuffleParameterOf(node->op());
|
||||
bool is_swizzle = param.is_swizzle();
|
||||
base::Memcpy(shuffle, param.imm().data(), kSimd128Size);
|
||||
bool is_swizzle;
|
||||
CanonicalizeShuffle(node, shuffle, &is_swizzle);
|
||||
uint8_t shuffle32x4[4];
|
||||
ArchOpcode opcode;
|
||||
if (TryMatchArchShuffle(shuffle, arch_shuffles, arraysize(arch_shuffles),
|
||||
|
@ -385,6 +385,8 @@
|
||||
# SIMD not fully implemented yet
|
||||
'test-run-wasm-simd-liftoff/*': [SKIP],
|
||||
'test-run-wasm-simd/*':[SKIP],
|
||||
'test-gc/RunWasmLiftoff_RefTrivialCasts': [SKIP],
|
||||
'test-gc/RunWasmTurbofan_RefTrivialCasts': [SKIP],
|
||||
|
||||
# Some wasm functionality is not implemented yet
|
||||
'test-run-wasm-atomics64/*': [SKIP],
|
||||
|
@ -844,6 +844,7 @@
|
||||
'regress/wasm/regress-1161555': [SKIP],
|
||||
'regress/wasm/regress-1161954': [SKIP],
|
||||
'regress/wasm/regress-1187831': [SKIP],
|
||||
'regress/wasm/regress-1199662': [SKIP],
|
||||
'regress/regress-1172797': [SKIP],
|
||||
'regress/wasm/regress-1179025': [SKIP],
|
||||
'wasm/multi-value-simd': [SKIP],
|
||||
|
Loading…
Reference in New Issue
Block a user