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/assembler.h" | 5 #include "src/assembler.h" |
6 #include "src/base/lazy-instance.h" | 6 #include "src/base/lazy-instance.h" |
7 #include "src/macro-assembler.h" | 7 #include "src/macro-assembler.h" |
8 #include "src/register-configuration.h" | 8 #include "src/register-configuration.h" |
9 | 9 |
10 #include "src/wasm/wasm-module.h" | 10 #include "src/wasm/wasm-module.h" |
11 | 11 |
12 #include "src/compiler/linkage.h" | 12 #include "src/compiler/linkage.h" |
13 | 13 |
14 #include "src/zone/zone.h" | 14 #include "src/zone/zone.h" |
15 | 15 |
16 namespace v8 { | 16 namespace v8 { |
17 namespace internal { | 17 namespace internal { |
18 // TODO(titzer): this should not be in the WASM namespace. | 18 // TODO(titzer): this should not be in the WASM namespace. |
19 namespace wasm { | 19 namespace wasm { |
20 | 20 |
21 using compiler::LocationSignature; | 21 using compiler::LocationSignature; |
22 using compiler::CallDescriptor; | 22 using compiler::CallDescriptor; |
23 using compiler::LinkageLocation; | 23 using compiler::LinkageLocation; |
24 | 24 |
25 namespace { | 25 namespace { |
26 | 26 |
27 MachineType MachineTypeFor(LocalType type) { | 27 MachineType MachineTypeFor(ValueType type) { |
28 switch (type) { | 28 switch (type) { |
29 case kAstI32: | 29 case kWasmI32: |
30 return MachineType::Int32(); | 30 return MachineType::Int32(); |
31 case kAstI64: | 31 case kWasmI64: |
32 return MachineType::Int64(); | 32 return MachineType::Int64(); |
33 case kAstF64: | 33 case kWasmF64: |
34 return MachineType::Float64(); | 34 return MachineType::Float64(); |
35 case kAstF32: | 35 case kWasmF32: |
36 return MachineType::Float32(); | 36 return MachineType::Float32(); |
37 case kAstS128: | 37 case kWasmS128: |
38 return MachineType::Simd128(); | 38 return MachineType::Simd128(); |
39 default: | 39 default: |
40 UNREACHABLE(); | 40 UNREACHABLE(); |
41 return MachineType::AnyTagged(); | 41 return MachineType::AnyTagged(); |
42 } | 42 } |
43 } | 43 } |
44 | 44 |
45 LinkageLocation regloc(Register reg, MachineType type) { | 45 LinkageLocation regloc(Register reg, MachineType type) { |
46 return LinkageLocation::ForRegister(reg.code(), type); | 46 return LinkageLocation::ForRegister(reg.code(), type); |
47 } | 47 } |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 int gp_count; | 166 int gp_count; |
167 int gp_offset; | 167 int gp_offset; |
168 const Register* gp_regs; | 168 const Register* gp_regs; |
169 | 169 |
170 int fp_count; | 170 int fp_count; |
171 int fp_offset; | 171 int fp_offset; |
172 const DoubleRegister* fp_regs; | 172 const DoubleRegister* fp_regs; |
173 | 173 |
174 int stack_offset; | 174 int stack_offset; |
175 | 175 |
176 LinkageLocation Next(LocalType type) { | 176 LinkageLocation Next(ValueType type) { |
177 if (IsFloatingPoint(type)) { | 177 if (IsFloatingPoint(type)) { |
178 // Allocate a floating point register/stack location. | 178 // Allocate a floating point register/stack location. |
179 if (fp_offset < fp_count) { | 179 if (fp_offset < fp_count) { |
180 DoubleRegister reg = fp_regs[fp_offset++]; | 180 DoubleRegister reg = fp_regs[fp_offset++]; |
181 #if V8_TARGET_ARCH_ARM | 181 #if V8_TARGET_ARCH_ARM |
182 // Allocate floats using a double register, but modify the code to | 182 // Allocate floats using a double register, but modify the code to |
183 // reflect how ARM FP registers alias. | 183 // reflect how ARM FP registers alias. |
184 // TODO(bbudge) Modify wasm linkage to allow use of all float regs. | 184 // TODO(bbudge) Modify wasm linkage to allow use of all float regs. |
185 if (type == kAstF32) { | 185 if (type == kWasmF32) { |
186 int float_reg_code = reg.code() * 2; | 186 int float_reg_code = reg.code() * 2; |
187 DCHECK(float_reg_code < RegisterConfiguration::kMaxFPRegisters); | 187 DCHECK(float_reg_code < RegisterConfiguration::kMaxFPRegisters); |
188 return regloc(DoubleRegister::from_code(float_reg_code), | 188 return regloc(DoubleRegister::from_code(float_reg_code), |
189 MachineTypeFor(type)); | 189 MachineTypeFor(type)); |
190 } | 190 } |
191 #endif | 191 #endif |
192 return regloc(reg, MachineTypeFor(type)); | 192 return regloc(reg, MachineTypeFor(type)); |
193 } else { | 193 } else { |
194 int offset = -1 - stack_offset; | 194 int offset = -1 - stack_offset; |
195 stack_offset += Words(type); | 195 stack_offset += Words(type); |
196 return stackloc(offset, MachineTypeFor(type)); | 196 return stackloc(offset, MachineTypeFor(type)); |
197 } | 197 } |
198 } else { | 198 } else { |
199 // Allocate a general purpose register/stack location. | 199 // Allocate a general purpose register/stack location. |
200 if (gp_offset < gp_count) { | 200 if (gp_offset < gp_count) { |
201 return regloc(gp_regs[gp_offset++], MachineTypeFor(type)); | 201 return regloc(gp_regs[gp_offset++], MachineTypeFor(type)); |
202 } else { | 202 } else { |
203 int offset = -1 - stack_offset; | 203 int offset = -1 - stack_offset; |
204 stack_offset += Words(type); | 204 stack_offset += Words(type); |
205 return stackloc(offset, MachineTypeFor(type)); | 205 return stackloc(offset, MachineTypeFor(type)); |
206 } | 206 } |
207 } | 207 } |
208 } | 208 } |
209 bool IsFloatingPoint(LocalType type) { | 209 bool IsFloatingPoint(ValueType type) { |
210 return type == kAstF32 || type == kAstF64; | 210 return type == kWasmF32 || type == kWasmF64; |
211 } | 211 } |
212 int Words(LocalType type) { | 212 int Words(ValueType type) { |
213 if (kPointerSize < 8 && (type == kAstI64 || type == kAstF64)) { | 213 if (kPointerSize < 8 && (type == kWasmI64 || type == kWasmF64)) { |
214 return 2; | 214 return 2; |
215 } | 215 } |
216 return 1; | 216 return 1; |
217 } | 217 } |
218 }; | 218 }; |
219 } // namespace | 219 } // namespace |
220 | 220 |
221 struct ParameterRegistersCreateTrait { | 221 struct ParameterRegistersCreateTrait { |
222 static void Construct(Allocator* allocated_ptr) { | 222 static void Construct(Allocator* allocated_ptr) { |
223 #ifdef GP_PARAM_REGISTERS | 223 #ifdef GP_PARAM_REGISTERS |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone, | 278 CallDescriptor* ModuleEnv::GetWasmCallDescriptor(Zone* zone, |
279 FunctionSig* fsig) { | 279 FunctionSig* fsig) { |
280 LocationSignature::Builder locations(zone, fsig->return_count(), | 280 LocationSignature::Builder locations(zone, fsig->return_count(), |
281 fsig->parameter_count()); | 281 fsig->parameter_count()); |
282 | 282 |
283 Allocator rets = return_registers.Get(); | 283 Allocator rets = return_registers.Get(); |
284 | 284 |
285 // Add return location(s). | 285 // Add return location(s). |
286 const int return_count = static_cast<int>(locations.return_count_); | 286 const int return_count = static_cast<int>(locations.return_count_); |
287 for (int i = 0; i < return_count; i++) { | 287 for (int i = 0; i < return_count; i++) { |
288 LocalType ret = fsig->GetReturn(i); | 288 ValueType ret = fsig->GetReturn(i); |
289 locations.AddReturn(rets.Next(ret)); | 289 locations.AddReturn(rets.Next(ret)); |
290 } | 290 } |
291 | 291 |
292 Allocator params = parameter_registers.Get(); | 292 Allocator params = parameter_registers.Get(); |
293 | 293 |
294 // Add register and/or stack parameter(s). | 294 // Add register and/or stack parameter(s). |
295 const int parameter_count = static_cast<int>(fsig->parameter_count()); | 295 const int parameter_count = static_cast<int>(fsig->parameter_count()); |
296 for (int i = 0; i < parameter_count; i++) { | 296 for (int i = 0; i < parameter_count; i++) { |
297 LocalType param = fsig->GetParam(i); | 297 ValueType param = fsig->GetParam(i); |
298 locations.AddParam(params.Next(param)); | 298 locations.AddParam(params.Next(param)); |
299 } | 299 } |
300 | 300 |
301 const RegList kCalleeSaveRegisters = 0; | 301 const RegList kCalleeSaveRegisters = 0; |
302 const RegList kCalleeSaveFPRegisters = 0; | 302 const RegList kCalleeSaveFPRegisters = 0; |
303 | 303 |
304 // The target for WASM calls is always a code object. | 304 // The target for WASM calls is always a code object. |
305 MachineType target_type = MachineType::AnyTagged(); | 305 MachineType target_type = MachineType::AnyTagged(); |
306 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(target_type); | 306 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(target_type); |
307 | 307 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 CallDescriptor* ModuleEnv::GetI32WasmCallDescriptorForSimd( | 389 CallDescriptor* ModuleEnv::GetI32WasmCallDescriptorForSimd( |
390 Zone* zone, CallDescriptor* descriptor) { | 390 Zone* zone, CallDescriptor* descriptor) { |
391 return ReplaceTypeInCallDescriptorWith(zone, descriptor, 4, | 391 return ReplaceTypeInCallDescriptorWith(zone, descriptor, 4, |
392 MachineType::Simd128(), | 392 MachineType::Simd128(), |
393 MachineRepresentation::kWord32); | 393 MachineRepresentation::kWord32); |
394 } | 394 } |
395 | 395 |
396 } // namespace wasm | 396 } // namespace wasm |
397 } // namespace internal | 397 } // namespace internal |
398 } // namespace v8 | 398 } // namespace v8 |
OLD | NEW |