| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "accessors.h" | 7 #include "accessors.h" |
| 8 #include "api.h" | 8 #include "api.h" |
| 9 #include "arguments.h" | 9 #include "arguments.h" |
| 10 #include "codegen.h" | 10 #include "codegen.h" |
| (...skipping 2089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2100 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2100 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2101 isolate, result, | 2101 isolate, result, |
| 2102 Runtime::SetObjectProperty( | 2102 Runtime::SetObjectProperty( |
| 2103 isolate, object, key, value, NONE, strict_mode)); | 2103 isolate, object, key, value, NONE, strict_mode)); |
| 2104 return *result; | 2104 return *result; |
| 2105 } | 2105 } |
| 2106 | 2106 |
| 2107 | 2107 |
| 2108 BinaryOpIC::State::State(Isolate* isolate, ExtraICState extra_ic_state) | 2108 BinaryOpIC::State::State(Isolate* isolate, ExtraICState extra_ic_state) |
| 2109 : isolate_(isolate) { | 2109 : isolate_(isolate) { |
| 2110 // We don't deserialize the SSE2 Field, since this is only used to be able | |
| 2111 // to include SSE2 as well as non-SSE2 versions in the snapshot. For code | |
| 2112 // generation we always want it to reflect the current state. | |
| 2113 op_ = static_cast<Token::Value>( | 2110 op_ = static_cast<Token::Value>( |
| 2114 FIRST_TOKEN + OpField::decode(extra_ic_state)); | 2111 FIRST_TOKEN + OpField::decode(extra_ic_state)); |
| 2115 mode_ = OverwriteModeField::decode(extra_ic_state); | 2112 mode_ = OverwriteModeField::decode(extra_ic_state); |
| 2116 fixed_right_arg_ = Maybe<int>( | 2113 fixed_right_arg_ = Maybe<int>( |
| 2117 HasFixedRightArgField::decode(extra_ic_state), | 2114 HasFixedRightArgField::decode(extra_ic_state), |
| 2118 1 << FixedRightArgValueField::decode(extra_ic_state)); | 2115 1 << FixedRightArgValueField::decode(extra_ic_state)); |
| 2119 left_kind_ = LeftKindField::decode(extra_ic_state); | 2116 left_kind_ = LeftKindField::decode(extra_ic_state); |
| 2120 if (fixed_right_arg_.has_value) { | 2117 if (fixed_right_arg_.has_value) { |
| 2121 right_kind_ = Smi::IsValid(fixed_right_arg_.value) ? SMI : INT32; | 2118 right_kind_ = Smi::IsValid(fixed_right_arg_.value) ? SMI : INT32; |
| 2122 } else { | 2119 } else { |
| 2123 right_kind_ = RightKindField::decode(extra_ic_state); | 2120 right_kind_ = RightKindField::decode(extra_ic_state); |
| 2124 } | 2121 } |
| 2125 result_kind_ = ResultKindField::decode(extra_ic_state); | 2122 result_kind_ = ResultKindField::decode(extra_ic_state); |
| 2126 ASSERT_LE(FIRST_TOKEN, op_); | 2123 ASSERT_LE(FIRST_TOKEN, op_); |
| 2127 ASSERT_LE(op_, LAST_TOKEN); | 2124 ASSERT_LE(op_, LAST_TOKEN); |
| 2128 } | 2125 } |
| 2129 | 2126 |
| 2130 | 2127 |
| 2131 ExtraICState BinaryOpIC::State::GetExtraICState() const { | 2128 ExtraICState BinaryOpIC::State::GetExtraICState() const { |
| 2132 bool sse2 = (Max(result_kind_, Max(left_kind_, right_kind_)) > SMI && | |
| 2133 CpuFeatures::IsSafeForSnapshot(isolate(), SSE2)); | |
| 2134 ExtraICState extra_ic_state = | 2129 ExtraICState extra_ic_state = |
| 2135 SSE2Field::encode(sse2) | | |
| 2136 OpField::encode(op_ - FIRST_TOKEN) | | 2130 OpField::encode(op_ - FIRST_TOKEN) | |
| 2137 OverwriteModeField::encode(mode_) | | 2131 OverwriteModeField::encode(mode_) | |
| 2138 LeftKindField::encode(left_kind_) | | 2132 LeftKindField::encode(left_kind_) | |
| 2139 ResultKindField::encode(result_kind_) | | 2133 ResultKindField::encode(result_kind_) | |
| 2140 HasFixedRightArgField::encode(fixed_right_arg_.has_value); | 2134 HasFixedRightArgField::encode(fixed_right_arg_.has_value); |
| 2141 if (fixed_right_arg_.has_value) { | 2135 if (fixed_right_arg_.has_value) { |
| 2142 extra_ic_state = FixedRightArgValueField::update( | 2136 extra_ic_state = FixedRightArgValueField::update( |
| 2143 extra_ic_state, WhichPowerOf2(fixed_right_arg_.value)); | 2137 extra_ic_state, WhichPowerOf2(fixed_right_arg_.value)); |
| 2144 } else { | 2138 } else { |
| 2145 extra_ic_state = RightKindField::update(extra_ic_state, right_kind_); | 2139 extra_ic_state = RightKindField::update(extra_ic_state, right_kind_); |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2446 if ((mode_ == OVERWRITE_LEFT && left_kind_ > NUMBER) || | 2440 if ((mode_ == OVERWRITE_LEFT && left_kind_ > NUMBER) || |
| 2447 (mode_ == OVERWRITE_RIGHT && right_kind_ > NUMBER) || | 2441 (mode_ == OVERWRITE_RIGHT && right_kind_ > NUMBER) || |
| 2448 result_kind_ > NUMBER) { | 2442 result_kind_ > NUMBER) { |
| 2449 mode_ = NO_OVERWRITE; | 2443 mode_ = NO_OVERWRITE; |
| 2450 } | 2444 } |
| 2451 | 2445 |
| 2452 if (old_extra_ic_state == GetExtraICState()) { | 2446 if (old_extra_ic_state == GetExtraICState()) { |
| 2453 // Tagged operations can lead to non-truncating HChanges | 2447 // Tagged operations can lead to non-truncating HChanges |
| 2454 if (left->IsUndefined() || left->IsBoolean()) { | 2448 if (left->IsUndefined() || left->IsBoolean()) { |
| 2455 left_kind_ = GENERIC; | 2449 left_kind_ = GENERIC; |
| 2456 } else if (right->IsUndefined() || right->IsBoolean()) { | 2450 } else { |
| 2451 ASSERT(right->IsUndefined() || right->IsBoolean()); |
| 2457 right_kind_ = GENERIC; | 2452 right_kind_ = GENERIC; |
| 2458 } else { | |
| 2459 // Since the X87 is too precise, we might bail out on numbers which | |
| 2460 // actually would truncate with 64 bit precision. | |
| 2461 ASSERT(!CpuFeatures::IsSupported(SSE2)); | |
| 2462 ASSERT(result_kind_ < NUMBER); | |
| 2463 result_kind_ = NUMBER; | |
| 2464 } | 2453 } |
| 2465 } | 2454 } |
| 2466 } | 2455 } |
| 2467 | 2456 |
| 2468 | 2457 |
| 2469 BinaryOpIC::State::Kind BinaryOpIC::State::UpdateKind(Handle<Object> object, | 2458 BinaryOpIC::State::Kind BinaryOpIC::State::UpdateKind(Handle<Object> object, |
| 2470 Kind kind) const { | 2459 Kind kind) const { |
| 2471 Kind new_kind = GENERIC; | 2460 Kind new_kind = GENERIC; |
| 2472 bool is_truncating = Token::IsTruncatingBinaryOp(op()); | 2461 bool is_truncating = Token::IsTruncatingBinaryOp(op()); |
| 2473 if (object->IsBoolean() && is_truncating) { | 2462 if (object->IsBoolean() && is_truncating) { |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2996 #undef ADDR | 2985 #undef ADDR |
| 2997 }; | 2986 }; |
| 2998 | 2987 |
| 2999 | 2988 |
| 3000 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2989 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 3001 return IC_utilities[id]; | 2990 return IC_utilities[id]; |
| 3002 } | 2991 } |
| 3003 | 2992 |
| 3004 | 2993 |
| 3005 } } // namespace v8::internal | 2994 } } // namespace v8::internal |
| OLD | NEW |