author | Nicolas B. Pierron <nicolas.b.pierron@mozilla.com> |
Mon, 26 Jan 2015 12:07:57 +0100 | |
changeset 225634 | a31fe829631e24908b15234d0695a914a0bb997f |
parent 225633 | 40a5dd69da69828a00ccc36f092e498e306a1d5c |
child 225635 | e19c170e727f4e9d0786dd87c008da481c8d2a57 |
push id | 54628 |
push user | npierron@mozilla.com |
push date | Mon, 26 Jan 2015 11:10:11 +0000 |
treeherder | mozilla-inbound@85f601fa7b46 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bbouvier |
bugs | 1112162 |
milestone | 38.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/jit/x64/Trampoline-x64.cpp +++ b/js/src/jit/x64/Trampoline-x64.cpp @@ -375,61 +375,101 @@ JitRuntime::generateInvalidator(JSContex } JitCode * JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) { // Do not erase the frame pointer in this function. MacroAssembler masm(cx); + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- rsp + // '--- #r8 ---' // ArgumentsRectifierReg contains the |nargs| pushed onto the current frame. // Including |this|, there are (|nargs| + 1) arguments to copy. MOZ_ASSERT(ArgumentsRectifierReg == r8); - // Load the number of |undefined|s to push into %rcx. + // Add |this|, in the counter of known arguments. + masm.addl(Imm32(1), r8); + + // Load |nformals| into %rcx. masm.loadPtr(Address(rsp, RectifierFrameLayout::offsetOfCalleeToken()), rax); masm.mov(rax, rcx); masm.andq(Imm32(uint32_t(CalleeTokenMask)), rcx); masm.movzwl(Operand(rcx, JSFunction::offsetOfNargs()), rcx); + + // Including |this|, there are (|nformals| + 1) arguments to push to the + // stack. Then we push a JitFrameLayout. We compute the padding expressed + // in the number of extra |undefined| values to push on the stack. + static_assert(sizeof(JitFrameLayout) % JitStackAlignment == 0, + "No need to consider the JitFrameLayout for aligning the stack"); + static_assert(JitStackAlignment % sizeof(Value) == 0, + "Ensure that we can pad the stack by pushing extra UndefinedValue"); + + const uint32_t alignment = JitStackAlignment / sizeof(Value); + MOZ_ASSERT(IsPowerOfTwo(alignment)); + masm.addl(Imm32(alignment - 1 /* for padding */ + 1 /* for |this| */), rcx); + masm.andl(Imm32(~(alignment - 1)), rcx); + + // Load the number of |undefined|s to push into %rcx. masm.subq(r8, rcx); + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- rsp <- r9 + // '------ #r8 -------' + // + // Rectifier frame: + // [undef] [undef] [undef] [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] + // '------- #rcx --------' '------ #r8 -------' + // Copy the number of actual arguments masm.loadPtr(Address(rsp, RectifierFrameLayout::offsetOfNumActualArgs()), rdx); masm.moveValue(UndefinedValue(), r10); masm.movq(rsp, r9); // Save %rsp. - // Push undefined. + // Push undefined. (including the padding) { Label undefLoopTop; masm.bind(&undefLoopTop); masm.push(r10); masm.subl(Imm32(1), rcx); masm.j(Assembler::NonZero, &undefLoopTop); } // Get the topmost argument. - BaseIndex b = BaseIndex(r9, r8, TimesEight, sizeof(RectifierFrameLayout)); + static_assert(sizeof(Value) == 8, "TimesEight is used to skip arguments"); + + // | - sizeof(Value)| is used to put rcx such that we can read the last + // argument, and not the value which is after. + BaseIndex b = BaseIndex(r9, r8, TimesEight, sizeof(RectifierFrameLayout) - sizeof(Value)); masm.lea(Operand(b), rcx); - // Push arguments, |nargs| + 1 times (to include |this|). - masm.addl(Imm32(1), r8); + // Copy & Push arguments, |nargs| + 1 times (to include |this|). { Label copyLoopTop; masm.bind(©LoopTop); masm.push(Operand(rcx, 0x0)); masm.subq(Imm32(sizeof(Value)), rcx); masm.subl(Imm32(1), r8); masm.j(Assembler::NonZero, ©LoopTop); } + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- r9 + // + // + // Rectifier frame: + // [undef] [undef] [undef] [arg2] [arg1] [this] <- rsp [[argc] [callee] [descr] [raddr]] + // + // Construct descriptor. masm.subq(rsp, r9); masm.makeFrameDescriptor(r9, JitFrame_Rectifier); // Construct JitFrameLayout. masm.push(rdx); // numActualArgs masm.push(rax); // callee token masm.push(r9); // descriptor