Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 14429003: Refactor ExternalReference::isolate_address() to not rely on Isolate::Current(). (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: addressed comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/regexp-macro-assembler-arm.cc ('k') | src/assembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/arm/regexp-macro-assembler-arm.cc ('k') | src/assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698