Index: src/ppc/builtins-ppc.cc |
diff --git a/src/ppc/builtins-ppc.cc b/src/ppc/builtins-ppc.cc |
index 7942a54e21742f63590db8d8eed795efb7849cac..388f72d074c246d34d96be7711ec71388679e6ee 100644 |
--- a/src/ppc/builtins-ppc.cc |
+++ b/src/ppc/builtins-ppc.cc |
@@ -305,14 +305,19 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { |
static void CallRuntimePassFunction(MacroAssembler* masm, |
Runtime::FunctionId function_id) { |
+ // ----------- S t a t e ------------- |
+ // -- r4 : target function (preserved for callee) |
+ // -- r6 : new target (preserved for callee) |
+ // ----------------------------------- |
+ |
FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
- // Push a copy of the function onto the stack. |
+ // Push a copy of the target function and the new target. |
// Push function as parameter to the runtime call. |
- __ Push(r4, r4); |
+ __ Push(r4, r6, r4); |
__ CallRuntime(function_id, 1); |
- // Restore reciever. |
- __ Pop(r4); |
+ // Restore target function and new target. |
+ __ Pop(r4, r6); |
} |
@@ -534,6 +539,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
// r3: number of arguments |
// r4: constructor function |
// r5: address of last argument (caller sp) |
+ // r6: new target |
// cr0: condition indicating whether r3 is zero |
// sp[0]: receiver |
// sp[1]: receiver |
@@ -554,13 +560,14 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
// Call the function. |
// r3: number of arguments |
// r4: constructor function |
+ // r6: new target |
if (is_api_function) { |
__ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); |
Handle<Code> code = masm->isolate()->builtins()->HandleApiCallConstruct(); |
__ Call(code, RelocInfo::CODE_TARGET); |
} else { |
ParameterCount actual(r3); |
- __ InvokeFunction(r4, actual, CALL_FUNCTION, NullCallWrapper()); |
+ __ InvokeFunction(r4, r6, actual, CALL_FUNCTION, NullCallWrapper()); |
} |
// Store offset of return address for deoptimizer. |
@@ -979,15 +986,16 @@ static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) { |
// the runtime: |
// r3 - contains return address (beginning of patch sequence) |
// r4 - isolate |
+ // r6 - new target |
// lr - return address |
FrameScope scope(masm, StackFrame::MANUAL); |
__ mflr(r0); |
- __ MultiPush(r0.bit() | r3.bit() | r4.bit() | fp.bit()); |
+ __ MultiPush(r0.bit() | r3.bit() | r4.bit() | r6.bit() | fp.bit()); |
__ PrepareCallCFunction(2, 0, r5); |
__ mov(r4, Operand(ExternalReference::isolate_address(masm->isolate()))); |
__ CallCFunction( |
ExternalReference::get_make_code_young_function(masm->isolate()), 2); |
- __ MultiPop(r0.bit() | r3.bit() | r4.bit() | fp.bit()); |
+ __ MultiPop(r0.bit() | r3.bit() | r4.bit() | r6.bit() | fp.bit()); |
__ mtlr(r0); |
__ mr(ip, r3); |
__ Jump(ip); |
@@ -1020,16 +1028,17 @@ void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) { |
// the runtime: |
// r3 - contains return address (beginning of patch sequence) |
// r4 - isolate |
+ // r6 - new target |
// lr - return address |
FrameScope scope(masm, StackFrame::MANUAL); |
__ mflr(r0); |
- __ MultiPush(r0.bit() | r3.bit() | r4.bit() | fp.bit()); |
+ __ MultiPush(r0.bit() | r3.bit() | r4.bit() | r6.bit() | fp.bit()); |
__ PrepareCallCFunction(2, 0, r5); |
__ mov(r4, Operand(ExternalReference::isolate_address(masm->isolate()))); |
__ CallCFunction( |
ExternalReference::get_mark_code_as_executed_function(masm->isolate()), |
2); |
- __ MultiPop(r0.bit() | r3.bit() | r4.bit() | fp.bit()); |
+ __ MultiPop(r0.bit() | r3.bit() | r4.bit() | r6.bit() | fp.bit()); |
__ mtlr(r0); |
__ mr(ip, r3); |
@@ -1688,10 +1697,10 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, |
#if !V8_TARGET_ARCH_PPC64 |
__ SmiUntag(r5); |
#endif |
- __ LoadP(r6, FieldMemOperand(r4, JSFunction::kCodeEntryOffset)); |
+ __ LoadP(r7, FieldMemOperand(r4, JSFunction::kCodeEntryOffset)); |
ParameterCount actual(r3); |
ParameterCount expected(r5); |
- __ InvokeCode(r6, expected, actual, JUMP_FUNCTION, NullCallWrapper()); |
+ __ InvokeCode(r7, no_reg, expected, actual, JUMP_FUNCTION, NullCallWrapper()); |
// The function is a "classConstructor", need to raise an exception. |
__ bind(&class_constructor); |