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

Side by Side Diff: src/compiler/mips64/code-generator-mips64.cc

Issue 1047213002: Finish 'MIPS: [turbofan] Add backend support for float32 operations.' (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix #1 Created 5 years, 8 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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 #include "src/compiler/code-generator-impl.h" 6 #include "src/compiler/code-generator-impl.h"
7 #include "src/compiler/gap-resolver.h" 7 #include "src/compiler/gap-resolver.h"
8 #include "src/compiler/node-matchers.h" 8 #include "src/compiler/node-matchers.h"
9 #include "src/mips/macro-assembler-mips.h" 9 #include "src/mips/macro-assembler-mips.h"
10 #include "src/scopes.h" 10 #include "src/scopes.h"
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 break; 848 break;
849 } 849 }
850 } 850 }
851 851
852 852
853 #define UNSUPPORTED_COND(opcode, condition) \ 853 #define UNSUPPORTED_COND(opcode, condition) \
854 OFStream out(stdout); \ 854 OFStream out(stdout); \
855 out << "Unsupported " << #opcode << " condition: \"" << condition << "\""; \ 855 out << "Unsupported " << #opcode << " condition: \"" << condition << "\""; \
856 UNIMPLEMENTED(); 856 UNIMPLEMENTED();
857 857
858 static bool convertCondition(FlagsCondition condition, Condition& cc,
859 bool& acceptNaN) {
860 acceptNaN = false;
861 switch (condition) {
862 case kEqual:
863 cc = eq;
864 return true;
865 case kNotEqual:
866 cc = ne;
867 acceptNaN = true;
868 return true;
869 case kUnsignedLessThan:
870 cc = lt;
871 return true;
872 case kUnsignedGreaterThanOrEqual:
873 cc = ge;
874 acceptNaN = true;
875 return true;
876 case kUnsignedLessThanOrEqual:
877 cc = le;
878 return true;
879 case kUnsignedGreaterThan:
880 cc = gt;
881 acceptNaN = true;
882 return true;
883 default:
884 break;
885 }
886 return false;
887 }
888
889
858 // Assembles branches after an instruction. 890 // Assembles branches after an instruction.
859 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { 891 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
860 MipsOperandConverter i(this, instr); 892 MipsOperandConverter i(this, instr);
861 Label* tlabel = branch->true_label; 893 Label* tlabel = branch->true_label;
862 Label* flabel = branch->false_label; 894 Label* flabel = branch->false_label;
863 Condition cc = kNoCondition; 895 Condition cc = kNoCondition;
864 896
865 // MIPS does not have condition code flags, so compare and branch are 897 // MIPS does not have condition code flags, so compare and branch are
866 // implemented differently than on the other arch's. The compare operations 898 // implemented differently than on the other arch's. The compare operations
867 // emit mips psuedo-instructions, which are handled here by branch 899 // emit mips psuedo-instructions, which are handled here by branch
(...skipping 13 matching lines...) Expand all
881 __ sra(at, i.OutputRegister(), 31); 913 __ sra(at, i.OutputRegister(), 31);
882 __ Branch(tlabel, cc, at, Operand(kScratchReg)); 914 __ Branch(tlabel, cc, at, Operand(kScratchReg));
883 } else if (instr->arch_opcode() == kMips64Cmp) { 915 } else if (instr->arch_opcode() == kMips64Cmp) {
884 cc = FlagsConditionToConditionCmp(branch->condition); 916 cc = FlagsConditionToConditionCmp(branch->condition);
885 __ Branch(tlabel, cc, i.InputRegister(0), i.InputOperand(1)); 917 __ Branch(tlabel, cc, i.InputRegister(0), i.InputOperand(1));
886 918
887 if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. 919 if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel.
888 } else if (instr->arch_opcode() == kMips64CmpS) { 920 } else if (instr->arch_opcode() == kMips64CmpS) {
889 // TODO(dusmil) optimize unordered checks to use fewer instructions 921 // TODO(dusmil) optimize unordered checks to use fewer instructions
890 // even if we have to unfold BranchF macro. 922 // even if we have to unfold BranchF macro.
891 Label* nan = flabel; 923 bool acceptNaN = false;
892 switch (branch->condition) { 924 if (!convertCondition(branch->condition, cc, acceptNaN)) {
893 case kEqual: 925 UNSUPPORTED_COND(kMips64CmpS, branch->condition);
894 cc = eq;
895 break;
896 case kNotEqual:
897 cc = ne;
898 nan = tlabel;
899 break;
900 case kUnsignedLessThan:
901 cc = lt;
902 break;
903 case kUnsignedGreaterThanOrEqual:
904 cc = ge;
905 nan = tlabel;
906 break;
907 case kUnsignedLessThanOrEqual:
908 cc = le;
909 break;
910 case kUnsignedGreaterThan:
911 cc = gt;
912 nan = tlabel;
913 break;
914 default:
915 UNSUPPORTED_COND(kMips64CmpS, branch->condition);
916 break;
917 } 926 }
918 __ BranchFS(tlabel, nan, cc, i.InputDoubleRegister(0), 927 Label* nan = acceptNaN ? tlabel : flabel;
919 i.InputDoubleRegister(1)); 928 __ BranchFS(tlabel, nan, cc, i.InputSingleRegister(0),
929 i.InputSingleRegister(1));
920 930
921 if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. 931 if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel.
922 932
923 } else if (instr->arch_opcode() == kMips64CmpD) { 933 } else if (instr->arch_opcode() == kMips64CmpD) {
924 // TODO(dusmil) optimize unordered checks to use less instructions 934 // TODO(dusmil) optimize unordered checks to use less instructions
925 // even if we have to unfold BranchF macro. 935 // even if we have to unfold BranchF macro.
926 Label* nan = flabel; 936 bool acceptNaN = false;
927 switch (branch->condition) { 937 if (!convertCondition(branch->condition, cc, acceptNaN)) {
928 case kEqual: 938 UNSUPPORTED_COND(kMips64CmpD, branch->condition);
929 cc = eq;
930 break;
931 case kNotEqual:
932 cc = ne;
933 nan = tlabel;
934 break;
935 case kUnsignedLessThan:
936 cc = lt;
937 break;
938 case kUnsignedGreaterThanOrEqual:
939 cc = ge;
940 nan = tlabel;
941 break;
942 case kUnsignedLessThanOrEqual:
943 cc = le;
944 break;
945 case kUnsignedGreaterThan:
946 cc = gt;
947 nan = tlabel;
948 break;
949 default:
950 UNSUPPORTED_COND(kMips64CmpD, branch->condition);
951 break;
952 } 939 }
940 Label* nan = acceptNaN ? tlabel : flabel;
953 __ BranchF(tlabel, nan, cc, i.InputDoubleRegister(0), 941 __ BranchF(tlabel, nan, cc, i.InputDoubleRegister(0),
954 i.InputDoubleRegister(1)); 942 i.InputDoubleRegister(1));
955 943
956 if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. 944 if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel.
957 } else { 945 } else {
958 PrintF("AssembleArchBranch Unimplemented arch_opcode: %d\n", 946 PrintF("AssembleArchBranch Unimplemented arch_opcode: %d\n",
959 instr->arch_opcode()); 947 instr->arch_opcode());
960 UNIMPLEMENTED(); 948 UNIMPLEMENTED();
961 } 949 }
962 } 950 }
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 } 1350 }
1363 } 1351 }
1364 MarkLazyDeoptSite(); 1352 MarkLazyDeoptSite();
1365 } 1353 }
1366 1354
1367 #undef __ 1355 #undef __
1368 1356
1369 } // namespace compiler 1357 } // namespace compiler
1370 } // namespace internal 1358 } // namespace internal
1371 } // namespace v8 1359 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698