| // Copyright 2017 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. |
| |
| #include "src/builtins/builtins-wasm-gen.h" |
| |
| #include "src/builtins/builtins-utils-gen.h" |
| #include "src/codegen/code-stub-assembler.h" |
| #include "src/codegen/interface-descriptors.h" |
| #include "src/objects/map-inl.h" |
| #include "src/objects/objects-inl.h" |
| #include "src/wasm/wasm-objects.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| TNode<WasmInstanceObject> WasmBuiltinsAssembler::LoadInstanceFromFrame() { |
| return CAST(LoadFromParentFrame(WasmFrameConstants::kWasmInstanceOffset)); |
| } |
| |
| TNode<NativeContext> WasmBuiltinsAssembler::LoadContextFromWasmOrJsFrame() { |
| static_assert(BuiltinFrameConstants::kFunctionOffset == |
| WasmFrameConstants::kWasmInstanceOffset); |
| TVARIABLE(NativeContext, context_result); |
| TNode<HeapObject> function_or_instance = |
| CAST(LoadFromParentFrame(WasmFrameConstants::kWasmInstanceOffset)); |
| Label js(this); |
| Label done(this); |
| GotoIf(IsJSFunction(function_or_instance), &js); |
| context_result = LoadContextFromInstance(CAST(function_or_instance)); |
| Goto(&done); |
| |
| BIND(&js); |
| TNode<JSFunction> function = CAST(function_or_instance); |
| TNode<Context> context = |
| LoadObjectField<Context>(function, JSFunction::kContextOffset); |
| context_result = LoadNativeContext(context); |
| Goto(&done); |
| |
| BIND(&done); |
| return context_result.value(); |
| } |
| |
| TNode<NativeContext> WasmBuiltinsAssembler::LoadContextFromInstance( |
| TNode<WasmInstanceObject> instance) { |
| return CAST(Load(MachineType::AnyTagged(), instance, |
| IntPtrConstant(WasmInstanceObject::kNativeContextOffset - |
| kHeapObjectTag))); |
| } |
| |
| TNode<FixedArray> WasmBuiltinsAssembler::LoadTablesFromInstance( |
| TNode<WasmInstanceObject> instance) { |
| return LoadObjectField<FixedArray>(instance, |
| WasmInstanceObject::kTablesOffset); |
| } |
| |
| TNode<FixedArray> WasmBuiltinsAssembler::LoadInternalFunctionsFromInstance( |
| TNode<WasmInstanceObject> instance) { |
| return LoadObjectField<FixedArray>( |
| instance, WasmInstanceObject::kWasmInternalFunctionsOffset); |
| } |
| |
| TNode<FixedArray> WasmBuiltinsAssembler::LoadManagedObjectMapsFromInstance( |
| TNode<WasmInstanceObject> instance) { |
| return LoadObjectField<FixedArray>( |
| instance, WasmInstanceObject::kManagedObjectMapsOffset); |
| } |
| |
| TF_BUILTIN(WasmFloat32ToNumber, WasmBuiltinsAssembler) { |
| auto val = UncheckedParameter<Float32T>(Descriptor::kValue); |
| Return(ChangeFloat32ToTagged(val)); |
| } |
| |
| TF_BUILTIN(WasmFloat64ToNumber, WasmBuiltinsAssembler) { |
| auto val = UncheckedParameter<Float64T>(Descriptor::kValue); |
| Return(ChangeFloat64ToTagged(val)); |
| } |
| |
| TF_BUILTIN(JSToWasmLazyDeoptContinuation, WasmBuiltinsAssembler) { |
| // Reset thread_in_wasm_flag. |
| TNode<ExternalReference> thread_in_wasm_flag_address_address = |
| ExternalConstant( |
| ExternalReference::thread_in_wasm_flag_address_address(isolate())); |
| auto thread_in_wasm_flag_address = |
| Load<RawPtrT>(thread_in_wasm_flag_address_address); |
| StoreNoWriteBarrier(MachineRepresentation::kWord32, |
| thread_in_wasm_flag_address, Int32Constant(0)); |
| |
| // Return the argument. |
| auto value = Parameter<Object>(Descriptor::kArgument); |
| Return(value); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |