| 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 708 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   719   __ push(name); |   719   __ push(name); | 
|   720   Handle<InterceptorInfo> interceptor(holder_obj->GetNamedInterceptor()); |   720   Handle<InterceptorInfo> interceptor(holder_obj->GetNamedInterceptor()); | 
|   721   ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); |   721   ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); | 
|   722   Register scratch = name; |   722   Register scratch = name; | 
|   723   __ mov(scratch, Operand(interceptor)); |   723   __ mov(scratch, Operand(interceptor)); | 
|   724   __ push(scratch); |   724   __ push(scratch); | 
|   725   __ push(receiver); |   725   __ push(receiver); | 
|   726   __ push(holder); |   726   __ push(holder); | 
|   727   __ ldr(scratch, FieldMemOperand(scratch, InterceptorInfo::kDataOffset)); |   727   __ ldr(scratch, FieldMemOperand(scratch, InterceptorInfo::kDataOffset)); | 
|   728   __ push(scratch); |   728   __ push(scratch); | 
|   729   __ mov(scratch, Operand(ExternalReference::isolate_address())); |   729   __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); | 
|   730   __ push(scratch); |   730   __ push(scratch); | 
|   731 } |   731 } | 
|   732  |   732  | 
|   733  |   733  | 
|   734 static void CompileCallLoadPropertyWithInterceptor( |   734 static void CompileCallLoadPropertyWithInterceptor( | 
|   735     MacroAssembler* masm, |   735     MacroAssembler* masm, | 
|   736     Register receiver, |   736     Register receiver, | 
|   737     Register holder, |   737     Register holder, | 
|   738     Register name, |   738     Register name, | 
|   739     Handle<JSObject> holder_obj) { |   739     Handle<JSObject> holder_obj) { | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   791  |   791  | 
|   792   // Pass the additional arguments. |   792   // Pass the additional arguments. | 
|   793   Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); |   793   Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); | 
|   794   Handle<Object> call_data(api_call_info->data(), masm->isolate()); |   794   Handle<Object> call_data(api_call_info->data(), masm->isolate()); | 
|   795   if (masm->isolate()->heap()->InNewSpace(*call_data)) { |   795   if (masm->isolate()->heap()->InNewSpace(*call_data)) { | 
|   796     __ Move(r0, api_call_info); |   796     __ Move(r0, api_call_info); | 
|   797     __ ldr(r6, FieldMemOperand(r0, CallHandlerInfo::kDataOffset)); |   797     __ ldr(r6, FieldMemOperand(r0, CallHandlerInfo::kDataOffset)); | 
|   798   } else { |   798   } else { | 
|   799     __ Move(r6, call_data); |   799     __ Move(r6, call_data); | 
|   800   } |   800   } | 
|   801   __ mov(r7, Operand(ExternalReference::isolate_address())); |   801   __ mov(r7, Operand(ExternalReference::isolate_address(masm->isolate()))); | 
|   802   // Store JS function, call data and isolate. |   802   // Store JS function, call data and isolate. | 
|   803   __ stm(ib, sp, r5.bit() | r6.bit() | r7.bit()); |   803   __ stm(ib, sp, r5.bit() | r6.bit() | r7.bit()); | 
|   804  |   804  | 
|   805   // Prepare arguments. |   805   // Prepare arguments. | 
|   806   __ add(r2, sp, Operand(3 * kPointerSize)); |   806   __ add(r2, sp, Operand(3 * kPointerSize)); | 
|   807  |   807  | 
|   808   // Allocate the v8::Arguments structure in the arguments' space since |   808   // Allocate the v8::Arguments structure in the arguments' space since | 
|   809   // it's not controlled by GC. |   809   // it's not controlled by GC. | 
|   810   const int kApiStackSpace = 4; |   810   const int kApiStackSpace = 4; | 
|   811  |   811  | 
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1160  |  1160  | 
|  1161     if (save_at_depth == depth) { |  1161     if (save_at_depth == depth) { | 
|  1162       __ str(reg, MemOperand(sp)); |  1162       __ str(reg, MemOperand(sp)); | 
|  1163     } |  1163     } | 
|  1164  |  1164  | 
|  1165     // Go to the next object in the prototype chain. |  1165     // Go to the next object in the prototype chain. | 
|  1166     current = prototype; |  1166     current = prototype; | 
|  1167   } |  1167   } | 
|  1168  |  1168  | 
|  1169   // Log the check depth. |  1169   // Log the check depth. | 
|  1170   LOG(masm()->isolate(), IntEvent("check-maps-depth", depth + 1)); |  1170   LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); | 
|  1171  |  1171  | 
|  1172   if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) { |  1172   if (!holder.is_identical_to(first) || check == CHECK_ALL_MAPS) { | 
|  1173     // Check the holder map. |  1173     // Check the holder map. | 
|  1174     __ CheckMap(reg, scratch1, Handle<Map>(holder->map()), miss, |  1174     __ CheckMap(reg, scratch1, Handle<Map>(holder->map()), miss, | 
|  1175                 DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |  1175                 DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); | 
|  1176   } |  1176   } | 
|  1177  |  1177  | 
|  1178   // Perform security check for access to the global object. |  1178   // Perform security check for access to the global object. | 
|  1179   ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); |  1179   ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); | 
|  1180   if (holder->IsJSGlobalProxy()) { |  1180   if (holder->IsJSGlobalProxy()) { | 
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1288     Handle<ExecutableAccessorInfo> callback) { |  1288     Handle<ExecutableAccessorInfo> callback) { | 
|  1289   // Build AccessorInfo::args_ list on the stack and push property name below |  1289   // Build AccessorInfo::args_ list on the stack and push property name below | 
|  1290   // the exit frame to make GC aware of them and store pointers to them. |  1290   // the exit frame to make GC aware of them and store pointers to them. | 
|  1291   __ push(receiver()); |  1291   __ push(receiver()); | 
|  1292   __ mov(scratch2(), sp);  // scratch2 = AccessorInfo::args_ |  1292   __ mov(scratch2(), sp);  // scratch2 = AccessorInfo::args_ | 
|  1293   if (heap()->InNewSpace(callback->data())) { |  1293   if (heap()->InNewSpace(callback->data())) { | 
|  1294     __ Move(scratch3(), callback); |  1294     __ Move(scratch3(), callback); | 
|  1295     __ ldr(scratch3(), FieldMemOperand(scratch3(), |  1295     __ ldr(scratch3(), FieldMemOperand(scratch3(), | 
|  1296                                        ExecutableAccessorInfo::kDataOffset)); |  1296                                        ExecutableAccessorInfo::kDataOffset)); | 
|  1297   } else { |  1297   } else { | 
|  1298     __ Move(scratch3(), Handle<Object>(callback->data(), |  1298     __ Move(scratch3(), Handle<Object>(callback->data(), isolate())); | 
|  1299                                        callback->GetIsolate())); |  | 
|  1300   } |  1299   } | 
|  1301   __ Push(reg, scratch3()); |  1300   __ Push(reg, scratch3()); | 
|  1302   __ mov(scratch3(), Operand(ExternalReference::isolate_address())); |  1301   __ mov(scratch3(), | 
 |  1302          Operand(ExternalReference::isolate_address(isolate()))); | 
|  1303   __ Push(scratch3(), name()); |  1303   __ Push(scratch3(), name()); | 
|  1304   __ mov(r0, sp);  // r0 = Handle<Name> |  1304   __ mov(r0, sp);  // r0 = Handle<Name> | 
|  1305  |  1305  | 
|  1306   const int kApiStackSpace = 1; |  1306   const int kApiStackSpace = 1; | 
|  1307   FrameScope frame_scope(masm(), StackFrame::MANUAL); |  1307   FrameScope frame_scope(masm(), StackFrame::MANUAL); | 
|  1308   __ EnterExitFrame(false, kApiStackSpace); |  1308   __ EnterExitFrame(false, kApiStackSpace); | 
|  1309  |  1309  | 
|  1310   // Create AccessorInfo instance on the stack above the exit frame with |  1310   // Create AccessorInfo instance on the stack above the exit frame with | 
|  1311   // scratch2 (internal::Object** args_) as the data. |  1311   // scratch2 (internal::Object** args_) as the data. | 
|  1312   __ str(scratch2(), MemOperand(sp, 1 * kPointerSize)); |  1312   __ str(scratch2(), MemOperand(sp, 1 * kPointerSize)); | 
|  1313   __ add(r1, sp, Operand(1 * kPointerSize));  // r1 = AccessorInfo& |  1313   __ add(r1, sp, Operand(1 * kPointerSize));  // r1 = AccessorInfo& | 
|  1314  |  1314  | 
|  1315   const int kStackUnwindSpace = 5; |  1315   const int kStackUnwindSpace = 5; | 
|  1316   Address getter_address = v8::ToCData<Address>(callback->getter()); |  1316   Address getter_address = v8::ToCData<Address>(callback->getter()); | 
|  1317   ApiFunction fun(getter_address); |  1317   ApiFunction fun(getter_address); | 
|  1318   ExternalReference ref = |  1318   ExternalReference ref = ExternalReference( | 
|  1319       ExternalReference(&fun, |  1319       &fun, ExternalReference::DIRECT_GETTER_CALL, isolate()); | 
|  1320                         ExternalReference::DIRECT_GETTER_CALL, |  | 
|  1321                         masm()->isolate()); |  | 
|  1322   __ CallApiFunctionAndReturn(ref, kStackUnwindSpace); |  1320   __ CallApiFunctionAndReturn(ref, kStackUnwindSpace); | 
|  1323 } |  1321 } | 
|  1324  |  1322  | 
|  1325  |  1323  | 
|  1326 void BaseLoadStubCompiler::GenerateLoadInterceptor( |  1324 void BaseLoadStubCompiler::GenerateLoadInterceptor( | 
|  1327     Register holder_reg, |  1325     Register holder_reg, | 
|  1328     Handle<JSObject> object, |  1326     Handle<JSObject> object, | 
|  1329     Handle<JSObject> interceptor_holder, |  1327     Handle<JSObject> interceptor_holder, | 
|  1330     LookupResult* lookup, |  1328     LookupResult* lookup, | 
|  1331     Handle<Name> name) { |  1329     Handle<Name> name) { | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1399  |  1397  | 
|  1400     GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); |  1398     GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); | 
|  1401   } else {  // !compile_followup_inline |  1399   } else {  // !compile_followup_inline | 
|  1402     // Call the runtime system to load the interceptor. |  1400     // Call the runtime system to load the interceptor. | 
|  1403     // Check that the maps haven't changed. |  1401     // Check that the maps haven't changed. | 
|  1404     PushInterceptorArguments(masm(), receiver(), holder_reg, |  1402     PushInterceptorArguments(masm(), receiver(), holder_reg, | 
|  1405                              this->name(), interceptor_holder); |  1403                              this->name(), interceptor_holder); | 
|  1406  |  1404  | 
|  1407     ExternalReference ref = |  1405     ExternalReference ref = | 
|  1408         ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), |  1406         ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), | 
|  1409                           masm()->isolate()); |  1407                           isolate()); | 
|  1410     __ TailCallExternalReference(ref, 6, 1); |  1408     __ TailCallExternalReference(ref, 6, 1); | 
|  1411   } |  1409   } | 
|  1412 } |  1410 } | 
|  1413  |  1411  | 
|  1414  |  1412  | 
|  1415 void CallStubCompiler::GenerateNameCheck(Handle<Name> name, Label* miss) { |  1413 void CallStubCompiler::GenerateNameCheck(Handle<Name> name, Label* miss) { | 
|  1416   if (kind_ == Code::KEYED_CALL_IC) { |  1414   if (kind_ == Code::KEYED_CALL_IC) { | 
|  1417     __ cmp(r2, Operand(name)); |  1415     __ cmp(r2, Operand(name)); | 
|  1418     __ b(ne, miss); |  1416     __ b(ne, miss); | 
|  1419   } |  1417   } | 
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1709  |  1707  | 
|  1710       __ ldr(r2, MemOperand(sp, (argc - 1) * kPointerSize)); |  1708       __ ldr(r2, MemOperand(sp, (argc - 1) * kPointerSize)); | 
|  1711       // Growing elements that are SMI-only requires special handling in case |  1709       // Growing elements that are SMI-only requires special handling in case | 
|  1712       // the new element is non-Smi. For now, delegate to the builtin. |  1710       // the new element is non-Smi. For now, delegate to the builtin. | 
|  1713       Label no_fast_elements_check; |  1711       Label no_fast_elements_check; | 
|  1714       __ JumpIfSmi(r2, &no_fast_elements_check); |  1712       __ JumpIfSmi(r2, &no_fast_elements_check); | 
|  1715       __ ldr(r7, FieldMemOperand(receiver, HeapObject::kMapOffset)); |  1713       __ ldr(r7, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 
|  1716       __ CheckFastObjectElements(r7, r7, &call_builtin); |  1714       __ CheckFastObjectElements(r7, r7, &call_builtin); | 
|  1717       __ bind(&no_fast_elements_check); |  1715       __ bind(&no_fast_elements_check); | 
|  1718  |  1716  | 
|  1719       Isolate* isolate = masm()->isolate(); |  | 
|  1720       ExternalReference new_space_allocation_top = |  1717       ExternalReference new_space_allocation_top = | 
|  1721           ExternalReference::new_space_allocation_top_address(isolate); |  1718           ExternalReference::new_space_allocation_top_address(isolate()); | 
|  1722       ExternalReference new_space_allocation_limit = |  1719       ExternalReference new_space_allocation_limit = | 
|  1723           ExternalReference::new_space_allocation_limit_address(isolate); |  1720           ExternalReference::new_space_allocation_limit_address(isolate()); | 
|  1724  |  1721  | 
|  1725       const int kAllocationDelta = 4; |  1722       const int kAllocationDelta = 4; | 
|  1726       // Load top and check if it is the end of elements. |  1723       // Load top and check if it is the end of elements. | 
|  1727       __ add(end_elements, elements, |  1724       __ add(end_elements, elements, | 
|  1728              Operand(r0, LSL, kPointerSizeLog2 - kSmiTagSize)); |  1725              Operand(r0, LSL, kPointerSizeLog2 - kSmiTagSize)); | 
|  1729       __ add(end_elements, end_elements, Operand(kEndElementsOffset)); |  1726       __ add(end_elements, end_elements, Operand(kEndElementsOffset)); | 
|  1730       __ mov(r7, Operand(new_space_allocation_top)); |  1727       __ mov(r7, Operand(new_space_allocation_top)); | 
|  1731       __ ldr(r3, MemOperand(r7)); |  1728       __ ldr(r3, MemOperand(r7)); | 
|  1732       __ cmp(end_elements, r3); |  1729       __ cmp(end_elements, r3); | 
|  1733       __ b(ne, &call_builtin); |  1730       __ b(ne, &call_builtin); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  1752       // Update elements' and array's sizes. |  1749       // Update elements' and array's sizes. | 
|  1753       __ str(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |  1750       __ str(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 
|  1754       __ add(r4, r4, Operand(Smi::FromInt(kAllocationDelta))); |  1751       __ add(r4, r4, Operand(Smi::FromInt(kAllocationDelta))); | 
|  1755       __ str(r4, FieldMemOperand(elements, FixedArray::kLengthOffset)); |  1752       __ str(r4, FieldMemOperand(elements, FixedArray::kLengthOffset)); | 
|  1756  |  1753  | 
|  1757       // Elements are in new space, so write barrier is not required. |  1754       // Elements are in new space, so write barrier is not required. | 
|  1758       __ Drop(argc + 1); |  1755       __ Drop(argc + 1); | 
|  1759       __ Ret(); |  1756       __ Ret(); | 
|  1760     } |  1757     } | 
|  1761     __ bind(&call_builtin); |  1758     __ bind(&call_builtin); | 
|  1762     __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush, |  1759     __ TailCallExternalReference( | 
|  1763                                                    masm()->isolate()), |  1760         ExternalReference(Builtins::c_ArrayPush, isolate()), argc + 1, 1); | 
|  1764                                  argc + 1, |  | 
|  1765                                  1); |  | 
|  1766   } |  1761   } | 
|  1767  |  1762  | 
|  1768   // Handle call cache miss. |  1763   // Handle call cache miss. | 
|  1769   __ bind(&miss); |  1764   __ bind(&miss); | 
|  1770   GenerateMissBranch(); |  1765   GenerateMissBranch(); | 
|  1771  |  1766  | 
|  1772   // Return the generated code. |  1767   // Return the generated code. | 
|  1773   return GetCode(function); |  1768   return GetCode(function); | 
|  1774 } |  1769 } | 
|  1775  |  1770  | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1839   __ str(r6, FieldMemOperand(elements, FixedArray::kHeaderSize)); |  1834   __ str(r6, FieldMemOperand(elements, FixedArray::kHeaderSize)); | 
|  1840   __ Drop(argc + 1); |  1835   __ Drop(argc + 1); | 
|  1841   __ Ret(); |  1836   __ Ret(); | 
|  1842  |  1837  | 
|  1843   __ bind(&return_undefined); |  1838   __ bind(&return_undefined); | 
|  1844   __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); |  1839   __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); | 
|  1845   __ Drop(argc + 1); |  1840   __ Drop(argc + 1); | 
|  1846   __ Ret(); |  1841   __ Ret(); | 
|  1847  |  1842  | 
|  1848   __ bind(&call_builtin); |  1843   __ bind(&call_builtin); | 
|  1849   __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop, |  1844   __ TailCallExternalReference( | 
|  1850                                                  masm()->isolate()), |  1845       ExternalReference(Builtins::c_ArrayPop, isolate()), argc + 1, 1); | 
|  1851                                argc + 1, |  | 
|  1852                                1); |  | 
|  1853  |  1846  | 
|  1854   // Handle call cache miss. |  1847   // Handle call cache miss. | 
|  1855   __ bind(&miss); |  1848   __ bind(&miss); | 
|  1856   GenerateMissBranch(); |  1849   GenerateMissBranch(); | 
|  1857  |  1850  | 
|  1858   // Return the generated code. |  1851   // Return the generated code. | 
|  1859   return GetCode(function); |  1852   return GetCode(function); | 
|  1860 } |  1853 } | 
|  1861  |  1854  | 
|  1862  |  1855  | 
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2381   // Check that the receiver isn't a smi. |  2374   // Check that the receiver isn't a smi. | 
|  2382   if (check != NUMBER_CHECK) { |  2375   if (check != NUMBER_CHECK) { | 
|  2383     __ JumpIfSmi(r1, &miss); |  2376     __ JumpIfSmi(r1, &miss); | 
|  2384   } |  2377   } | 
|  2385  |  2378  | 
|  2386   // Make sure that it's okay not to patch the on stack receiver |  2379   // Make sure that it's okay not to patch the on stack receiver | 
|  2387   // unless we're doing a receiver map check. |  2380   // unless we're doing a receiver map check. | 
|  2388   ASSERT(!object->IsGlobalObject() || check == RECEIVER_MAP_CHECK); |  2381   ASSERT(!object->IsGlobalObject() || check == RECEIVER_MAP_CHECK); | 
|  2389   switch (check) { |  2382   switch (check) { | 
|  2390     case RECEIVER_MAP_CHECK: |  2383     case RECEIVER_MAP_CHECK: | 
|  2391       __ IncrementCounter(masm()->isolate()->counters()->call_const(), |  2384       __ IncrementCounter(isolate()->counters()->call_const(), 1, r0, r3); | 
|  2392                           1, r0, r3); |  | 
|  2393  |  2385  | 
|  2394       // Check that the maps haven't changed. |  2386       // Check that the maps haven't changed. | 
|  2395       CheckPrototypes(Handle<JSObject>::cast(object), r1, holder, r0, r3, r4, |  2387       CheckPrototypes(Handle<JSObject>::cast(object), r1, holder, r0, r3, r4, | 
|  2396                       name, &miss); |  2388                       name, &miss); | 
|  2397  |  2389  | 
|  2398       // Patch the receiver on the stack with the global proxy if |  2390       // Patch the receiver on the stack with the global proxy if | 
|  2399       // necessary. |  2391       // necessary. | 
|  2400       if (object->IsGlobalObject()) { |  2392       if (object->IsGlobalObject()) { | 
|  2401         __ ldr(r3, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |  2393         __ ldr(r3, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 
|  2402         __ str(r3, MemOperand(sp, argc * kPointerSize)); |  2394         __ str(r3, MemOperand(sp, argc * kPointerSize)); | 
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2572   // necessary. |  2564   // necessary. | 
|  2573   if (object->IsGlobalObject()) { |  2565   if (object->IsGlobalObject()) { | 
|  2574     __ ldr(r3, FieldMemOperand(r0, GlobalObject::kGlobalReceiverOffset)); |  2566     __ ldr(r3, FieldMemOperand(r0, GlobalObject::kGlobalReceiverOffset)); | 
|  2575     __ str(r3, MemOperand(sp, argc * kPointerSize)); |  2567     __ str(r3, MemOperand(sp, argc * kPointerSize)); | 
|  2576   } |  2568   } | 
|  2577  |  2569  | 
|  2578   // Set up the context (function already in r1). |  2570   // Set up the context (function already in r1). | 
|  2579   __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |  2571   __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 
|  2580  |  2572  | 
|  2581   // Jump to the cached code (tail call). |  2573   // Jump to the cached code (tail call). | 
|  2582   Counters* counters = masm()->isolate()->counters(); |  2574   Counters* counters = isolate()->counters(); | 
|  2583   __ IncrementCounter(counters->call_global_inline(), 1, r3, r4); |  2575   __ IncrementCounter(counters->call_global_inline(), 1, r3, r4); | 
|  2584   ParameterCount expected(function->shared()->formal_parameter_count()); |  2576   ParameterCount expected(function->shared()->formal_parameter_count()); | 
|  2585   CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |  2577   CallKind call_kind = CallICBase::Contextual::decode(extra_state_) | 
|  2586       ? CALL_AS_FUNCTION |  2578       ? CALL_AS_FUNCTION | 
|  2587       : CALL_AS_METHOD; |  2579       : CALL_AS_METHOD; | 
|  2588   // We call indirectly through the code field in the function to |  2580   // We call indirectly through the code field in the function to | 
|  2589   // allow recompilation to take effect without changing any of the |  2581   // allow recompilation to take effect without changing any of the | 
|  2590   // call sites. |  2582   // call sites. | 
|  2591   __ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); |  2583   __ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); | 
|  2592   __ InvokeCode(r3, expected, arguments(), JUMP_FUNCTION, |  2584   __ InvokeCode(r3, expected, arguments(), JUMP_FUNCTION, | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  2615  |  2607  | 
|  2616   // Stub never generated for non-global objects that require access checks. |  2608   // Stub never generated for non-global objects that require access checks. | 
|  2617   ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); |  2609   ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); | 
|  2618  |  2610  | 
|  2619   __ push(receiver());  // receiver |  2611   __ push(receiver());  // receiver | 
|  2620   __ mov(ip, Operand(callback));  // callback info |  2612   __ mov(ip, Operand(callback));  // callback info | 
|  2621   __ Push(ip, this->name(), value()); |  2613   __ Push(ip, this->name(), value()); | 
|  2622  |  2614  | 
|  2623   // Do tail-call to the runtime system. |  2615   // Do tail-call to the runtime system. | 
|  2624   ExternalReference store_callback_property = |  2616   ExternalReference store_callback_property = | 
|  2625       ExternalReference(IC_Utility(IC::kStoreCallbackProperty), |  2617       ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); | 
|  2626                         masm()->isolate()); |  | 
|  2627   __ TailCallExternalReference(store_callback_property, 4, 1); |  2618   __ TailCallExternalReference(store_callback_property, 4, 1); | 
|  2628  |  2619  | 
|  2629   // Handle store cache miss. |  2620   // Handle store cache miss. | 
|  2630   __ bind(&miss); |  2621   __ bind(&miss); | 
|  2631   TailCallBuiltin(masm(), MissBuiltin(kind())); |  2622   TailCallBuiltin(masm(), MissBuiltin(kind())); | 
|  2632  |  2623  | 
|  2633   // Return the generated code. |  2624   // Return the generated code. | 
|  2634   return GetICCode(kind(), Code::CALLBACKS, name); |  2625   return GetICCode(kind(), Code::CALLBACKS, name); | 
|  2635 } |  2626 } | 
|  2636  |  2627  | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2699   // checks. |  2690   // checks. | 
|  2700   ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); |  2691   ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); | 
|  2701  |  2692  | 
|  2702   __ Push(receiver(), this->name(), value()); |  2693   __ Push(receiver(), this->name(), value()); | 
|  2703  |  2694  | 
|  2704   __ mov(scratch1(), Operand(Smi::FromInt(strict_mode()))); |  2695   __ mov(scratch1(), Operand(Smi::FromInt(strict_mode()))); | 
|  2705   __ push(scratch1());  // strict mode |  2696   __ push(scratch1());  // strict mode | 
|  2706  |  2697  | 
|  2707   // Do tail-call to the runtime system. |  2698   // Do tail-call to the runtime system. | 
|  2708   ExternalReference store_ic_property = |  2699   ExternalReference store_ic_property = | 
|  2709       ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), |  2700       ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); | 
|  2710                         masm()->isolate()); |  | 
|  2711   __ TailCallExternalReference(store_ic_property, 4, 1); |  2701   __ TailCallExternalReference(store_ic_property, 4, 1); | 
|  2712  |  2702  | 
|  2713   // Handle store cache miss. |  2703   // Handle store cache miss. | 
|  2714   __ bind(&miss); |  2704   __ bind(&miss); | 
|  2715   TailCallBuiltin(masm(), MissBuiltin(kind())); |  2705   TailCallBuiltin(masm(), MissBuiltin(kind())); | 
|  2716  |  2706  | 
|  2717   // Return the generated code. |  2707   // Return the generated code. | 
|  2718   return GetICCode(kind(), Code::INTERCEPTOR, name); |  2708   return GetICCode(kind(), Code::INTERCEPTOR, name); | 
|  2719 } |  2709 } | 
|  2720  |  2710  | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  2739   __ ldr(scratch3(), |  2729   __ ldr(scratch3(), | 
|  2740          FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset)); |  2730          FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset)); | 
|  2741   __ cmp(scratch3(), scratch2()); |  2731   __ cmp(scratch3(), scratch2()); | 
|  2742   __ b(eq, &miss); |  2732   __ b(eq, &miss); | 
|  2743  |  2733  | 
|  2744   // Store the value in the cell. |  2734   // Store the value in the cell. | 
|  2745   __ str(value(), |  2735   __ str(value(), | 
|  2746          FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset)); |  2736          FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset)); | 
|  2747   // Cells are always rescanned, so no write barrier here. |  2737   // Cells are always rescanned, so no write barrier here. | 
|  2748  |  2738  | 
|  2749   Counters* counters = masm()->isolate()->counters(); |  2739   Counters* counters = isolate()->counters(); | 
|  2750   __ IncrementCounter( |  2740   __ IncrementCounter( | 
|  2751       counters->named_store_global_inline(), 1, scratch1(), scratch2()); |  2741       counters->named_store_global_inline(), 1, scratch1(), scratch2()); | 
|  2752   __ Ret(); |  2742   __ Ret(); | 
|  2753  |  2743  | 
|  2754   // Handle store cache miss. |  2744   // Handle store cache miss. | 
|  2755   __ bind(&miss); |  2745   __ bind(&miss); | 
|  2756   __ IncrementCounter( |  2746   __ IncrementCounter( | 
|  2757       counters->named_store_global_inline_miss(), 1, scratch1(), scratch2()); |  2747       counters->named_store_global_inline_miss(), 1, scratch1(), scratch2()); | 
|  2758   TailCallBuiltin(masm(), MissBuiltin(kind())); |  2748   TailCallBuiltin(masm(), MissBuiltin(kind())); | 
|  2759  |  2749  | 
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2884   // Check for deleted property if property can actually be deleted. |  2874   // Check for deleted property if property can actually be deleted. | 
|  2885   if (!is_dont_delete) { |  2875   if (!is_dont_delete) { | 
|  2886     __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |  2876     __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 
|  2887     __ cmp(r4, ip); |  2877     __ cmp(r4, ip); | 
|  2888     __ b(eq, &miss); |  2878     __ b(eq, &miss); | 
|  2889   } |  2879   } | 
|  2890  |  2880  | 
|  2891   HandlerFrontendFooter(&success, &miss); |  2881   HandlerFrontendFooter(&success, &miss); | 
|  2892   __ bind(&success); |  2882   __ bind(&success); | 
|  2893  |  2883  | 
|  2894   Counters* counters = masm()->isolate()->counters(); |  2884   Counters* counters = isolate()->counters(); | 
|  2895   __ IncrementCounter(counters->named_load_global_stub(), 1, r1, r3); |  2885   __ IncrementCounter(counters->named_load_global_stub(), 1, r1, r3); | 
|  2896   __ mov(r0, r4); |  2886   __ mov(r0, r4); | 
|  2897   __ Ret(); |  2887   __ Ret(); | 
|  2898  |  2888  | 
|  2899   // Return the generated code. |  2889   // Return the generated code. | 
|  2900   return GetICCode(kind(), Code::NORMAL, name); |  2890   return GetICCode(kind(), Code::NORMAL, name); | 
|  2901 } |  2891 } | 
|  2902  |  2892  | 
|  2903  |  2893  | 
|  2904 Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC( |  2894 Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC( | 
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3088   // Move argc to r1 and the JSObject to return to r0 and tag it. |  3078   // Move argc to r1 and the JSObject to return to r0 and tag it. | 
|  3089   __ mov(r1, r0); |  3079   __ mov(r1, r0); | 
|  3090   __ mov(r0, r4); |  3080   __ mov(r0, r4); | 
|  3091   __ orr(r0, r0, Operand(kHeapObjectTag)); |  3081   __ orr(r0, r0, Operand(kHeapObjectTag)); | 
|  3092  |  3082  | 
|  3093   // r0: JSObject |  3083   // r0: JSObject | 
|  3094   // r1: argc |  3084   // r1: argc | 
|  3095   // Remove caller arguments and receiver from the stack and return. |  3085   // Remove caller arguments and receiver from the stack and return. | 
|  3096   __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2)); |  3086   __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2)); | 
|  3097   __ add(sp, sp, Operand(kPointerSize)); |  3087   __ add(sp, sp, Operand(kPointerSize)); | 
|  3098   Counters* counters = masm()->isolate()->counters(); |  3088   Counters* counters = isolate()->counters(); | 
|  3099   __ IncrementCounter(counters->constructed_objects(), 1, r1, r2); |  3089   __ IncrementCounter(counters->constructed_objects(), 1, r1, r2); | 
|  3100   __ IncrementCounter(counters->constructed_objects_stub(), 1, r1, r2); |  3090   __ IncrementCounter(counters->constructed_objects_stub(), 1, r1, r2); | 
|  3101   __ Jump(lr); |  3091   __ Jump(lr); | 
|  3102  |  3092  | 
|  3103   // Jump to the generic stub in case the specialized code cannot handle the |  3093   // Jump to the generic stub in case the specialized code cannot handle the | 
|  3104   // construction. |  3094   // construction. | 
|  3105   __ bind(&generic_stub_call); |  3095   __ bind(&generic_stub_call); | 
|  3106   Handle<Code> code = masm()->isolate()->builtins()->JSConstructStubGeneric(); |  3096   Handle<Code> code = isolate()->builtins()->JSConstructStubGeneric(); | 
|  3107   __ Jump(code, RelocInfo::CODE_TARGET); |  3097   __ Jump(code, RelocInfo::CODE_TARGET); | 
|  3108  |  3098  | 
|  3109   // Return the generated code. |  3099   // Return the generated code. | 
|  3110   return GetCode(); |  3100   return GetCode(); | 
|  3111 } |  3101 } | 
|  3112  |  3102  | 
|  3113  |  3103  | 
|  3114 #undef __ |  3104 #undef __ | 
|  3115 #define __ ACCESS_MASM(masm) |  3105 #define __ ACCESS_MASM(masm) | 
|  3116  |  3106  | 
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3667     TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |  3657     TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 
|  3668   } |  3658   } | 
|  3669 } |  3659 } | 
|  3670  |  3660  | 
|  3671  |  3661  | 
|  3672 #undef __ |  3662 #undef __ | 
|  3673  |  3663  | 
|  3674 } }  // namespace v8::internal |  3664 } }  // namespace v8::internal | 
|  3675  |  3665  | 
|  3676 #endif  // V8_TARGET_ARCH_ARM |  3666 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW |