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