| 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand all 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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 |