summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-wasm-gen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/builtins-wasm-gen.cc')
-rw-r--r--deps/v8/src/builtins/builtins-wasm-gen.cc106
1 files changed, 100 insertions, 6 deletions
diff --git a/deps/v8/src/builtins/builtins-wasm-gen.cc b/deps/v8/src/builtins/builtins-wasm-gen.cc
index 87fe14743a..5826ec546e 100644
--- a/deps/v8/src/builtins/builtins-wasm-gen.cc
+++ b/deps/v8/src/builtins/builtins-wasm-gen.cc
@@ -10,17 +10,111 @@
namespace v8 {
namespace internal {
-typedef compiler::Node Node;
+class WasmBuiltinsAssembler : public CodeStubAssembler {
+ public:
+ explicit WasmBuiltinsAssembler(compiler::CodeAssemblerState* state)
+ : CodeStubAssembler(state) {}
-TF_BUILTIN(WasmStackGuard, CodeStubAssembler) {
- TailCallRuntime(Runtime::kWasmStackGuard, NoContextConstant());
+ protected:
+ TNode<Object> UncheckedParameter(int index) {
+ return UncheckedCast<Object>(Parameter(index));
+ }
+
+ TNode<Code> LoadBuiltinFromFrame(Builtins::Name id) {
+ TNode<Object> instance = LoadInstanceFromFrame();
+ TNode<IntPtrT> roots = UncheckedCast<IntPtrT>(
+ Load(MachineType::Pointer(), instance,
+ IntPtrConstant(WasmInstanceObject::kRootsArrayAddressOffset -
+ kHeapObjectTag)));
+ TNode<Code> target = UncheckedCast<Code>(Load(
+ MachineType::TaggedPointer(), roots,
+ IntPtrConstant(Heap::roots_to_builtins_offset() + id * kPointerSize)));
+ return target;
+ }
+
+ TNode<Object> LoadInstanceFromFrame() {
+ return UncheckedCast<Object>(
+ LoadFromParentFrame(WasmCompiledFrameConstants::kWasmInstanceOffset));
+ }
+
+ TNode<Code> LoadCEntryFromInstance(TNode<Object> instance) {
+ return UncheckedCast<Code>(
+ Load(MachineType::AnyTagged(), instance,
+ IntPtrConstant(WasmInstanceObject::kCEntryStubOffset -
+ kHeapObjectTag)));
+ }
+
+ TNode<Code> LoadCEntryFromFrame() {
+ return LoadCEntryFromInstance(LoadInstanceFromFrame());
+ }
+};
+
+TF_BUILTIN(WasmAllocateHeapNumber, WasmBuiltinsAssembler) {
+ TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
+ 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(ArgumentAdaptorDescriptor{}, target, context, function,
+ new_target, argc1, argc2);
+}
+
+TF_BUILTIN(WasmCallJavaScript, WasmBuiltinsAssembler) {
+ TNode<Object> context = UncheckedParameter(Descriptor::kContext);
+ TNode<Object> function = UncheckedParameter(Descriptor::kFunction);
+ TNode<Object> argc = UncheckedParameter(Descriptor::kActualArgumentsCount);
+ TNode<Code> target = LoadBuiltinFromFrame(Builtins::kCall_ReceiverIsAny);
+ TailCallStub(CallTrampolineDescriptor{}, target, context, function, argc);
+}
+
+TF_BUILTIN(WasmToNumber, WasmBuiltinsAssembler) {
+ TNode<Object> context = UncheckedParameter(Descriptor::kContext);
+ TNode<Object> argument = UncheckedParameter(Descriptor::kArgument);
+ TNode<Code> target = LoadBuiltinFromFrame(Builtins::kToNumber);
+ TailCallStub(TypeConversionDescriptor(), target, context, argument);
+}
+
+TF_BUILTIN(WasmStackGuard, WasmBuiltinsAssembler) {
+ TNode<Code> centry = LoadCEntryFromFrame();
+ TailCallRuntimeWithCEntry(Runtime::kWasmStackGuard, centry,
+ NoContextConstant());
+}
+
+TF_BUILTIN(WasmGrowMemory, WasmBuiltinsAssembler) {
+ TNode<Int32T> num_pages =
+ UncheckedCast<Int32T>(Parameter(Descriptor::kNumPages));
+ Label num_pages_out_of_range(this, Label::kDeferred);
+
+ TNode<BoolT> num_pages_fits_in_smi =
+ IsValidPositiveSmi(ChangeInt32ToIntPtr(num_pages));
+ GotoIfNot(num_pages_fits_in_smi, &num_pages_out_of_range);
+
+ TNode<Smi> num_pages_smi = SmiFromInt32(num_pages);
+ TNode<Object> instance = LoadInstanceFromFrame();
+ TNode<Code> centry = LoadCEntryFromInstance(instance);
+ TNode<Smi> ret_smi = UncheckedCast<Smi>(
+ CallRuntimeWithCEntry(Runtime::kWasmGrowMemory, centry,
+ NoContextConstant(), instance, num_pages_smi));
+ TNode<Int32T> ret = SmiToInt32(ret_smi);
+ ReturnRaw(ret);
+
+ BIND(&num_pages_out_of_range);
+ ReturnRaw(Int32Constant(-1));
}
#define DECLARE_ENUM(name) \
- TF_BUILTIN(ThrowWasm##name, CodeStubAssembler) { \
+ TF_BUILTIN(ThrowWasm##name, WasmBuiltinsAssembler) { \
+ TNode<Code> centry = LoadCEntryFromFrame(); \
int message_id = wasm::WasmOpcodes::TrapReasonToMessageId(wasm::k##name); \
- TailCallRuntime(Runtime::kThrowWasmError, NoContextConstant(), \
- SmiConstant(message_id)); \
+ TailCallRuntimeWithCEntry(Runtime::kThrowWasmError, centry, \
+ NoContextConstant(), SmiConstant(message_id)); \
}
FOREACH_WASM_TRAPREASON(DECLARE_ENUM)
#undef DECLARE_ENUM