V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
builtins-wasm-gen.cc
1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/builtins/builtins-utils-gen.h"
6 #include "src/code-stub-assembler.h"
7 #include "src/objects-inl.h"
8 #include "src/wasm/wasm-objects.h"
9 #include "src/wasm/wasm-opcodes.h"
10 
11 namespace v8 {
12 namespace internal {
13 
15  public:
17  : CodeStubAssembler(state) {}
18 
19  protected:
20  TNode<Object> UncheckedParameter(int index) {
21  return UncheckedCast<Object>(Parameter(index));
22  }
23 
24  TNode<Code> LoadBuiltinFromFrame(Builtins::Name id) {
25  TNode<Object> instance = LoadInstanceFromFrame();
26  TNode<IntPtrT> isolate_root = UncheckedCast<IntPtrT>(
27  Load(MachineType::Pointer(), instance,
28  IntPtrConstant(WasmInstanceObject::kIsolateRootOffset -
29  kHeapObjectTag)));
30  TNode<Code> target = UncheckedCast<Code>(
31  Load(MachineType::TaggedPointer(), isolate_root,
32  IntPtrConstant(IsolateData::builtin_slot_offset(id))));
33  return target;
34  }
35 
36  TNode<Object> LoadInstanceFromFrame() {
37  return UncheckedCast<Object>(
38  LoadFromParentFrame(WasmCompiledFrameConstants::kWasmInstanceOffset));
39  }
40 
41  TNode<Object> LoadContextFromInstance(TNode<Object> instance) {
42  return UncheckedCast<Object>(
43  Load(MachineType::AnyTagged(), instance,
44  IntPtrConstant(WasmInstanceObject::kNativeContextOffset -
45  kHeapObjectTag)));
46  }
47 
48  TNode<Code> LoadCEntryFromInstance(TNode<Object> instance) {
49  return UncheckedCast<Code>(
50  Load(MachineType::AnyTagged(), instance,
51  IntPtrConstant(WasmInstanceObject::kCEntryStubOffset -
52  kHeapObjectTag)));
53  }
54 };
55 
56 TF_BUILTIN(WasmAllocateHeapNumber, WasmBuiltinsAssembler) {
57  TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
58  TailCallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant());
59 }
60 
61 TF_BUILTIN(WasmCallJavaScript, WasmBuiltinsAssembler) {
62  TNode<Object> context = UncheckedParameter(Descriptor::kContext);
63  TNode<Object> function = UncheckedParameter(Descriptor::kFunction);
64  TNode<Object> argc = UncheckedParameter(Descriptor::kActualArgumentsCount);
65  TNode<Code> target = LoadBuiltinFromFrame(Builtins::kCall_ReceiverIsAny);
66  TailCallStub(CallTrampolineDescriptor{}, target, context, function, argc);
67 }
68 
69 TF_BUILTIN(WasmRecordWrite, WasmBuiltinsAssembler) {
70  TNode<Object> object = UncheckedParameter(Descriptor::kObject);
71  TNode<Object> slot = UncheckedParameter(Descriptor::kSlot);
72  TNode<Object> remembered = UncheckedParameter(Descriptor::kRememberedSet);
73  TNode<Object> fp_mode = UncheckedParameter(Descriptor::kFPMode);
74  TNode<Code> target = LoadBuiltinFromFrame(Builtins::kRecordWrite);
75  TailCallStub(RecordWriteDescriptor{}, target, NoContextConstant(), object,
76  slot, remembered, fp_mode);
77 }
78 
79 TF_BUILTIN(WasmToNumber, WasmBuiltinsAssembler) {
80  TNode<Object> context = UncheckedParameter(Descriptor::kContext);
81  TNode<Object> argument = UncheckedParameter(Descriptor::kArgument);
82  TNode<Code> target = LoadBuiltinFromFrame(Builtins::kToNumber);
83  TailCallStub(TypeConversionDescriptor(), target, context, argument);
84 }
85 
86 TF_BUILTIN(WasmStackGuard, WasmBuiltinsAssembler) {
87  TNode<Object> instance = LoadInstanceFromFrame();
88  TNode<Code> centry = LoadCEntryFromInstance(instance);
89  TNode<Object> context = LoadContextFromInstance(instance);
90  TailCallRuntimeWithCEntry(Runtime::kWasmStackGuard, centry, context);
91 }
92 
93 TF_BUILTIN(WasmThrow, WasmBuiltinsAssembler) {
94  TNode<Object> exception = UncheckedParameter(Descriptor::kException);
95  TNode<Object> instance = LoadInstanceFromFrame();
96  TNode<Code> centry = LoadCEntryFromInstance(instance);
97  TNode<Object> context = LoadContextFromInstance(instance);
98  TailCallRuntimeWithCEntry(Runtime::kThrow, centry, context, exception);
99 }
100 
101 TF_BUILTIN(WasmAtomicWake, WasmBuiltinsAssembler) {
102  TNode<Uint32T> address =
103  UncheckedCast<Uint32T>(Parameter(Descriptor::kAddress));
104  TNode<Uint32T> count = UncheckedCast<Uint32T>(Parameter(Descriptor::kCount));
105 
106  TNode<Object> instance = LoadInstanceFromFrame();
107  TNode<Code> centry = LoadCEntryFromInstance(instance);
108 
109  TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
110 
111  // TODO(aseemgarg): Use SMIs if possible for address and count
112  TNode<HeapNumber> address_heap = UncheckedCast<HeapNumber>(
113  CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
114  StoreHeapNumberValue(address_heap, ChangeUint32ToFloat64(address));
115 
116  TNode<HeapNumber> count_heap = UncheckedCast<HeapNumber>(
117  CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
118  StoreHeapNumberValue(count_heap, ChangeUint32ToFloat64(count));
119 
120  TNode<Smi> result_smi = UncheckedCast<Smi>(CallRuntimeWithCEntry(
121  Runtime::kWasmAtomicWake, centry, NoContextConstant(), instance,
122  address_heap, count_heap));
123  ReturnRaw(SmiToInt32(result_smi));
124 }
125 
126 TF_BUILTIN(WasmI32AtomicWait, WasmBuiltinsAssembler) {
127  TNode<Uint32T> address =
128  UncheckedCast<Uint32T>(Parameter(Descriptor::kAddress));
129  TNode<Int32T> expected_value =
130  UncheckedCast<Int32T>(Parameter(Descriptor::kExpectedValue));
131  TNode<Float64T> timeout =
132  UncheckedCast<Float64T>(Parameter(Descriptor::kTimeout));
133 
134  TNode<Object> instance = LoadInstanceFromFrame();
135  TNode<Code> centry = LoadCEntryFromInstance(instance);
136 
137  TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
138 
139  // TODO(aseemgarg): Use SMIs if possible for address and expected_value
140  TNode<HeapNumber> address_heap = UncheckedCast<HeapNumber>(
141  CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
142  StoreHeapNumberValue(address_heap, ChangeUint32ToFloat64(address));
143 
144  TNode<HeapNumber> expected_value_heap = UncheckedCast<HeapNumber>(
145  CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
146  StoreHeapNumberValue(expected_value_heap,
147  ChangeInt32ToFloat64(expected_value));
148 
149  TNode<HeapNumber> timeout_heap = UncheckedCast<HeapNumber>(
150  CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
151  StoreHeapNumberValue(timeout_heap, timeout);
152 
153  TNode<Smi> result_smi = UncheckedCast<Smi>(CallRuntimeWithCEntry(
154  Runtime::kWasmI32AtomicWait, centry, NoContextConstant(), instance,
155  address_heap, expected_value_heap, timeout_heap));
156  ReturnRaw(SmiToInt32(result_smi));
157 }
158 
159 TF_BUILTIN(WasmMemoryGrow, WasmBuiltinsAssembler) {
160  TNode<Int32T> num_pages =
161  UncheckedCast<Int32T>(Parameter(Descriptor::kNumPages));
162  Label num_pages_out_of_range(this, Label::kDeferred);
163 
164  TNode<BoolT> num_pages_fits_in_smi =
165  IsValidPositiveSmi(ChangeInt32ToIntPtr(num_pages));
166  GotoIfNot(num_pages_fits_in_smi, &num_pages_out_of_range);
167 
168  TNode<Smi> num_pages_smi = SmiFromInt32(num_pages);
169  TNode<Object> instance = LoadInstanceFromFrame();
170  TNode<Code> centry = LoadCEntryFromInstance(instance);
171  TNode<Object> context = LoadContextFromInstance(instance);
172  TNode<Smi> ret_smi = UncheckedCast<Smi>(CallRuntimeWithCEntry(
173  Runtime::kWasmMemoryGrow, centry, context, instance, num_pages_smi));
174  TNode<Int32T> ret = SmiToInt32(ret_smi);
175  ReturnRaw(ret);
176 
177  BIND(&num_pages_out_of_range);
178  ReturnRaw(Int32Constant(-1));
179 }
180 
181 #define DECLARE_ENUM(name) \
182  TF_BUILTIN(ThrowWasm##name, WasmBuiltinsAssembler) { \
183  TNode<Object> instance = LoadInstanceFromFrame(); \
184  TNode<Code> centry = LoadCEntryFromInstance(instance); \
185  TNode<Object> context = LoadContextFromInstance(instance); \
186  MessageTemplate message_id = \
187  wasm::WasmOpcodes::TrapReasonToMessageId(wasm::k##name); \
188  TailCallRuntimeWithCEntry(Runtime::kThrowWasmError, centry, context, \
189  SmiConstant(static_cast<int>(message_id))); \
190  }
191 FOREACH_WASM_TRAPREASON(DECLARE_ENUM)
192 #undef DECLARE_ENUM
193 
194 } // namespace internal
195 } // namespace v8
Definition: libplatform.h:13