OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 17275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17286 } | 17286 } |
17287 default: | 17287 default: |
17288 UNIMPLEMENTED(); | 17288 UNIMPLEMENTED(); |
17289 } | 17289 } |
17290 } | 17290 } |
17291 if (!IsBigint() && !other.IsBigint()) { | 17291 if (!IsBigint() && !other.IsBigint()) { |
17292 const int64_t left_value = AsInt64Value(); | 17292 const int64_t left_value = AsInt64Value(); |
17293 const int64_t right_value = other.AsInt64Value(); | 17293 const int64_t right_value = other.AsInt64Value(); |
17294 switch (operation) { | 17294 switch (operation) { |
17295 case Token::kADD: { | 17295 case Token::kADD: { |
17296 if (((left_value < 0) != (right_value < 0)) || | 17296 if (!Utils::WillAddOverflow(left_value, right_value)) { |
17297 ((left_value + right_value) < 0) == (left_value < 0)) { | |
17298 return Integer::New(left_value + right_value, space); | 17297 return Integer::New(left_value + right_value, space); |
17299 } | 17298 } |
17300 break; | 17299 break; |
17301 } | 17300 } |
17302 case Token::kSUB: { | 17301 case Token::kSUB: { |
17303 // TODO(srdjan): XCode 7 produces different code in -O0 than in -O2 for | 17302 if (!Utils::WillSubOverflow(left_value, right_value)) { |
17304 // following code when 'left_value - right_value' overflows into a | |
17305 // positive number (left negative, right positive): | |
17306 // if (((left_value < 0) == (right_value < 0)) || | |
17307 // ((left_value - right_value) < 0) == (left_value < 0)) { | |
17308 // | |
17309 // Restructuring code using temporary variables is a workaround. | |
17310 const bool both_same_sign = (left_value < 0) == (right_value < 0); | |
17311 const bool result_same_sign_as_left = | |
17312 ((left_value - right_value) < 0) == (left_value < 0); | |
17313 if (both_same_sign || result_same_sign_as_left) { | |
17314 return Integer::New(left_value - right_value, space); | 17303 return Integer::New(left_value - right_value, space); |
17315 } | 17304 } |
17316 break; | 17305 break; |
17317 } | 17306 } |
17318 case Token::kMUL: { | 17307 case Token::kMUL: { |
17319 if ((Utils::HighestBit(left_value) + | 17308 if ((Utils::HighestBit(left_value) + |
17320 Utils::HighestBit(right_value)) < 62) { | 17309 Utils::HighestBit(right_value)) < 62) { |
17321 return Integer::New(left_value * right_value, space); | 17310 return Integer::New(left_value * right_value, space); |
17322 } | 17311 } |
17323 break; | 17312 break; |
(...skipping 4598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21922 return tag_label.ToCString(); | 21911 return tag_label.ToCString(); |
21923 } | 21912 } |
21924 | 21913 |
21925 | 21914 |
21926 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21915 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21927 Instance::PrintJSONImpl(stream, ref); | 21916 Instance::PrintJSONImpl(stream, ref); |
21928 } | 21917 } |
21929 | 21918 |
21930 | 21919 |
21931 } // namespace dart | 21920 } // namespace dart |
OLD | NEW |