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 |