Bug 627335 - Port patch from bug 567707 to GCC assembly r=timeless a=NPOTB
authorJacek Caban <jacek@codeweavers.com>
Sun, 30 Jan 2011 21:20:23 +0000
changeset 61630 10e879bc17a470372647c85aae9a89e60bdf50ef
parent 61629 4c199b3e02cd11f45a74453d3d7f96bcabe6154d
child 61631 cb0f7b37208df372c787ecdb433cb4016b1a4b12
push id18415
push userjacek@codeweavers.com
push dateSun, 30 Jan 2011 20:13:51 +0000
treeherdermozilla-central@cb0f7b37208d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstimeless, NPOTB
bugs627335, 567707
milestone2.0b11pre
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
Bug 627335 - Port patch from bug 567707 to GCC assembly r=timeless a=NPOTB
xpcom/reflect/xptcall/src/md/win32/xptcinvoke_asm_x86_64_gnu.s
--- a/xpcom/reflect/xptcall/src/md/win32/xptcinvoke_asm_x86_64_gnu.s
+++ b/xpcom/reflect/xptcall/src/md/win32/xptcinvoke_asm_x86_64_gnu.s
@@ -47,112 +47,96 @@
 
 .globl XPTC__InvokebyIndex
 .def XPTC__InvokebyIndex
    .scl 3
    .type 46
 .endef
 XPTC__InvokebyIndex:
 
-   #
    # store register parameters
-   #
 
     mov     qword ptr [rsp+32], r9        # params
     mov     dword ptr [rsp+24], r8d       # paramCount
     mov     dword ptr [rsp+16], edx       # methodIndex
     mov     qword ptr [rsp+8], rcx        # that
 
-    #
-    # store RBX/RBP register for backup
-    #
-
-    mov     qword ptr [rsp-16], rbp
-
+    push    rbp
+    # .PUSHREG rbp
     mov     rbp, rsp            # store current RSP to RBP
     # .SETFRAME rbp, 0
     # .ENDPROLOG
 
     sub     rsp, 32
 
-    #
     # maybe we don't have any parameters to copy
-    #
 
     test    r8d, r8d
     jz      noparams
 
     #
-    # make space for 1st parameter
+    # Build stack for stdcall
+    #
+
+    # 1st parameter is space for parameters
 
     mov     eax, r8d
-    and     eax, 1              # AMD64 must be alignment to 16 bytes
-    add     eax, r8d
+    or      eax, 1
     shl     rax, 3              # *= 8
     sub     rsp, rax
     mov     rcx, rsp
 
-    #
     # 2nd parameter is parameter count
-    #
 
     mov     edx, r8d
 
-    #
     # 3rd parameter is params
-    #
 
     mov     r8, r9
 
-    sub     rsp, 32
-
-    call    invoke_copy_to_stack  # rcx = d
-                                  # edx = paramCount
-                                  # r8  = s
-
+    sub     rsp, 40
+    call    invoke_copy_to_stack # rcx = d
+                                 # edx = paramCount
+                                 # r8  = s
     add     rsp, 32
 
-    #
-    # Build parameters
+    # Current stack is the following.
     #
-
-    mov     rdx, qword ptr [rsp] # 1st parameter
-    movsd   xmm1, qword ptr [rsp] # for double
+    #  0h: [space (for this)]
+    #  8h: [1st parameter]
+    # 10h: [2nd parameter]
+    # 18h: [3rd parameter]
+    # 20h: [4th parameter]
+    # ...
+    #
+    # On Win64 ABI, the first 4 parameters are passed using registers,
+    # and others are on stack. 
 
-    mov     r8, qword ptr [rsp+8] # 2nd parameter
-    movsd   xmm2, qword ptr [rsp+8] # for double
+    # 1st, 2nd and 3rd arguments are passed via registers
 
-    mov     r9, qword ptr [rsp+16] # 3rd parameter
-    movsd   xmm3, qword ptr [rsp+16] # for double
+    mov     rdx, qword ptr [rsp+8] # 1st parameter
+    movsd   xmm1, qword ptr [rsp+8] # for double
 
-    #
-    # 1st parameter (this)
-    #
+    mov     r8, qword ptr [rsp+16] # 2nd parameter
+    movsd   xmm2, qword ptr [rsp+16] # for double
 
-    mov     rcx, qword ptr [rbp+8] # that
+    mov     r9, qword ptr [rsp+24] # 3rd parameter
+    movsd   xmm3, qword ptr [rsp+24] # for double
+
+    # rcx register is this
+
+    mov     rcx, qword ptr [rbp+8+8] # that
 
 noparams:
 
-    #
     # calculate call address
-    #
 
     mov     r11, qword ptr [rcx]
-    mov     eax, dword ptr [rbp+16] # methodIndex
-
-    #
-    # Now current stack has parameter list
-    # But, since callee function backups parameters, make space into stack.
-
-    sub     rsp, 8
+    mov     eax, dword ptr [rbp+16+8] # methodIndex
 
     call    qword ptr [r11+rax*8]      # stdcall, i.e. callee cleans up stack.
 
-    #
-    # restore registers
-    #
-
     mov     rsp, rbp
-    mov     rbp, qword ptr [rsp-16]
+    pop     rbp
 
     ret