Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(740)

Side by Side Diff: src/compiler/wasm-compiler.cc

Issue 2705293011: MIPS[64]: Fix unaligned arguments storage in Wasm-to-interpreter entry (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2958 matching lines...) Expand 10 before | Expand all | Expand 10 after
2969 2969
2970 // Now store all our arguments to the buffer. 2970 // Now store all our arguments to the buffer.
2971 int param_index = 0; 2971 int param_index = 0;
2972 int offset = 0; 2972 int offset = 0;
2973 for (int i = 0; i < wasm_count; i++) { 2973 for (int i = 0; i < wasm_count; i++) {
2974 Node* param = Param(param_index++); 2974 Node* param = Param(param_index++);
2975 bool is_i64_as_two_params = 2975 bool is_i64_as_two_params =
2976 jsgraph()->machine()->Is32() && sig->GetParam(i) == wasm::kWasmI64; 2976 jsgraph()->machine()->Is32() && sig->GetParam(i) == wasm::kWasmI64;
2977 MachineRepresentation param_rep = 2977 MachineRepresentation param_rep =
2978 is_i64_as_two_params ? wasm::kWasmI32 : sig->GetParam(i); 2978 is_i64_as_two_params ? wasm::kWasmI32 : sig->GetParam(i);
2979 StoreRepresentation store_rep(param_rep, WriteBarrierKind::kNoWriteBarrier); 2979
2980 *effect_ = 2980 int alignment = offset % (1 << ElementSizeLog2Of(param_rep));
titzer 2017/02/23 20:44:46 What about just aligning all arguments to 64-bits?
ivica.bogosavljevic 2017/02/24 09:37:56 Pfiffig!
2981 graph()->NewNode(jsgraph()->machine()->Store(store_rep), arg_buffer, 2981 bool offset_aligned = (alignment == 0);
2982 Int32Constant(offset), param, *effect_, *control_); 2982
2983 if (offset_aligned ||
2984 jsgraph()->machine()->UnalignedStoreSupported(
2985 MachineType::TypeForRepresentation(param_rep), 0)) {
2986 StoreRepresentation store_rep(param_rep,
2987 WriteBarrierKind::kNoWriteBarrier);
2988 *effect_ =
2989 graph()->NewNode(jsgraph()->machine()->Store(store_rep), arg_buffer,
2990 Int32Constant(offset), param, *effect_, *control_);
2991 } else {
2992 UnalignedStoreRepresentation store_rep(param_rep);
2993 *effect_ = graph()->NewNode(
2994 jsgraph()->machine()->UnalignedStore(store_rep), arg_buffer,
2995 Int32Constant(offset), param, *effect_, *control_);
2996 }
2997
2983 offset += 1 << ElementSizeLog2Of(param_rep); 2998 offset += 1 << ElementSizeLog2Of(param_rep);
2999
2984 // TODO(clemensh): Respect endianess here. Might need to swap upper and 3000 // TODO(clemensh): Respect endianess here. Might need to swap upper and
2985 // lower word. 3001 // lower word.
2986 if (is_i64_as_two_params) { 3002 if (is_i64_as_two_params) {
2987 // Also store the upper half. 3003 // Also store the upper half.
2988 param = Param(param_index++); 3004 param = Param(param_index++);
2989 StoreRepresentation store_rep(wasm::kWasmI32, 3005
2990 WriteBarrierKind::kNoWriteBarrier); 3006 alignment = offset % (1 << ElementSizeLog2Of(wasm::kWasmI32));
2991 *effect_ = 3007 offset_aligned = (alignment == 0);
2992 graph()->NewNode(jsgraph()->machine()->Store(store_rep), arg_buffer, 3008
2993 Int32Constant(offset), param, *effect_, *control_); 3009 if (offset_aligned ||
3010 jsgraph()->machine()->UnalignedStoreSupported(
3011 MachineType::TypeForRepresentation(wasm::kWasmI32), 0)) {
3012 StoreRepresentation store_rep(wasm::kWasmI32,
3013 WriteBarrierKind::kNoWriteBarrier);
3014 *effect_ =
3015 graph()->NewNode(jsgraph()->machine()->Store(store_rep), arg_buffer,
3016 Int32Constant(offset), param, *effect_, *control_);
3017 } else {
3018 UnalignedStoreRepresentation store_rep(wasm::kWasmI32);
3019 *effect_ = graph()->NewNode(
3020 jsgraph()->machine()->UnalignedStore(store_rep), arg_buffer,
3021 Int32Constant(offset), param, *effect_, *control_);
3022 }
2994 offset += 1 << ElementSizeLog2Of(wasm::kWasmI32); 3023 offset += 1 << ElementSizeLog2Of(wasm::kWasmI32);
2995 } 3024 }
2996 } 3025 }
2997 DCHECK_EQ(param_count, param_index); 3026 DCHECK_EQ(param_count, param_index);
2998 DCHECK_EQ(args_size_bytes, offset); 3027 DCHECK_EQ(args_size_bytes, offset);
2999 3028
3000 // We are passing the raw arg_buffer here. To the GC and other parts, it looks 3029 // We are passing the raw arg_buffer here. To the GC and other parts, it looks
3001 // like a Smi (lowest bit not set). In the runtime function however, don't 3030 // like a Smi (lowest bit not set). In the runtime function however, don't
3002 // call Smi::value on it, but just cast it to a byte pointer. 3031 // call Smi::value on it, but just cast it to a byte pointer.
3003 Node* parameters[] = { 3032 Node* parameters[] = {
(...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after
3887 3916
3888 Handle<Code> CompileWasmInterpreterEntry(Isolate* isolate, uint32_t func_index, 3917 Handle<Code> CompileWasmInterpreterEntry(Isolate* isolate, uint32_t func_index,
3889 wasm::FunctionSig* sig, 3918 wasm::FunctionSig* sig,
3890 Handle<WasmInstanceObject> instance) { 3919 Handle<WasmInstanceObject> instance) {
3891 //---------------------------------------------------------------------------- 3920 //----------------------------------------------------------------------------
3892 // Create the Graph 3921 // Create the Graph
3893 //---------------------------------------------------------------------------- 3922 //----------------------------------------------------------------------------
3894 Zone zone(isolate->allocator(), ZONE_NAME); 3923 Zone zone(isolate->allocator(), ZONE_NAME);
3895 Graph graph(&zone); 3924 Graph graph(&zone);
3896 CommonOperatorBuilder common(&zone); 3925 CommonOperatorBuilder common(&zone);
3897 MachineOperatorBuilder machine(&zone); 3926 MachineOperatorBuilder machine(
3927 &zone, MachineType::PointerRepresentation(),
3928 InstructionSelector::SupportedMachineOperatorFlags(),
3929 InstructionSelector::AlignmentRequirements());
3898 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); 3930 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine);
3899 3931
3900 Node* control = nullptr; 3932 Node* control = nullptr;
3901 Node* effect = nullptr; 3933 Node* effect = nullptr;
3902 3934
3903 WasmGraphBuilder builder(nullptr, &zone, &jsgraph, sig); 3935 WasmGraphBuilder builder(nullptr, &zone, &jsgraph, sig);
3904 builder.set_control_ptr(&control); 3936 builder.set_control_ptr(&control);
3905 builder.set_effect_ptr(&effect); 3937 builder.set_effect_ptr(&effect);
3906 builder.BuildWasmInterpreterEntry(func_index, sig, instance); 3938 builder.BuildWasmInterpreterEntry(func_index, sig, instance);
3907 3939
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
4143 function_->code_start_offset), 4175 function_->code_start_offset),
4144 compile_ms); 4176 compile_ms);
4145 } 4177 }
4146 4178
4147 return code; 4179 return code;
4148 } 4180 }
4149 4181
4150 } // namespace compiler 4182 } // namespace compiler
4151 } // namespace internal 4183 } // namespace internal
4152 } // namespace v8 4184 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698