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

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

Issue 850653002: [turbofan] Improve code generation for unordered comparisons. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 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 6
7 #include "src/arm64/macro-assembler-arm64.h" 7 #include "src/arm64/macro-assembler-arm64.h"
8 #include "src/compiler/code-generator-impl.h" 8 #include "src/compiler/code-generator-impl.h"
9 #include "src/compiler/gap-resolver.h" 9 #include "src/compiler/gap-resolver.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 public: 209 public:
210 OutOfLineLoadZero(CodeGenerator* gen, Register result) 210 OutOfLineLoadZero(CodeGenerator* gen, Register result)
211 : OutOfLineCode(gen), result_(result) {} 211 : OutOfLineCode(gen), result_(result) {}
212 212
213 void Generate() FINAL { __ Mov(result_, 0); } 213 void Generate() FINAL { __ Mov(result_, 0); }
214 214
215 private: 215 private:
216 Register const result_; 216 Register const result_;
217 }; 217 };
218 218
219
220 Condition FlagsConditionToCondition(FlagsCondition condition) {
221 switch (condition) {
222 case kEqual:
223 return eq;
224 case kNotEqual:
225 return ne;
226 case kSignedLessThan:
227 return lt;
228 case kSignedGreaterThanOrEqual:
229 return ge;
230 case kSignedLessThanOrEqual:
231 return le;
232 case kSignedGreaterThan:
233 return gt;
234 case kUnsignedLessThan:
235 return lo;
236 case kUnsignedGreaterThanOrEqual:
237 return hs;
238 case kUnsignedLessThanOrEqual:
239 return ls;
240 case kUnsignedGreaterThan:
241 return hi;
242 case kOverflow:
243 return vs;
244 case kNotOverflow:
245 return vc;
246 case kUnorderedEqual:
247 case kUnorderedNotEqual:
248 break;
249 }
250 UNREACHABLE();
251 return nv;
252 }
253
219 } // namespace 254 } // namespace
220 255
221 256
222 #define ASSEMBLE_CHECKED_LOAD_FLOAT(width) \ 257 #define ASSEMBLE_CHECKED_LOAD_FLOAT(width) \
223 do { \ 258 do { \
224 auto result = i.OutputFloat##width##Register(); \ 259 auto result = i.OutputFloat##width##Register(); \
225 auto buffer = i.InputRegister(0); \ 260 auto buffer = i.InputRegister(0); \
226 auto offset = i.InputRegister32(1); \ 261 auto offset = i.InputRegister32(1); \
227 auto length = i.InputOperand32(2); \ 262 auto length = i.InputOperand32(2); \
228 __ Cmp(offset, length); \ 263 __ Cmp(offset, length); \
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 case kEqual: 814 case kEqual:
780 __ Tbz(i.InputRegister64(0), i.InputInt6(1), tlabel); 815 __ Tbz(i.InputRegister64(0), i.InputInt6(1), tlabel);
781 break; 816 break;
782 case kNotEqual: 817 case kNotEqual:
783 __ Tbnz(i.InputRegister64(0), i.InputInt6(1), tlabel); 818 __ Tbnz(i.InputRegister64(0), i.InputInt6(1), tlabel);
784 break; 819 break;
785 default: 820 default:
786 UNREACHABLE(); 821 UNREACHABLE();
787 } 822 }
788 } else { 823 } else {
789 switch (condition) { 824 Condition cc = FlagsConditionToCondition(condition);
790 case kUnorderedEqual: 825 __ B(cc, tlabel);
791 // The "eq" condition will not catch the unordered case.
792 // The jump/fall through to false label will be used if the comparison
793 // was unordered.
794 case kEqual:
795 __ B(eq, tlabel);
796 break;
797 case kUnorderedNotEqual:
798 // Unordered or not equal can be tested with "ne" condtion.
799 // See ARMv8 manual C1.2.3 - Condition Code.
800 case kNotEqual:
801 __ B(ne, tlabel);
802 break;
803 case kSignedLessThan:
804 __ B(lt, tlabel);
805 break;
806 case kSignedGreaterThanOrEqual:
807 __ B(ge, tlabel);
808 break;
809 case kSignedLessThanOrEqual:
810 __ B(le, tlabel);
811 break;
812 case kSignedGreaterThan:
813 __ B(gt, tlabel);
814 break;
815 case kUnorderedLessThan:
816 // The "lo" condition will not catch the unordered case.
817 // The jump/fall through to false label will be used if the comparison
818 // was unordered.
819 case kUnsignedLessThan:
820 __ B(lo, tlabel);
821 break;
822 case kUnorderedGreaterThanOrEqual:
823 // Unordered, greater than or equal can be tested with "hs" condtion.
824 // See ARMv8 manual C1.2.3 - Condition Code.
825 case kUnsignedGreaterThanOrEqual:
826 __ B(hs, tlabel);
827 break;
828 case kUnorderedLessThanOrEqual:
829 // The "ls" condition will not catch the unordered case.
830 // The jump/fall through to false label will be used if the comparison
831 // was unordered.
832 case kUnsignedLessThanOrEqual:
833 __ B(ls, tlabel);
834 break;
835 case kUnorderedGreaterThan:
836 // Unordered or greater than can be tested with "hi" condtion.
837 // See ARMv8 manual C1.2.3 - Condition Code.
838 case kUnsignedGreaterThan:
839 __ B(hi, tlabel);
840 break;
841 case kOverflow:
842 __ B(vs, tlabel);
843 break;
844 case kNotOverflow:
845 __ B(vc, tlabel);
846 break;
847 }
848 } 826 }
849 if (!branch->fallthru) __ B(flabel); // no fallthru to flabel. 827 if (!branch->fallthru) __ B(flabel); // no fallthru to flabel.
850 } 828 }
851 829
852 830
853 void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) { 831 void CodeGenerator::AssembleArchJump(BasicBlock::RpoNumber target) {
854 if (!IsNextInAssemblyOrder(target)) __ B(GetLabel(target)); 832 if (!IsNextInAssemblyOrder(target)) __ B(GetLabel(target));
855 } 833 }
856 834
857 835
858 // Assemble boolean materializations after this instruction. 836 // Assemble boolean materializations after this instruction.
859 void CodeGenerator::AssembleArchBoolean(Instruction* instr, 837 void CodeGenerator::AssembleArchBoolean(Instruction* instr,
860 FlagsCondition condition) { 838 FlagsCondition condition) {
861 Arm64OperandConverter i(this, instr); 839 Arm64OperandConverter i(this, instr);
862 Label done;
863 840
864 // Materialize a full 64-bit 1 or 0 value. The result register is always the 841 // Materialize a full 64-bit 1 or 0 value. The result register is always the
865 // last output of the instruction. 842 // last output of the instruction.
866 Label check;
867 DCHECK_NE(0, instr->OutputCount()); 843 DCHECK_NE(0, instr->OutputCount());
868 Register reg = i.OutputRegister(instr->OutputCount() - 1); 844 Register reg = i.OutputRegister(instr->OutputCount() - 1);
869 Condition cc = nv; 845 Condition cc = FlagsConditionToCondition(condition);
870 switch (condition) {
871 case kUnorderedEqual:
872 __ B(vc, &check);
873 __ Mov(reg, 0);
874 __ B(&done);
875 // Fall through.
876 case kEqual:
877 cc = eq;
878 break;
879 case kUnorderedNotEqual:
880 __ B(vc, &check);
881 __ Mov(reg, 1);
882 __ B(&done);
883 // Fall through.
884 case kNotEqual:
885 cc = ne;
886 break;
887 case kSignedLessThan:
888 cc = lt;
889 break;
890 case kSignedGreaterThanOrEqual:
891 cc = ge;
892 break;
893 case kSignedLessThanOrEqual:
894 cc = le;
895 break;
896 case kSignedGreaterThan:
897 cc = gt;
898 break;
899 case kUnorderedLessThan:
900 __ B(vc, &check);
901 __ Mov(reg, 0);
902 __ B(&done);
903 // Fall through.
904 case kUnsignedLessThan:
905 cc = lo;
906 break;
907 case kUnorderedGreaterThanOrEqual:
908 __ B(vc, &check);
909 __ Mov(reg, 1);
910 __ B(&done);
911 // Fall through.
912 case kUnsignedGreaterThanOrEqual:
913 cc = hs;
914 break;
915 case kUnorderedLessThanOrEqual:
916 __ B(vc, &check);
917 __ Mov(reg, 0);
918 __ B(&done);
919 // Fall through.
920 case kUnsignedLessThanOrEqual:
921 cc = ls;
922 break;
923 case kUnorderedGreaterThan:
924 __ B(vc, &check);
925 __ Mov(reg, 1);
926 __ B(&done);
927 // Fall through.
928 case kUnsignedGreaterThan:
929 cc = hi;
930 break;
931 case kOverflow:
932 cc = vs;
933 break;
934 case kNotOverflow:
935 cc = vc;
936 break;
937 }
938 __ Bind(&check);
939 __ Cset(reg, cc); 846 __ Cset(reg, cc);
940 __ Bind(&done);
941 } 847 }
942 848
943 849
944 void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { 850 void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) {
945 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( 851 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry(
946 isolate(), deoptimization_id, Deoptimizer::LAZY); 852 isolate(), deoptimization_id, Deoptimizer::LAZY);
947 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); 853 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY);
948 } 854 }
949 855
950 856
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 } 1104 }
1199 } 1105 }
1200 MarkLazyDeoptSite(); 1106 MarkLazyDeoptSite();
1201 } 1107 }
1202 1108
1203 #undef __ 1109 #undef __
1204 1110
1205 } // namespace compiler 1111 } // namespace compiler
1206 } // namespace internal 1112 } // namespace internal
1207 } // namespace v8 1113 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm/instruction-selector-arm.cc ('k') | src/compiler/arm64/instruction-selector-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698