OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/assembler-inl.h" | 9 #include "src/assembler-inl.h" |
10 #include "src/base/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
(...skipping 2905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2916 : Int64Lowering::GetParameterCountAfterLowering(sig); | 2916 : Int64Lowering::GetParameterCountAfterLowering(sig); |
2917 | 2917 |
2918 // Build the start and the parameter nodes. | 2918 // Build the start and the parameter nodes. |
2919 Node* start = Start(param_count + 3); | 2919 Node* start = Start(param_count + 3); |
2920 *effect_ = start; | 2920 *effect_ = start; |
2921 *control_ = start; | 2921 *control_ = start; |
2922 | 2922 |
2923 // Compute size for the argument buffer. | 2923 // Compute size for the argument buffer. |
2924 int args_size_bytes = 0; | 2924 int args_size_bytes = 0; |
2925 for (int i = 0; i < wasm_count; i++) { | 2925 for (int i = 0; i < wasm_count; i++) { |
2926 args_size_bytes += | 2926 args_size_bytes += 1 << ElementSizeLog2Of(sig->GetParam(i)); |
2927 RoundUpToMultipleOfPowOf2(1 << ElementSizeLog2Of(sig->GetParam(i)), 8); | |
2928 } | 2927 } |
2929 | 2928 |
2930 // The return value is also passed via this buffer: | 2929 // The return value is also passed via this buffer: |
2931 DCHECK_GE(wasm::kV8MaxWasmFunctionReturns, sig->return_count()); | 2930 DCHECK_GE(wasm::kV8MaxWasmFunctionReturns, sig->return_count()); |
2932 // TODO(wasm): Handle multi-value returns. | 2931 // TODO(wasm): Handle multi-value returns. |
2933 DCHECK_EQ(1, wasm::kV8MaxWasmFunctionReturns); | 2932 DCHECK_EQ(1, wasm::kV8MaxWasmFunctionReturns); |
2934 int return_size_bytes = | 2933 int return_size_bytes = |
2935 sig->return_count() == 0 ? 0 : 1 << ElementSizeLog2Of(sig->GetReturn(0)); | 2934 sig->return_count() == 0 ? 0 : 1 << ElementSizeLog2Of(sig->GetReturn(0)); |
2936 | 2935 |
2937 // Get a stack slot for the arguments. | 2936 // Get a stack slot for the arguments. |
(...skipping 24 matching lines...) Expand all Loading... |
2962 param, *effect_, *control_); | 2961 param, *effect_, *control_); |
2963 offset += 8; | 2962 offset += 8; |
2964 | 2963 |
2965 } else { | 2964 } else { |
2966 MachineRepresentation param_rep = sig->GetParam(i); | 2965 MachineRepresentation param_rep = sig->GetParam(i); |
2967 StoreRepresentation store_rep(param_rep, | 2966 StoreRepresentation store_rep(param_rep, |
2968 WriteBarrierKind::kNoWriteBarrier); | 2967 WriteBarrierKind::kNoWriteBarrier); |
2969 *effect_ = | 2968 *effect_ = |
2970 graph()->NewNode(jsgraph()->machine()->Store(store_rep), arg_buffer, | 2969 graph()->NewNode(jsgraph()->machine()->Store(store_rep), arg_buffer, |
2971 Int32Constant(offset), param, *effect_, *control_); | 2970 Int32Constant(offset), param, *effect_, *control_); |
2972 offset += RoundUpToMultipleOfPowOf2(1 << ElementSizeLog2Of(param_rep), 8); | 2971 offset += 1 << ElementSizeLog2Of(param_rep); |
2973 } | 2972 } |
2974 | |
2975 DCHECK(IsAligned(offset, 8)); | |
2976 } | 2973 } |
2977 DCHECK_EQ(param_count, param_index); | 2974 DCHECK_EQ(param_count, param_index); |
2978 DCHECK_EQ(args_size_bytes, offset); | 2975 DCHECK_EQ(args_size_bytes, offset); |
2979 | 2976 |
2980 // We are passing the raw arg_buffer here. To the GC and other parts, it looks | 2977 // We are passing the raw arg_buffer here. To the GC and other parts, it looks |
2981 // like a Smi (lowest bit not set). In the runtime function however, don't | 2978 // like a Smi (lowest bit not set). In the runtime function however, don't |
2982 // call Smi::value on it, but just cast it to a byte pointer. | 2979 // call Smi::value on it, but just cast it to a byte pointer. |
2983 Node* parameters[] = { | 2980 Node* parameters[] = { |
2984 jsgraph()->HeapConstant(instance), // wasm instance | 2981 jsgraph()->HeapConstant(instance), // wasm instance |
2985 jsgraph()->SmiConstant(function_index), // function index | 2982 jsgraph()->SmiConstant(function_index), // function index |
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3943 | 3940 |
3944 Handle<Code> CompileWasmInterpreterEntry(Isolate* isolate, uint32_t func_index, | 3941 Handle<Code> CompileWasmInterpreterEntry(Isolate* isolate, uint32_t func_index, |
3945 wasm::FunctionSig* sig, | 3942 wasm::FunctionSig* sig, |
3946 Handle<WasmInstanceObject> instance) { | 3943 Handle<WasmInstanceObject> instance) { |
3947 //---------------------------------------------------------------------------- | 3944 //---------------------------------------------------------------------------- |
3948 // Create the Graph | 3945 // Create the Graph |
3949 //---------------------------------------------------------------------------- | 3946 //---------------------------------------------------------------------------- |
3950 Zone zone(isolate->allocator(), ZONE_NAME); | 3947 Zone zone(isolate->allocator(), ZONE_NAME); |
3951 Graph graph(&zone); | 3948 Graph graph(&zone); |
3952 CommonOperatorBuilder common(&zone); | 3949 CommonOperatorBuilder common(&zone); |
3953 MachineOperatorBuilder machine( | 3950 MachineOperatorBuilder machine(&zone); |
3954 &zone, MachineType::PointerRepresentation(), | |
3955 InstructionSelector::SupportedMachineOperatorFlags(), | |
3956 InstructionSelector::AlignmentRequirements()); | |
3957 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); | 3951 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
3958 | 3952 |
3959 Node* control = nullptr; | 3953 Node* control = nullptr; |
3960 Node* effect = nullptr; | 3954 Node* effect = nullptr; |
3961 | 3955 |
3962 WasmGraphBuilder builder(nullptr, &zone, &jsgraph, sig); | 3956 WasmGraphBuilder builder(nullptr, &zone, &jsgraph, sig); |
3963 builder.set_control_ptr(&control); | 3957 builder.set_control_ptr(&control); |
3964 builder.set_effect_ptr(&effect); | 3958 builder.set_effect_ptr(&effect); |
3965 builder.BuildWasmInterpreterEntry(func_index, sig, instance); | 3959 builder.BuildWasmInterpreterEntry(func_index, sig, instance); |
3966 | 3960 |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4200 wasm::ErrorThrower* thrower, Isolate* isolate, | 4194 wasm::ErrorThrower* thrower, Isolate* isolate, |
4201 wasm::ModuleBytesEnv* module_env, const wasm::WasmFunction* function) { | 4195 wasm::ModuleBytesEnv* module_env, const wasm::WasmFunction* function) { |
4202 WasmCompilationUnit unit(isolate, module_env, function); | 4196 WasmCompilationUnit unit(isolate, module_env, function); |
4203 unit.ExecuteCompilation(); | 4197 unit.ExecuteCompilation(); |
4204 return unit.FinishCompilation(thrower); | 4198 return unit.FinishCompilation(thrower); |
4205 } | 4199 } |
4206 | 4200 |
4207 } // namespace compiler | 4201 } // namespace compiler |
4208 } // namespace internal | 4202 } // namespace internal |
4209 } // namespace v8 | 4203 } // namespace v8 |
OLD | NEW |