| 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_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 bool IfThenElseInstr::IsSupported() { | 158 bool IfThenElseInstr::IsSupported() { |
| 159 return true; | 159 return true; |
| 160 } | 160 } |
| 161 | 161 |
| 162 | 162 |
| 163 bool IfThenElseInstr::Supports(ComparisonInstr* comparison, | 163 bool IfThenElseInstr::Supports(ComparisonInstr* comparison, |
| 164 Value* v1, | 164 Value* v1, |
| 165 Value* v2) { | 165 Value* v2) { |
| 166 if (!(comparison->IsStrictCompare() && | 166 if (!(comparison->IsStrictCompare() && |
| 167 !comparison->AsStrictCompare()->needs_number_check()) && | 167 !comparison->AsStrictCompare()->needs_number_check()) && |
| 168 !(comparison->IsEqualityCompare() && | 168 !comparison->IsSmiEquality()) { |
| 169 (comparison->AsEqualityCompare()->receiver_class_id() == kSmiCid))) { | |
| 170 return false; | 169 return false; |
| 171 } | 170 } |
| 172 | 171 |
| 173 intptr_t v1_value, v2_value; | 172 intptr_t v1_value, v2_value; |
| 174 | 173 |
| 175 if (!BindsToSmiConstant(v1, &v1_value) || | 174 if (!BindsToSmiConstant(v1, &v1_value) || |
| 176 !BindsToSmiConstant(v2, &v2_value)) { | 175 !BindsToSmiConstant(v2, &v2_value)) { |
| 177 return false; | 176 return false; |
| 178 } | 177 } |
| 179 | 178 |
| (...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 *ic_data()); | 910 *ic_data()); |
| 912 if (branch->is_checked()) { | 911 if (branch->is_checked()) { |
| 913 EmitAssertBoolean(RAX, token_pos(), deopt_id(), locs(), compiler); | 912 EmitAssertBoolean(RAX, token_pos(), deopt_id(), locs(), compiler); |
| 914 } | 913 } |
| 915 Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL; | 914 Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL; |
| 916 __ CompareObject(RAX, Bool::True()); | 915 __ CompareObject(RAX, Bool::True()); |
| 917 branch->EmitBranchOnCondition(compiler, branch_condition); | 916 branch->EmitBranchOnCondition(compiler, branch_condition); |
| 918 } | 917 } |
| 919 | 918 |
| 920 | 919 |
| 920 LocationSummary* TestSmiInstr::MakeLocationSummary() const { |
| 921 const intptr_t kNumInputs = 2; |
| 922 const intptr_t kNumTemps = 0; |
| 923 LocationSummary* locs = |
| 924 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 925 locs->set_in(0, Location::RequiresRegister()); |
| 926 // Only one input can be a constant operand. The case of two constant |
| 927 // operands should be handled by constant propagation. |
| 928 locs->set_in(1, Location::RegisterOrConstant(right())); |
| 929 return locs; |
| 930 } |
| 931 |
| 932 |
| 933 void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 934 // Never emitted outside of the BranchInstr. |
| 935 UNREACHABLE(); |
| 936 } |
| 937 |
| 938 |
| 939 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 940 BranchInstr* branch) { |
| 941 Condition branch_condition = (kind() == Token::kNE) ? NOT_ZERO : ZERO; |
| 942 Location right = locs()->in(1); |
| 943 if (right.IsConstant()) { |
| 944 ASSERT(right.constant().IsSmi()); |
| 945 const int64_t imm = |
| 946 reinterpret_cast<int64_t>(right.constant().raw()); |
| 947 __ testq(locs()->in(0).reg(), Immediate(imm)); |
| 948 } else { |
| 949 __ testq(locs()->in(0).reg(), right.reg()); |
| 950 } |
| 951 branch->EmitBranchOnCondition(compiler, branch_condition); |
| 952 } |
| 953 |
| 954 |
| 921 LocationSummary* RelationalOpInstr::MakeLocationSummary() const { | 955 LocationSummary* RelationalOpInstr::MakeLocationSummary() const { |
| 922 const intptr_t kNumInputs = 2; | 956 const intptr_t kNumInputs = 2; |
| 923 const intptr_t kNumTemps = 0; | 957 const intptr_t kNumTemps = 0; |
| 924 if (operands_class_id() == kDoubleCid) { | 958 if (operands_class_id() == kDoubleCid) { |
| 925 LocationSummary* summary = | 959 LocationSummary* summary = |
| 926 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 960 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 927 summary->set_in(0, Location::RequiresFpuRegister()); | 961 summary->set_in(0, Location::RequiresFpuRegister()); |
| 928 summary->set_in(1, Location::RequiresFpuRegister()); | 962 summary->set_in(1, Location::RequiresFpuRegister()); |
| 929 summary->set_out(Location::RequiresRegister()); | 963 summary->set_out(Location::RequiresRegister()); |
| 930 return summary; | 964 return summary; |
| (...skipping 2649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3580 PcDescriptors::kOther, | 3614 PcDescriptors::kOther, |
| 3581 locs()); | 3615 locs()); |
| 3582 __ Drop(2); // Discard type arguments and receiver. | 3616 __ Drop(2); // Discard type arguments and receiver. |
| 3583 } | 3617 } |
| 3584 | 3618 |
| 3585 } // namespace dart | 3619 } // namespace dart |
| 3586 | 3620 |
| 3587 #undef __ | 3621 #undef __ |
| 3588 | 3622 |
| 3589 #endif // defined TARGET_ARCH_X64 | 3623 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |