OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2322 // to include SSE2 as well as non-SSE2 versions in the snapshot. For code | 2322 // to include SSE2 as well as non-SSE2 versions in the snapshot. For code |
2323 // generation we always want it to reflect the current state. | 2323 // generation we always want it to reflect the current state. |
2324 op_ = static_cast<Token::Value>( | 2324 op_ = static_cast<Token::Value>( |
2325 FIRST_TOKEN + OpField::decode(extra_ic_state)); | 2325 FIRST_TOKEN + OpField::decode(extra_ic_state)); |
2326 mode_ = OverwriteModeField::decode(extra_ic_state); | 2326 mode_ = OverwriteModeField::decode(extra_ic_state); |
2327 fixed_right_arg_ = Maybe<int>( | 2327 fixed_right_arg_ = Maybe<int>( |
2328 HasFixedRightArgField::decode(extra_ic_state), | 2328 HasFixedRightArgField::decode(extra_ic_state), |
2329 1 << FixedRightArgValueField::decode(extra_ic_state)); | 2329 1 << FixedRightArgValueField::decode(extra_ic_state)); |
2330 left_kind_ = LeftKindField::decode(extra_ic_state); | 2330 left_kind_ = LeftKindField::decode(extra_ic_state); |
2331 if (fixed_right_arg_.has_value) { | 2331 if (fixed_right_arg_.has_value) { |
2332 // We have only 4 bits to encode the log2 of the fixed right arg, so the | 2332 right_kind_ = Smi::IsValid(fixed_right_arg_.value) ? SMI : INT32; |
2333 // max value is 2^(2^4), which is always a SMI. | |
2334 ASSERT(Smi::IsValid(fixed_right_arg_.value)); | |
2335 right_kind_ = SMI; | |
2336 } else { | 2333 } else { |
2337 right_kind_ = RightKindField::decode(extra_ic_state); | 2334 right_kind_ = RightKindField::decode(extra_ic_state); |
2338 } | 2335 } |
2339 result_kind_ = ResultKindField::decode(extra_ic_state); | 2336 result_kind_ = ResultKindField::decode(extra_ic_state); |
2340 ASSERT_LE(FIRST_TOKEN, op_); | 2337 ASSERT_LE(FIRST_TOKEN, op_); |
2341 ASSERT_LE(op_, LAST_TOKEN); | 2338 ASSERT_LE(op_, LAST_TOKEN); |
2342 } | 2339 } |
2343 | 2340 |
2344 | 2341 |
2345 ExtraICState BinaryOpIC::State::GetExtraICState() const { | 2342 ExtraICState BinaryOpIC::State::GetExtraICState() const { |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2578 GENERATE(Token::MOD, SMI, 4, SMI, NO_OVERWRITE); | 2575 GENERATE(Token::MOD, SMI, 4, SMI, NO_OVERWRITE); |
2579 GENERATE(Token::MOD, SMI, 4, SMI, OVERWRITE_LEFT); | 2576 GENERATE(Token::MOD, SMI, 4, SMI, OVERWRITE_LEFT); |
2580 GENERATE(Token::MOD, SMI, 8, SMI, NO_OVERWRITE); | 2577 GENERATE(Token::MOD, SMI, 8, SMI, NO_OVERWRITE); |
2581 GENERATE(Token::MOD, SMI, 16, SMI, OVERWRITE_LEFT); | 2578 GENERATE(Token::MOD, SMI, 16, SMI, OVERWRITE_LEFT); |
2582 GENERATE(Token::MOD, SMI, 32, SMI, NO_OVERWRITE); | 2579 GENERATE(Token::MOD, SMI, 32, SMI, NO_OVERWRITE); |
2583 GENERATE(Token::MOD, SMI, 2048, SMI, NO_OVERWRITE); | 2580 GENERATE(Token::MOD, SMI, 2048, SMI, NO_OVERWRITE); |
2584 #undef GENERATE | 2581 #undef GENERATE |
2585 } | 2582 } |
2586 | 2583 |
2587 | 2584 |
2588 Handle<Type> BinaryOpIC::State::GetRightType(Isolate* isolate) const { | |
2589 if (fixed_right_arg_.has_value) { | |
2590 Handle<Smi> value = handle(Smi::FromInt(fixed_right_arg_.value), isolate); | |
2591 Handle<Type> type = handle(Type::Constant(value, isolate), isolate); | |
2592 ASSERT(type->Is(KindToType(right_kind_, isolate))); | |
2593 return type; | |
2594 } | |
2595 return KindToType(right_kind_, isolate); | |
2596 } | |
2597 | |
2598 | |
2599 Handle<Type> BinaryOpIC::State::GetResultType(Isolate* isolate) const { | 2585 Handle<Type> BinaryOpIC::State::GetResultType(Isolate* isolate) const { |
2600 Kind result_kind = result_kind_; | 2586 Kind result_kind = result_kind_; |
2601 if (HasSideEffects()) { | 2587 if (HasSideEffects()) { |
2602 result_kind = NONE; | 2588 result_kind = NONE; |
2603 } else if (result_kind == GENERIC && op_ == Token::ADD) { | 2589 } else if (result_kind == GENERIC && op_ == Token::ADD) { |
2604 return handle(Type::Union(handle(Type::Number(), isolate), | 2590 return handle(Type::Union(handle(Type::Number(), isolate), |
2605 handle(Type::String(), isolate)), isolate); | 2591 handle(Type::String(), isolate)), isolate); |
2606 } else if (result_kind == NUMBER && op_ == Token::SHR) { | 2592 } else if (result_kind == NUMBER && op_ == Token::SHR) { |
2607 return handle(Type::Unsigned32(), isolate); | 2593 return handle(Type::Unsigned32(), isolate); |
2608 } | 2594 } |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3157 #undef ADDR | 3143 #undef ADDR |
3158 }; | 3144 }; |
3159 | 3145 |
3160 | 3146 |
3161 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3147 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
3162 return IC_utilities[id]; | 3148 return IC_utilities[id]; |
3163 } | 3149 } |
3164 | 3150 |
3165 | 3151 |
3166 } } // namespace v8::internal | 3152 } } // namespace v8::internal |
OLD | NEW |