OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 intptr_t temp = true_value; | 171 intptr_t temp = true_value; |
172 true_value = false_value; | 172 true_value = false_value; |
173 false_value = temp; | 173 false_value = temp; |
174 swapped = true; | 174 swapped = true; |
175 } | 175 } |
176 | 176 |
177 // Initialize result with the true value. | 177 // Initialize result with the true value. |
178 __ LoadImmediate(result, Smi::RawValue(true_value)); | 178 __ LoadImmediate(result, Smi::RawValue(true_value)); |
179 | 179 |
180 // Emit comparison code. This must not overwrite the result register. | 180 // Emit comparison code. This must not overwrite the result register. |
181 // IfThenElseInstr::Supports() should prevent EmitComparisonCode from using | |
182 // the labels or returning an invalid condition. | |
183 BranchLabels labels = {NULL, NULL, NULL}; // Emit branch-free code. | 181 BranchLabels labels = {NULL, NULL, NULL}; // Emit branch-free code. |
184 Condition true_condition = comparison()->EmitComparisonCode(compiler, labels); | 182 Condition true_condition = comparison()->EmitComparisonCode(compiler, labels); |
185 ASSERT(true_condition.IsValid()); | |
186 if (swapped) { | 183 if (swapped) { |
187 true_condition = NegateCondition(true_condition); | 184 true_condition = NegateCondition(true_condition); |
188 } | 185 } |
189 | 186 |
190 // Evaluate condition and provide result in CMPRES1. | 187 // Evaluate condition and provide result in CMPRES1. |
191 Register left = true_condition.left(); | 188 Register left = true_condition.left(); |
192 Register right = true_condition.right(); | 189 Register right = true_condition.right(); |
193 bool zero_is_false = true; // Zero in CMPRES1 indicates a false condition. | 190 bool zero_is_false = true; // Zero in CMPRES1 indicates a false condition. |
194 switch (true_condition.rel_op()) { | 191 switch (true_condition.rel_op()) { |
195 case AL: | 192 case AL: |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 return EmitSmiComparisonOp(compiler, *locs(), kind()); | 774 return EmitSmiComparisonOp(compiler, *locs(), kind()); |
778 } else if (operation_cid() == kMintCid) { | 775 } else if (operation_cid() == kMintCid) { |
779 return EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), labels); | 776 return EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), labels); |
780 } else { | 777 } else { |
781 ASSERT(operation_cid() == kDoubleCid); | 778 ASSERT(operation_cid() == kDoubleCid); |
782 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); | 779 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); |
783 } | 780 } |
784 } | 781 } |
785 | 782 |
786 | 783 |
787 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 784 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 785 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); |
| 786 __ Comment("EqualityCompareInstr"); |
| 787 |
788 Label is_true, is_false; | 788 Label is_true, is_false; |
789 BranchLabels labels = {&is_true, &is_false, &is_false}; | 789 BranchLabels labels = {&is_true, &is_false, &is_false}; |
790 Condition true_condition = EmitComparisonCode(compiler, labels); | 790 Condition true_condition = EmitComparisonCode(compiler, labels); |
791 if (true_condition.IsValid()) { | 791 EmitBranchOnCondition(compiler, true_condition, labels); |
792 EmitBranchOnCondition(compiler, true_condition, labels); | |
793 } | |
794 | 792 |
795 Register result = this->locs()->out(0).reg(); | 793 Register result = locs()->out(0).reg(); |
796 Label done; | 794 Label done; |
797 __ Bind(&is_false); | 795 __ Bind(&is_false); |
798 __ LoadObject(result, Bool::False()); | 796 __ LoadObject(result, Bool::False()); |
799 __ b(&done); | 797 __ b(&done); |
800 __ Bind(&is_true); | 798 __ Bind(&is_true); |
801 __ LoadObject(result, Bool::True()); | 799 __ LoadObject(result, Bool::True()); |
802 __ Bind(&done); | 800 __ Bind(&done); |
803 } | 801 } |
804 | 802 |
805 | 803 |
806 void ComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 804 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
807 BranchInstr* branch) { | 805 BranchInstr* branch) { |
| 806 __ Comment("EqualityCompareInstr::EmitBranchCode"); |
| 807 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); |
| 808 |
808 BranchLabels labels = compiler->CreateBranchLabels(branch); | 809 BranchLabels labels = compiler->CreateBranchLabels(branch); |
809 Condition true_condition = EmitComparisonCode(compiler, labels); | 810 Condition true_condition = EmitComparisonCode(compiler, labels); |
810 if (true_condition.IsValid()) { | 811 EmitBranchOnCondition(compiler, true_condition, labels); |
811 EmitBranchOnCondition(compiler, true_condition, labels); | |
812 } | |
813 } | 812 } |
814 | 813 |
815 | 814 |
816 LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const { | 815 LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const { |
817 const intptr_t kNumInputs = 2; | 816 const intptr_t kNumInputs = 2; |
818 const intptr_t kNumTemps = 0; | 817 const intptr_t kNumTemps = 0; |
819 LocationSummary* locs = new (zone) | 818 LocationSummary* locs = new (zone) |
820 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 819 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
821 locs->set_in(0, Location::RequiresRegister()); | 820 locs->set_in(0, Location::RequiresRegister()); |
822 // Only one input can be a constant operand. The case of two constant | 821 // Only one input can be a constant operand. The case of two constant |
(...skipping 11 matching lines...) Expand all Loading... |
834 ASSERT(right.constant().IsSmi()); | 833 ASSERT(right.constant().IsSmi()); |
835 const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw()); | 834 const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw()); |
836 __ AndImmediate(CMPRES1, left, imm); | 835 __ AndImmediate(CMPRES1, left, imm); |
837 } else { | 836 } else { |
838 __ and_(CMPRES1, left, right.reg()); | 837 __ and_(CMPRES1, left, right.reg()); |
839 } | 838 } |
840 return Condition(CMPRES1, ZR, (kind() == Token::kNE) ? NE : EQ); | 839 return Condition(CMPRES1, ZR, (kind() == Token::kNE) ? NE : EQ); |
841 } | 840 } |
842 | 841 |
843 | 842 |
| 843 void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 844 // Never emitted outside of the BranchInstr. |
| 845 UNREACHABLE(); |
| 846 } |
| 847 |
| 848 |
| 849 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 850 BranchInstr* branch) { |
| 851 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 852 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 853 EmitBranchOnCondition(compiler, true_condition, labels); |
| 854 } |
| 855 |
| 856 |
844 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone, | 857 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone, |
845 bool opt) const { | 858 bool opt) const { |
846 const intptr_t kNumInputs = 1; | 859 const intptr_t kNumInputs = 1; |
847 const intptr_t kNumTemps = 1; | 860 const intptr_t kNumTemps = 1; |
848 LocationSummary* locs = new (zone) | 861 LocationSummary* locs = new (zone) |
849 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 862 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
850 locs->set_in(0, Location::RequiresRegister()); | 863 locs->set_in(0, Location::RequiresRegister()); |
851 locs->set_temp(0, Location::RequiresRegister()); | 864 locs->set_temp(0, Location::RequiresRegister()); |
852 locs->set_out(0, Location::RequiresRegister()); | 865 locs->set_out(0, Location::RequiresRegister()); |
853 return locs; | 866 return locs; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 // If the cid is not in the list, jump to the opposite label from the cids | 899 // If the cid is not in the list, jump to the opposite label from the cids |
887 // that are in the list. These must be all the same (see asserts in the | 900 // that are in the list. These must be all the same (see asserts in the |
888 // constructor). | 901 // constructor). |
889 Label* target = result ? labels.false_label : labels.true_label; | 902 Label* target = result ? labels.false_label : labels.true_label; |
890 if (target != labels.fall_through) { | 903 if (target != labels.fall_through) { |
891 __ b(target); | 904 __ b(target); |
892 } | 905 } |
893 } else { | 906 } else { |
894 __ b(deopt); | 907 __ b(deopt); |
895 } | 908 } |
896 // Dummy result as this method already did the jump, there's no need | 909 // Dummy result as the last instruction is a jump or fall through. |
897 // for the caller to branch on a condition. | 910 return Condition(CMPRES1, ZR, AL); |
898 return Condition(ZR, ZR, INVALID_RELATION); | |
899 } | 911 } |
900 | 912 |
901 | 913 |
| 914 void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 915 BranchInstr* branch) { |
| 916 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 917 EmitComparisonCode(compiler, labels); |
| 918 } |
| 919 |
| 920 |
| 921 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 922 Register result_reg = locs()->out(0).reg(); |
| 923 Label is_true, is_false, done; |
| 924 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 925 EmitComparisonCode(compiler, labels); |
| 926 __ Bind(&is_false); |
| 927 __ LoadObject(result_reg, Bool::False()); |
| 928 __ b(&done); |
| 929 __ Bind(&is_true); |
| 930 __ LoadObject(result_reg, Bool::True()); |
| 931 __ Bind(&done); |
| 932 } |
| 933 |
| 934 |
902 LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone, | 935 LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone, |
903 bool opt) const { | 936 bool opt) const { |
904 const intptr_t kNumInputs = 2; | 937 const intptr_t kNumInputs = 2; |
905 const intptr_t kNumTemps = 0; | 938 const intptr_t kNumTemps = 0; |
906 if (operation_cid() == kMintCid) { | 939 if (operation_cid() == kMintCid) { |
907 const intptr_t kNumTemps = 0; | 940 const intptr_t kNumTemps = 0; |
908 LocationSummary* locs = new (zone) | 941 LocationSummary* locs = new (zone) |
909 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 942 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
910 locs->set_in(0, Location::Pair(Location::RequiresRegister(), | 943 locs->set_in(0, Location::Pair(Location::RequiresRegister(), |
911 Location::RequiresRegister())); | 944 Location::RequiresRegister())); |
(...skipping 30 matching lines...) Expand all Loading... |
942 return EmitSmiComparisonOp(compiler, *locs(), kind()); | 975 return EmitSmiComparisonOp(compiler, *locs(), kind()); |
943 } else if (operation_cid() == kMintCid) { | 976 } else if (operation_cid() == kMintCid) { |
944 return EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), labels); | 977 return EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), labels); |
945 } else { | 978 } else { |
946 ASSERT(operation_cid() == kDoubleCid); | 979 ASSERT(operation_cid() == kDoubleCid); |
947 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); | 980 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); |
948 } | 981 } |
949 } | 982 } |
950 | 983 |
951 | 984 |
| 985 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 986 __ Comment("RelationalOpInstr"); |
| 987 |
| 988 Label is_true, is_false; |
| 989 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 990 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 991 EmitBranchOnCondition(compiler, true_condition, labels); |
| 992 |
| 993 Register result = locs()->out(0).reg(); |
| 994 Label done; |
| 995 __ Bind(&is_false); |
| 996 __ LoadObject(result, Bool::False()); |
| 997 __ b(&done); |
| 998 __ Bind(&is_true); |
| 999 __ LoadObject(result, Bool::True()); |
| 1000 __ Bind(&done); |
| 1001 } |
| 1002 |
| 1003 |
| 1004 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 1005 BranchInstr* branch) { |
| 1006 __ Comment("RelationalOpInstr"); |
| 1007 |
| 1008 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 1009 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 1010 EmitBranchOnCondition(compiler, true_condition, labels); |
| 1011 } |
| 1012 |
| 1013 |
952 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone, | 1014 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone, |
953 bool opt) const { | 1015 bool opt) const { |
954 return MakeCallSummary(zone); | 1016 return MakeCallSummary(zone); |
955 } | 1017 } |
956 | 1018 |
957 | 1019 |
958 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1020 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
959 SetupNative(); | 1021 SetupNative(); |
960 __ Comment("NativeCallInstr"); | 1022 __ Comment("NativeCallInstr"); |
961 Register result = locs()->out(0).reg(); | 1023 Register result = locs()->out(0).reg(); |
(...skipping 2216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3178 | 3240 |
3179 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 3241 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
3180 BranchInstr* branch) { | 3242 BranchInstr* branch) { |
3181 BranchLabels labels = compiler->CreateBranchLabels(branch); | 3243 BranchLabels labels = compiler->CreateBranchLabels(branch); |
3182 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( | 3244 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( |
3183 this, compiler->CurrentTryIndex(), labels, | 3245 this, compiler->CurrentTryIndex(), labels, |
3184 /* merged = */ true); | 3246 /* merged = */ true); |
3185 compiler->AddSlowPathCode(slow_path); | 3247 compiler->AddSlowPathCode(slow_path); |
3186 EMIT_SMI_CHECK; | 3248 EMIT_SMI_CHECK; |
3187 Condition true_condition = EmitComparisonCode(compiler, labels); | 3249 Condition true_condition = EmitComparisonCode(compiler, labels); |
3188 ASSERT(true_condition.IsValid()); | |
3189 EmitBranchOnCondition(compiler, true_condition, labels); | 3250 EmitBranchOnCondition(compiler, true_condition, labels); |
3190 __ Bind(slow_path->exit_label()); | 3251 __ Bind(slow_path->exit_label()); |
3191 } | 3252 } |
3192 | 3253 |
3193 | 3254 |
3194 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3255 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3195 Label true_label, false_label, done; | 3256 Label true_label, false_label, done; |
3196 BranchLabels labels = {&true_label, &false_label, &false_label}; | 3257 BranchLabels labels = {&true_label, &false_label, &false_label}; |
3197 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( | 3258 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( |
3198 this, compiler->CurrentTryIndex(), labels, | 3259 this, compiler->CurrentTryIndex(), labels, |
3199 /* merged = */ false); | 3260 /* merged = */ false); |
3200 compiler->AddSlowPathCode(slow_path); | 3261 compiler->AddSlowPathCode(slow_path); |
3201 EMIT_SMI_CHECK; | 3262 EMIT_SMI_CHECK; |
3202 Condition true_condition = EmitComparisonCode(compiler, labels); | 3263 Condition true_condition = EmitComparisonCode(compiler, labels); |
3203 ASSERT(true_condition.IsValid()); | |
3204 EmitBranchOnCondition(compiler, true_condition, labels); | 3264 EmitBranchOnCondition(compiler, true_condition, labels); |
3205 Register result = locs()->out(0).reg(); | 3265 Register result = locs()->out(0).reg(); |
3206 __ Bind(&false_label); | 3266 __ Bind(&false_label); |
3207 __ LoadObject(result, Bool::False()); | 3267 __ LoadObject(result, Bool::False()); |
3208 __ b(&done); | 3268 __ b(&done); |
3209 __ Bind(&true_label); | 3269 __ Bind(&true_label); |
3210 __ LoadObject(result, Bool::True()); | 3270 __ LoadObject(result, Bool::True()); |
3211 __ Bind(&done); | 3271 __ Bind(&done); |
3212 __ Bind(slow_path->exit_label()); | 3272 __ Bind(slow_path->exit_label()); |
3213 } | 3273 } |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3908 __ bc1t(labels.true_label); | 3968 __ bc1t(labels.true_label); |
3909 } | 3969 } |
3910 } else { | 3970 } else { |
3911 if (is_negated) { | 3971 if (is_negated) { |
3912 __ bc1t(labels.false_label); | 3972 __ bc1t(labels.false_label); |
3913 } else { | 3973 } else { |
3914 __ bc1f(labels.false_label); | 3974 __ bc1f(labels.false_label); |
3915 } | 3975 } |
3916 __ b(labels.true_label); | 3976 __ b(labels.true_label); |
3917 } | 3977 } |
3918 return Condition(ZR, ZR, INVALID_RELATION); // Unused. | 3978 return Condition(); // Unused. |
3919 } else { | 3979 } else { |
3920 ASSERT(op_kind() == MethodRecognizer::kDouble_getIsInfinite); | 3980 ASSERT(op_kind() == MethodRecognizer::kDouble_getIsInfinite); |
3921 __ mfc1(CMPRES1, EvenFRegisterOf(value)); | 3981 __ mfc1(CMPRES1, EvenFRegisterOf(value)); |
3922 // If the low word isn't zero, then it isn't infinity. | 3982 // If the low word isn't zero, then it isn't infinity. |
3923 __ bne(CMPRES1, ZR, is_negated ? labels.true_label : labels.false_label); | 3983 __ bne(CMPRES1, ZR, is_negated ? labels.true_label : labels.false_label); |
3924 __ mfc1(CMPRES1, OddFRegisterOf(value)); | 3984 __ mfc1(CMPRES1, OddFRegisterOf(value)); |
3925 // Mask off the sign bit. | 3985 // Mask off the sign bit. |
3926 __ AndImmediate(CMPRES1, CMPRES1, 0x7FFFFFFF); | 3986 __ AndImmediate(CMPRES1, CMPRES1, 0x7FFFFFFF); |
3927 // Compare with +infinity. | 3987 // Compare with +infinity. |
3928 __ LoadImmediate(CMPRES2, 0x7FF00000); | 3988 __ LoadImmediate(CMPRES2, 0x7FF00000); |
3929 return Condition(CMPRES1, CMPRES2, is_negated ? NE : EQ); | 3989 return Condition(CMPRES1, CMPRES2, is_negated ? NE : EQ); |
3930 } | 3990 } |
3931 } | 3991 } |
3932 | 3992 |
| 3993 void DoubleTestOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 3994 BranchInstr* branch) { |
| 3995 ASSERT(compiler->is_optimizing()); |
| 3996 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 3997 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 3998 // Branches for isNaN are emitted in EmitComparisonCode already. |
| 3999 if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) { |
| 4000 EmitBranchOnCondition(compiler, true_condition, labels); |
| 4001 } |
| 4002 } |
| 4003 |
| 4004 |
| 4005 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 4006 Label is_true, is_false; |
| 4007 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 4008 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 4009 // Branches for isNaN are emitted in EmitComparisonCode already. |
| 4010 if (op_kind() == MethodRecognizer::kDouble_getIsInfinite) { |
| 4011 EmitBranchOnCondition(compiler, true_condition, labels); |
| 4012 } |
| 4013 const Register result = locs()->out(0).reg(); |
| 4014 Label done; |
| 4015 __ Comment("return bool"); |
| 4016 __ Bind(&is_false); |
| 4017 __ LoadObject(result, Bool::False()); |
| 4018 __ b(&done); |
| 4019 __ Bind(&is_true); |
| 4020 __ LoadObject(result, Bool::True()); |
| 4021 __ Bind(&done); |
| 4022 } |
| 4023 |
| 4024 |
3933 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone, | 4025 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone, |
3934 bool opt) const { | 4026 bool opt) const { |
3935 UNIMPLEMENTED(); | 4027 UNIMPLEMENTED(); |
3936 return NULL; | 4028 return NULL; |
3937 } | 4029 } |
3938 | 4030 |
3939 | 4031 |
3940 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4032 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3941 UNIMPLEMENTED(); | 4033 UNIMPLEMENTED(); |
3942 } | 4034 } |
(...skipping 1944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5887 left.reg(), right.reg(), needs_number_check(), token_pos(), deopt_id_); | 5979 left.reg(), right.reg(), needs_number_check(), token_pos(), deopt_id_); |
5888 } | 5980 } |
5889 if (kind() != Token::kEQ_STRICT) { | 5981 if (kind() != Token::kEQ_STRICT) { |
5890 ASSERT(kind() == Token::kNE_STRICT); | 5982 ASSERT(kind() == Token::kNE_STRICT); |
5891 true_condition = NegateCondition(true_condition); | 5983 true_condition = NegateCondition(true_condition); |
5892 } | 5984 } |
5893 return true_condition; | 5985 return true_condition; |
5894 } | 5986 } |
5895 | 5987 |
5896 | 5988 |
| 5989 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 5990 __ Comment("StrictCompareInstr"); |
| 5991 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| 5992 |
| 5993 Label is_true, is_false; |
| 5994 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 5995 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 5996 EmitBranchOnCondition(compiler, true_condition, labels); |
| 5997 |
| 5998 Register result = locs()->out(0).reg(); |
| 5999 Label done; |
| 6000 __ Bind(&is_false); |
| 6001 __ LoadObject(result, Bool::False()); |
| 6002 __ b(&done); |
| 6003 __ Bind(&is_true); |
| 6004 __ LoadObject(result, Bool::True()); |
| 6005 __ Bind(&done); |
| 6006 } |
| 6007 |
| 6008 |
| 6009 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 6010 BranchInstr* branch) { |
| 6011 __ Comment("StrictCompareInstr::EmitBranchCode"); |
| 6012 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| 6013 |
| 6014 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 6015 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 6016 EmitBranchOnCondition(compiler, true_condition, labels); |
| 6017 } |
| 6018 |
| 6019 |
5897 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone, | 6020 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone, |
5898 bool opt) const { | 6021 bool opt) const { |
5899 return LocationSummary::Make(zone, 1, Location::RequiresRegister(), | 6022 return LocationSummary::Make(zone, 1, Location::RequiresRegister(), |
5900 LocationSummary::kNoCall); | 6023 LocationSummary::kNoCall); |
5901 } | 6024 } |
5902 | 6025 |
5903 | 6026 |
5904 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6027 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5905 Register value = locs()->in(0).reg(); | 6028 Register value = locs()->in(0).reg(); |
5906 Register result = locs()->out(0).reg(); | 6029 Register result = locs()->out(0).reg(); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5961 compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(), | 6084 compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(), |
5962 kGrowRegExpStackRuntimeEntry, 1, locs()); | 6085 kGrowRegExpStackRuntimeEntry, 1, locs()); |
5963 __ lw(result, Address(SP, 1 * kWordSize)); | 6086 __ lw(result, Address(SP, 1 * kWordSize)); |
5964 __ addiu(SP, SP, Immediate(2 * kWordSize)); | 6087 __ addiu(SP, SP, Immediate(2 * kWordSize)); |
5965 } | 6088 } |
5966 | 6089 |
5967 | 6090 |
5968 } // namespace dart | 6091 } // namespace dart |
5969 | 6092 |
5970 #endif // defined TARGET_ARCH_MIPS | 6093 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |