| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1494 __ lw(t0, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 1494 __ lw(t0, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
| 1495 __ Branch(miss, ne, t0, Operand(a3)); | 1495 __ Branch(miss, ne, t0, Operand(a3)); |
| 1496 } else { | 1496 } else { |
| 1497 __ Branch(miss, ne, a1, Operand(Handle<JSFunction>(function))); | 1497 __ Branch(miss, ne, a1, Operand(Handle<JSFunction>(function))); |
| 1498 } | 1498 } |
| 1499 } | 1499 } |
| 1500 | 1500 |
| 1501 | 1501 |
| 1502 MaybeObject* CallStubCompiler::GenerateMissBranch() { | 1502 MaybeObject* CallStubCompiler::GenerateMissBranch() { |
| 1503 MaybeObject* maybe_obj = | 1503 MaybeObject* maybe_obj = |
| 1504 isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(), | 1504 isolate()->stub_cache()->TryComputeCallMiss(arguments().immediate(), |
| 1505 kind_, | 1505 kind_, |
| 1506 extra_ic_state_); | 1506 extra_state_); |
| 1507 Object* obj; | 1507 Object* obj; |
| 1508 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 1508 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 1509 __ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); | 1509 __ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); |
| 1510 return obj; | 1510 return obj; |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 | 1513 |
| 1514 MaybeObject* CallStubCompiler::CompileCallField(JSObject* object, | 1514 MaybeObject* CallStubCompiler::CompileCallField(JSObject* object, |
| 1515 JSObject* holder, | 1515 JSObject* holder, |
| 1516 int index, | 1516 int index, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1527 | 1527 |
| 1528 // Get the receiver of the function from the stack into a0. | 1528 // Get the receiver of the function from the stack into a0. |
| 1529 __ lw(a0, MemOperand(sp, argc * kPointerSize)); | 1529 __ lw(a0, MemOperand(sp, argc * kPointerSize)); |
| 1530 // Check that the receiver isn't a smi. | 1530 // Check that the receiver isn't a smi. |
| 1531 __ JumpIfSmi(a0, &miss, t0); | 1531 __ JumpIfSmi(a0, &miss, t0); |
| 1532 | 1532 |
| 1533 // Do the right check and compute the holder register. | 1533 // Do the right check and compute the holder register. |
| 1534 Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss); | 1534 Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss); |
| 1535 GenerateFastPropertyLoad(masm(), a1, reg, holder, index); | 1535 GenerateFastPropertyLoad(masm(), a1, reg, holder, index); |
| 1536 | 1536 |
| 1537 GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_); | 1537 GenerateCallFunction(masm(), object, arguments(), &miss, extra_state_); |
| 1538 | 1538 |
| 1539 // Handle call cache miss. | 1539 // Handle call cache miss. |
| 1540 __ bind(&miss); | 1540 __ bind(&miss); |
| 1541 MaybeObject* maybe_result = GenerateMissBranch(); | 1541 MaybeObject* maybe_result = GenerateMissBranch(); |
| 1542 if (maybe_result->IsFailure()) return maybe_result; | 1542 if (maybe_result->IsFailure()) return maybe_result; |
| 1543 | 1543 |
| 1544 // Return the generated code. | 1544 // Return the generated code. |
| 1545 return GetCode(FIELD, name); | 1545 return GetCode(FIELD, name); |
| 1546 } | 1546 } |
| 1547 | 1547 |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1846 | 1846 |
| 1847 const int argc = arguments().immediate(); | 1847 const int argc = arguments().immediate(); |
| 1848 | 1848 |
| 1849 Label miss; | 1849 Label miss; |
| 1850 Label name_miss; | 1850 Label name_miss; |
| 1851 Label index_out_of_range; | 1851 Label index_out_of_range; |
| 1852 | 1852 |
| 1853 Label* index_out_of_range_label = &index_out_of_range; | 1853 Label* index_out_of_range_label = &index_out_of_range; |
| 1854 | 1854 |
| 1855 if (kind_ == Code::CALL_IC && | 1855 if (kind_ == Code::CALL_IC && |
| 1856 (CallICBase::StringStubState::decode(extra_ic_state_) == | 1856 (CallICBase::StringStubState::decode(extra_state_) == |
| 1857 DEFAULT_STRING_STUB)) { | 1857 DEFAULT_STRING_STUB)) { |
| 1858 index_out_of_range_label = &miss; | 1858 index_out_of_range_label = &miss; |
| 1859 } | 1859 } |
| 1860 | 1860 |
| 1861 GenerateNameCheck(name, &name_miss); | 1861 GenerateNameCheck(name, &name_miss); |
| 1862 | 1862 |
| 1863 // Check that the maps starting from the prototype haven't changed. | 1863 // Check that the maps starting from the prototype haven't changed. |
| 1864 GenerateDirectLoadGlobalFunctionPrototype(masm(), | 1864 GenerateDirectLoadGlobalFunctionPrototype(masm(), |
| 1865 Context::STRING_FUNCTION_INDEX, | 1865 Context::STRING_FUNCTION_INDEX, |
| 1866 v0, | 1866 v0, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1932 if (!object->IsString() || cell != NULL) return heap()->undefined_value(); | 1932 if (!object->IsString() || cell != NULL) return heap()->undefined_value(); |
| 1933 | 1933 |
| 1934 const int argc = arguments().immediate(); | 1934 const int argc = arguments().immediate(); |
| 1935 | 1935 |
| 1936 Label miss; | 1936 Label miss; |
| 1937 Label name_miss; | 1937 Label name_miss; |
| 1938 Label index_out_of_range; | 1938 Label index_out_of_range; |
| 1939 Label* index_out_of_range_label = &index_out_of_range; | 1939 Label* index_out_of_range_label = &index_out_of_range; |
| 1940 | 1940 |
| 1941 if (kind_ == Code::CALL_IC && | 1941 if (kind_ == Code::CALL_IC && |
| 1942 (CallICBase::StringStubState::decode(extra_ic_state_) == | 1942 (CallICBase::StringStubState::decode(extra_state_) == |
| 1943 DEFAULT_STRING_STUB)) { | 1943 DEFAULT_STRING_STUB)) { |
| 1944 index_out_of_range_label = &miss; | 1944 index_out_of_range_label = &miss; |
| 1945 } | 1945 } |
| 1946 | 1946 |
| 1947 GenerateNameCheck(name, &name_miss); | 1947 GenerateNameCheck(name, &name_miss); |
| 1948 | 1948 |
| 1949 // Check that the maps starting from the prototype haven't changed. | 1949 // Check that the maps starting from the prototype haven't changed. |
| 1950 GenerateDirectLoadGlobalFunctionPrototype(masm(), | 1950 GenerateDirectLoadGlobalFunctionPrototype(masm(), |
| 1951 Context::STRING_FUNCTION_INDEX, | 1951 Context::STRING_FUNCTION_INDEX, |
| 1952 v0, | 1952 v0, |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2477 CheckPrototypes(JSObject::cast(object->GetPrototype()), a0, holder, a3, | 2477 CheckPrototypes(JSObject::cast(object->GetPrototype()), a0, holder, a3, |
| 2478 a1, t0, name, &miss); | 2478 a1, t0, name, &miss); |
| 2479 } | 2479 } |
| 2480 break; | 2480 break; |
| 2481 } | 2481 } |
| 2482 | 2482 |
| 2483 default: | 2483 default: |
| 2484 UNREACHABLE(); | 2484 UNREACHABLE(); |
| 2485 } | 2485 } |
| 2486 | 2486 |
| 2487 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2487 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 2488 ? CALL_AS_FUNCTION | 2488 ? CALL_AS_FUNCTION |
| 2489 : CALL_AS_METHOD; | 2489 : CALL_AS_METHOD; |
| 2490 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind); | 2490 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind); |
| 2491 | 2491 |
| 2492 // Handle call cache miss. | 2492 // Handle call cache miss. |
| 2493 __ bind(&miss); | 2493 __ bind(&miss); |
| 2494 | 2494 |
| 2495 MaybeObject* maybe_result = GenerateMissBranch(); | 2495 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2496 if (maybe_result->IsFailure()) return maybe_result; | 2496 if (maybe_result->IsFailure()) return maybe_result; |
| 2497 | 2497 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2514 | 2514 |
| 2515 // Get the number of arguments. | 2515 // Get the number of arguments. |
| 2516 const int argc = arguments().immediate(); | 2516 const int argc = arguments().immediate(); |
| 2517 | 2517 |
| 2518 LookupResult lookup(isolate()); | 2518 LookupResult lookup(isolate()); |
| 2519 LookupPostInterceptor(holder, name, &lookup); | 2519 LookupPostInterceptor(holder, name, &lookup); |
| 2520 | 2520 |
| 2521 // Get the receiver from the stack. | 2521 // Get the receiver from the stack. |
| 2522 __ lw(a1, MemOperand(sp, argc * kPointerSize)); | 2522 __ lw(a1, MemOperand(sp, argc * kPointerSize)); |
| 2523 | 2523 |
| 2524 CallInterceptorCompiler compiler(this, arguments(), a2, extra_ic_state_); | 2524 CallInterceptorCompiler compiler(this, arguments(), a2, extra_state_); |
| 2525 MaybeObject* result = compiler.Compile(masm(), | 2525 MaybeObject* result = compiler.Compile(masm(), |
| 2526 object, | 2526 object, |
| 2527 holder, | 2527 holder, |
| 2528 name, | 2528 name, |
| 2529 &lookup, | 2529 &lookup, |
| 2530 a1, | 2530 a1, |
| 2531 a3, | 2531 a3, |
| 2532 t0, | 2532 t0, |
| 2533 a0, | 2533 a0, |
| 2534 &miss); | 2534 &miss); |
| 2535 if (result->IsFailure()) { | 2535 if (result->IsFailure()) { |
| 2536 return result; | 2536 return result; |
| 2537 } | 2537 } |
| 2538 | 2538 |
| 2539 // Move returned value, the function to call, to a1. | 2539 // Move returned value, the function to call, to a1. |
| 2540 __ mov(a1, v0); | 2540 __ mov(a1, v0); |
| 2541 // Restore receiver. | 2541 // Restore receiver. |
| 2542 __ lw(a0, MemOperand(sp, argc * kPointerSize)); | 2542 __ lw(a0, MemOperand(sp, argc * kPointerSize)); |
| 2543 | 2543 |
| 2544 GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_); | 2544 GenerateCallFunction(masm(), object, arguments(), &miss, extra_state_); |
| 2545 | 2545 |
| 2546 // Handle call cache miss. | 2546 // Handle call cache miss. |
| 2547 __ bind(&miss); | 2547 __ bind(&miss); |
| 2548 MaybeObject* maybe_result = GenerateMissBranch(); | 2548 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2549 if (maybe_result->IsFailure()) return maybe_result; | 2549 if (maybe_result->IsFailure()) return maybe_result; |
| 2550 | 2550 |
| 2551 // Return the generated code. | 2551 // Return the generated code. |
| 2552 return GetCode(INTERCEPTOR, name); | 2552 return GetCode(INTERCEPTOR, name); |
| 2553 } | 2553 } |
| 2554 | 2554 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2588 __ lw(a3, FieldMemOperand(a0, GlobalObject::kGlobalReceiverOffset)); | 2588 __ lw(a3, FieldMemOperand(a0, GlobalObject::kGlobalReceiverOffset)); |
| 2589 __ sw(a3, MemOperand(sp, argc * kPointerSize)); | 2589 __ sw(a3, MemOperand(sp, argc * kPointerSize)); |
| 2590 } | 2590 } |
| 2591 | 2591 |
| 2592 // Setup the context (function already in r1). | 2592 // Setup the context (function already in r1). |
| 2593 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 2593 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 2594 | 2594 |
| 2595 // Jump to the cached code (tail call). | 2595 // Jump to the cached code (tail call). |
| 2596 Counters* counters = masm()->isolate()->counters(); | 2596 Counters* counters = masm()->isolate()->counters(); |
| 2597 __ IncrementCounter(counters->call_global_inline(), 1, a3, t0); | 2597 __ IncrementCounter(counters->call_global_inline(), 1, a3, t0); |
| 2598 ASSERT(function->is_compiled()); | |
| 2599 Handle<Code> code(function->code()); | 2598 Handle<Code> code(function->code()); |
| 2600 ParameterCount expected(function->shared()->formal_parameter_count()); | 2599 ParameterCount expected(function->shared()->formal_parameter_count()); |
| 2601 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2600 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 2602 ? CALL_AS_FUNCTION | 2601 ? CALL_AS_FUNCTION |
| 2603 : CALL_AS_METHOD; | 2602 : CALL_AS_METHOD; |
| 2604 if (V8::UseCrankshaft()) { | 2603 // We call indirectly through the code field in the function to |
| 2605 // TODO(kasperl): For now, we always call indirectly through the | 2604 // allow recompilation to take effect without changing any of the |
| 2606 // code field in the function to allow recompilation to take effect | 2605 // call sites. |
| 2607 // without changing any of the call sites. | 2606 __ lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
| 2608 __ lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); | 2607 __ InvokeCode(a3, expected, arguments(), JUMP_FUNCTION, |
| 2609 __ InvokeCode(a3, expected, arguments(), JUMP_FUNCTION, | 2608 NullCallWrapper(), call_kind); |
| 2610 NullCallWrapper(), call_kind); | |
| 2611 } else { | |
| 2612 __ InvokeCode(code, expected, arguments(), RelocInfo::CODE_TARGET, | |
| 2613 JUMP_FUNCTION, call_kind); | |
| 2614 } | |
| 2615 | 2609 |
| 2616 // Handle call cache miss. | 2610 // Handle call cache miss. |
| 2617 __ bind(&miss); | 2611 __ bind(&miss); |
| 2618 __ IncrementCounter(counters->call_global_inline_miss(), 1, a1, a3); | 2612 __ IncrementCounter(counters->call_global_inline_miss(), 1, a1, a3); |
| 2619 MaybeObject* maybe_result = GenerateMissBranch(); | 2613 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2620 if (maybe_result->IsFailure()) return maybe_result; | 2614 if (maybe_result->IsFailure()) return maybe_result; |
| 2621 | 2615 |
| 2622 // Return the generated code. | 2616 // Return the generated code. |
| 2623 return GetCode(NORMAL, name); | 2617 return GetCode(NORMAL, name); |
| 2624 } | 2618 } |
| (...skipping 1905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4530 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4524 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); |
| 4531 __ Jump(ic_miss, RelocInfo::CODE_TARGET); | 4525 __ Jump(ic_miss, RelocInfo::CODE_TARGET); |
| 4532 } | 4526 } |
| 4533 | 4527 |
| 4534 | 4528 |
| 4535 #undef __ | 4529 #undef __ |
| 4536 | 4530 |
| 4537 } } // namespace v8::internal | 4531 } } // namespace v8::internal |
| 4538 | 4532 |
| 4539 #endif // V8_TARGET_ARCH_MIPS | 4533 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |