Commit 68d244a1 authored by jgruber's avatar jgruber Committed by Commit Bot

[wasm] Inline the arguments adaptor builtin lookup

The motivation behind this change is that the WasmArgumentsAdaptor
builtin needed too many registers on ia32 and was blocking work on
adding a root register.

Bug: v8:6666
Change-Id: I9d39af96e8520acc092f5ef4b7f0a159fe4e3b12
Reviewed-on: https://chromium-review.googlesource.com/1209788
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#55761}
parent 0606bf91
......@@ -1211,7 +1211,6 @@ namespace internal {
/* Wasm */ \
ASM(WasmCompileLazy) \
TFC(WasmAllocateHeapNumber, AllocateHeapNumber, 1) \
TFC(WasmArgumentsAdaptor, ArgumentsAdaptor, 1) \
TFC(WasmCallJavaScript, CallTrampoline, 1) \
TFC(WasmGrowMemory, WasmGrowMemory, 1) \
TFC(WasmStackGuard, NoContext, 1) \
......@@ -1477,7 +1476,6 @@ namespace internal {
#define WASM_RUNTIME_STUB_LIST(V, VTRAP) \
FOREACH_WASM_TRAPREASON(VTRAP) \
V(WasmAllocateHeapNumber) \
V(WasmArgumentsAdaptor) \
V(WasmCallJavaScript) \
V(WasmGrowMemory) \
V(WasmStackGuard) \
......
......@@ -55,18 +55,6 @@ TF_BUILTIN(WasmAllocateHeapNumber, WasmBuiltinsAssembler) {
TailCallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant());
}
TF_BUILTIN(WasmArgumentsAdaptor, WasmBuiltinsAssembler) {
TNode<Object> context = UncheckedParameter(Descriptor::kContext);
TNode<Object> function = UncheckedParameter(Descriptor::kTarget);
TNode<Object> new_target = UncheckedParameter(Descriptor::kNewTarget);
TNode<Object> argc1 = UncheckedParameter(Descriptor::kActualArgumentsCount);
TNode<Object> argc2 = UncheckedParameter(Descriptor::kExpectedArgumentsCount);
TNode<Code> target =
LoadBuiltinFromFrame(Builtins::kArgumentsAdaptorTrampoline);
TailCallStub(ArgumentsAdaptorDescriptor{}, target, context, function,
new_target, argc1, argc2);
}
TF_BUILTIN(WasmCallJavaScript, WasmBuiltinsAssembler) {
TNode<Object> context = UncheckedParameter(Descriptor::kContext);
TNode<Object> function = UncheckedParameter(Descriptor::kFunction);
......
......@@ -2439,11 +2439,7 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
AllocateRegisters(RegisterConfiguration::Poisoning(), call_descriptor,
run_verifier);
#if defined(V8_TARGET_ARCH_IA32) && defined(V8_EMBEDDED_BUILTINS)
// TODO(v8:6666): For explicitly listed builtins, register allocation fails
// due to register pressure when kRootRegister is not allocatable. Either
// refactor these builtins or fix register allocation in these cases.
} else if (Builtins::IsBuiltinId(data->info()->builtin_index()) &&
data->info()->builtin_index() != Builtins::kWasmArgumentsAdaptor) {
} else if (Builtins::IsBuiltinId(data->info()->builtin_index())) {
// TODO(v8:6666): Extend support to user code. Ensure that
// it is mutually exclusive with the Poisoning configuration above; and that
// it cooperates with restricted allocatable registers above.
......
......@@ -88,12 +88,14 @@ MachineType assert_size(int expected_size, MachineType type) {
mcgraph()->Int32Constant(WASM_INSTANCE_OBJECT_OFFSET(name)), Effect(), \
Control()))
#define LOAD_FIXED_ARRAY_SLOT(array_node, index) \
SetEffect(graph()->NewNode( \
mcgraph()->machine()->Load(MachineType::TaggedPointer()), array_node, \
mcgraph()->Int32Constant( \
wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(index)), \
Effect(), Control()))
#define LOAD_TAGGED_POINTER(base_pointer, byte_offset) \
SetEffect(graph()->NewNode( \
mcgraph()->machine()->Load(MachineType::TaggedPointer()), base_pointer, \
mcgraph()->Int32Constant(byte_offset), Effect(), Control()))
#define LOAD_FIXED_ARRAY_SLOT(array_node, index) \
LOAD_TAGGED_POINTER( \
array_node, wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(index))
constexpr uint32_t kBytesPerExceptionValuesArrayElement = 2;
......@@ -2966,6 +2968,14 @@ Node* WasmGraphBuilder::CurrentMemoryPages() {
return result;
}
Node* WasmGraphBuilder::BuildLoadBuiltinFromInstance(int builtin_index) {
DCHECK(Builtins::IsBuiltinId(builtin_index));
Node* roots =
LOAD_INSTANCE_FIELD(RootsArrayAddress, MachineType::TaggedPointer());
return LOAD_TAGGED_POINTER(
roots, Heap::roots_to_builtins_offset() + builtin_index * kPointerSize);
}
// Only call this function for code which is not reused across instantiations,
// as we do not patch the embedded js_context.
Node* WasmGraphBuilder::BuildCallToRuntimeWithContext(Runtime::FunctionId f,
......@@ -4545,8 +4555,8 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
pos, args);
} else if (function->shared()->internal_formal_parameter_count() >= 0) {
int pos = 0;
args[pos++] = mcgraph()->RelocatableIntPtrConstant(
wasm::WasmCode::kWasmArgumentsAdaptor, RelocInfo::WASM_STUB_CALL);
args[pos++] = BuildLoadBuiltinFromInstance(
Builtins::kArgumentsAdaptorTrampoline);
args[pos++] = callable_node; // target callable
args[pos++] = undefined_node; // new target
args[pos++] = mcgraph()->Int32Constant(wasm_count); // argument count
......@@ -4564,8 +4574,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
call_descriptor = Linkage::GetStubCallDescriptor(
mcgraph()->zone(), ArgumentsAdaptorDescriptor{}, 1 + wasm_count,
CallDescriptor::kNoFlags, Operator::kNoProperties,
StubCallMode::kCallWasmRuntimeStub);
CallDescriptor::kNoFlags, Operator::kNoProperties);
// Convert wasm numbers to JS values.
pos = AddArgumentNodes(args, pos, wasm_count, sig_);
......@@ -5401,6 +5410,7 @@ AssemblerOptions WasmAssemblerOptions() {
#undef WASM_INSTANCE_OBJECT_SIZE
#undef WASM_INSTANCE_OBJECT_OFFSET
#undef LOAD_INSTANCE_FIELD
#undef LOAD_TAGGED_POINTER
#undef LOAD_FIXED_ARRAY_SLOT
} // namespace compiler
......
......@@ -433,8 +433,6 @@ class WasmGraphBuilder {
Node* BuildSmiShiftBitsConstant();
Node* BuildChangeSmiToInt32(Node* value);
Node* BuildLoadInstanceFromExportedFunction(Node* closure);
// Asm.js specific functionality.
Node* BuildI32AsmjsSConvertF32(Node* input);
Node* BuildI32AsmjsSConvertF64(Node* input);
......@@ -460,6 +458,8 @@ class WasmGraphBuilder {
void SetNeedsStackCheck() { needs_stack_check_ = true; }
Node* BuildLoadBuiltinFromInstance(int builtin_index);
//-----------------------------------------------------------------------
// Operations involving the CEntry, a dependency we want to remove
// to get off the GC heap.
......@@ -469,10 +469,6 @@ class WasmGraphBuilder {
Node* BuildCallToRuntimeWithContext(Runtime::FunctionId f, Node* js_context,
Node** parameters, int parameter_count);
Node* BuildCallToRuntimeWithContextFromJS(Runtime::FunctionId f,
Node* js_context,
Node* const* parameters,
int parameter_count);
TrapId GetTrapIdForTrap(wasm::TrapReason reason);
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment