OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
6 | 6 |
7 #include "src/isolate-inl.h" | 7 #include "src/isolate-inl.h" |
8 | 8 |
9 #include "src/base/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 423 matching lines...) Loading... |
434 op = m->Word32And(); | 434 op = m->Word32And(); |
435 break; | 435 break; |
436 case wasm::kExprI32Ior: | 436 case wasm::kExprI32Ior: |
437 op = m->Word32Or(); | 437 op = m->Word32Or(); |
438 break; | 438 break; |
439 case wasm::kExprI32Xor: | 439 case wasm::kExprI32Xor: |
440 op = m->Word32Xor(); | 440 op = m->Word32Xor(); |
441 break; | 441 break; |
442 case wasm::kExprI32Shl: | 442 case wasm::kExprI32Shl: |
443 op = m->Word32Shl(); | 443 op = m->Word32Shl(); |
| 444 right = MaskShiftCount32(right); |
444 break; | 445 break; |
445 case wasm::kExprI32ShrU: | 446 case wasm::kExprI32ShrU: |
446 op = m->Word32Shr(); | 447 op = m->Word32Shr(); |
| 448 right = MaskShiftCount32(right); |
447 break; | 449 break; |
448 case wasm::kExprI32ShrS: | 450 case wasm::kExprI32ShrS: |
449 op = m->Word32Sar(); | 451 op = m->Word32Sar(); |
| 452 right = MaskShiftCount32(right); |
450 break; | 453 break; |
451 case wasm::kExprI32Ror: | 454 case wasm::kExprI32Ror: |
452 op = m->Word32Ror(); | 455 op = m->Word32Ror(); |
| 456 right = MaskShiftCount32(right); |
453 break; | 457 break; |
454 case wasm::kExprI32Rol: | 458 case wasm::kExprI32Rol: |
| 459 right = MaskShiftCount32(right); |
455 return BuildI32Rol(left, right); | 460 return BuildI32Rol(left, right); |
456 case wasm::kExprI32Eq: | 461 case wasm::kExprI32Eq: |
457 op = m->Word32Equal(); | 462 op = m->Word32Equal(); |
458 break; | 463 break; |
459 case wasm::kExprI32Ne: | 464 case wasm::kExprI32Ne: |
460 return Invert(Binop(wasm::kExprI32Eq, left, right)); | 465 return Invert(Binop(wasm::kExprI32Eq, left, right)); |
461 case wasm::kExprI32LtS: | 466 case wasm::kExprI32LtS: |
462 op = m->Int32LessThan(); | 467 op = m->Int32LessThan(); |
463 break; | 468 break; |
464 case wasm::kExprI32LeS: | 469 case wasm::kExprI32LeS: |
(...skipping 53 matching lines...) Loading... |
518 case wasm::kExprI64Ior: | 523 case wasm::kExprI64Ior: |
519 op = m->Word64Or(); | 524 op = m->Word64Or(); |
520 break; | 525 break; |
521 // kExprI64Xor: | 526 // kExprI64Xor: |
522 case wasm::kExprI64Xor: | 527 case wasm::kExprI64Xor: |
523 op = m->Word64Xor(); | 528 op = m->Word64Xor(); |
524 break; | 529 break; |
525 // kExprI64Shl: | 530 // kExprI64Shl: |
526 case wasm::kExprI64Shl: | 531 case wasm::kExprI64Shl: |
527 op = m->Word64Shl(); | 532 op = m->Word64Shl(); |
| 533 right = MaskShiftCount64(right); |
528 break; | 534 break; |
529 // kExprI64ShrU: | 535 // kExprI64ShrU: |
530 case wasm::kExprI64ShrU: | 536 case wasm::kExprI64ShrU: |
531 op = m->Word64Shr(); | 537 op = m->Word64Shr(); |
| 538 right = MaskShiftCount64(right); |
532 break; | 539 break; |
533 // kExprI64ShrS: | 540 // kExprI64ShrS: |
534 case wasm::kExprI64ShrS: | 541 case wasm::kExprI64ShrS: |
535 op = m->Word64Sar(); | 542 op = m->Word64Sar(); |
| 543 right = MaskShiftCount64(right); |
536 break; | 544 break; |
537 // kExprI64Eq: | 545 // kExprI64Eq: |
538 case wasm::kExprI64Eq: | 546 case wasm::kExprI64Eq: |
539 op = m->Word64Equal(); | 547 op = m->Word64Equal(); |
540 break; | 548 break; |
541 // kExprI64Ne: | 549 // kExprI64Ne: |
542 case wasm::kExprI64Ne: | 550 case wasm::kExprI64Ne: |
543 return Invert(Binop(wasm::kExprI64Eq, left, right)); | 551 return Invert(Binop(wasm::kExprI64Eq, left, right)); |
544 // kExprI64LtS: | 552 // kExprI64LtS: |
545 case wasm::kExprI64LtS: | 553 case wasm::kExprI64LtS: |
(...skipping 23 matching lines...) Loading... |
569 case wasm::kExprI64GeU: | 577 case wasm::kExprI64GeU: |
570 op = m->Uint64LessThanOrEqual(); | 578 op = m->Uint64LessThanOrEqual(); |
571 std::swap(left, right); | 579 std::swap(left, right); |
572 break; | 580 break; |
573 | 581 |
574 #if WASM_64 | 582 #if WASM_64 |
575 // Opcodes only supported on 64-bit platforms. | 583 // Opcodes only supported on 64-bit platforms. |
576 // TODO(titzer): query the machine operator builder here instead of #ifdef. | 584 // TODO(titzer): query the machine operator builder here instead of #ifdef. |
577 case wasm::kExprI64Ror: | 585 case wasm::kExprI64Ror: |
578 op = m->Word64Ror(); | 586 op = m->Word64Ror(); |
| 587 right = MaskShiftCount64(right); |
579 break; | 588 break; |
580 case wasm::kExprI64Rol: | 589 case wasm::kExprI64Rol: |
| 590 right = MaskShiftCount64(right); |
581 return BuildI64Rol(left, right); | 591 return BuildI64Rol(left, right); |
582 #endif | 592 #endif |
583 | 593 |
584 case wasm::kExprF32CopySign: | 594 case wasm::kExprF32CopySign: |
585 return BuildF32CopySign(left, right); | 595 return BuildF32CopySign(left, right); |
586 case wasm::kExprF64CopySign: | 596 case wasm::kExprF64CopySign: |
587 return BuildF64CopySign(left, right); | 597 return BuildF64CopySign(left, right); |
588 case wasm::kExprF32Add: | 598 case wasm::kExprF32Add: |
589 op = m->Float32Add(); | 599 op = m->Float32Add(); |
590 break; | 600 break; |
(...skipping 394 matching lines...) Loading... |
985 | 995 |
986 | 996 |
987 Node* WasmGraphBuilder::ReturnVoid() { return Return(0, Buffer(0)); } | 997 Node* WasmGraphBuilder::ReturnVoid() { return Return(0, Buffer(0)); } |
988 | 998 |
989 | 999 |
990 Node* WasmGraphBuilder::Unreachable() { | 1000 Node* WasmGraphBuilder::Unreachable() { |
991 trap_->Unreachable(); | 1001 trap_->Unreachable(); |
992 return nullptr; | 1002 return nullptr; |
993 } | 1003 } |
994 | 1004 |
| 1005 Node* WasmGraphBuilder::MaskShiftCount32(Node* node) { |
| 1006 static const int32_t kMask32 = 0x1f; |
| 1007 if (!jsgraph()->machine()->Word32ShiftIsSafe()) { |
| 1008 // Shifts by constants are so common we pattern-match them here. |
| 1009 Int32Matcher match(node); |
| 1010 if (match.HasValue()) { |
| 1011 int32_t masked = (match.Value() & kMask32); |
| 1012 if (match.Value() != masked) node = jsgraph()->Int32Constant(masked); |
| 1013 } else { |
| 1014 node = graph()->NewNode(jsgraph()->machine()->Word32And(), node, |
| 1015 jsgraph()->Int32Constant(kMask32)); |
| 1016 } |
| 1017 } |
| 1018 return node; |
| 1019 } |
| 1020 |
| 1021 Node* WasmGraphBuilder::MaskShiftCount64(Node* node) { |
| 1022 static const int64_t kMask64 = 0x3f; |
| 1023 if (!jsgraph()->machine()->Word32ShiftIsSafe()) { |
| 1024 // Shifts by constants are so common we pattern-match them here. |
| 1025 Int64Matcher match(node); |
| 1026 if (match.HasValue()) { |
| 1027 int64_t masked = (match.Value() & kMask64); |
| 1028 if (match.Value() != masked) node = jsgraph()->Int64Constant(masked); |
| 1029 } else { |
| 1030 node = graph()->NewNode(jsgraph()->machine()->Word64And(), node, |
| 1031 jsgraph()->Int64Constant(kMask64)); |
| 1032 } |
| 1033 } |
| 1034 return node; |
| 1035 } |
995 | 1036 |
996 Node* WasmGraphBuilder::BuildF32Neg(Node* input) { | 1037 Node* WasmGraphBuilder::BuildF32Neg(Node* input) { |
997 Node* result = | 1038 Node* result = |
998 Unop(wasm::kExprF32ReinterpretI32, | 1039 Unop(wasm::kExprF32ReinterpretI32, |
999 Binop(wasm::kExprI32Xor, Unop(wasm::kExprI32ReinterpretF32, input), | 1040 Binop(wasm::kExprI32Xor, Unop(wasm::kExprI32ReinterpretF32, input), |
1000 jsgraph()->Int32Constant(0x80000000))); | 1041 jsgraph()->Int32Constant(0x80000000))); |
1001 | 1042 |
1002 return result; | 1043 return result; |
1003 } | 1044 } |
1004 | 1045 |
(...skipping 1661 matching lines...) Loading... |
2666 static_cast<int>(function.code_end_offset - function.code_start_offset), | 2707 static_cast<int>(function.code_end_offset - function.code_start_offset), |
2667 decode_ms, static_cast<int>(graph.NodeCount()), compile_ms); | 2708 decode_ms, static_cast<int>(graph.NodeCount()), compile_ms); |
2668 } | 2709 } |
2669 return code; | 2710 return code; |
2670 } | 2711 } |
2671 | 2712 |
2672 | 2713 |
2673 } // namespace compiler | 2714 } // namespace compiler |
2674 } // namespace internal | 2715 } // namespace internal |
2675 } // namespace v8 | 2716 } // namespace v8 |
OLD | NEW |