| 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 2241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2252 __ Jump(lr); | 2252 __ Jump(lr); |
| 2253 | 2253 |
| 2254 // Slow-case: Handle non-smi or out-of-bounds access to arguments | 2254 // Slow-case: Handle non-smi or out-of-bounds access to arguments |
| 2255 // by calling the runtime system. | 2255 // by calling the runtime system. |
| 2256 __ bind(&slow); | 2256 __ bind(&slow); |
| 2257 __ push(r1); | 2257 __ push(r1); |
| 2258 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); | 2258 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); |
| 2259 } | 2259 } |
| 2260 | 2260 |
| 2261 | 2261 |
| 2262 void ArgumentsAccessStub::GenerateNewNonStrictSlow(MacroAssembler* masm) { | 2262 void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) { |
| 2263 // sp[0] : number of parameters | 2263 // sp[0] : number of parameters |
| 2264 // sp[4] : receiver displacement | 2264 // sp[4] : receiver displacement |
| 2265 // sp[8] : function | 2265 // sp[8] : function |
| 2266 | 2266 |
| 2267 // Check if the calling frame is an arguments adaptor frame. | 2267 // Check if the calling frame is an arguments adaptor frame. |
| 2268 Label runtime; | 2268 Label runtime; |
| 2269 __ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 2269 __ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 2270 __ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset)); | 2270 __ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset)); |
| 2271 __ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 2271 __ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| 2272 __ b(ne, &runtime); | 2272 __ b(ne, &runtime); |
| 2273 | 2273 |
| 2274 // Patch the arguments.length and the parameters pointer in the current frame. | 2274 // Patch the arguments.length and the parameters pointer in the current frame. |
| 2275 __ ldr(r2, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 2275 __ ldr(r2, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 2276 __ str(r2, MemOperand(sp, 0 * kPointerSize)); | 2276 __ str(r2, MemOperand(sp, 0 * kPointerSize)); |
| 2277 __ add(r3, r3, Operand(r2, LSL, 1)); | 2277 __ add(r3, r3, Operand(r2, LSL, 1)); |
| 2278 __ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset)); | 2278 __ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset)); |
| 2279 __ str(r3, MemOperand(sp, 1 * kPointerSize)); | 2279 __ str(r3, MemOperand(sp, 1 * kPointerSize)); |
| 2280 | 2280 |
| 2281 __ bind(&runtime); | 2281 __ bind(&runtime); |
| 2282 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); | 2282 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); |
| 2283 } | 2283 } |
| 2284 | 2284 |
| 2285 | 2285 |
| 2286 void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) { | 2286 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) { |
| 2287 // Stack layout: | 2287 // Stack layout: |
| 2288 // sp[0] : number of parameters (tagged) | 2288 // sp[0] : number of parameters (tagged) |
| 2289 // sp[4] : address of receiver argument | 2289 // sp[4] : address of receiver argument |
| 2290 // sp[8] : function | 2290 // sp[8] : function |
| 2291 // Registers used over whole function: | 2291 // Registers used over whole function: |
| 2292 // r6 : allocated object (tagged) | 2292 // r6 : allocated object (tagged) |
| 2293 // r9 : mapped parameter count (tagged) | 2293 // r9 : mapped parameter count (tagged) |
| 2294 | 2294 |
| 2295 __ ldr(r1, MemOperand(sp, 0 * kPointerSize)); | 2295 __ ldr(r1, MemOperand(sp, 0 * kPointerSize)); |
| 2296 // r1 = parameter count (tagged) | 2296 // r1 = parameter count (tagged) |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2390 // r2 = argument count (tagged) | 2390 // r2 = argument count (tagged) |
| 2391 // r4 = address of parameter map or backing store (tagged) | 2391 // r4 = address of parameter map or backing store (tagged) |
| 2392 // Initialize parameter map. If there are no mapped arguments, we're done. | 2392 // Initialize parameter map. If there are no mapped arguments, we're done. |
| 2393 Label skip_parameter_map; | 2393 Label skip_parameter_map; |
| 2394 __ cmp(r1, Operand(Smi::FromInt(0))); | 2394 __ cmp(r1, Operand(Smi::FromInt(0))); |
| 2395 // Move backing store address to r3, because it is | 2395 // Move backing store address to r3, because it is |
| 2396 // expected there when filling in the unmapped arguments. | 2396 // expected there when filling in the unmapped arguments. |
| 2397 __ mov(r3, r4, LeaveCC, eq); | 2397 __ mov(r3, r4, LeaveCC, eq); |
| 2398 __ b(eq, &skip_parameter_map); | 2398 __ b(eq, &skip_parameter_map); |
| 2399 | 2399 |
| 2400 __ LoadRoot(r6, Heap::kNonStrictArgumentsElementsMapRootIndex); | 2400 __ LoadRoot(r6, Heap::kSloppyArgumentsElementsMapRootIndex); |
| 2401 __ str(r6, FieldMemOperand(r4, FixedArray::kMapOffset)); | 2401 __ str(r6, FieldMemOperand(r4, FixedArray::kMapOffset)); |
| 2402 __ add(r6, r1, Operand(Smi::FromInt(2))); | 2402 __ add(r6, r1, Operand(Smi::FromInt(2))); |
| 2403 __ str(r6, FieldMemOperand(r4, FixedArray::kLengthOffset)); | 2403 __ str(r6, FieldMemOperand(r4, FixedArray::kLengthOffset)); |
| 2404 __ str(cp, FieldMemOperand(r4, FixedArray::kHeaderSize + 0 * kPointerSize)); | 2404 __ str(cp, FieldMemOperand(r4, FixedArray::kHeaderSize + 0 * kPointerSize)); |
| 2405 __ add(r6, r4, Operand(r1, LSL, 1)); | 2405 __ add(r6, r4, Operand(r1, LSL, 1)); |
| 2406 __ add(r6, r6, Operand(kParameterMapHeaderSize)); | 2406 __ add(r6, r6, Operand(kParameterMapHeaderSize)); |
| 2407 __ str(r6, FieldMemOperand(r4, FixedArray::kHeaderSize + 1 * kPointerSize)); | 2407 __ str(r6, FieldMemOperand(r4, FixedArray::kHeaderSize + 1 * kPointerSize)); |
| 2408 | 2408 |
| 2409 // Copy the parameter slots and the holes in the arguments. | 2409 // Copy the parameter slots and the holes in the arguments. |
| 2410 // We need to fill in mapped_parameter_count slots. They index the context, | 2410 // We need to fill in mapped_parameter_count slots. They index the context, |
| (...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3127 __ ldr(r4, FieldMemOperand(r3, SharedFunctionInfo::kCompilerHintsOffset)); | 3127 __ ldr(r4, FieldMemOperand(r3, SharedFunctionInfo::kCompilerHintsOffset)); |
| 3128 __ tst(r4, Operand(1 << (SharedFunctionInfo::kStrictModeFunction + | 3128 __ tst(r4, Operand(1 << (SharedFunctionInfo::kStrictModeFunction + |
| 3129 kSmiTagSize))); | 3129 kSmiTagSize))); |
| 3130 __ b(ne, &cont); | 3130 __ b(ne, &cont); |
| 3131 | 3131 |
| 3132 // Do not transform the receiver for native (Compilerhints already in r3). | 3132 // Do not transform the receiver for native (Compilerhints already in r3). |
| 3133 __ tst(r4, Operand(1 << (SharedFunctionInfo::kNative + kSmiTagSize))); | 3133 __ tst(r4, Operand(1 << (SharedFunctionInfo::kNative + kSmiTagSize))); |
| 3134 __ b(ne, &cont); | 3134 __ b(ne, &cont); |
| 3135 } | 3135 } |
| 3136 | 3136 |
| 3137 // Compute the receiver in non-strict mode. | 3137 // Compute the receiver in sloppy mode. |
| 3138 __ ldr(r3, MemOperand(sp, argc_ * kPointerSize)); | 3138 __ ldr(r3, MemOperand(sp, argc_ * kPointerSize)); |
| 3139 | 3139 |
| 3140 if (NeedsChecks()) { | 3140 if (NeedsChecks()) { |
| 3141 __ JumpIfSmi(r3, &wrap); | 3141 __ JumpIfSmi(r3, &wrap); |
| 3142 __ CompareObjectType(r3, r4, r4, FIRST_SPEC_OBJECT_TYPE); | 3142 __ CompareObjectType(r3, r4, r4, FIRST_SPEC_OBJECT_TYPE); |
| 3143 __ b(lt, &wrap); | 3143 __ b(lt, &wrap); |
| 3144 } else { | 3144 } else { |
| 3145 __ jmp(&wrap); | 3145 __ jmp(&wrap); |
| 3146 } | 3146 } |
| 3147 | 3147 |
| (...skipping 2432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5580 MemOperand(fp, 6 * kPointerSize), | 5580 MemOperand(fp, 6 * kPointerSize), |
| 5581 NULL); | 5581 NULL); |
| 5582 } | 5582 } |
| 5583 | 5583 |
| 5584 | 5584 |
| 5585 #undef __ | 5585 #undef __ |
| 5586 | 5586 |
| 5587 } } // namespace v8::internal | 5587 } } // namespace v8::internal |
| 5588 | 5588 |
| 5589 #endif // V8_TARGET_ARCH_ARM | 5589 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |