OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_PPC | 7 #if V8_TARGET_ARCH_PPC |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 3130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3141 if (callee->var()->IsLookupSlot()) { | 3141 if (callee->var()->IsLookupSlot()) { |
3142 Label slow, done; | 3142 Label slow, done; |
3143 SetSourcePosition(callee->position()); | 3143 SetSourcePosition(callee->position()); |
3144 { | 3144 { |
3145 PreservePositionScope scope(masm()->positions_recorder()); | 3145 PreservePositionScope scope(masm()->positions_recorder()); |
3146 // Generate code for loading from variables potentially shadowed by | 3146 // Generate code for loading from variables potentially shadowed by |
3147 // eval-introduced variables. | 3147 // eval-introduced variables. |
3148 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); | 3148 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); |
3149 } | 3149 } |
3150 __ bind(&slow); | 3150 __ bind(&slow); |
3151 // Call the runtime to find the function to call (returned in rax) and | 3151 // Call the runtime to find the function to call (returned in r3) and |
3152 // the object holding it (returned in rdx). | 3152 // the object holding it (returned in r4). |
3153 __ Push(context_register()); | 3153 DCHECK(!context_register().is(r5)); |
3154 __ Push(callee->name()); | 3154 __ mov(r5, Operand(callee->name())); |
| 3155 __ Push(context_register(), r5); |
3155 __ CallRuntime(Runtime::kLoadLookupSlot, 2); | 3156 __ CallRuntime(Runtime::kLoadLookupSlot, 2); |
3156 __ Push(rax); // Function. | 3157 __ Push(r3, r4); // Function, receiver. |
3157 __ Push(rdx); // Receiver. | |
3158 PrepareForBailoutForId(expr->LookupId(), NO_REGISTERS); | 3158 PrepareForBailoutForId(expr->LookupId(), NO_REGISTERS); |
3159 | 3159 |
3160 // If fast case code has been generated, emit code to push the function | 3160 // If fast case code has been generated, emit code to push the function |
3161 // and receiver and have the slow path jump around this code. | 3161 // and receiver and have the slow path jump around this code. |
3162 if (done.is_linked()) { | 3162 if (done.is_linked()) { |
3163 Label call; | 3163 Label call; |
3164 __ jmp(&call, Label::kNear); | 3164 __ b(&call); |
3165 __ bind(&done); | 3165 __ bind(&done); |
3166 // Push function. | 3166 // Push function. |
3167 __ Push(rax); | 3167 __ push(r3); |
3168 // Pass undefined as the receiver, which is the WithBaseObject of a | 3168 // Pass undefined as the receiver, which is the WithBaseObject of a |
3169 // non-object environment record. If the callee is sloppy, it will patch | 3169 // non-object environment record. If the callee is sloppy, it will patch |
3170 // it up to be the global receiver. | 3170 // it up to be the global receiver. |
3171 __ PushRoot(Heap::kUndefinedValueRootIndex); | 3171 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex); |
| 3172 __ push(r4); |
3172 __ bind(&call); | 3173 __ bind(&call); |
3173 } | 3174 } |
3174 } else { | 3175 } else { |
3175 VisitForStackValue(callee); | 3176 VisitForStackValue(callee); |
3176 // refEnv.WithBaseObject() | 3177 // refEnv.WithBaseObject() |
3177 __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); | 3178 __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); |
3178 __ push(r5); | 3179 __ push(r5); // Reserved receiver slot. |
3179 } | 3180 } |
3180 } | 3181 } |
3181 | 3182 |
3182 | 3183 |
3183 void FullCodeGenerator::VisitCall(Call* expr) { | 3184 void FullCodeGenerator::VisitCall(Call* expr) { |
3184 #ifdef DEBUG | 3185 #ifdef DEBUG |
3185 // We want to verify that RecordJSReturnSite gets called on all paths | 3186 // We want to verify that RecordJSReturnSite gets called on all paths |
3186 // through this function. Avoid early returns. | 3187 // through this function. Avoid early returns. |
3187 expr->return_is_recorded_ = false; | 3188 expr->return_is_recorded_ = false; |
3188 #endif | 3189 #endif |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3789 Split(eq, if_true, if_false, fall_through); | 3790 Split(eq, if_true, if_false, fall_through); |
3790 | 3791 |
3791 context()->Plug(if_true, if_false); | 3792 context()->Plug(if_true, if_false); |
3792 } | 3793 } |
3793 | 3794 |
3794 | 3795 |
3795 void FullCodeGenerator::EmitArguments(CallRuntime* expr) { | 3796 void FullCodeGenerator::EmitArguments(CallRuntime* expr) { |
3796 ZoneList<Expression*>* args = expr->arguments(); | 3797 ZoneList<Expression*>* args = expr->arguments(); |
3797 DCHECK(args->length() == 1); | 3798 DCHECK(args->length() == 1); |
3798 | 3799 |
3799 // ArgumentsAccessStub expects the key in edx and the formal | 3800 // ArgumentsAccessStub expects the key in r4 and the formal |
3800 // parameter count in r3. | 3801 // parameter count in r3. |
3801 VisitForAccumulatorValue(args->at(0)); | 3802 VisitForAccumulatorValue(args->at(0)); |
3802 __ mr(r4, r3); | 3803 __ mr(r4, r3); |
3803 __ LoadSmiLiteral(r3, Smi::FromInt(info_->scope()->num_parameters())); | 3804 __ LoadSmiLiteral(r3, Smi::FromInt(info_->scope()->num_parameters())); |
3804 ArgumentsAccessStub stub(isolate(), ArgumentsAccessStub::READ_ELEMENT); | 3805 ArgumentsAccessStub stub(isolate(), ArgumentsAccessStub::READ_ELEMENT); |
3805 __ CallStub(&stub); | 3806 __ CallStub(&stub); |
3806 context()->Plug(r3); | 3807 context()->Plug(r3); |
3807 } | 3808 } |
3808 | 3809 |
3809 | 3810 |
(...skipping 1763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5573 return ON_STACK_REPLACEMENT; | 5574 return ON_STACK_REPLACEMENT; |
5574 } | 5575 } |
5575 | 5576 |
5576 DCHECK(interrupt_address == | 5577 DCHECK(interrupt_address == |
5577 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5578 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5578 return OSR_AFTER_STACK_CHECK; | 5579 return OSR_AFTER_STACK_CHECK; |
5579 } | 5580 } |
5580 } // namespace internal | 5581 } // namespace internal |
5581 } // namespace v8 | 5582 } // namespace v8 |
5582 #endif // V8_TARGET_ARCH_PPC | 5583 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |