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 2040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2051 } | 2051 } |
2052 Handle<Object> result; | 2052 Handle<Object> result; |
2053 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2053 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2054 isolate, result, | 2054 isolate, result, |
2055 Runtime::SetObjectProperty( | 2055 Runtime::SetObjectProperty( |
2056 isolate, object, key, value, NONE, strict_mode)); | 2056 isolate, object, key, value, NONE, strict_mode)); |
2057 return *result; | 2057 return *result; |
2058 } | 2058 } |
2059 | 2059 |
2060 | 2060 |
2061 BinaryOpIC::State::State(ExtraICState extra_ic_state) { | 2061 BinaryOpIC::State::State(Isolate* isolate, ExtraICState extra_ic_state) |
| 2062 : isolate_(isolate) { |
2062 // We don't deserialize the SSE2 Field, since this is only used to be able | 2063 // We don't deserialize the SSE2 Field, since this is only used to be able |
2063 // to include SSE2 as well as non-SSE2 versions in the snapshot. For code | 2064 // to include SSE2 as well as non-SSE2 versions in the snapshot. For code |
2064 // generation we always want it to reflect the current state. | 2065 // generation we always want it to reflect the current state. |
2065 op_ = static_cast<Token::Value>( | 2066 op_ = static_cast<Token::Value>( |
2066 FIRST_TOKEN + OpField::decode(extra_ic_state)); | 2067 FIRST_TOKEN + OpField::decode(extra_ic_state)); |
2067 mode_ = OverwriteModeField::decode(extra_ic_state); | 2068 mode_ = OverwriteModeField::decode(extra_ic_state); |
2068 fixed_right_arg_ = Maybe<int>( | 2069 fixed_right_arg_ = Maybe<int>( |
2069 HasFixedRightArgField::decode(extra_ic_state), | 2070 HasFixedRightArgField::decode(extra_ic_state), |
2070 1 << FixedRightArgValueField::decode(extra_ic_state)); | 2071 1 << FixedRightArgValueField::decode(extra_ic_state)); |
2071 left_kind_ = LeftKindField::decode(extra_ic_state); | 2072 left_kind_ = LeftKindField::decode(extra_ic_state); |
(...skipping 30 matching lines...) Expand all Loading... |
2102 | 2103 |
2103 // static | 2104 // static |
2104 void BinaryOpIC::State::GenerateAheadOfTime( | 2105 void BinaryOpIC::State::GenerateAheadOfTime( |
2105 Isolate* isolate, void (*Generate)(Isolate*, const State&)) { | 2106 Isolate* isolate, void (*Generate)(Isolate*, const State&)) { |
2106 // TODO(olivf) We should investigate why adding stubs to the snapshot is so | 2107 // TODO(olivf) We should investigate why adding stubs to the snapshot is so |
2107 // expensive at runtime. When solved we should be able to add most binops to | 2108 // expensive at runtime. When solved we should be able to add most binops to |
2108 // the snapshot instead of hand-picking them. | 2109 // the snapshot instead of hand-picking them. |
2109 // Generated list of commonly used stubs | 2110 // Generated list of commonly used stubs |
2110 #define GENERATE(op, left_kind, right_kind, result_kind, mode) \ | 2111 #define GENERATE(op, left_kind, right_kind, result_kind, mode) \ |
2111 do { \ | 2112 do { \ |
2112 State state(op, mode); \ | 2113 State state(isolate, op, mode); \ |
2113 state.left_kind_ = left_kind; \ | 2114 state.left_kind_ = left_kind; \ |
2114 state.fixed_right_arg_.has_value = false; \ | 2115 state.fixed_right_arg_.has_value = false; \ |
2115 state.right_kind_ = right_kind; \ | 2116 state.right_kind_ = right_kind; \ |
2116 state.result_kind_ = result_kind; \ | 2117 state.result_kind_ = result_kind; \ |
2117 Generate(isolate, state); \ | 2118 Generate(isolate, state); \ |
2118 } while (false) | 2119 } while (false) |
2119 GENERATE(Token::ADD, INT32, INT32, INT32, NO_OVERWRITE); | 2120 GENERATE(Token::ADD, INT32, INT32, INT32, NO_OVERWRITE); |
2120 GENERATE(Token::ADD, INT32, INT32, INT32, OVERWRITE_LEFT); | 2121 GENERATE(Token::ADD, INT32, INT32, INT32, OVERWRITE_LEFT); |
2121 GENERATE(Token::ADD, INT32, INT32, NUMBER, NO_OVERWRITE); | 2122 GENERATE(Token::ADD, INT32, INT32, NUMBER, NO_OVERWRITE); |
2122 GENERATE(Token::ADD, INT32, INT32, NUMBER, OVERWRITE_LEFT); | 2123 GENERATE(Token::ADD, INT32, INT32, NUMBER, OVERWRITE_LEFT); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2297 GENERATE(Token::SUB, SMI, INT32, INT32, NO_OVERWRITE); | 2298 GENERATE(Token::SUB, SMI, INT32, INT32, NO_OVERWRITE); |
2298 GENERATE(Token::SUB, SMI, NUMBER, NUMBER, NO_OVERWRITE); | 2299 GENERATE(Token::SUB, SMI, NUMBER, NUMBER, NO_OVERWRITE); |
2299 GENERATE(Token::SUB, SMI, NUMBER, NUMBER, OVERWRITE_LEFT); | 2300 GENERATE(Token::SUB, SMI, NUMBER, NUMBER, OVERWRITE_LEFT); |
2300 GENERATE(Token::SUB, SMI, NUMBER, NUMBER, OVERWRITE_RIGHT); | 2301 GENERATE(Token::SUB, SMI, NUMBER, NUMBER, OVERWRITE_RIGHT); |
2301 GENERATE(Token::SUB, SMI, SMI, SMI, NO_OVERWRITE); | 2302 GENERATE(Token::SUB, SMI, SMI, SMI, NO_OVERWRITE); |
2302 GENERATE(Token::SUB, SMI, SMI, SMI, OVERWRITE_LEFT); | 2303 GENERATE(Token::SUB, SMI, SMI, SMI, OVERWRITE_LEFT); |
2303 GENERATE(Token::SUB, SMI, SMI, SMI, OVERWRITE_RIGHT); | 2304 GENERATE(Token::SUB, SMI, SMI, SMI, OVERWRITE_RIGHT); |
2304 #undef GENERATE | 2305 #undef GENERATE |
2305 #define GENERATE(op, left_kind, fixed_right_arg_value, result_kind, mode) \ | 2306 #define GENERATE(op, left_kind, fixed_right_arg_value, result_kind, mode) \ |
2306 do { \ | 2307 do { \ |
2307 State state(op, mode); \ | 2308 State state(isolate, op, mode); \ |
2308 state.left_kind_ = left_kind; \ | 2309 state.left_kind_ = left_kind; \ |
2309 state.fixed_right_arg_.has_value = true; \ | 2310 state.fixed_right_arg_.has_value = true; \ |
2310 state.fixed_right_arg_.value = fixed_right_arg_value; \ | 2311 state.fixed_right_arg_.value = fixed_right_arg_value; \ |
2311 state.right_kind_ = SMI; \ | 2312 state.right_kind_ = SMI; \ |
2312 state.result_kind_ = result_kind; \ | 2313 state.result_kind_ = result_kind; \ |
2313 Generate(isolate, state); \ | 2314 Generate(isolate, state); \ |
2314 } while (false) | 2315 } while (false) |
2315 GENERATE(Token::MOD, SMI, 2, SMI, NO_OVERWRITE); | 2316 GENERATE(Token::MOD, SMI, 2, SMI, NO_OVERWRITE); |
2316 GENERATE(Token::MOD, SMI, 4, SMI, NO_OVERWRITE); | 2317 GENERATE(Token::MOD, SMI, 4, SMI, NO_OVERWRITE); |
2317 GENERATE(Token::MOD, SMI, 4, SMI, OVERWRITE_LEFT); | 2318 GENERATE(Token::MOD, SMI, 4, SMI, OVERWRITE_LEFT); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2475 } | 2476 } |
2476 UNREACHABLE(); | 2477 UNREACHABLE(); |
2477 return NULL; | 2478 return NULL; |
2478 } | 2479 } |
2479 | 2480 |
2480 | 2481 |
2481 MaybeHandle<Object> BinaryOpIC::Transition( | 2482 MaybeHandle<Object> BinaryOpIC::Transition( |
2482 Handle<AllocationSite> allocation_site, | 2483 Handle<AllocationSite> allocation_site, |
2483 Handle<Object> left, | 2484 Handle<Object> left, |
2484 Handle<Object> right) { | 2485 Handle<Object> right) { |
2485 State state(target()->extra_ic_state()); | 2486 State state(isolate(), target()->extra_ic_state()); |
2486 | 2487 |
2487 // Compute the actual result using the builtin for the binary operation. | 2488 // Compute the actual result using the builtin for the binary operation. |
2488 Object* builtin = isolate()->js_builtins_object()->javascript_builtin( | 2489 Object* builtin = isolate()->js_builtins_object()->javascript_builtin( |
2489 TokenToJSBuiltin(state.op())); | 2490 TokenToJSBuiltin(state.op())); |
2490 Handle<JSFunction> function = handle(JSFunction::cast(builtin), isolate()); | 2491 Handle<JSFunction> function = handle(JSFunction::cast(builtin), isolate()); |
2491 Handle<Object> result; | 2492 Handle<Object> result; |
2492 ASSIGN_RETURN_ON_EXCEPTION( | 2493 ASSIGN_RETURN_ON_EXCEPTION( |
2493 isolate(), | 2494 isolate(), |
2494 result, | 2495 result, |
2495 Execution::Call(isolate(), function, left, 1, &right), | 2496 Execution::Call(isolate(), function, left, 1, &right), |
2496 Object); | 2497 Object); |
2497 | 2498 |
2498 // Execution::Call can execute arbitrary JavaScript, hence potentially | 2499 // Execution::Call can execute arbitrary JavaScript, hence potentially |
2499 // update the state of this very IC, so we must update the stored state. | 2500 // update the state of this very IC, so we must update the stored state. |
2500 UpdateTarget(); | 2501 UpdateTarget(); |
2501 // Compute the new state. | 2502 // Compute the new state. |
2502 State old_state(target()->extra_ic_state()); | 2503 State old_state(isolate(), target()->extra_ic_state()); |
2503 state.Update(left, right, result); | 2504 state.Update(left, right, result); |
2504 | 2505 |
2505 // Check if we have a string operation here. | 2506 // Check if we have a string operation here. |
2506 Handle<Code> target; | 2507 Handle<Code> target; |
2507 if (!allocation_site.is_null() || state.ShouldCreateAllocationMementos()) { | 2508 if (!allocation_site.is_null() || state.ShouldCreateAllocationMementos()) { |
2508 // Setup the allocation site on-demand. | 2509 // Setup the allocation site on-demand. |
2509 if (allocation_site.is_null()) { | 2510 if (allocation_site.is_null()) { |
2510 allocation_site = isolate()->factory()->NewAllocationSite(); | 2511 allocation_site = isolate()->factory()->NewAllocationSite(); |
2511 } | 2512 } |
2512 | 2513 |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2948 #undef ADDR | 2949 #undef ADDR |
2949 }; | 2950 }; |
2950 | 2951 |
2951 | 2952 |
2952 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2953 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2953 return IC_utilities[id]; | 2954 return IC_utilities[id]; |
2954 } | 2955 } |
2955 | 2956 |
2956 | 2957 |
2957 } } // namespace v8::internal | 2958 } } // namespace v8::internal |
OLD | NEW |