OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "src/base/adapters.h" | 7 #include "src/base/adapters.h" |
8 #include "src/compiler/instruction-selector-impl.h" | 8 #include "src/compiler/instruction-selector-impl.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
(...skipping 2321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2332 addressing_mode = kMode_MRI; | 2332 addressing_mode = kMode_MRI; |
2333 } else { | 2333 } else { |
2334 inputs[input_count++] = g.UseUniqueRegister(index); | 2334 inputs[input_count++] = g.UseUniqueRegister(index); |
2335 addressing_mode = kMode_MR1; | 2335 addressing_mode = kMode_MR1; |
2336 } | 2336 } |
2337 outputs[0] = g.DefineSameAsFirst(node); | 2337 outputs[0] = g.DefineSameAsFirst(node); |
2338 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); | 2338 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); |
2339 Emit(code, 1, outputs, input_count, inputs); | 2339 Emit(code, 1, outputs, input_count, inputs); |
2340 } | 2340 } |
2341 | 2341 |
2342 void InstructionSelector::VisitInt32x4Splat(Node* node) { | 2342 #define SIMD_TYPES(V) V(Int32x4) |
| 2343 |
| 2344 #define SIMD_ZERO_OP_LIST(V) \ |
| 2345 V(Simd128Zero) \ |
| 2346 V(Simd1x4Zero) \ |
| 2347 V(Simd1x8Zero) \ |
| 2348 V(Simd1x16Zero) |
| 2349 |
| 2350 #define SIMD_BINOP_LIST(V) \ |
| 2351 V(Int32x4Add) \ |
| 2352 V(Int32x4Sub) \ |
| 2353 V(Int32x4Mul) \ |
| 2354 V(Int32x4Min) \ |
| 2355 V(Int32x4Max) \ |
| 2356 V(Int32x4Equal) \ |
| 2357 V(Int32x4NotEqual) \ |
| 2358 V(Uint32x4Min) \ |
| 2359 V(Uint32x4Max) |
| 2360 |
| 2361 #define SIMD_SHIFT_OPCODES(V) \ |
| 2362 V(Int32x4ShiftLeftByScalar) \ |
| 2363 V(Int32x4ShiftRightByScalar) \ |
| 2364 V(Uint32x4ShiftRightByScalar) |
| 2365 |
| 2366 #define VISIT_SIMD_SPLAT(Type) \ |
| 2367 void InstructionSelector::Visit##Type##Splat(Node* node) { \ |
| 2368 X64OperandGenerator g(this); \ |
| 2369 Emit(kX64##Type##Splat, g.DefineAsRegister(node), \ |
| 2370 g.Use(node->InputAt(0))); \ |
| 2371 } |
| 2372 SIMD_TYPES(VISIT_SIMD_SPLAT) |
| 2373 #undef VISIT_SIMD_SPLAT |
| 2374 |
| 2375 #define VISIT_SIMD_EXTRACT_LANE(Type) \ |
| 2376 void InstructionSelector::Visit##Type##ExtractLane(Node* node) { \ |
| 2377 X64OperandGenerator g(this); \ |
| 2378 int32_t lane = OpParameter<int32_t>(node); \ |
| 2379 Emit(kX64##Type##ExtractLane, g.DefineAsRegister(node), \ |
| 2380 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); \ |
| 2381 } |
| 2382 SIMD_TYPES(VISIT_SIMD_EXTRACT_LANE) |
| 2383 #undef VISIT_SIMD_EXTRACT_LANE |
| 2384 |
| 2385 #define VISIT_SIMD_REPLACE_LANE(Type) \ |
| 2386 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ |
| 2387 X64OperandGenerator g(this); \ |
| 2388 int32_t lane = OpParameter<int32_t>(node); \ |
| 2389 Emit(kX64##Type##ReplaceLane, g.DefineSameAsFirst(node), \ |
| 2390 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), \ |
| 2391 g.Use(node->InputAt(1))); \ |
| 2392 } |
| 2393 SIMD_TYPES(VISIT_SIMD_REPLACE_LANE) |
| 2394 #undef VISIT_SIMD_REPLACE_LANE |
| 2395 |
| 2396 #define SIMD_VISIT_ZERO_OP(Name) \ |
| 2397 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2398 X64OperandGenerator g(this); \ |
| 2399 Emit(kX64Simd128Zero, g.DefineAsRegister(node), g.DefineAsRegister(node)); \ |
| 2400 } |
| 2401 SIMD_ZERO_OP_LIST(SIMD_VISIT_ZERO_OP) |
| 2402 #undef SIMD_VISIT_ZERO_OP |
| 2403 |
| 2404 #define VISIT_SIMD_BINOP(Opcode) \ |
| 2405 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2406 X64OperandGenerator g(this); \ |
| 2407 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ |
| 2408 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); \ |
| 2409 } |
| 2410 SIMD_BINOP_LIST(VISIT_SIMD_BINOP) |
| 2411 #undef VISIT_SIMD_BINOP |
| 2412 |
| 2413 #define VISIT_SIMD_SHIFT(Opcode) \ |
| 2414 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2415 X64OperandGenerator g(this); \ |
| 2416 int32_t value = OpParameter<int32_t>(node); \ |
| 2417 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ |
| 2418 g.UseRegister(node->InputAt(0)), g.UseImmediate(value)); \ |
| 2419 } |
| 2420 SIMD_SHIFT_OPCODES(VISIT_SIMD_SHIFT) |
| 2421 #undef VISIT_SIMD_SHIFT |
| 2422 |
| 2423 void InstructionSelector::VisitSimd32x4Select(Node* node) { |
2343 X64OperandGenerator g(this); | 2424 X64OperandGenerator g(this); |
2344 Emit(kX64Int32x4Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | 2425 Emit(kX64Simd32x4Select, g.DefineSameAsFirst(node), |
2345 } | 2426 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), |
2346 | 2427 g.UseRegister(node->InputAt(2))); |
2347 void InstructionSelector::VisitInt32x4ExtractLane(Node* node) { | |
2348 X64OperandGenerator g(this); | |
2349 int32_t lane = OpParameter<int32_t>(node); | |
2350 Emit(kX64Int32x4ExtractLane, g.DefineAsRegister(node), | |
2351 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); | |
2352 } | |
2353 | |
2354 void InstructionSelector::VisitInt32x4ReplaceLane(Node* node) { | |
2355 X64OperandGenerator g(this); | |
2356 int32_t lane = OpParameter<int32_t>(node); | |
2357 Emit(kX64Int32x4ReplaceLane, g.DefineSameAsFirst(node), | |
2358 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), | |
2359 g.Use(node->InputAt(1))); | |
2360 } | |
2361 | |
2362 void InstructionSelector::VisitInt32x4Add(Node* node) { | |
2363 X64OperandGenerator g(this); | |
2364 Emit(kX64Int32x4Add, g.DefineSameAsFirst(node), | |
2365 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
2366 } | |
2367 | |
2368 void InstructionSelector::VisitInt32x4Sub(Node* node) { | |
2369 X64OperandGenerator g(this); | |
2370 Emit(kX64Int32x4Sub, g.DefineSameAsFirst(node), | |
2371 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
2372 } | |
2373 | |
2374 void InstructionSelector::VisitSimd128Zero(Node* node) { | |
2375 X64OperandGenerator g(this); | |
2376 Emit(kX64Simd128Zero, g.DefineSameAsFirst(node)); | |
2377 } | |
2378 | |
2379 void InstructionSelector::VisitSimd1x4Zero(Node* node) { | |
2380 X64OperandGenerator g(this); | |
2381 Emit(kX64Simd128Zero, g.DefineSameAsFirst(node)); | |
2382 } | |
2383 | |
2384 void InstructionSelector::VisitSimd1x8Zero(Node* node) { | |
2385 X64OperandGenerator g(this); | |
2386 Emit(kX64Simd128Zero, g.DefineSameAsFirst(node)); | |
2387 } | |
2388 | |
2389 void InstructionSelector::VisitSimd1x16Zero(Node* node) { | |
2390 X64OperandGenerator g(this); | |
2391 Emit(kX64Simd128Zero, g.DefineSameAsFirst(node)); | |
2392 } | 2428 } |
2393 | 2429 |
2394 // static | 2430 // static |
2395 MachineOperatorBuilder::Flags | 2431 MachineOperatorBuilder::Flags |
2396 InstructionSelector::SupportedMachineOperatorFlags() { | 2432 InstructionSelector::SupportedMachineOperatorFlags() { |
2397 MachineOperatorBuilder::Flags flags = | 2433 MachineOperatorBuilder::Flags flags = |
2398 MachineOperatorBuilder::kWord32ShiftIsSafe | | 2434 MachineOperatorBuilder::kWord32ShiftIsSafe | |
2399 MachineOperatorBuilder::kWord32Ctz | MachineOperatorBuilder::kWord64Ctz; | 2435 MachineOperatorBuilder::kWord32Ctz | MachineOperatorBuilder::kWord64Ctz; |
2400 if (CpuFeatures::IsSupported(POPCNT)) { | 2436 if (CpuFeatures::IsSupported(POPCNT)) { |
2401 flags |= MachineOperatorBuilder::kWord32Popcnt | | 2437 flags |= MachineOperatorBuilder::kWord32Popcnt | |
(...skipping 15 matching lines...) Expand all Loading... |
2417 // static | 2453 // static |
2418 MachineOperatorBuilder::AlignmentRequirements | 2454 MachineOperatorBuilder::AlignmentRequirements |
2419 InstructionSelector::AlignmentRequirements() { | 2455 InstructionSelector::AlignmentRequirements() { |
2420 return MachineOperatorBuilder::AlignmentRequirements:: | 2456 return MachineOperatorBuilder::AlignmentRequirements:: |
2421 FullUnalignedAccessSupport(); | 2457 FullUnalignedAccessSupport(); |
2422 } | 2458 } |
2423 | 2459 |
2424 } // namespace compiler | 2460 } // namespace compiler |
2425 } // namespace internal | 2461 } // namespace internal |
2426 } // namespace v8 | 2462 } // namespace v8 |
OLD | NEW |