| 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 |