| 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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 2901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2912 Register result = locs()->out(0).reg(); | 2912 Register result = locs()->out(0).reg(); |
| 2913 ASSERT(left == result); | 2913 ASSERT(left == result); |
| 2914 Label* deopt = NULL; | 2914 Label* deopt = NULL; |
| 2915 if (CanDeoptimize()) { | 2915 if (CanDeoptimize()) { |
| 2916 deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp); | 2916 deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp); |
| 2917 } | 2917 } |
| 2918 | 2918 |
| 2919 if (locs()->in(1).IsConstant()) { | 2919 if (locs()->in(1).IsConstant()) { |
| 2920 const Object& constant = locs()->in(1).constant(); | 2920 const Object& constant = locs()->in(1).constant(); |
| 2921 ASSERT(constant.IsSmi()); | 2921 ASSERT(constant.IsSmi()); |
| 2922 const int32_t imm = | 2922 const int32_t imm = reinterpret_cast<int32_t>(constant.raw()); |
| 2923 reinterpret_cast<int32_t>(constant.raw()); | |
| 2924 switch (op_kind()) { | 2923 switch (op_kind()) { |
| 2925 case Token::kADD: | 2924 case Token::kADD: |
| 2926 __ addl(left, Immediate(imm)); | 2925 if (imm != 0) { |
| 2927 if (deopt != NULL) __ j(OVERFLOW, deopt); | 2926 // Checking overflow without emitting an instruction would be wrong. |
| 2927 __ addl(left, Immediate(imm)); |
| 2928 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 2929 } |
| 2928 break; | 2930 break; |
| 2929 case Token::kSUB: { | 2931 case Token::kSUB: { |
| 2930 __ subl(left, Immediate(imm)); | 2932 if (imm != 0) { |
| 2931 if (deopt != NULL) __ j(OVERFLOW, deopt); | 2933 // Checking overflow without emitting an instruction would be wrong. |
| 2934 __ subl(left, Immediate(imm)); |
| 2935 if (deopt != NULL) __ j(OVERFLOW, deopt); |
| 2936 } |
| 2932 break; | 2937 break; |
| 2933 } | 2938 } |
| 2934 case Token::kMUL: { | 2939 case Token::kMUL: { |
| 2935 // Keep left value tagged and untag right value. | 2940 // Keep left value tagged and untag right value. |
| 2936 const intptr_t value = Smi::Cast(constant).Value(); | 2941 const intptr_t value = Smi::Cast(constant).Value(); |
| 2937 if (value == 2) { | 2942 if (value == 2) { |
| 2938 __ shll(left, Immediate(1)); | 2943 __ shll(left, Immediate(1)); |
| 2939 } else { | 2944 } else { |
| 2940 __ imull(left, Immediate(value)); | 2945 __ imull(left, Immediate(value)); |
| 2941 } | 2946 } |
| (...skipping 3048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5990 } | 5995 } |
| 5991 } | 5996 } |
| 5992 | 5997 |
| 5993 __ setcc(true_condition, DL); | 5998 __ setcc(true_condition, DL); |
| 5994 | 5999 |
| 5995 if (is_power_of_two_kind) { | 6000 if (is_power_of_two_kind) { |
| 5996 const intptr_t shift = | 6001 const intptr_t shift = |
| 5997 Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value)); | 6002 Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value)); |
| 5998 __ shll(EDX, Immediate(shift + kSmiTagSize)); | 6003 __ shll(EDX, Immediate(shift + kSmiTagSize)); |
| 5999 } else { | 6004 } else { |
| 6000 __ subl(EDX, Immediate(1)); | 6005 __ decl(EDX); |
| 6001 __ andl(EDX, Immediate( | 6006 __ andl(EDX, Immediate( |
| 6002 Smi::RawValue(true_value) - Smi::RawValue(false_value))); | 6007 Smi::RawValue(true_value) - Smi::RawValue(false_value))); |
| 6003 if (false_value != 0) { | 6008 if (false_value != 0) { |
| 6004 __ addl(EDX, Immediate(Smi::RawValue(false_value))); | 6009 __ addl(EDX, Immediate(Smi::RawValue(false_value))); |
| 6005 } | 6010 } |
| 6006 } | 6011 } |
| 6007 } | 6012 } |
| 6008 | 6013 |
| 6009 | 6014 |
| 6010 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { | 6015 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6090 PcDescriptors::kOther, | 6095 PcDescriptors::kOther, |
| 6091 locs()); | 6096 locs()); |
| 6092 __ Drop(ArgumentCount()); // Discard arguments. | 6097 __ Drop(ArgumentCount()); // Discard arguments. |
| 6093 } | 6098 } |
| 6094 | 6099 |
| 6095 } // namespace dart | 6100 } // namespace dart |
| 6096 | 6101 |
| 6097 #undef __ | 6102 #undef __ |
| 6098 | 6103 |
| 6099 #endif // defined TARGET_ARCH_IA32 | 6104 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |