Commit 2f2bf246 authored by Junliang Yan's avatar Junliang Yan Committed by Commit Bot

PPC/s390: [generators] Store parameters in the generator object.

Port ea7499f5

Original Commit Message:

    Currently, we context allocate all parameters for generators.

    With this CL, we keep arguments on stack (unless they escape to inner
    closure) and copy them between the stack and the generator's register
    file on suspend/resume. This will save context allocation in most cases.

    - Suspend copies arguments and registers to the generator.
    - Resume copies only the registers from the generator, the arguments
      are copied by the ResumeGenerator trampoline.

R=jarin@chromium.org, joransiu@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=
LOG=N

Change-Id: I4a22024ce4e29a4e0217697a3b53b1c7bba0ddf1
Reviewed-on: https://chromium-review.googlesource.com/1072309Reviewed-by: 's avatarJoran Siu <joransiu@ca.ibm.com>
Commit-Queue: Junliang Yan <jyan@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#53348}
parent 8a95da24
......@@ -500,22 +500,27 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
// -- sp[0] : generator receiver
// -----------------------------------
// Push holes for arguments to generator function. Since the parser forced
// context allocation for any variables in generators, the actual argument
// values have already been copied into the context and these dummy values
// will never be used.
// Copy the function arguments from the generator object's register file.
__ LoadP(r6, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset));
__ LoadWordArith(
r3, FieldMemOperand(r6, SharedFunctionInfo::kFormalParameterCountOffset));
r6, FieldMemOperand(r6, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadP(r5, FieldMemOperand(
r4, JSGeneratorObject::kParametersAndRegistersOffset));
{
Label loop, done_loop;
__ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
__ cmpi(r3, Operand::Zero());
__ beq(&done_loop);
__ mtctr(r3);
__ cmpi(r6, Operand::Zero());
__ ble(&done_loop);
// setup r9 to first element address - kPointerSize
__ addi(r9, r5,
Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize));
__ mtctr(r6);
__ bind(&loop);
__ LoadPU(ip, MemOperand(r9, kPointerSize));
__ push(ip);
__ bdnz(&loop);
__ bind(&done_loop);
}
......
......@@ -500,27 +500,36 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
// -- sp[0] : generator receiver
// -----------------------------------
// Push holes for arguments to generator function. Since the parser forced
// context allocation for any variables in generators, the actual argument
// values have already been copied into the context and these dummy values
// will never be used.
// Copy the function arguments from the generator object's register file.
__ LoadP(r5, FieldMemOperand(r6, JSFunction::kSharedFunctionInfoOffset));
__ LoadW(
r2, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadP(r4, FieldMemOperand(
r3, JSGeneratorObject::kParametersAndRegistersOffset));
{
Label loop, done_loop;
__ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
#if V8_TARGET_ARCH_S390X
__ CmpP(r2, Operand::Zero());
__ beq(&done_loop);
#else
__ LoadAndTestP(r2, r2);
__ beq(&done_loop);
#endif
__ LoadRR(r1, r2);
__ ShiftLeftP(r5, r5, Operand(kPointerSizeLog2));
__ SubP(sp, r5);
// r1 = stack offset
// r5 = parameter array offset
__ LoadImmP(r1, Operand::Zero());
__ SubP(r5, Operand(kPointerSize));
__ blt(&done_loop);
__ bind(&loop);
__ push(ip);
__ BranchOnCount(r1, &loop);
// parameter copy loop
__ LoadP(r0, FieldMemOperand(r4, r5, FixedArray::kHeaderSize));
__ StoreP(r0, MemOperand(sp, r1));
// update offsets
__ lay(r1, MemOperand(r1, kPointerSize));
// TODO(john-yan): combine SubP/bge with brxh/brxhg
__ SubP(r5, Operand(kPointerSize));
__ bge(&loop);
__ bind(&done_loop);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment