| 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 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 break; | 226 break; |
| 227 case MachineRepresentation::kTaggedSigned: // Fall through. | 227 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 228 case MachineRepresentation::kTaggedPointer: // Fall through. | 228 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 229 case MachineRepresentation::kTagged: // Fall through. | 229 case MachineRepresentation::kTagged: // Fall through. |
| 230 case MachineRepresentation::kWord64: | 230 case MachineRepresentation::kWord64: |
| 231 opcode = kX64Movq; | 231 opcode = kX64Movq; |
| 232 break; | 232 break; |
| 233 case MachineRepresentation::kSimd128: // Fall through. | 233 case MachineRepresentation::kSimd128: // Fall through. |
| 234 opcode = kX64Movdqu; | 234 opcode = kX64Movdqu; |
| 235 break; | 235 break; |
| 236 case MachineRepresentation::kSimd1x4: // Fall through. | |
| 237 case MachineRepresentation::kSimd1x8: // Fall through. | |
| 238 case MachineRepresentation::kSimd1x16: // Fall through. | |
| 239 case MachineRepresentation::kNone: | 236 case MachineRepresentation::kNone: |
| 240 UNREACHABLE(); | 237 UNREACHABLE(); |
| 241 break; | 238 break; |
| 242 } | 239 } |
| 243 return opcode; | 240 return opcode; |
| 244 } | 241 } |
| 245 | 242 |
| 246 ArchOpcode GetStoreOpcode(StoreRepresentation store_rep) { | 243 ArchOpcode GetStoreOpcode(StoreRepresentation store_rep) { |
| 247 switch (store_rep.representation()) { | 244 switch (store_rep.representation()) { |
| 248 case MachineRepresentation::kFloat32: | 245 case MachineRepresentation::kFloat32: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 263 break; | 260 break; |
| 264 case MachineRepresentation::kTaggedSigned: // Fall through. | 261 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 265 case MachineRepresentation::kTaggedPointer: // Fall through. | 262 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 266 case MachineRepresentation::kTagged: // Fall through. | 263 case MachineRepresentation::kTagged: // Fall through. |
| 267 case MachineRepresentation::kWord64: | 264 case MachineRepresentation::kWord64: |
| 268 return kX64Movq; | 265 return kX64Movq; |
| 269 break; | 266 break; |
| 270 case MachineRepresentation::kSimd128: // Fall through. | 267 case MachineRepresentation::kSimd128: // Fall through. |
| 271 return kX64Movdqu; | 268 return kX64Movdqu; |
| 272 break; | 269 break; |
| 273 case MachineRepresentation::kSimd1x4: // Fall through. | |
| 274 case MachineRepresentation::kSimd1x8: // Fall through. | |
| 275 case MachineRepresentation::kSimd1x16: // Fall through. | |
| 276 case MachineRepresentation::kNone: | 270 case MachineRepresentation::kNone: |
| 277 UNREACHABLE(); | 271 UNREACHABLE(); |
| 278 } | 272 } |
| 279 UNREACHABLE(); | 273 UNREACHABLE(); |
| 280 } | 274 } |
| 281 | 275 |
| 282 } // namespace | 276 } // namespace |
| 283 | 277 |
| 284 void InstructionSelector::VisitStackSlot(Node* node) { | 278 void InstructionSelector::VisitStackSlot(Node* node) { |
| 285 StackSlotRepresentation rep = StackSlotRepresentationOf(node->op()); | 279 StackSlotRepresentation rep = StackSlotRepresentationOf(node->op()); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 opcode = kCheckedLoadWord64; | 419 opcode = kCheckedLoadWord64; |
| 426 break; | 420 break; |
| 427 case MachineRepresentation::kFloat32: | 421 case MachineRepresentation::kFloat32: |
| 428 opcode = kCheckedLoadFloat32; | 422 opcode = kCheckedLoadFloat32; |
| 429 break; | 423 break; |
| 430 case MachineRepresentation::kFloat64: | 424 case MachineRepresentation::kFloat64: |
| 431 opcode = kCheckedLoadFloat64; | 425 opcode = kCheckedLoadFloat64; |
| 432 break; | 426 break; |
| 433 case MachineRepresentation::kBit: // Fall through. | 427 case MachineRepresentation::kBit: // Fall through. |
| 434 case MachineRepresentation::kSimd128: // Fall through. | 428 case MachineRepresentation::kSimd128: // Fall through. |
| 435 case MachineRepresentation::kSimd1x4: // Fall through. | |
| 436 case MachineRepresentation::kSimd1x8: // Fall through. | |
| 437 case MachineRepresentation::kSimd1x16: // Fall through. | |
| 438 case MachineRepresentation::kTaggedSigned: // Fall through. | 429 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 439 case MachineRepresentation::kTaggedPointer: // Fall through. | 430 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 440 case MachineRepresentation::kTagged: // Fall through. | 431 case MachineRepresentation::kTagged: // Fall through. |
| 441 case MachineRepresentation::kNone: | 432 case MachineRepresentation::kNone: |
| 442 UNREACHABLE(); | 433 UNREACHABLE(); |
| 443 return; | 434 return; |
| 444 } | 435 } |
| 445 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { | 436 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { |
| 446 Int32Matcher mlength(length); | 437 Int32Matcher mlength(length); |
| 447 Int32BinopMatcher moffset(offset); | 438 Int32BinopMatcher moffset(offset); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 opcode = kCheckedStoreWord64; | 474 opcode = kCheckedStoreWord64; |
| 484 break; | 475 break; |
| 485 case MachineRepresentation::kFloat32: | 476 case MachineRepresentation::kFloat32: |
| 486 opcode = kCheckedStoreFloat32; | 477 opcode = kCheckedStoreFloat32; |
| 487 break; | 478 break; |
| 488 case MachineRepresentation::kFloat64: | 479 case MachineRepresentation::kFloat64: |
| 489 opcode = kCheckedStoreFloat64; | 480 opcode = kCheckedStoreFloat64; |
| 490 break; | 481 break; |
| 491 case MachineRepresentation::kBit: // Fall through. | 482 case MachineRepresentation::kBit: // Fall through. |
| 492 case MachineRepresentation::kSimd128: // Fall through. | 483 case MachineRepresentation::kSimd128: // Fall through. |
| 493 case MachineRepresentation::kSimd1x4: // Fall through. | |
| 494 case MachineRepresentation::kSimd1x8: // Fall through. | |
| 495 case MachineRepresentation::kSimd1x16: // Fall through. | |
| 496 case MachineRepresentation::kTaggedSigned: // Fall through. | 484 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 497 case MachineRepresentation::kTaggedPointer: // Fall through. | 485 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 498 case MachineRepresentation::kTagged: // Fall through. | 486 case MachineRepresentation::kTagged: // Fall through. |
| 499 case MachineRepresentation::kNone: | 487 case MachineRepresentation::kNone: |
| 500 UNREACHABLE(); | 488 UNREACHABLE(); |
| 501 return; | 489 return; |
| 502 } | 490 } |
| 503 InstructionOperand value_operand = | 491 InstructionOperand value_operand = |
| 504 g.CanBeImmediate(value) ? g.UseImmediate(value) : g.UseRegister(value); | 492 g.CanBeImmediate(value) ? g.UseImmediate(value) : g.UseRegister(value); |
| 505 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { | 493 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { |
| (...skipping 1947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2453 #define SIMD_TYPES(V) \ | 2441 #define SIMD_TYPES(V) \ |
| 2454 V(I32x4) \ | 2442 V(I32x4) \ |
| 2455 V(I16x8) \ | 2443 V(I16x8) \ |
| 2456 V(I8x16) | 2444 V(I8x16) |
| 2457 | 2445 |
| 2458 #define SIMD_FORMAT_LIST(V) \ | 2446 #define SIMD_FORMAT_LIST(V) \ |
| 2459 V(32x4) \ | 2447 V(32x4) \ |
| 2460 V(16x8) \ | 2448 V(16x8) \ |
| 2461 V(8x16) | 2449 V(8x16) |
| 2462 | 2450 |
| 2463 #define SIMD_ZERO_OP_LIST(V) \ | |
| 2464 V(S128Zero) \ | |
| 2465 V(S1x4Zero) \ | |
| 2466 V(S1x8Zero) \ | |
| 2467 V(S1x16Zero) | |
| 2468 | |
| 2469 #define SIMD_BINOP_LIST(V) \ | 2451 #define SIMD_BINOP_LIST(V) \ |
| 2470 V(I32x4Add) \ | 2452 V(I32x4Add) \ |
| 2471 V(I32x4AddHoriz) \ | 2453 V(I32x4AddHoriz) \ |
| 2472 V(I32x4Sub) \ | 2454 V(I32x4Sub) \ |
| 2473 V(I32x4Mul) \ | 2455 V(I32x4Mul) \ |
| 2474 V(I32x4MinS) \ | 2456 V(I32x4MinS) \ |
| 2475 V(I32x4MaxS) \ | 2457 V(I32x4MaxS) \ |
| 2476 V(I32x4Eq) \ | 2458 V(I32x4Eq) \ |
| 2477 V(I32x4Ne) \ | 2459 V(I32x4Ne) \ |
| 2478 V(I32x4MinU) \ | 2460 V(I32x4MinU) \ |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2510 #define SIMD_UNOP_LIST(V) V(S128Not) | 2492 #define SIMD_UNOP_LIST(V) V(S128Not) |
| 2511 | 2493 |
| 2512 #define SIMD_SHIFT_OPCODES(V) \ | 2494 #define SIMD_SHIFT_OPCODES(V) \ |
| 2513 V(I32x4Shl) \ | 2495 V(I32x4Shl) \ |
| 2514 V(I32x4ShrS) \ | 2496 V(I32x4ShrS) \ |
| 2515 V(I32x4ShrU) \ | 2497 V(I32x4ShrU) \ |
| 2516 V(I16x8Shl) \ | 2498 V(I16x8Shl) \ |
| 2517 V(I16x8ShrS) \ | 2499 V(I16x8ShrS) \ |
| 2518 V(I16x8ShrU) | 2500 V(I16x8ShrU) |
| 2519 | 2501 |
| 2502 void InstructionSelector::VisitS128Zero(Node* node) { |
| 2503 X64OperandGenerator g(this); |
| 2504 Emit(kX64S128Zero, g.DefineAsRegister(node), g.DefineAsRegister(node)); |
| 2505 } |
| 2506 |
| 2520 #define VISIT_SIMD_SPLAT(Type) \ | 2507 #define VISIT_SIMD_SPLAT(Type) \ |
| 2521 void InstructionSelector::Visit##Type##Splat(Node* node) { \ | 2508 void InstructionSelector::Visit##Type##Splat(Node* node) { \ |
| 2522 X64OperandGenerator g(this); \ | 2509 X64OperandGenerator g(this); \ |
| 2523 Emit(kX64##Type##Splat, g.DefineAsRegister(node), \ | 2510 Emit(kX64##Type##Splat, g.DefineAsRegister(node), \ |
| 2524 g.Use(node->InputAt(0))); \ | 2511 g.Use(node->InputAt(0))); \ |
| 2525 } | 2512 } |
| 2526 SIMD_TYPES(VISIT_SIMD_SPLAT) | 2513 SIMD_TYPES(VISIT_SIMD_SPLAT) |
| 2527 #undef VISIT_SIMD_SPLAT | 2514 #undef VISIT_SIMD_SPLAT |
| 2528 | 2515 |
| 2529 #define VISIT_SIMD_EXTRACT_LANE(Type) \ | 2516 #define VISIT_SIMD_EXTRACT_LANE(Type) \ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2540 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ | 2527 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ |
| 2541 X64OperandGenerator g(this); \ | 2528 X64OperandGenerator g(this); \ |
| 2542 int32_t lane = OpParameter<int32_t>(node); \ | 2529 int32_t lane = OpParameter<int32_t>(node); \ |
| 2543 Emit(kX64##Type##ReplaceLane, g.DefineSameAsFirst(node), \ | 2530 Emit(kX64##Type##ReplaceLane, g.DefineSameAsFirst(node), \ |
| 2544 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), \ | 2531 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), \ |
| 2545 g.Use(node->InputAt(1))); \ | 2532 g.Use(node->InputAt(1))); \ |
| 2546 } | 2533 } |
| 2547 SIMD_TYPES(VISIT_SIMD_REPLACE_LANE) | 2534 SIMD_TYPES(VISIT_SIMD_REPLACE_LANE) |
| 2548 #undef VISIT_SIMD_REPLACE_LANE | 2535 #undef VISIT_SIMD_REPLACE_LANE |
| 2549 | 2536 |
| 2550 #define SIMD_VISIT_ZERO_OP(Name) \ | |
| 2551 void InstructionSelector::Visit##Name(Node* node) { \ | |
| 2552 X64OperandGenerator g(this); \ | |
| 2553 Emit(kX64S128Zero, g.DefineAsRegister(node), g.DefineAsRegister(node)); \ | |
| 2554 } | |
| 2555 SIMD_ZERO_OP_LIST(SIMD_VISIT_ZERO_OP) | |
| 2556 #undef SIMD_VISIT_ZERO_OP | |
| 2557 | |
| 2558 #define VISIT_SIMD_SHIFT(Opcode) \ | 2537 #define VISIT_SIMD_SHIFT(Opcode) \ |
| 2559 void InstructionSelector::Visit##Opcode(Node* node) { \ | 2538 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2560 X64OperandGenerator g(this); \ | 2539 X64OperandGenerator g(this); \ |
| 2561 int32_t value = OpParameter<int32_t>(node); \ | 2540 int32_t value = OpParameter<int32_t>(node); \ |
| 2562 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ | 2541 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ |
| 2563 g.UseRegister(node->InputAt(0)), g.UseImmediate(value)); \ | 2542 g.UseRegister(node->InputAt(0)), g.UseImmediate(value)); \ |
| 2564 } | 2543 } |
| 2565 SIMD_SHIFT_OPCODES(VISIT_SIMD_SHIFT) | 2544 SIMD_SHIFT_OPCODES(VISIT_SIMD_SHIFT) |
| 2566 #undef VISIT_SIMD_SHIFT | 2545 #undef VISIT_SIMD_SHIFT |
| 2567 | 2546 |
| 2568 #define VISIT_SIMD_UNOP(Opcode) \ | 2547 #define VISIT_SIMD_UNOP(Opcode) \ |
| 2569 void InstructionSelector::Visit##Opcode(Node* node) { \ | 2548 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2570 X64OperandGenerator g(this); \ | 2549 X64OperandGenerator g(this); \ |
| 2571 Emit(kX64##Opcode, g.DefineAsRegister(node), \ | 2550 Emit(kX64##Opcode, g.DefineAsRegister(node), \ |
| 2572 g.UseRegister(node->InputAt(0))); \ | 2551 g.UseRegister(node->InputAt(0))); \ |
| 2573 } | 2552 } |
| 2574 SIMD_UNOP_LIST(VISIT_SIMD_UNOP) | 2553 SIMD_UNOP_LIST(VISIT_SIMD_UNOP) |
| 2575 #undef VISIT_SIMD_UNOP | 2554 #undef VISIT_SIMD_UNOP |
| 2576 | 2555 |
| 2577 #define VISIT_SIMD_BINOP(Opcode) \ | 2556 #define VISIT_SIMD_BINOP(Opcode) \ |
| 2578 void InstructionSelector::Visit##Opcode(Node* node) { \ | 2557 void InstructionSelector::Visit##Opcode(Node* node) { \ |
| 2579 X64OperandGenerator g(this); \ | 2558 X64OperandGenerator g(this); \ |
| 2580 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ | 2559 Emit(kX64##Opcode, g.DefineSameAsFirst(node), \ |
| 2581 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); \ | 2560 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); \ |
| 2582 } | 2561 } |
| 2583 SIMD_BINOP_LIST(VISIT_SIMD_BINOP) | 2562 SIMD_BINOP_LIST(VISIT_SIMD_BINOP) |
| 2584 #undef VISIT_SIMD_BINOP | 2563 #undef VISIT_SIMD_BINOP |
| 2585 | 2564 |
| 2586 #define SIMD_VISIT_SELECT_OP(format) \ | 2565 void InstructionSelector::VisitS128Select(Node* node) { |
| 2587 void InstructionSelector::VisitS##format##Select(Node* node) { \ | 2566 X64OperandGenerator g(this); |
| 2588 X64OperandGenerator g(this); \ | 2567 Emit(kX64S128Select, g.DefineSameAsFirst(node), |
| 2589 Emit(kX64S128Select, g.DefineSameAsFirst(node), \ | 2568 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), |
| 2590 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), \ | 2569 g.UseRegister(node->InputAt(2))); |
| 2591 g.UseRegister(node->InputAt(2))); \ | 2570 } |
| 2592 } | |
| 2593 SIMD_FORMAT_LIST(SIMD_VISIT_SELECT_OP) | |
| 2594 #undef SIMD_VISIT_SELECT_OP | |
| 2595 | 2571 |
| 2596 void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) { | 2572 void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) { |
| 2597 UNREACHABLE(); | 2573 UNREACHABLE(); |
| 2598 } | 2574 } |
| 2599 | 2575 |
| 2600 void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { | 2576 void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { |
| 2601 UNREACHABLE(); | 2577 UNREACHABLE(); |
| 2602 } | 2578 } |
| 2603 | 2579 |
| 2604 // static | 2580 // static |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2627 // static | 2603 // static |
| 2628 MachineOperatorBuilder::AlignmentRequirements | 2604 MachineOperatorBuilder::AlignmentRequirements |
| 2629 InstructionSelector::AlignmentRequirements() { | 2605 InstructionSelector::AlignmentRequirements() { |
| 2630 return MachineOperatorBuilder::AlignmentRequirements:: | 2606 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2631 FullUnalignedAccessSupport(); | 2607 FullUnalignedAccessSupport(); |
| 2632 } | 2608 } |
| 2633 | 2609 |
| 2634 } // namespace compiler | 2610 } // namespace compiler |
| 2635 } // namespace internal | 2611 } // namespace internal |
| 2636 } // namespace v8 | 2612 } // namespace v8 |
| OLD | NEW |