Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/compiler/wasm-compiler.cc

Issue 1941323002: [wasm] Mark all 64-bit instructions as supported on 32-bit platforms. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698