Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(603)

Side by Side Diff: src/ic.cc

Issue 275433004: Require SSE2 support for the ia32 port. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ic.h ('k') | src/mips/code-stubs-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/ic.h ('k') | src/mips/code-stubs-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698