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 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 | 483 |
484 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { | 484 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { |
485 // Update the static counter each time a new code stub is generated. | 485 // Update the static counter each time a new code stub is generated. |
486 Isolate* isolate = masm->isolate(); | 486 Isolate* isolate = masm->isolate(); |
487 isolate->counters()->code_stubs()->Increment(); | 487 isolate->counters()->code_stubs()->Increment(); |
488 | 488 |
489 CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor(isolate); | 489 CodeStubInterfaceDescriptor* descriptor = GetInterfaceDescriptor(isolate); |
490 int param_count = descriptor->register_param_count_; | 490 int param_count = descriptor->register_param_count_; |
491 { | 491 { |
492 // Call the runtime system in a fresh internal frame. | 492 // Call the runtime system in a fresh internal frame. |
493 FrameScope scope(masm, StackFrame::INTERNAL); | 493 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
494 ASSERT(descriptor->register_param_count_ == 0 || | 494 ASSERT(descriptor->register_param_count_ == 0 || |
495 r0.is(descriptor->register_params_[param_count - 1])); | 495 r0.is(descriptor->register_params_[param_count - 1])); |
496 // Push arguments | 496 // Push arguments |
497 for (int i = 0; i < param_count; ++i) { | 497 for (int i = 0; i < param_count; ++i) { |
498 __ push(descriptor->register_params_[i]); | 498 __ push(descriptor->register_params_[i]); |
499 } | 499 } |
500 ExternalReference miss = descriptor->miss_handler(); | 500 ExternalReference miss = descriptor->miss_handler(); |
501 __ CallExternalReference(miss, descriptor->register_param_count_); | 501 __ CallExternalReference(miss, descriptor->register_param_count_); |
502 } | 502 } |
503 | 503 |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1599 | 1599 |
1600 // Retrieve the pending exception. | 1600 // Retrieve the pending exception. |
1601 __ mov(ip, Operand(ExternalReference(Isolate::kPendingExceptionAddress, | 1601 __ mov(ip, Operand(ExternalReference(Isolate::kPendingExceptionAddress, |
1602 isolate))); | 1602 isolate))); |
1603 __ ldr(r0, MemOperand(ip)); | 1603 __ ldr(r0, MemOperand(ip)); |
1604 | 1604 |
1605 // See if we just retrieved an OOM exception. | 1605 // See if we just retrieved an OOM exception. |
1606 JumpIfOOM(masm, r0, ip, throw_out_of_memory_exception); | 1606 JumpIfOOM(masm, r0, ip, throw_out_of_memory_exception); |
1607 | 1607 |
1608 // Clear the pending exception. | 1608 // Clear the pending exception. |
1609 __ mov(r3, Operand(isolate->factory()->the_hole_value())); | 1609 __ LoadRoot(r3, Heap::kTheHoleValueRootIndex); |
1610 __ mov(ip, Operand(ExternalReference(Isolate::kPendingExceptionAddress, | 1610 __ mov(ip, Operand(ExternalReference(Isolate::kPendingExceptionAddress, |
1611 isolate))); | 1611 isolate))); |
1612 __ str(r3, MemOperand(ip)); | 1612 __ str(r3, MemOperand(ip)); |
1613 | 1613 |
1614 // Special handling of termination exceptions which are uncatchable | 1614 // Special handling of termination exceptions which are uncatchable |
1615 // by javascript code. | 1615 // by javascript code. |
1616 __ cmp(r0, Operand(isolate->factory()->termination_exception())); | 1616 __ LoadRoot(r3, Heap::kTerminationExceptionRootIndex); |
| 1617 __ cmp(r0, r3); |
1617 __ b(eq, throw_termination_exception); | 1618 __ b(eq, throw_termination_exception); |
1618 | 1619 |
1619 // Handle normal exception. | 1620 // Handle normal exception. |
1620 __ jmp(throw_normal_exception); | 1621 __ jmp(throw_normal_exception); |
1621 | 1622 |
1622 __ bind(&retry); // pass last failure (r0) as parameter (r0) when retrying | 1623 __ bind(&retry); // pass last failure (r0) as parameter (r0) when retrying |
1623 } | 1624 } |
1624 | 1625 |
1625 | 1626 |
1626 void CEntryStub::Generate(MacroAssembler* masm) { | 1627 void CEntryStub::Generate(MacroAssembler* masm) { |
(...skipping 11 matching lines...) Expand all Loading... |
1638 // NOTE: Invocations of builtins may return failure objects | 1639 // NOTE: Invocations of builtins may return failure objects |
1639 // instead of a proper result. The builtin entry handles | 1640 // instead of a proper result. The builtin entry handles |
1640 // this by performing a garbage collection and retrying the | 1641 // this by performing a garbage collection and retrying the |
1641 // builtin once. | 1642 // builtin once. |
1642 | 1643 |
1643 // Compute the argv pointer in a callee-saved register. | 1644 // Compute the argv pointer in a callee-saved register. |
1644 __ add(r6, sp, Operand(r0, LSL, kPointerSizeLog2)); | 1645 __ add(r6, sp, Operand(r0, LSL, kPointerSizeLog2)); |
1645 __ sub(r6, r6, Operand(kPointerSize)); | 1646 __ sub(r6, r6, Operand(kPointerSize)); |
1646 | 1647 |
1647 // Enter the exit frame that transitions from JavaScript to C++. | 1648 // Enter the exit frame that transitions from JavaScript to C++. |
1648 FrameScope scope(masm, StackFrame::MANUAL); | 1649 FrameAndConstantPoolScope scope(masm, StackFrame::MANUAL); |
1649 __ EnterExitFrame(save_doubles_); | 1650 __ EnterExitFrame(save_doubles_); |
1650 | 1651 |
1651 // Set up argc and the builtin function in callee-saved registers. | 1652 // Set up argc and the builtin function in callee-saved registers. |
1652 __ mov(r4, Operand(r0)); | 1653 __ mov(r4, Operand(r0)); |
1653 __ mov(r5, Operand(r1)); | 1654 __ mov(r5, Operand(r1)); |
1654 | 1655 |
1655 // r4: number of arguments (C callee-saved) | 1656 // r4: number of arguments (C callee-saved) |
1656 // r5: pointer to builtin function (C callee-saved) | 1657 // r5: pointer to builtin function (C callee-saved) |
1657 // r6: pointer to first argument (C callee-saved) | 1658 // r6: pointer to first argument (C callee-saved) |
1658 | 1659 |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2050 | 2051 |
2051 // Slow-case. Tail call builtin. | 2052 // Slow-case. Tail call builtin. |
2052 __ bind(&slow); | 2053 __ bind(&slow); |
2053 if (!ReturnTrueFalseObject()) { | 2054 if (!ReturnTrueFalseObject()) { |
2054 if (HasArgsInRegisters()) { | 2055 if (HasArgsInRegisters()) { |
2055 __ Push(r0, r1); | 2056 __ Push(r0, r1); |
2056 } | 2057 } |
2057 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 2058 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
2058 } else { | 2059 } else { |
2059 { | 2060 { |
2060 FrameScope scope(masm, StackFrame::INTERNAL); | 2061 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
2061 __ Push(r0, r1); | 2062 __ Push(r0, r1); |
2062 __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); | 2063 __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); |
2063 } | 2064 } |
2064 __ cmp(r0, Operand::Zero()); | 2065 __ cmp(r0, Operand::Zero()); |
2065 __ LoadRoot(r0, Heap::kTrueValueRootIndex, eq); | 2066 __ LoadRoot(r0, Heap::kTrueValueRootIndex, eq); |
2066 __ LoadRoot(r0, Heap::kFalseValueRootIndex, ne); | 2067 __ LoadRoot(r0, Heap::kFalseValueRootIndex, ne); |
2067 __ Ret(HasArgsInRegisters() ? 0 : 2); | 2068 __ Ret(HasArgsInRegisters() ? 0 : 2); |
2068 } | 2069 } |
2069 } | 2070 } |
2070 | 2071 |
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3059 // indicate the ElementsKind if function is the Array constructor. | 3060 // indicate the ElementsKind if function is the Array constructor. |
3060 __ bind(&initialize); | 3061 __ bind(&initialize); |
3061 // Make sure the function is the Array() function | 3062 // Make sure the function is the Array() function |
3062 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, r4); | 3063 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, r4); |
3063 __ cmp(r1, r4); | 3064 __ cmp(r1, r4); |
3064 __ b(ne, ¬_array_function); | 3065 __ b(ne, ¬_array_function); |
3065 | 3066 |
3066 // The target function is the Array constructor, | 3067 // The target function is the Array constructor, |
3067 // Create an AllocationSite if we don't already have it, store it in the slot. | 3068 // Create an AllocationSite if we don't already have it, store it in the slot. |
3068 { | 3069 { |
3069 FrameScope scope(masm, StackFrame::INTERNAL); | 3070 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
3070 | 3071 |
3071 // Arguments register must be smi-tagged to call out. | 3072 // Arguments register must be smi-tagged to call out. |
3072 __ SmiTag(r0); | 3073 __ SmiTag(r0); |
3073 __ Push(r3, r2, r1, r0); | 3074 __ Push(r3, r2, r1, r0); |
3074 | 3075 |
3075 CreateAllocationSiteStub create_stub; | 3076 CreateAllocationSiteStub create_stub; |
3076 __ CallStub(&create_stub); | 3077 __ CallStub(&create_stub); |
3077 | 3078 |
3078 __ Pop(r3, r2, r1, r0); | 3079 __ Pop(r3, r2, r1, r0); |
3079 __ SmiUntag(r0); | 3080 __ SmiUntag(r0); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3182 __ mov(r0, Operand(argc_)); // Set up the number of arguments. | 3183 __ mov(r0, Operand(argc_)); // Set up the number of arguments. |
3183 __ mov(r2, Operand::Zero()); | 3184 __ mov(r2, Operand::Zero()); |
3184 __ GetBuiltinFunction(r1, Builtins::CALL_NON_FUNCTION); | 3185 __ GetBuiltinFunction(r1, Builtins::CALL_NON_FUNCTION); |
3185 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), | 3186 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
3186 RelocInfo::CODE_TARGET); | 3187 RelocInfo::CODE_TARGET); |
3187 } | 3188 } |
3188 | 3189 |
3189 if (CallAsMethod()) { | 3190 if (CallAsMethod()) { |
3190 __ bind(&wrap); | 3191 __ bind(&wrap); |
3191 // Wrap the receiver and patch it back onto the stack. | 3192 // Wrap the receiver and patch it back onto the stack. |
3192 { FrameScope frame_scope(masm, StackFrame::INTERNAL); | 3193 { FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL); |
3193 __ Push(r1, r3); | 3194 __ Push(r1, r3); |
3194 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); | 3195 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); |
3195 __ pop(r1); | 3196 __ pop(r1); |
3196 } | 3197 } |
3197 __ str(r0, MemOperand(sp, argc_ * kPointerSize)); | 3198 __ str(r0, MemOperand(sp, argc_ * kPointerSize)); |
3198 __ jmp(&cont); | 3199 __ jmp(&cont); |
3199 } | 3200 } |
3200 } | 3201 } |
3201 | 3202 |
3202 | 3203 |
(...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4467 } | 4468 } |
4468 | 4469 |
4469 | 4470 |
4470 | 4471 |
4471 void ICCompareStub::GenerateMiss(MacroAssembler* masm) { | 4472 void ICCompareStub::GenerateMiss(MacroAssembler* masm) { |
4472 { | 4473 { |
4473 // Call the runtime system in a fresh internal frame. | 4474 // Call the runtime system in a fresh internal frame. |
4474 ExternalReference miss = | 4475 ExternalReference miss = |
4475 ExternalReference(IC_Utility(IC::kCompareIC_Miss), masm->isolate()); | 4476 ExternalReference(IC_Utility(IC::kCompareIC_Miss), masm->isolate()); |
4476 | 4477 |
4477 FrameScope scope(masm, StackFrame::INTERNAL); | 4478 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
4478 __ Push(r1, r0); | 4479 __ Push(r1, r0); |
4479 __ Push(lr, r1, r0); | 4480 __ Push(lr, r1, r0); |
4480 __ mov(ip, Operand(Smi::FromInt(op_))); | 4481 __ mov(ip, Operand(Smi::FromInt(op_))); |
4481 __ push(ip); | 4482 __ push(ip); |
4482 __ CallExternalReference(miss, 3); | 4483 __ CallExternalReference(miss, 3); |
4483 // Compute the entry point of the rewritten stub. | 4484 // Compute the entry point of the rewritten stub. |
4484 __ add(r2, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); | 4485 __ add(r2, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); |
4485 // Restore registers. | 4486 // Restore registers. |
4486 __ pop(lr); | 4487 __ pop(lr); |
4487 __ Pop(r1, r0); | 4488 __ Pop(r1, r0); |
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5489 // holder | 5490 // holder |
5490 __ push(holder); | 5491 __ push(holder); |
5491 | 5492 |
5492 // Prepare arguments. | 5493 // Prepare arguments. |
5493 __ mov(scratch, sp); | 5494 __ mov(scratch, sp); |
5494 | 5495 |
5495 // Allocate the v8::Arguments structure in the arguments' space since | 5496 // Allocate the v8::Arguments structure in the arguments' space since |
5496 // it's not controlled by GC. | 5497 // it's not controlled by GC. |
5497 const int kApiStackSpace = 4; | 5498 const int kApiStackSpace = 4; |
5498 | 5499 |
5499 FrameScope frame_scope(masm, StackFrame::MANUAL); | 5500 FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL); |
5500 __ EnterExitFrame(false, kApiStackSpace); | 5501 __ EnterExitFrame(false, kApiStackSpace); |
5501 | 5502 |
5502 ASSERT(!api_function_address.is(r0) && !scratch.is(r0)); | 5503 ASSERT(!api_function_address.is(r0) && !scratch.is(r0)); |
5503 // r0 = FunctionCallbackInfo& | 5504 // r0 = FunctionCallbackInfo& |
5504 // Arguments is after the return address. | 5505 // Arguments is after the return address. |
5505 __ add(r0, sp, Operand(1 * kPointerSize)); | 5506 __ add(r0, sp, Operand(1 * kPointerSize)); |
5506 // FunctionCallbackInfo::implicit_args_ | 5507 // FunctionCallbackInfo::implicit_args_ |
5507 __ str(scratch, MemOperand(r0, 0 * kPointerSize)); | 5508 __ str(scratch, MemOperand(r0, 0 * kPointerSize)); |
5508 // FunctionCallbackInfo::values_ | 5509 // FunctionCallbackInfo::values_ |
5509 __ add(ip, scratch, Operand((FCA::kArgsLength - 1 + argc) * kPointerSize)); | 5510 __ add(ip, scratch, Operand((FCA::kArgsLength - 1 + argc) * kPointerSize)); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5549 // -- ... | 5550 // -- ... |
5550 // -- r2 : api_function_address | 5551 // -- r2 : api_function_address |
5551 // ----------------------------------- | 5552 // ----------------------------------- |
5552 | 5553 |
5553 Register api_function_address = r2; | 5554 Register api_function_address = r2; |
5554 | 5555 |
5555 __ mov(r0, sp); // r0 = Handle<Name> | 5556 __ mov(r0, sp); // r0 = Handle<Name> |
5556 __ add(r1, r0, Operand(1 * kPointerSize)); // r1 = PCA | 5557 __ add(r1, r0, Operand(1 * kPointerSize)); // r1 = PCA |
5557 | 5558 |
5558 const int kApiStackSpace = 1; | 5559 const int kApiStackSpace = 1; |
5559 FrameScope frame_scope(masm, StackFrame::MANUAL); | 5560 FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL); |
5560 __ EnterExitFrame(false, kApiStackSpace); | 5561 __ EnterExitFrame(false, kApiStackSpace); |
5561 | 5562 |
5562 // Create PropertyAccessorInfo instance on the stack above the exit frame with | 5563 // Create PropertyAccessorInfo instance on the stack above the exit frame with |
5563 // r1 (internal::Object** args_) as the data. | 5564 // r1 (internal::Object** args_) as the data. |
5564 __ str(r1, MemOperand(sp, 1 * kPointerSize)); | 5565 __ str(r1, MemOperand(sp, 1 * kPointerSize)); |
5565 __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& | 5566 __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& |
5566 | 5567 |
5567 const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1; | 5568 const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1; |
5568 | 5569 |
5569 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); | 5570 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); |
5570 ExternalReference::Type thunk_type = | 5571 ExternalReference::Type thunk_type = |
5571 ExternalReference::PROFILING_GETTER_CALL; | 5572 ExternalReference::PROFILING_GETTER_CALL; |
5572 ApiFunction thunk_fun(thunk_address); | 5573 ApiFunction thunk_fun(thunk_address); |
5573 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, | 5574 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, |
5574 masm->isolate()); | 5575 masm->isolate()); |
5575 __ CallApiFunctionAndReturn(api_function_address, | 5576 __ CallApiFunctionAndReturn(api_function_address, |
5576 thunk_ref, | 5577 thunk_ref, |
5577 kStackUnwindSpace, | 5578 kStackUnwindSpace, |
5578 MemOperand(fp, 6 * kPointerSize), | 5579 MemOperand(fp, 6 * kPointerSize), |
5579 NULL); | 5580 NULL); |
5580 } | 5581 } |
5581 | 5582 |
5582 | 5583 |
5583 #undef __ | 5584 #undef __ |
5584 | 5585 |
5585 } } // namespace v8::internal | 5586 } } // namespace v8::internal |
5586 | 5587 |
5587 #endif // V8_TARGET_ARCH_ARM | 5588 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |