| 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 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 op = m->Uint32LessThan(); | 464 op = m->Uint32LessThan(); |
| 465 std::swap(left, right); | 465 std::swap(left, right); |
| 466 break; | 466 break; |
| 467 case wasm::kExprI32GeU: | 467 case wasm::kExprI32GeU: |
| 468 op = m->Uint32LessThanOrEqual(); | 468 op = m->Uint32LessThanOrEqual(); |
| 469 std::swap(left, right); | 469 std::swap(left, right); |
| 470 break; | 470 break; |
| 471 case wasm::kExprI64And: | 471 case wasm::kExprI64And: |
| 472 op = m->Word64And(); | 472 op = m->Word64And(); |
| 473 break; | 473 break; |
| 474 // todo(ahaas): I added a list of missing instructions here to make merging | |
| 475 // easier when I do them one by one. | |
| 476 // kExprI64Add: | |
| 477 case wasm::kExprI64Add: | 474 case wasm::kExprI64Add: |
| 478 op = m->Int64Add(); | 475 op = m->Int64Add(); |
| 479 break; | 476 break; |
| 480 // kExprI64Sub: | |
| 481 case wasm::kExprI64Sub: | 477 case wasm::kExprI64Sub: |
| 482 op = m->Int64Sub(); | 478 op = m->Int64Sub(); |
| 483 break; | 479 break; |
| 484 // kExprI64Mul: | |
| 485 case wasm::kExprI64Mul: | 480 case wasm::kExprI64Mul: |
| 486 op = m->Int64Mul(); | 481 op = m->Int64Mul(); |
| 487 break; | 482 break; |
| 488 // kExprI64DivS: | |
| 489 case wasm::kExprI64DivS: | 483 case wasm::kExprI64DivS: |
| 490 return BuildI64DivS(left, right, position); | 484 return BuildI64DivS(left, right, position); |
| 491 // kExprI64DivU: | |
| 492 case wasm::kExprI64DivU: | 485 case wasm::kExprI64DivU: |
| 493 return BuildI64DivU(left, right, position); | 486 return BuildI64DivU(left, right, position); |
| 494 // kExprI64RemS: | |
| 495 case wasm::kExprI64RemS: | 487 case wasm::kExprI64RemS: |
| 496 return BuildI64RemS(left, right, position); | 488 return BuildI64RemS(left, right, position); |
| 497 // kExprI64RemU: | |
| 498 case wasm::kExprI64RemU: | 489 case wasm::kExprI64RemU: |
| 499 return BuildI64RemU(left, right, position); | 490 return BuildI64RemU(left, right, position); |
| 500 case wasm::kExprI64Ior: | 491 case wasm::kExprI64Ior: |
| 501 op = m->Word64Or(); | 492 op = m->Word64Or(); |
| 502 break; | 493 break; |
| 503 // kExprI64Xor: | |
| 504 case wasm::kExprI64Xor: | 494 case wasm::kExprI64Xor: |
| 505 op = m->Word64Xor(); | 495 op = m->Word64Xor(); |
| 506 break; | 496 break; |
| 507 // kExprI64Shl: | |
| 508 case wasm::kExprI64Shl: | 497 case wasm::kExprI64Shl: |
| 509 op = m->Word64Shl(); | 498 op = m->Word64Shl(); |
| 510 right = MaskShiftCount64(right); | 499 right = MaskShiftCount64(right); |
| 511 break; | 500 break; |
| 512 // kExprI64ShrU: | |
| 513 case wasm::kExprI64ShrU: | 501 case wasm::kExprI64ShrU: |
| 514 op = m->Word64Shr(); | 502 op = m->Word64Shr(); |
| 515 right = MaskShiftCount64(right); | 503 right = MaskShiftCount64(right); |
| 516 break; | 504 break; |
| 517 // kExprI64ShrS: | |
| 518 case wasm::kExprI64ShrS: | 505 case wasm::kExprI64ShrS: |
| 519 op = m->Word64Sar(); | 506 op = m->Word64Sar(); |
| 520 right = MaskShiftCount64(right); | 507 right = MaskShiftCount64(right); |
| 521 break; | 508 break; |
| 522 // kExprI64Eq: | |
| 523 case wasm::kExprI64Eq: | 509 case wasm::kExprI64Eq: |
| 524 op = m->Word64Equal(); | 510 op = m->Word64Equal(); |
| 525 break; | 511 break; |
| 526 // kExprI64Ne: | |
| 527 case wasm::kExprI64Ne: | 512 case wasm::kExprI64Ne: |
| 528 return Invert(Binop(wasm::kExprI64Eq, left, right)); | 513 return Invert(Binop(wasm::kExprI64Eq, left, right)); |
| 529 // kExprI64LtS: | |
| 530 case wasm::kExprI64LtS: | 514 case wasm::kExprI64LtS: |
| 531 op = m->Int64LessThan(); | 515 op = m->Int64LessThan(); |
| 532 break; | 516 break; |
| 533 case wasm::kExprI64LeS: | 517 case wasm::kExprI64LeS: |
| 534 op = m->Int64LessThanOrEqual(); | 518 op = m->Int64LessThanOrEqual(); |
| 535 break; | 519 break; |
| 536 case wasm::kExprI64LtU: | 520 case wasm::kExprI64LtU: |
| 537 op = m->Uint64LessThan(); | 521 op = m->Uint64LessThan(); |
| 538 break; | 522 break; |
| 539 case wasm::kExprI64LeU: | 523 case wasm::kExprI64LeU: |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 } | 772 } |
| 789 case wasm::kExprF64Tan: { | 773 case wasm::kExprF64Tan: { |
| 790 return BuildF64Tan(input); | 774 return BuildF64Tan(input); |
| 791 } | 775 } |
| 792 case wasm::kExprF64Exp: { | 776 case wasm::kExprF64Exp: { |
| 793 return BuildF64Exp(input); | 777 return BuildF64Exp(input); |
| 794 } | 778 } |
| 795 case wasm::kExprF64Log: { | 779 case wasm::kExprF64Log: { |
| 796 return BuildF64Log(input); | 780 return BuildF64Log(input); |
| 797 } | 781 } |
| 798 // kExprI32ConvertI64: | |
| 799 case wasm::kExprI32ConvertI64: | 782 case wasm::kExprI32ConvertI64: |
| 800 op = m->TruncateInt64ToInt32(); | 783 op = m->TruncateInt64ToInt32(); |
| 801 break; | 784 break; |
| 802 // kExprI64SConvertI32: | |
| 803 case wasm::kExprI64SConvertI32: | 785 case wasm::kExprI64SConvertI32: |
| 804 op = m->ChangeInt32ToInt64(); | 786 op = m->ChangeInt32ToInt64(); |
| 805 break; | 787 break; |
| 806 // kExprI64UConvertI32: | |
| 807 case wasm::kExprI64UConvertI32: | 788 case wasm::kExprI64UConvertI32: |
| 808 op = m->ChangeUint32ToUint64(); | 789 op = m->ChangeUint32ToUint64(); |
| 809 break; | 790 break; |
| 810 // kExprF64ReinterpretI64: | |
| 811 case wasm::kExprF64ReinterpretI64: | 791 case wasm::kExprF64ReinterpretI64: |
| 812 op = m->BitcastInt64ToFloat64(); | 792 op = m->BitcastInt64ToFloat64(); |
| 813 break; | 793 break; |
| 814 // kExprI64ReinterpretF64: | |
| 815 case wasm::kExprI64ReinterpretF64: | 794 case wasm::kExprI64ReinterpretF64: |
| 816 op = m->BitcastFloat64ToInt64(); | 795 op = m->BitcastFloat64ToInt64(); |
| 817 break; | 796 break; |
| 818 // kExprI64Clz: | |
| 819 case wasm::kExprI64Clz: | 797 case wasm::kExprI64Clz: |
| 820 op = m->Word64Clz(); | 798 op = m->Word64Clz(); |
| 821 break; | 799 break; |
| 822 // kExprI64Ctz: | |
| 823 case wasm::kExprI64Ctz: { | 800 case wasm::kExprI64Ctz: { |
| 824 if (m->Word64Ctz().IsSupported()) { | 801 if (m->Word64Ctz().IsSupported()) { |
| 825 op = m->Word64Ctz().op(); | 802 op = m->Word64Ctz().op(); |
| 826 break; | 803 break; |
| 827 } else if (m->Is32() && m->Word32Ctz().IsSupported()) { | 804 } else if (m->Is32() && m->Word32Ctz().IsSupported()) { |
| 828 op = m->Word64CtzPlaceholder(); | 805 op = m->Word64CtzPlaceholder(); |
| 829 break; | 806 break; |
| 830 } else if (m->Word64ReverseBits().IsSupported()) { | 807 } else if (m->Word64ReverseBits().IsSupported()) { |
| 831 Node* reversed = graph()->NewNode(m->Word64ReverseBits().op(), input); | 808 Node* reversed = graph()->NewNode(m->Word64ReverseBits().op(), input); |
| 832 Node* result = graph()->NewNode(m->Word64Clz(), reversed); | 809 Node* result = graph()->NewNode(m->Word64Clz(), reversed); |
| 833 return result; | 810 return result; |
| 834 } else { | 811 } else { |
| 835 return BuildI64Ctz(input); | 812 return BuildI64Ctz(input); |
| 836 } | 813 } |
| 837 } | 814 } |
| 838 // kExprI64Popcnt: | |
| 839 case wasm::kExprI64Popcnt: { | 815 case wasm::kExprI64Popcnt: { |
| 840 if (m->Word64Popcnt().IsSupported()) { | 816 if (m->Word64Popcnt().IsSupported()) { |
| 841 op = m->Word64Popcnt().op(); | 817 op = m->Word64Popcnt().op(); |
| 842 } else if (m->Is32() && m->Word32Popcnt().IsSupported()) { | 818 } else if (m->Is32() && m->Word32Popcnt().IsSupported()) { |
| 843 op = m->Word64PopcntPlaceholder(); | 819 op = m->Word64PopcntPlaceholder(); |
| 844 } else { | 820 } else { |
| 845 return BuildI64Popcnt(input); | 821 return BuildI64Popcnt(input); |
| 846 } | 822 } |
| 847 break; | 823 break; |
| 848 } | 824 } |
| 849 // kExprF32SConvertI64: | |
| 850 case wasm::kExprI64Eqz: | 825 case wasm::kExprI64Eqz: |
| 851 op = m->Word64Equal(); | 826 op = m->Word64Equal(); |
| 852 return graph()->NewNode(op, input, jsgraph()->Int64Constant(0)); | 827 return graph()->NewNode(op, input, jsgraph()->Int64Constant(0)); |
| 853 case wasm::kExprF32SConvertI64: | 828 case wasm::kExprF32SConvertI64: |
| 854 if (m->Is32()) { | 829 if (m->Is32()) { |
| 855 return BuildF32SConvertI64(input); | 830 return BuildF32SConvertI64(input); |
| 856 } | 831 } |
| 857 op = m->RoundInt64ToFloat32(); | 832 op = m->RoundInt64ToFloat32(); |
| 858 break; | 833 break; |
| 859 // kExprF32UConvertI64: | |
| 860 case wasm::kExprF32UConvertI64: | 834 case wasm::kExprF32UConvertI64: |
| 861 if (m->Is32()) { | 835 if (m->Is32()) { |
| 862 return BuildF32UConvertI64(input); | 836 return BuildF32UConvertI64(input); |
| 863 } | 837 } |
| 864 op = m->RoundUint64ToFloat32(); | 838 op = m->RoundUint64ToFloat32(); |
| 865 break; | 839 break; |
| 866 // kExprF64SConvertI64: | |
| 867 case wasm::kExprF64SConvertI64: | 840 case wasm::kExprF64SConvertI64: |
| 868 if (m->Is32()) { | 841 if (m->Is32()) { |
| 869 return BuildF64SConvertI64(input); | 842 return BuildF64SConvertI64(input); |
| 870 } | 843 } |
| 871 op = m->RoundInt64ToFloat64(); | 844 op = m->RoundInt64ToFloat64(); |
| 872 break; | 845 break; |
| 873 // kExprF64UConvertI64: | |
| 874 case wasm::kExprF64UConvertI64: | 846 case wasm::kExprF64UConvertI64: |
| 875 if (m->Is32()) { | 847 if (m->Is32()) { |
| 876 return BuildF64UConvertI64(input); | 848 return BuildF64UConvertI64(input); |
| 877 } | 849 } |
| 878 op = m->RoundUint64ToFloat64(); | 850 op = m->RoundUint64ToFloat64(); |
| 879 break; | 851 break; |
| 880 // kExprI64SConvertF32: | |
| 881 case wasm::kExprI64SConvertF32: { | 852 case wasm::kExprI64SConvertF32: { |
| 882 return BuildI64SConvertF32(input, position); | 853 return BuildI64SConvertF32(input, position); |
| 883 } | 854 } |
| 884 // kExprI64SConvertF64: | |
| 885 case wasm::kExprI64SConvertF64: { | 855 case wasm::kExprI64SConvertF64: { |
| 886 return BuildI64SConvertF64(input, position); | 856 return BuildI64SConvertF64(input, position); |
| 887 } | 857 } |
| 888 // kExprI64UConvertF32: | |
| 889 case wasm::kExprI64UConvertF32: { | 858 case wasm::kExprI64UConvertF32: { |
| 890 return BuildI64UConvertF32(input, position); | 859 return BuildI64UConvertF32(input, position); |
| 891 } | 860 } |
| 892 // kExprI64UConvertF64: | |
| 893 case wasm::kExprI64UConvertF64: { | 861 case wasm::kExprI64UConvertF64: { |
| 894 return BuildI64UConvertF64(input, position); | 862 return BuildI64UConvertF64(input, position); |
| 895 } | 863 } |
| 896 default: | 864 default: |
| 897 op = UnsupportedOpcode(opcode); | 865 op = UnsupportedOpcode(opcode); |
| 898 } | 866 } |
| 899 return graph()->NewNode(op, input); | 867 return graph()->NewNode(op, input); |
| 900 } | 868 } |
| 901 | 869 |
| 902 | 870 |
| (...skipping 2200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3103 | 3071 |
| 3104 Handle<Code> FinishCompilation(WasmCompilationUnit* unit) { | 3072 Handle<Code> FinishCompilation(WasmCompilationUnit* unit) { |
| 3105 Handle<Code> result = unit->FinishCompilation(); | 3073 Handle<Code> result = unit->FinishCompilation(); |
| 3106 delete unit; | 3074 delete unit; |
| 3107 return result; | 3075 return result; |
| 3108 } | 3076 } |
| 3109 | 3077 |
| 3110 } // namespace compiler | 3078 } // namespace compiler |
| 3111 } // namespace internal | 3079 } // namespace internal |
| 3112 } // namespace v8 | 3080 } // namespace v8 |
| OLD | NEW |