| 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 2363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2374 addressing_mode = kMode_MRI; | 2374 addressing_mode = kMode_MRI; |
| 2375 } else { | 2375 } else { |
| 2376 inputs[input_count++] = g.UseUniqueRegister(index); | 2376 inputs[input_count++] = g.UseUniqueRegister(index); |
| 2377 addressing_mode = kMode_MR1; | 2377 addressing_mode = kMode_MR1; |
| 2378 } | 2378 } |
| 2379 outputs[0] = g.DefineAsFixed(node, rax); | 2379 outputs[0] = g.DefineAsFixed(node, rax); |
| 2380 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); | 2380 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); |
| 2381 Emit(code, 1, outputs, input_count, inputs); | 2381 Emit(code, 1, outputs, input_count, inputs); |
| 2382 } | 2382 } |
| 2383 | 2383 |
| 2384 #define SIMD_TYPES(V) V(Int32x4) | 2384 #define SIMD_TYPES(V) V(I32x4) |
| 2385 | 2385 |
| 2386 #define SIMD_ZERO_OP_LIST(V) \ | 2386 #define SIMD_ZERO_OP_LIST(V) \ |
| 2387 V(Simd128Zero) \ | 2387 V(S128Zero) \ |
| 2388 V(Simd1x4Zero) \ | 2388 V(S1x4Zero) \ |
| 2389 V(Simd1x8Zero) \ | 2389 V(S1x8Zero) \ |
| 2390 V(Simd1x16Zero) | 2390 V(S1x16Zero) |
| 2391 |
| 2392 #define SIMD_SHIFT_OPCODES(V) \ |
| 2393 V(I32x4Shl) \ |
| 2394 V(I32x4ShrS) \ |
| 2395 V(I32x4ShrU) |
| 2391 | 2396 |
| 2392 #define SIMD_BINOP_LIST(V) \ | 2397 #define SIMD_BINOP_LIST(V) \ |
| 2393 V(Int32x4Add) \ | 2398 V(I32x4Add) \ |
| 2394 V(Int32x4Sub) \ | 2399 V(I32x4Sub) \ |
| 2395 V(Int32x4Mul) \ | 2400 V(I32x4Mul) \ |
| 2396 V(Int32x4Min) \ | 2401 V(I32x4MinS) \ |
| 2397 V(Int32x4Max) \ | 2402 V(I32x4MaxS) \ |
| 2398 V(Int32x4Equal) \ | 2403 V(I32x4Eq) \ |
| 2399 V(Int32x4NotEqual) \ | 2404 V(I32x4Ne) \ |
| 2400 V(Uint32x4Min) \ | 2405 V(I32x4MinU) \ |
| 2401 V(Uint32x4Max) | 2406 V(I32x4MaxU) |
| 2402 | |
| 2403 #define SIMD_SHIFT_OPCODES(V) \ | |
| 2404 V(Int32x4ShiftLeftByScalar) \ | |
| 2405 V(Int32x4ShiftRightByScalar) \ | |
| 2406 V(Uint32x4ShiftRightByScalar) | |
| 2407 | 2407 |
| 2408 #define VISIT_SIMD_SPLAT(Type) \ | 2408 #define VISIT_SIMD_SPLAT(Type) \ |
| 2409 void InstructionSelector::Visit##Type##Splat(Node* node) { \ | 2409 void InstructionSelector::Visit##Type##Splat(Node* node) { \ |
| 2410 X64OperandGenerator g(this); \ | 2410 X64OperandGenerator g(this); \ |
| 2411 Emit(kX64##Type##Splat, g.DefineAsRegister(node), \ | 2411 Emit(kX64##Type##Splat, g.DefineAsRegister(node), \ |
| 2412 g.Use(node->InputAt(0))); \ | 2412 g.Use(node->InputAt(0))); \ |
| 2413 } | 2413 } |
| 2414 SIMD_TYPES(VISIT_SIMD_SPLAT) | 2414 SIMD_TYPES(VISIT_SIMD_SPLAT) |
| 2415 #undef VISIT_SIMD_SPLAT | 2415 #undef VISIT_SIMD_SPLAT |
| 2416 | 2416 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2428 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ | 2428 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ |
| 2429 X64OperandGenerator g(this); \ | 2429 X64OperandGenerator g(this); \ |
| 2430 int32_t lane = OpParameter<int32_t>(node); \ | 2430 int32_t lane = OpParameter<int32_t>(node); \ |
| 2431 Emit(kX64##Type##ReplaceLane, g.DefineSameAsFirst(node), \ | 2431 Emit(kX64##Type##ReplaceLane, g.DefineSameAsFirst(node), \ |
| 2432 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), \ | 2432 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), \ |
| 2433 g.Use(node->InputAt(1))); \ | 2433 g.Use(node->InputAt(1))); \ |
| 2434 } | 2434 } |
| 2435 SIMD_TYPES(VISIT_SIMD_REPLACE_LANE) | 2435 SIMD_TYPES(VISIT_SIMD_REPLACE_LANE) |
| 2436 #undef VISIT_SIMD_REPLACE_LANE | 2436 #undef VISIT_SIMD_REPLACE_LANE |
| 2437 | 2437 |
| 2438 #define SIMD_VISIT_ZERO_OP(Name) \ | 2438 #define SIMD_VISIT_ZERO_OP(Name) \ |
| 2439 void InstructionSelector::Visit##Name(Node* node) { \ | 2439 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2440 X64OperandGenerator g(this); \ | 2440 X64OperandGenerator g(this); \ |
| 2441 Emit(kX64Simd128Zero, g.DefineAsRegister(node), g.DefineAsRegister(node)); \ | 2441 Emit(kX64S128Zero, g.DefineAsRegister(node), g.DefineAsRegister(node)); \ |
| 2442 } | 2442 } |
| 2443 SIMD_ZERO_OP_LIST(SIMD_VISIT_ZERO_OP) | 2443 SIMD_ZERO_OP_LIST(SIMD_VISIT_ZERO_OP) |
| 2444 #undef SIMD_VISIT_ZERO_OP | 2444 #undef SIMD_VISIT_ZERO_OP |
| 2445 | 2445 |
| 2446 #define VISIT_SIMD_BINOP(Opcode) \ | |
| 2447 void InstructionSelector::Visit##Opcode(Node* node) { \ | |
| 2448 X64OperandGenerator g(this); \ | |
| 2449 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ | |
| 2450 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); \ | |
| 2451 } | |
| 2452 SIMD_BINOP_LIST(VISIT_SIMD_BINOP) | |
| 2453 #undef VISIT_SIMD_BINOP | |
| 2454 | |
| 2455 #define VISIT_SIMD_SHIFT(Opcode) \ | 2446 #define VISIT_SIMD_SHIFT(Opcode) \ |
| 2456 void InstructionSelector::Visit##Opcode(Node* node) { \ | 2447 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2457 X64OperandGenerator g(this); \ | 2448 X64OperandGenerator g(this); \ |
| 2458 int32_t value = OpParameter<int32_t>(node); \ | 2449 int32_t value = OpParameter<int32_t>(node); \ |
| 2459 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ | 2450 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ |
| 2460 g.UseRegister(node->InputAt(0)), g.UseImmediate(value)); \ | 2451 g.UseRegister(node->InputAt(0)), g.UseImmediate(value)); \ |
| 2461 } | 2452 } |
| 2462 SIMD_SHIFT_OPCODES(VISIT_SIMD_SHIFT) | 2453 SIMD_SHIFT_OPCODES(VISIT_SIMD_SHIFT) |
| 2463 #undef VISIT_SIMD_SHIFT | 2454 #undef VISIT_SIMD_SHIFT |
| 2464 | 2455 |
| 2465 void InstructionSelector::VisitSimd32x4Select(Node* node) { | 2456 #define VISIT_SIMD_BINOP(Opcode) \ |
| 2457 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2458 X64OperandGenerator g(this); \ |
| 2459 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ |
| 2460 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); \ |
| 2461 } |
| 2462 SIMD_BINOP_LIST(VISIT_SIMD_BINOP) |
| 2463 #undef VISIT_SIMD_BINOP |
| 2464 |
| 2465 void InstructionSelector::VisitS32x4Select(Node* node) { |
| 2466 X64OperandGenerator g(this); | 2466 X64OperandGenerator g(this); |
| 2467 Emit(kX64Simd32x4Select, g.DefineSameAsFirst(node), | 2467 Emit(kX64S32x4Select, g.DefineSameAsFirst(node), |
| 2468 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), | 2468 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), |
| 2469 g.UseRegister(node->InputAt(2))); | 2469 g.UseRegister(node->InputAt(2))); |
| 2470 } | 2470 } |
| 2471 | 2471 |
| 2472 // static | 2472 // static |
| 2473 MachineOperatorBuilder::Flags | 2473 MachineOperatorBuilder::Flags |
| 2474 InstructionSelector::SupportedMachineOperatorFlags() { | 2474 InstructionSelector::SupportedMachineOperatorFlags() { |
| 2475 MachineOperatorBuilder::Flags flags = | 2475 MachineOperatorBuilder::Flags flags = |
| 2476 MachineOperatorBuilder::kWord32ShiftIsSafe | | 2476 MachineOperatorBuilder::kWord32ShiftIsSafe | |
| 2477 MachineOperatorBuilder::kWord32Ctz | MachineOperatorBuilder::kWord64Ctz; | 2477 MachineOperatorBuilder::kWord32Ctz | MachineOperatorBuilder::kWord64Ctz; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2495 // static | 2495 // static |
| 2496 MachineOperatorBuilder::AlignmentRequirements | 2496 MachineOperatorBuilder::AlignmentRequirements |
| 2497 InstructionSelector::AlignmentRequirements() { | 2497 InstructionSelector::AlignmentRequirements() { |
| 2498 return MachineOperatorBuilder::AlignmentRequirements:: | 2498 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2499 FullUnalignedAccessSupport(); | 2499 FullUnalignedAccessSupport(); |
| 2500 } | 2500 } |
| 2501 | 2501 |
| 2502 } // namespace compiler | 2502 } // namespace compiler |
| 2503 } // namespace internal | 2503 } // namespace internal |
| 2504 } // namespace v8 | 2504 } // namespace v8 |
| OLD | NEW |