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" 21 return UncheckedCast<Object>(Parameter(index));
24 TNode<Code> LoadBuiltinFromFrame(Builtins::Name
id) {
27 Load(MachineType::Pointer(), instance,
28 IntPtrConstant(WasmInstanceObject::kIsolateRootOffset -
31 Load(MachineType::TaggedPointer(), isolate_root,
32 IntPtrConstant(IsolateData::builtin_slot_offset(
id))));
37 return UncheckedCast<Object>(
38 LoadFromParentFrame(WasmCompiledFrameConstants::kWasmInstanceOffset));
42 return UncheckedCast<Object>(
43 Load(MachineType::AnyTagged(), instance,
44 IntPtrConstant(WasmInstanceObject::kNativeContextOffset -
49 return UncheckedCast<Code>(
50 Load(MachineType::AnyTagged(), instance,
51 IntPtrConstant(WasmInstanceObject::kCEntryStubOffset -
57 TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
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);
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);
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);
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);
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);
101 TF_BUILTIN(WasmAtomicWake, WasmBuiltinsAssembler) {
102 TNode<Uint32T> address =
103 UncheckedCast<Uint32T>(Parameter(Descriptor::kAddress));
104 TNode<Uint32T> count = UncheckedCast<Uint32T>(Parameter(Descriptor::kCount));
106 TNode<Object> instance = LoadInstanceFromFrame();
107 TNode<Code> centry = LoadCEntryFromInstance(instance);
109 TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
112 TNode<HeapNumber> address_heap = UncheckedCast<HeapNumber>(
113 CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
114 StoreHeapNumberValue(address_heap, ChangeUint32ToFloat64(address));
116 TNode<HeapNumber> count_heap = UncheckedCast<HeapNumber>(
117 CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
118 StoreHeapNumberValue(count_heap, ChangeUint32ToFloat64(count));
120 TNode<Smi> result_smi = UncheckedCast<Smi>(CallRuntimeWithCEntry(
121 Runtime::kWasmAtomicWake, centry, NoContextConstant(), instance,
122 address_heap, count_heap));
123 ReturnRaw(SmiToInt32(result_smi));
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));
134 TNode<Object> instance = LoadInstanceFromFrame();
135 TNode<Code> centry = LoadCEntryFromInstance(instance);
137 TNode<Code> target = LoadBuiltinFromFrame(Builtins::kAllocateHeapNumber);
140 TNode<HeapNumber> address_heap = UncheckedCast<HeapNumber>(
141 CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
142 StoreHeapNumberValue(address_heap, ChangeUint32ToFloat64(address));
144 TNode<HeapNumber> expected_value_heap = UncheckedCast<HeapNumber>(
145 CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
146 StoreHeapNumberValue(expected_value_heap,
147 ChangeInt32ToFloat64(expected_value));
149 TNode<HeapNumber> timeout_heap = UncheckedCast<HeapNumber>(
150 CallStub(AllocateHeapNumberDescriptor(), target, NoContextConstant()));
151 StoreHeapNumberValue(timeout_heap, timeout);
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));
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);
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);
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);
177 BIND(&num_pages_out_of_range);
178 ReturnRaw(Int32Constant(-1));
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))); \ 191 FOREACH_WASM_TRAPREASON(DECLARE_ENUM)