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 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 | 420 |
421 | 421 |
422 // Generate code to check that a global property cell is empty. Create | 422 // Generate code to check that a global property cell is empty. Create |
423 // the property cell at compilation time if no cell exists for the | 423 // the property cell at compilation time if no cell exists for the |
424 // property. | 424 // property. |
425 static void GenerateCheckPropertyCell(MacroAssembler* masm, | 425 static void GenerateCheckPropertyCell(MacroAssembler* masm, |
426 Handle<GlobalObject> global, | 426 Handle<GlobalObject> global, |
427 Handle<Name> name, | 427 Handle<Name> name, |
428 Register scratch, | 428 Register scratch, |
429 Label* miss) { | 429 Label* miss) { |
430 Handle<JSGlobalPropertyCell> cell = | 430 Handle<Cell> cell = GlobalObject::EnsurePropertyCell(global, name); |
431 GlobalObject::EnsurePropertyCell(global, name); | |
432 ASSERT(cell->value()->IsTheHole()); | 431 ASSERT(cell->value()->IsTheHole()); |
433 __ mov(scratch, Operand(cell)); | 432 __ mov(scratch, Operand(cell)); |
434 __ ldr(scratch, | 433 __ ldr(scratch, FieldMemOperand(scratch, Cell::kValueOffset)); |
435 FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset)); | |
436 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 434 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
437 __ cmp(scratch, ip); | 435 __ cmp(scratch, ip); |
438 __ b(ne, miss); | 436 __ b(ne, miss); |
439 } | 437 } |
440 | 438 |
441 | 439 |
442 // Generate StoreTransition code, value is passed in r0 register. | 440 // Generate StoreTransition code, value is passed in r0 register. |
443 // When leaving generated code after success, the receiver_reg and name_reg | 441 // When leaving generated code after success, the receiver_reg and name_reg |
444 // may be clobbered. Upon branch to miss_label, the receiver and name | 442 // may be clobbered. Upon branch to miss_label, the receiver and name |
445 // registers have their original values. | 443 // registers have their original values. |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1579 // Get the receiver from the stack. | 1577 // Get the receiver from the stack. |
1580 __ ldr(r0, MemOperand(sp, argc * kPointerSize)); | 1578 __ ldr(r0, MemOperand(sp, argc * kPointerSize)); |
1581 | 1579 |
1582 // Check that the maps haven't changed. | 1580 // Check that the maps haven't changed. |
1583 __ JumpIfSmi(r0, miss); | 1581 __ JumpIfSmi(r0, miss); |
1584 CheckPrototypes(object, r0, holder, r3, r1, r4, name, miss); | 1582 CheckPrototypes(object, r0, holder, r3, r1, r4, name, miss); |
1585 } | 1583 } |
1586 | 1584 |
1587 | 1585 |
1588 void CallStubCompiler::GenerateLoadFunctionFromCell( | 1586 void CallStubCompiler::GenerateLoadFunctionFromCell( |
1589 Handle<JSGlobalPropertyCell> cell, | 1587 Handle<Cell> cell, |
1590 Handle<JSFunction> function, | 1588 Handle<JSFunction> function, |
1591 Label* miss) { | 1589 Label* miss) { |
1592 // Get the value from the cell. | 1590 // Get the value from the cell. |
1593 __ mov(r3, Operand(cell)); | 1591 __ mov(r3, Operand(cell)); |
1594 __ ldr(r1, FieldMemOperand(r3, JSGlobalPropertyCell::kValueOffset)); | 1592 __ ldr(r1, FieldMemOperand(r3, Cell::kValueOffset)); |
1595 | 1593 |
1596 // Check that the cell contains the same function. | 1594 // Check that the cell contains the same function. |
1597 if (heap()->InNewSpace(*function)) { | 1595 if (heap()->InNewSpace(*function)) { |
1598 // We can't embed a pointer to a function in new space so we have | 1596 // We can't embed a pointer to a function in new space so we have |
1599 // to verify that the shared function info is unchanged. This has | 1597 // to verify that the shared function info is unchanged. This has |
1600 // the nice side effect that multiple closures based on the same | 1598 // the nice side effect that multiple closures based on the same |
1601 // function can all use this call IC. Before we load through the | 1599 // function can all use this call IC. Before we load through the |
1602 // function, we have to verify that it still is a function. | 1600 // function, we have to verify that it still is a function. |
1603 __ JumpIfSmi(r1, miss); | 1601 __ JumpIfSmi(r1, miss); |
1604 __ CompareObjectType(r1, r3, r3, JS_FUNCTION_TYPE); | 1602 __ CompareObjectType(r1, r3, r3, JS_FUNCTION_TYPE); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1655 GenerateMissBranch(); | 1653 GenerateMissBranch(); |
1656 | 1654 |
1657 // Return the generated code. | 1655 // Return the generated code. |
1658 return GetCode(Code::FIELD, name); | 1656 return GetCode(Code::FIELD, name); |
1659 } | 1657 } |
1660 | 1658 |
1661 | 1659 |
1662 Handle<Code> CallStubCompiler::CompileArrayPushCall( | 1660 Handle<Code> CallStubCompiler::CompileArrayPushCall( |
1663 Handle<Object> object, | 1661 Handle<Object> object, |
1664 Handle<JSObject> holder, | 1662 Handle<JSObject> holder, |
1665 Handle<JSGlobalPropertyCell> cell, | 1663 Handle<Cell> cell, |
1666 Handle<JSFunction> function, | 1664 Handle<JSFunction> function, |
1667 Handle<String> name) { | 1665 Handle<String> name) { |
1668 // ----------- S t a t e ------------- | 1666 // ----------- S t a t e ------------- |
1669 // -- r2 : name | 1667 // -- r2 : name |
1670 // -- lr : return address | 1668 // -- lr : return address |
1671 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 1669 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
1672 // -- ... | 1670 // -- ... |
1673 // -- sp[argc * 4] : receiver | 1671 // -- sp[argc * 4] : receiver |
1674 // ----------------------------------- | 1672 // ----------------------------------- |
1675 | 1673 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1908 GenerateMissBranch(); | 1906 GenerateMissBranch(); |
1909 | 1907 |
1910 // Return the generated code. | 1908 // Return the generated code. |
1911 return GetCode(function); | 1909 return GetCode(function); |
1912 } | 1910 } |
1913 | 1911 |
1914 | 1912 |
1915 Handle<Code> CallStubCompiler::CompileArrayPopCall( | 1913 Handle<Code> CallStubCompiler::CompileArrayPopCall( |
1916 Handle<Object> object, | 1914 Handle<Object> object, |
1917 Handle<JSObject> holder, | 1915 Handle<JSObject> holder, |
1918 Handle<JSGlobalPropertyCell> cell, | 1916 Handle<Cell> cell, |
1919 Handle<JSFunction> function, | 1917 Handle<JSFunction> function, |
1920 Handle<String> name) { | 1918 Handle<String> name) { |
1921 // ----------- S t a t e ------------- | 1919 // ----------- S t a t e ------------- |
1922 // -- r2 : name | 1920 // -- r2 : name |
1923 // -- lr : return address | 1921 // -- lr : return address |
1924 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 1922 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
1925 // -- ... | 1923 // -- ... |
1926 // -- sp[argc * 4] : receiver | 1924 // -- sp[argc * 4] : receiver |
1927 // ----------------------------------- | 1925 // ----------------------------------- |
1928 | 1926 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1990 GenerateMissBranch(); | 1988 GenerateMissBranch(); |
1991 | 1989 |
1992 // Return the generated code. | 1990 // Return the generated code. |
1993 return GetCode(function); | 1991 return GetCode(function); |
1994 } | 1992 } |
1995 | 1993 |
1996 | 1994 |
1997 Handle<Code> CallStubCompiler::CompileStringCharCodeAtCall( | 1995 Handle<Code> CallStubCompiler::CompileStringCharCodeAtCall( |
1998 Handle<Object> object, | 1996 Handle<Object> object, |
1999 Handle<JSObject> holder, | 1997 Handle<JSObject> holder, |
2000 Handle<JSGlobalPropertyCell> cell, | 1998 Handle<Cell> cell, |
2001 Handle<JSFunction> function, | 1999 Handle<JSFunction> function, |
2002 Handle<String> name) { | 2000 Handle<String> name) { |
2003 // ----------- S t a t e ------------- | 2001 // ----------- S t a t e ------------- |
2004 // -- r2 : function name | 2002 // -- r2 : function name |
2005 // -- lr : return address | 2003 // -- lr : return address |
2006 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 2004 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
2007 // -- ... | 2005 // -- ... |
2008 // -- sp[argc * 4] : receiver | 2006 // -- sp[argc * 4] : receiver |
2009 // ----------------------------------- | 2007 // ----------------------------------- |
2010 | 2008 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2072 GenerateMissBranch(); | 2070 GenerateMissBranch(); |
2073 | 2071 |
2074 // Return the generated code. | 2072 // Return the generated code. |
2075 return GetCode(function); | 2073 return GetCode(function); |
2076 } | 2074 } |
2077 | 2075 |
2078 | 2076 |
2079 Handle<Code> CallStubCompiler::CompileStringCharAtCall( | 2077 Handle<Code> CallStubCompiler::CompileStringCharAtCall( |
2080 Handle<Object> object, | 2078 Handle<Object> object, |
2081 Handle<JSObject> holder, | 2079 Handle<JSObject> holder, |
2082 Handle<JSGlobalPropertyCell> cell, | 2080 Handle<Cell> cell, |
2083 Handle<JSFunction> function, | 2081 Handle<JSFunction> function, |
2084 Handle<String> name) { | 2082 Handle<String> name) { |
2085 // ----------- S t a t e ------------- | 2083 // ----------- S t a t e ------------- |
2086 // -- r2 : function name | 2084 // -- r2 : function name |
2087 // -- lr : return address | 2085 // -- lr : return address |
2088 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 2086 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
2089 // -- ... | 2087 // -- ... |
2090 // -- sp[argc * 4] : receiver | 2088 // -- sp[argc * 4] : receiver |
2091 // ----------------------------------- | 2089 // ----------------------------------- |
2092 | 2090 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2155 GenerateMissBranch(); | 2153 GenerateMissBranch(); |
2156 | 2154 |
2157 // Return the generated code. | 2155 // Return the generated code. |
2158 return GetCode(function); | 2156 return GetCode(function); |
2159 } | 2157 } |
2160 | 2158 |
2161 | 2159 |
2162 Handle<Code> CallStubCompiler::CompileStringFromCharCodeCall( | 2160 Handle<Code> CallStubCompiler::CompileStringFromCharCodeCall( |
2163 Handle<Object> object, | 2161 Handle<Object> object, |
2164 Handle<JSObject> holder, | 2162 Handle<JSObject> holder, |
2165 Handle<JSGlobalPropertyCell> cell, | 2163 Handle<Cell> cell, |
2166 Handle<JSFunction> function, | 2164 Handle<JSFunction> function, |
2167 Handle<String> name) { | 2165 Handle<String> name) { |
2168 // ----------- S t a t e ------------- | 2166 // ----------- S t a t e ------------- |
2169 // -- r2 : function name | 2167 // -- r2 : function name |
2170 // -- lr : return address | 2168 // -- lr : return address |
2171 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 2169 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
2172 // -- ... | 2170 // -- ... |
2173 // -- sp[argc * 4] : receiver | 2171 // -- sp[argc * 4] : receiver |
2174 // ----------------------------------- | 2172 // ----------------------------------- |
2175 | 2173 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2227 GenerateMissBranch(); | 2225 GenerateMissBranch(); |
2228 | 2226 |
2229 // Return the generated code. | 2227 // Return the generated code. |
2230 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2228 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
2231 } | 2229 } |
2232 | 2230 |
2233 | 2231 |
2234 Handle<Code> CallStubCompiler::CompileMathFloorCall( | 2232 Handle<Code> CallStubCompiler::CompileMathFloorCall( |
2235 Handle<Object> object, | 2233 Handle<Object> object, |
2236 Handle<JSObject> holder, | 2234 Handle<JSObject> holder, |
2237 Handle<JSGlobalPropertyCell> cell, | 2235 Handle<Cell> cell, |
2238 Handle<JSFunction> function, | 2236 Handle<JSFunction> function, |
2239 Handle<String> name) { | 2237 Handle<String> name) { |
2240 // ----------- S t a t e ------------- | 2238 // ----------- S t a t e ------------- |
2241 // -- r2 : function name | 2239 // -- r2 : function name |
2242 // -- lr : return address | 2240 // -- lr : return address |
2243 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 2241 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
2244 // -- ... | 2242 // -- ... |
2245 // -- sp[argc * 4] : receiver | 2243 // -- sp[argc * 4] : receiver |
2246 // ----------------------------------- | 2244 // ----------------------------------- |
2247 | 2245 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2335 GenerateMissBranch(); | 2333 GenerateMissBranch(); |
2336 | 2334 |
2337 // Return the generated code. | 2335 // Return the generated code. |
2338 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2336 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
2339 } | 2337 } |
2340 | 2338 |
2341 | 2339 |
2342 Handle<Code> CallStubCompiler::CompileMathAbsCall( | 2340 Handle<Code> CallStubCompiler::CompileMathAbsCall( |
2343 Handle<Object> object, | 2341 Handle<Object> object, |
2344 Handle<JSObject> holder, | 2342 Handle<JSObject> holder, |
2345 Handle<JSGlobalPropertyCell> cell, | 2343 Handle<Cell> cell, |
2346 Handle<JSFunction> function, | 2344 Handle<JSFunction> function, |
2347 Handle<String> name) { | 2345 Handle<String> name) { |
2348 // ----------- S t a t e ------------- | 2346 // ----------- S t a t e ------------- |
2349 // -- r2 : function name | 2347 // -- r2 : function name |
2350 // -- lr : return address | 2348 // -- lr : return address |
2351 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) | 2349 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) |
2352 // -- ... | 2350 // -- ... |
2353 // -- sp[argc * 4] : receiver | 2351 // -- sp[argc * 4] : receiver |
2354 // ----------------------------------- | 2352 // ----------------------------------- |
2355 | 2353 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2434 | 2432 |
2435 // Return the generated code. | 2433 // Return the generated code. |
2436 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); | 2434 return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name); |
2437 } | 2435 } |
2438 | 2436 |
2439 | 2437 |
2440 Handle<Code> CallStubCompiler::CompileFastApiCall( | 2438 Handle<Code> CallStubCompiler::CompileFastApiCall( |
2441 const CallOptimization& optimization, | 2439 const CallOptimization& optimization, |
2442 Handle<Object> object, | 2440 Handle<Object> object, |
2443 Handle<JSObject> holder, | 2441 Handle<JSObject> holder, |
2444 Handle<JSGlobalPropertyCell> cell, | 2442 Handle<Cell> cell, |
2445 Handle<JSFunction> function, | 2443 Handle<JSFunction> function, |
2446 Handle<String> name) { | 2444 Handle<String> name) { |
2447 Counters* counters = isolate()->counters(); | 2445 Counters* counters = isolate()->counters(); |
2448 | 2446 |
2449 ASSERT(optimization.is_simple_api_call()); | 2447 ASSERT(optimization.is_simple_api_call()); |
2450 // Bail out if object is a global object as we don't want to | 2448 // Bail out if object is a global object as we don't want to |
2451 // repatch it to global receiver. | 2449 // repatch it to global receiver. |
2452 if (object->IsGlobalObject()) return Handle<Code>::null(); | 2450 if (object->IsGlobalObject()) return Handle<Code>::null(); |
2453 if (!cell.is_null()) return Handle<Code>::null(); | 2451 if (!cell.is_null()) return Handle<Code>::null(); |
2454 if (!object->IsJSObject()) return Handle<Code>::null(); | 2452 if (!object->IsJSObject()) return Handle<Code>::null(); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2606 | 2604 |
2607 | 2605 |
2608 Handle<Code> CallStubCompiler::CompileCallConstant( | 2606 Handle<Code> CallStubCompiler::CompileCallConstant( |
2609 Handle<Object> object, | 2607 Handle<Object> object, |
2610 Handle<JSObject> holder, | 2608 Handle<JSObject> holder, |
2611 Handle<Name> name, | 2609 Handle<Name> name, |
2612 CheckType check, | 2610 CheckType check, |
2613 Handle<JSFunction> function) { | 2611 Handle<JSFunction> function) { |
2614 if (HasCustomCallGenerator(function)) { | 2612 if (HasCustomCallGenerator(function)) { |
2615 Handle<Code> code = CompileCustomCall(object, holder, | 2613 Handle<Code> code = CompileCustomCall(object, holder, |
2616 Handle<JSGlobalPropertyCell>::null(), | 2614 Handle<Cell>::null(), |
2617 function, Handle<String>::cast(name)); | 2615 function, Handle<String>::cast(name)); |
2618 // A null handle means bail out to the regular compiler code below. | 2616 // A null handle means bail out to the regular compiler code below. |
2619 if (!code.is_null()) return code; | 2617 if (!code.is_null()) return code; |
2620 } | 2618 } |
2621 | 2619 |
2622 Label success; | 2620 Label success; |
2623 | 2621 |
2624 CompileHandlerFrontend(object, holder, name, check, &success); | 2622 CompileHandlerFrontend(object, holder, name, check, &success); |
2625 __ bind(&success); | 2623 __ bind(&success); |
2626 CompileHandlerBackend(function); | 2624 CompileHandlerBackend(function); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2852 __ ldr(scratch1(), FieldMemOperand(receiver(), HeapObject::kMapOffset)); | 2850 __ ldr(scratch1(), FieldMemOperand(receiver(), HeapObject::kMapOffset)); |
2853 __ cmp(scratch1(), Operand(Handle<Map>(object->map()))); | 2851 __ cmp(scratch1(), Operand(Handle<Map>(object->map()))); |
2854 __ b(ne, &miss); | 2852 __ b(ne, &miss); |
2855 | 2853 |
2856 // Check that the value in the cell is not the hole. If it is, this | 2854 // Check that the value in the cell is not the hole. If it is, this |
2857 // cell could have been deleted and reintroducing the global needs | 2855 // cell could have been deleted and reintroducing the global needs |
2858 // to update the property details in the property dictionary of the | 2856 // to update the property details in the property dictionary of the |
2859 // global object. We bail out to the runtime system to do that. | 2857 // global object. We bail out to the runtime system to do that. |
2860 __ mov(scratch1(), Operand(cell)); | 2858 __ mov(scratch1(), Operand(cell)); |
2861 __ LoadRoot(scratch2(), Heap::kTheHoleValueRootIndex); | 2859 __ LoadRoot(scratch2(), Heap::kTheHoleValueRootIndex); |
2862 __ ldr(scratch3(), | 2860 __ ldr(scratch3(), FieldMemOperand(scratch1(), Cell::kValueOffset)); |
2863 FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset)); | |
2864 __ cmp(scratch3(), scratch2()); | 2861 __ cmp(scratch3(), scratch2()); |
2865 __ b(eq, &miss); | 2862 __ b(eq, &miss); |
2866 | 2863 |
2867 // Store the value in the cell. | 2864 // Store the value in the cell. |
2868 __ str(value(), | 2865 __ str(value(), FieldMemOperand(scratch1(), Cell::kValueOffset)); |
2869 FieldMemOperand(scratch1(), JSGlobalPropertyCell::kValueOffset)); | |
2870 // Cells are always rescanned, so no write barrier here. | 2866 // Cells are always rescanned, so no write barrier here. |
2871 | 2867 |
2872 Counters* counters = isolate()->counters(); | 2868 Counters* counters = isolate()->counters(); |
2873 __ IncrementCounter( | 2869 __ IncrementCounter( |
2874 counters->named_store_global_inline(), 1, scratch1(), scratch2()); | 2870 counters->named_store_global_inline(), 1, scratch1(), scratch2()); |
2875 __ Ret(); | 2871 __ Ret(); |
2876 | 2872 |
2877 // Handle store cache miss. | 2873 // Handle store cache miss. |
2878 __ bind(&miss); | 2874 __ bind(&miss); |
2879 __ IncrementCounter( | 2875 __ IncrementCounter( |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2995 bool is_dont_delete) { | 2991 bool is_dont_delete) { |
2996 Label success, miss; | 2992 Label success, miss; |
2997 | 2993 |
2998 __ CheckMap( | 2994 __ CheckMap( |
2999 receiver(), scratch1(), Handle<Map>(object->map()), &miss, DO_SMI_CHECK); | 2995 receiver(), scratch1(), Handle<Map>(object->map()), &miss, DO_SMI_CHECK); |
3000 HandlerFrontendHeader( | 2996 HandlerFrontendHeader( |
3001 object, receiver(), Handle<JSObject>::cast(global), name, &miss); | 2997 object, receiver(), Handle<JSObject>::cast(global), name, &miss); |
3002 | 2998 |
3003 // Get the value from the cell. | 2999 // Get the value from the cell. |
3004 __ mov(r3, Operand(cell)); | 3000 __ mov(r3, Operand(cell)); |
3005 __ ldr(r4, FieldMemOperand(r3, JSGlobalPropertyCell::kValueOffset)); | 3001 __ ldr(r4, FieldMemOperand(r3, Cell::kValueOffset)); |
3006 | 3002 |
3007 // Check for deleted property if property can actually be deleted. | 3003 // Check for deleted property if property can actually be deleted. |
3008 if (!is_dont_delete) { | 3004 if (!is_dont_delete) { |
3009 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 3005 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
3010 __ cmp(r4, ip); | 3006 __ cmp(r4, ip); |
3011 __ b(eq, &miss); | 3007 __ b(eq, &miss); |
3012 } | 3008 } |
3013 | 3009 |
3014 HandlerFrontendFooter(&success, &miss); | 3010 HandlerFrontendFooter(&success, &miss); |
3015 __ bind(&success); | 3011 __ bind(&success); |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3641 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); | 3637 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); |
3642 } | 3638 } |
3643 } | 3639 } |
3644 | 3640 |
3645 | 3641 |
3646 #undef __ | 3642 #undef __ |
3647 | 3643 |
3648 } } // namespace v8::internal | 3644 } } // namespace v8::internal |
3649 | 3645 |
3650 #endif // V8_TARGET_ARCH_ARM | 3646 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |