| 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 | 
|---|