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

Side by Side Diff: src/compiler/arm/instruction-selector-arm.cc

Issue 2638133002: [Turbofan] Add other integer SIMD types, add more integer ops. (Closed)
Patch Set: Fix value helper. Created 3 years, 11 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
OLDNEW
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 "src/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/base/bits.h" 6 #include "src/base/bits.h"
7 #include "src/compiler/instruction-selector-impl.h" 7 #include "src/compiler/instruction-selector-impl.h"
8 #include "src/compiler/node-matchers.h" 8 #include "src/compiler/node-matchers.h"
9 #include "src/compiler/node-properties.h" 9 #include "src/compiler/node-properties.h"
10 10
(...skipping 2368 matching lines...) Expand 10 before | Expand all | Expand 10 after
2379 Emit(kArmInt32x4FromFloat32x4, g.DefineAsRegister(node), 2379 Emit(kArmInt32x4FromFloat32x4, g.DefineAsRegister(node),
2380 g.UseRegister(node->InputAt(0))); 2380 g.UseRegister(node->InputAt(0)));
2381 } 2381 }
2382 2382
2383 void InstructionSelector::VisitUint32x4FromFloat32x4(Node* node) { 2383 void InstructionSelector::VisitUint32x4FromFloat32x4(Node* node) {
2384 ArmOperandGenerator g(this); 2384 ArmOperandGenerator g(this);
2385 Emit(kArmUint32x4FromFloat32x4, g.DefineAsRegister(node), 2385 Emit(kArmUint32x4FromFloat32x4, g.DefineAsRegister(node),
2386 g.UseRegister(node->InputAt(0))); 2386 g.UseRegister(node->InputAt(0)));
2387 } 2387 }
2388 2388
2389 void InstructionSelector::VisitInt32x4Neg(Node* node) {
titzer 2017/01/25 09:47:25 I think it's time to macro-ify these methods, but
bbudge 2017/01/26 02:04:43 Added a TODO.
2390 ArmOperandGenerator g(this);
2391 Emit(kArmInt32x4Neg, g.DefineAsRegister(node),
2392 g.UseRegister(node->InputAt(0)));
2393 }
2394
2389 void InstructionSelector::VisitInt32x4Add(Node* node) { 2395 void InstructionSelector::VisitInt32x4Add(Node* node) {
2390 ArmOperandGenerator g(this); 2396 ArmOperandGenerator g(this);
2391 Emit(kArmInt32x4Add, g.DefineAsRegister(node), 2397 Emit(kArmInt32x4Add, g.DefineAsRegister(node),
2392 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); 2398 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2393 } 2399 }
2394 2400
2395 void InstructionSelector::VisitInt32x4Sub(Node* node) { 2401 void InstructionSelector::VisitInt32x4Sub(Node* node) {
2396 ArmOperandGenerator g(this); 2402 ArmOperandGenerator g(this);
2397 Emit(kArmInt32x4Sub, g.DefineAsRegister(node), 2403 Emit(kArmInt32x4Sub, g.DefineAsRegister(node),
2398 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); 2404 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2399 } 2405 }
2400 2406
2407 void InstructionSelector::VisitInt32x4Mul(Node* node) {
2408 ArmOperandGenerator g(this);
2409 Emit(kArmInt32x4Mul, g.DefineAsRegister(node),
2410 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2411 }
2412
2413 void InstructionSelector::VisitInt32x4Min(Node* node) {
2414 ArmOperandGenerator g(this);
2415 Emit(kArmInt32x4Min, g.DefineAsRegister(node),
2416 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2417 }
2418
2419 void InstructionSelector::VisitInt32x4Max(Node* node) {
2420 ArmOperandGenerator g(this);
2421 Emit(kArmInt32x4Max, g.DefineAsRegister(node),
2422 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2423 }
2424
2401 void InstructionSelector::VisitInt32x4Equal(Node* node) { 2425 void InstructionSelector::VisitInt32x4Equal(Node* node) {
2402 ArmOperandGenerator g(this); 2426 ArmOperandGenerator g(this);
2403 Emit(kArmInt32x4Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 2427 Emit(kArmInt32x4Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2404 g.UseRegister(node->InputAt(1))); 2428 g.UseRegister(node->InputAt(1)));
2405 } 2429 }
2406 2430
2407 void InstructionSelector::VisitInt32x4NotEqual(Node* node) { 2431 void InstructionSelector::VisitInt32x4NotEqual(Node* node) {
2408 ArmOperandGenerator g(this); 2432 ArmOperandGenerator g(this);
2409 Emit(kArmInt32x4Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), 2433 Emit(kArmInt32x4Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2410 g.UseRegister(node->InputAt(1))); 2434 g.UseRegister(node->InputAt(1)));
2411 } 2435 }
2412 2436
2437 void InstructionSelector::VisitInt32x4GreaterThan(Node* node) {
2438 ArmOperandGenerator g(this);
2439 Emit(kArmInt32x4Gt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2440 g.UseRegister(node->InputAt(1)));
2441 }
2442
2443 void InstructionSelector::VisitInt32x4GreaterThanOrEqual(Node* node) {
2444 ArmOperandGenerator g(this);
2445 Emit(kArmInt32x4Ge, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2446 g.UseRegister(node->InputAt(1)));
2447 }
2448
2449 void InstructionSelector::VisitUint32x4GreaterThan(Node* node) {
2450 ArmOperandGenerator g(this);
2451 Emit(kArmUint32x4Gt, g.DefineAsRegister(node),
2452 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2453 }
2454
2455 void InstructionSelector::VisitUint32x4GreaterThanOrEqual(Node* node) {
2456 ArmOperandGenerator g(this);
2457 Emit(kArmUint32x4Ge, g.DefineAsRegister(node),
2458 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2459 }
2460
2413 void InstructionSelector::VisitSimd32x4Select(Node* node) { 2461 void InstructionSelector::VisitSimd32x4Select(Node* node) {
2414 ArmOperandGenerator g(this); 2462 ArmOperandGenerator g(this);
2415 Emit(kArmSimd32x4Select, g.DefineAsRegister(node), 2463 Emit(kArmSimd32x4Select, g.DefineAsRegister(node),
2416 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), 2464 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)),
2417 g.UseRegister(node->InputAt(2))); 2465 g.UseRegister(node->InputAt(2)));
2418 } 2466 }
2419 2467
2468 void InstructionSelector::VisitCreateInt16x8(Node* node) {
2469 ArmOperandGenerator g(this);
2470 Emit(kArmInt16x8Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
2471 }
2472
2473 void InstructionSelector::VisitInt16x8ExtractLane(Node* node) {
2474 ArmOperandGenerator g(this);
2475 int32_t lane = OpParameter<int32_t>(node);
2476 Emit(kArmInt16x8ExtractLane, g.DefineAsRegister(node),
2477 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane));
2478 }
2479
2480 void InstructionSelector::VisitInt16x8ReplaceLane(Node* node) {
2481 ArmOperandGenerator g(this);
2482 int32_t lane = OpParameter<int32_t>(node);
2483 Emit(kArmInt16x8ReplaceLane, g.DefineAsRegister(node),
2484 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane),
2485 g.Use(node->InputAt(1)));
2486 }
2487
2488 void InstructionSelector::VisitInt16x8Neg(Node* node) {
2489 ArmOperandGenerator g(this);
2490 Emit(kArmInt16x8Neg, g.DefineAsRegister(node),
2491 g.UseRegister(node->InputAt(0)));
2492 }
2493
2494 void InstructionSelector::VisitInt16x8Add(Node* node) {
2495 ArmOperandGenerator g(this);
2496 Emit(kArmInt16x8Add, g.DefineAsRegister(node),
2497 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2498 }
2499
2500 void InstructionSelector::VisitInt16x8Sub(Node* node) {
2501 ArmOperandGenerator g(this);
2502 Emit(kArmInt16x8Sub, g.DefineAsRegister(node),
2503 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2504 }
2505
2506 void InstructionSelector::VisitInt16x8Mul(Node* node) {
2507 ArmOperandGenerator g(this);
2508 Emit(kArmInt16x8Mul, g.DefineAsRegister(node),
2509 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2510 }
2511
2512 void InstructionSelector::VisitInt16x8Min(Node* node) {
2513 ArmOperandGenerator g(this);
2514 Emit(kArmInt16x8Min, g.DefineAsRegister(node),
2515 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2516 }
2517
2518 void InstructionSelector::VisitInt16x8Max(Node* node) {
2519 ArmOperandGenerator g(this);
2520 Emit(kArmInt16x8Max, g.DefineAsRegister(node),
2521 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2522 }
2523
2524 void InstructionSelector::VisitInt16x8Equal(Node* node) {
2525 ArmOperandGenerator g(this);
2526 Emit(kArmInt16x8Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2527 g.UseRegister(node->InputAt(1)));
2528 }
2529
2530 void InstructionSelector::VisitInt16x8NotEqual(Node* node) {
2531 ArmOperandGenerator g(this);
2532 Emit(kArmInt16x8Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2533 g.UseRegister(node->InputAt(1)));
2534 }
2535
2536 void InstructionSelector::VisitInt16x8GreaterThan(Node* node) {
2537 ArmOperandGenerator g(this);
2538 Emit(kArmInt16x8Gt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2539 g.UseRegister(node->InputAt(1)));
2540 }
2541
2542 void InstructionSelector::VisitInt16x8GreaterThanOrEqual(Node* node) {
2543 ArmOperandGenerator g(this);
2544 Emit(kArmInt16x8Ge, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2545 g.UseRegister(node->InputAt(1)));
2546 }
2547
2548 void InstructionSelector::VisitUint16x8GreaterThan(Node* node) {
2549 ArmOperandGenerator g(this);
2550 Emit(kArmUint16x8Gt, g.DefineAsRegister(node),
2551 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2552 }
2553
2554 void InstructionSelector::VisitUint16x8GreaterThanOrEqual(Node* node) {
2555 ArmOperandGenerator g(this);
2556 Emit(kArmUint16x8Ge, g.DefineAsRegister(node),
2557 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2558 }
2559
2560 void InstructionSelector::VisitCreateInt8x16(Node* node) {
2561 ArmOperandGenerator g(this);
2562 Emit(kArmInt8x16Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0)));
2563 }
2564
2565 void InstructionSelector::VisitInt8x16ExtractLane(Node* node) {
2566 ArmOperandGenerator g(this);
2567 int32_t lane = OpParameter<int32_t>(node);
2568 Emit(kArmInt8x16ExtractLane, g.DefineAsRegister(node),
2569 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane));
2570 }
2571
2572 void InstructionSelector::VisitInt8x16ReplaceLane(Node* node) {
2573 ArmOperandGenerator g(this);
2574 int32_t lane = OpParameter<int32_t>(node);
2575 Emit(kArmInt8x16ReplaceLane, g.DefineAsRegister(node),
2576 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane),
2577 g.Use(node->InputAt(1)));
2578 }
2579
2580 void InstructionSelector::VisitInt8x16Neg(Node* node) {
2581 ArmOperandGenerator g(this);
2582 Emit(kArmInt8x16Neg, g.DefineAsRegister(node),
2583 g.UseRegister(node->InputAt(0)));
2584 }
2585
2586 void InstructionSelector::VisitInt8x16Add(Node* node) {
2587 ArmOperandGenerator g(this);
2588 Emit(kArmInt8x16Add, g.DefineAsRegister(node),
2589 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2590 }
2591
2592 void InstructionSelector::VisitInt8x16Sub(Node* node) {
2593 ArmOperandGenerator g(this);
2594 Emit(kArmInt8x16Sub, g.DefineAsRegister(node),
2595 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2596 }
2597
2598 void InstructionSelector::VisitInt8x16Mul(Node* node) {
2599 ArmOperandGenerator g(this);
2600 Emit(kArmInt8x16Mul, g.DefineAsRegister(node),
2601 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2602 }
2603
2604 void InstructionSelector::VisitInt8x16Min(Node* node) {
2605 ArmOperandGenerator g(this);
2606 Emit(kArmInt8x16Min, g.DefineAsRegister(node),
2607 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2608 }
2609
2610 void InstructionSelector::VisitInt8x16Max(Node* node) {
2611 ArmOperandGenerator g(this);
2612 Emit(kArmInt8x16Max, g.DefineAsRegister(node),
2613 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2614 }
2615
2616 void InstructionSelector::VisitInt8x16Equal(Node* node) {
2617 ArmOperandGenerator g(this);
2618 Emit(kArmInt8x16Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2619 g.UseRegister(node->InputAt(1)));
2620 }
2621
2622 void InstructionSelector::VisitInt8x16NotEqual(Node* node) {
2623 ArmOperandGenerator g(this);
2624 Emit(kArmInt8x16Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2625 g.UseRegister(node->InputAt(1)));
2626 }
2627
2628 void InstructionSelector::VisitInt8x16GreaterThan(Node* node) {
2629 ArmOperandGenerator g(this);
2630 Emit(kArmInt8x16Gt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2631 g.UseRegister(node->InputAt(1)));
2632 }
2633
2634 void InstructionSelector::VisitInt8x16GreaterThanOrEqual(Node* node) {
2635 ArmOperandGenerator g(this);
2636 Emit(kArmInt8x16Ge, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)),
2637 g.UseRegister(node->InputAt(1)));
2638 }
2639
2640 void InstructionSelector::VisitUint8x16GreaterThan(Node* node) {
2641 ArmOperandGenerator g(this);
2642 Emit(kArmUint8x16Gt, g.DefineAsRegister(node),
2643 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2644 }
2645
2646 void InstructionSelector::VisitUint8x16GreaterThanOrEqual(Node* node) {
2647 ArmOperandGenerator g(this);
2648 Emit(kArmUint8x16Ge, g.DefineAsRegister(node),
2649 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
2650 }
2651
2420 // static 2652 // static
2421 MachineOperatorBuilder::Flags 2653 MachineOperatorBuilder::Flags
2422 InstructionSelector::SupportedMachineOperatorFlags() { 2654 InstructionSelector::SupportedMachineOperatorFlags() {
2423 MachineOperatorBuilder::Flags flags; 2655 MachineOperatorBuilder::Flags flags;
2424 if (CpuFeatures::IsSupported(SUDIV)) { 2656 if (CpuFeatures::IsSupported(SUDIV)) {
2425 // The sdiv and udiv instructions correctly return 0 if the divisor is 0, 2657 // The sdiv and udiv instructions correctly return 0 if the divisor is 0,
2426 // but the fall-back implementation does not. 2658 // but the fall-back implementation does not.
2427 flags |= MachineOperatorBuilder::kInt32DivIsSafe | 2659 flags |= MachineOperatorBuilder::kInt32DivIsSafe |
2428 MachineOperatorBuilder::kUint32DivIsSafe; 2660 MachineOperatorBuilder::kUint32DivIsSafe;
2429 } 2661 }
(...skipping 20 matching lines...) Expand all
2450 Vector<MachineType> req_aligned = Vector<MachineType>::New(2); 2682 Vector<MachineType> req_aligned = Vector<MachineType>::New(2);
2451 req_aligned[0] = MachineType::Float32(); 2683 req_aligned[0] = MachineType::Float32();
2452 req_aligned[1] = MachineType::Float64(); 2684 req_aligned[1] = MachineType::Float64();
2453 return MachineOperatorBuilder::AlignmentRequirements:: 2685 return MachineOperatorBuilder::AlignmentRequirements::
2454 SomeUnalignedAccessUnsupported(req_aligned, req_aligned); 2686 SomeUnalignedAccessUnsupported(req_aligned, req_aligned);
2455 } 2687 }
2456 2688
2457 } // namespace compiler 2689 } // namespace compiler
2458 } // namespace internal 2690 } // namespace internal
2459 } // namespace v8 2691 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698