Updated intel syntax x86-64 asm files to also support MS win64 call convention (ifdef...
authorErik Lindahl <lindahl@cbr.su.se>
Tue, 24 Aug 2010 19:19:17 +0000 (21:19 +0200)
committerErik Lindahl <lindahl@cbr.su.se>
Tue, 24 Aug 2010 19:19:17 +0000 (21:19 +0200)
95 files changed:
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel010_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel030_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel100_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel101_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel102_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel103_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel104_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel110_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel111_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel112_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel113_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel114_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel130_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel131_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel132_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel133_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel134_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel200_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel201_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel202_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel203_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel204_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel210_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel211_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel212_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel213_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel214_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel230_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel231_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel232_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel233_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel234_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel300_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel301_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel302_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel303_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel304_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel310_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel311_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel312_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel313_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel314_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel330_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel331_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel332_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel333_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse/nb_kernel334_x86_64_sse_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel010_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel030_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel100_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel101_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel102_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel103_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel104_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel110_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel111_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel112_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel113_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel114_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel130_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel131_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel132_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel133_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel134_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel200_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel201_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel202_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel203_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel204_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel210_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel211_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel212_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel213_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel214_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel230_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel231_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel232_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel233_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel234_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel300_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel301_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel302_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel303_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel304_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel310_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel311_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel312_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel313_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel314_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel330_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel331_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel332_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel333_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nb_kernel_x86_64_sse2/nb_kernel334_x86_64_sse2_intel_syntax.s
src/gmxlib/nonbonded/nonbonded.c

index a1f89f358233dccaa8aabf4726d63e1c79c61dde..04a0c0236772ee55391fb9de66abd4395ee0f6aa 100644 (file)
@@ -115,16 +115,51 @@ _nb_kernel010_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       push r12
-       push r13
-       push r14
-       push r15
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
        emms
+    sub rsp, 376            ; # local variable stack space (n*16)                                                         
 
-        sub rsp, 392            ; # local variable stack space (n*16+8)                                                         
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb010_nouter], eax
@@ -734,8 +769,6 @@ _nb_kernel010_x86_64_sse:
         jmp   .nb010_threadloop
 .nb010_end:
        
-       emms
-
        mov eax, [rsp + nb010_nouter]
        mov ebx, [rsp + nb010_ninner]
        mov rcx, [rbp + nb010_outeriter]
@@ -743,23 +776,38 @@ _nb_kernel010_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 392
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
+       add rsp, 376
+       emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
-
-
        
 .globl nb_kernel010nf_x86_64_sse
 .globl _nb_kernel010nf_x86_64_sse
@@ -823,10 +871,49 @@ _nb_kernel010nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-        sub rsp, 264           ; # local variable stack space (n*16+8)                                                         
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+    sub rsp, 248               ; # local variable stack space (n*16+8)                                                         
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1290,9 +1377,31 @@ _nb_kernel010nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 264
+       add rsp, 248
        emms
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 2e9a858d42ad0660456a2a5bfe7481381597a8d5..ee35b9eeb63eb5340c5cdecc1c6b1a10ee4d72b1 100644 (file)
@@ -113,15 +113,50 @@ _nb_kernel030_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-       
-    sub rsp, 376               ; # local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+    sub rsp, 368               ; # local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1004,20 +1039,35 @@ _nb_kernel030_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-        add rsp, 376
+    add rsp, 368
        emms
-               
-       pop r15
-       pop r14
-       pop r13
-       pop r12
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
-
        
 
 .globl nb_kernel030nf_x86_64_sse
@@ -1080,10 +1130,49 @@ _nb_kernel030nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-        sub rsp, 248           ; # local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+    sub rsp, 240               ; # local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1739,9 +1828,31 @@ _nb_kernel030nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
-        
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index f4dbdb8ad31a8201c46e76bf5f73ae098804a3a9..658e29c8965f8eda3dc5c9c0f0de3f97c30015cb 100644 (file)
@@ -111,15 +111,49 @@ _nb_kernel100_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       push r12
-       push r13
-       push r14
-       push r15
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-    sub rsp, 312       ; # local variable stack space (n*16+8)                                                         
+    sub rsp, 304       ; # local variable stack space (n*16+8)                                                         
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -673,15 +707,32 @@ _nb_kernel100_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -747,10 +798,50 @@ _nb_kernel100nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-        sub rsp, 216           ; # local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+    sub rsp, 208               ; # local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1155,9 +1246,31 @@ _nb_kernel100nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 216
+       add rsp, 208
        emms
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 440a7cab49517444cfa1b4ee5180a26f8b6bdee7..8a8cce7a12d0f9629762f1d5ae8aefb6a04e8f0f 100644 (file)
@@ -132,16 +132,50 @@ _nb_kernel101_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-       
-       
-       sub rsp, 696
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 688
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -895,19 +929,35 @@ _nb_kernel101_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 696
+       add rsp, 688
        emms
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
 .globl nb_kernel101nf_x86_64_sse
 .globl _nb_kernel101nf_x86_64_sse
 nb_kernel101nf_x86_64_sse:     
@@ -973,10 +1023,49 @@ _nb_kernel101nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       sub rsp, 360    
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 352    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1431,9 +1520,31 @@ _nb_kernel101nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 360
+       add rsp, 352
        emms
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 844aa53e5eeb0f2e5ae6c992103d378b3f9566a9..09b1f177471d982e4e9f36a02a77fdf406b6ba93 100644 (file)
@@ -185,15 +185,50 @@ _nb_kernel102_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       push r12
-       push r13
-       push r14
-       push r15
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 1512
+       sub rsp, 1504
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb102_nouter], eax
@@ -1439,20 +1474,36 @@ _nb_kernel102_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1512
+       add rsp, 1504
        emms
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel102nf_x86_64_sse
 .globl _nb_kernel102nf_x86_64_sse
@@ -1545,10 +1596,49 @@ _nb_kernel102nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       sub rsp, 776    
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 768    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2221,12 +2311,31 @@ _nb_kernel102nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 776
+       add rsp, 768
        emms
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
index e880758cda7c5522cedd366ddcd29e7f975624c1..2208b63e3afbdb187536c2fbea7463461ef6f3e9 100644 (file)
@@ -132,15 +132,49 @@ _nb_kernel103_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       push r12
-       push r13
-       push r14
-       push r15
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 696            ; # local variable stack space (n*16+8)
+       sub rsp, 688            ; # local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
        
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -901,22 +935,37 @@ _nb_kernel103_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 696
+       add rsp, 688
        emms
-       
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel103nf_x86_64_sse
 .globl _nb_kernel103nf_x86_64_sse
 nb_kernel103nf_x86_64_sse:     
@@ -982,10 +1031,49 @@ _nb_kernel103nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 360
+       sub rsp, 352
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1440,10 +1528,31 @@ _nb_kernel103nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 360
+       add rsp, 352
        emms
-               
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 61d92741a1260d8e537bcc1b7abb57ddf46045e1..a57e238496bdf0d4e4d4ca05f2391db09b902cb1 100644 (file)
@@ -181,15 +181,49 @@ _nb_kernel104_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-       
-       sub rsp, 1512
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 1504
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1434,23 +1468,37 @@ _nb_kernel104_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1512
+       add rsp, 1504
        emms
-       
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
        
 
 .globl nb_kernel104nf_x86_64_sse
@@ -1547,11 +1595,50 @@ _nb_kernel104nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 824
+       sub rsp, 816
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb104nf_nouter], eax
@@ -2210,13 +2297,33 @@ _nb_kernel104nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 824
+       add rsp, 816
        emms
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
-
        
index 6848dd6462156b1cd1741e588643ee263e53b6cc..d7fd06895882b9527b571fa7ec08ed1cf0bb987f 100644 (file)
@@ -113,19 +113,51 @@ _nb_kernel110_x86_64_sse:
 .equiv          nb110_nouter,           380
 .equiv          nb110_ninner,           384
 
-
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-               
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 408
+       sub rsp, 400
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
        
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -835,15 +867,32 @@ _nb_kernel110_x86_64_sse:
        mov rdx, [rbp + nb110_inneriter]
        mov [rcx], eax
        mov [rdx], ebx
-       add rsp, 408
+       add rsp, 400
        emms
-       
-       pop r15
-       pop r14
-       pop r13
-       pop r12
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -910,11 +959,50 @@ _nb_kernel110nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 280
+       sub rsp, 272
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb110nf_nouter], eax
@@ -1453,11 +1541,31 @@ _nb_kernel110nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 280
+       add rsp, 272
        emms
-       
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index 0c226be4196853a3e1d27ef53a9155ac8844301b..f6b94d85c6949f1172d2b423789425c2fa51464b 100644 (file)
@@ -136,18 +136,51 @@ _nb_kernel111_x86_64_sse:
 .equiv          nb111_nouter,           772
 .equiv          nb111_ninner,           776
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-       
-       sub rsp, 792
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 784
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1005,19 +1038,34 @@ _nb_kernel111_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
-       ret     
-
-
+       ret
 
 
 
@@ -1091,10 +1139,49 @@ _nb_kernel111nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       sub rsp, 424
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 416
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1647,10 +1734,31 @@ _nb_kernel111nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 424
+       add rsp, 416
        emms
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index cd2028105b98474441b6fc3f697562cca702b5db..6171fe248ec854d21c786e572d91dfca846d32a5 100644 (file)
@@ -188,15 +188,49 @@ _nb_kernel112_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-       
-       sub rsp, 1592
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 1584
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1515,21 +1549,37 @@ _nb_kernel112_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1592
+       add rsp, 1584
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
        
 .globl nb_kernel112nf_x86_64_sse
 .globl _nb_kernel112nf_x86_64_sse
@@ -1626,10 +1676,49 @@ _nb_kernel112nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       sub rsp, 840
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 832
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2347,8 +2436,31 @@ _nb_kernel112nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 840
+       add rsp, 832
        emms
-       pop rbx
+
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index ac83b29a55137e41766edd5924568f6f6f1bf2fe..6b39df83f82c536ebae62b1016456126cf0c287c 100644 (file)
@@ -151,16 +151,49 @@ _nb_kernel113_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 984
+       sub rsp, 976
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
        
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1147,15 +1180,32 @@ _nb_kernel113_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 984
+       add rsp, 976
        emms
 
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
        
@@ -1238,16 +1288,49 @@ _nb_kernel113nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 520
+       sub rsp, 512
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
        
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1830,15 +1913,31 @@ _nb_kernel113nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-       
index 904b62a142e91186663b10b201306204b852a01a..0b93d633d5aae7a243b50e610be25c1c671a18d4 100644 (file)
@@ -206,16 +206,49 @@ _nb_kernel114_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1880
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 1872
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1770,9 +1803,6 @@ _nb_kernel114_x86_64_sse:
         jmp   .nb114_threadloop
 .nb114_end:
 
-
-       emms
-
        mov eax, [rsp + nb114_nouter]
        mov ebx, [rsp + nb114_ninner]
        mov rcx, [rbp + nb114_outeriter]
@@ -1780,17 +1810,34 @@ _nb_kernel114_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1880
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
+       add rsp, 1872
+       emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
-       ret     
-
+       ret
 
 
 
@@ -1900,16 +1947,49 @@ _nb_kernel114nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 968
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 960
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2679,9 +2759,6 @@ _nb_kernel114nf_x86_64_sse:
         jmp   .nb114nf_threadloop
 .nb114nf_end:
 
-
-       emms
-
        mov eax, [rsp + nb114nf_nouter]
        mov ebx, [rsp + nb114nf_ninner]
        mov rcx, [rbp + nb114nf_outeriter]
@@ -2689,14 +2766,31 @@ _nb_kernel114nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 968
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
+       add rsp, 960
+       emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index b4a91165ea8e4bebdb930a12f3ca1db48a753c63..c25aa752275ea74ec3a3c283bec779c9e7d0061e 100644 (file)
@@ -115,20 +115,51 @@ _nb_kernel130_x86_64_sse:
 .equiv          nb130_nouter,           428
 .equiv          nb130_ninner,           432
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       sub rsp, 432            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1075,16 +1106,32 @@ _nb_kernel130_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1093,7 +1140,6 @@ _nb_kernel130_x86_64_sse:
 
 
 
-
 .globl nb_kernel130nf_x86_64_sse
 .globl _nb_kernel130nf_x86_64_sse
 nb_kernel130nf_x86_64_sse:     
@@ -1159,16 +1205,49 @@ _nb_kernel130nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 328            ;# local variable stack space (n*16+8)
+       sub rsp, 320            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1904,15 +1983,31 @@ _nb_kernel130nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 328
+       add rsp, 320
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 84ce19784c8699ed53588506e0c23fc4251c6157..53606d55078e9063cea40b2e3d094ffe54c3d152 100644 (file)
@@ -147,16 +147,49 @@ _nb_kernel131_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 920            ;# local variable stack space (n*16+8)
+       sub rsp, 912            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1178,22 +1211,37 @@ _nb_kernel131_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 920
+       add rsp, 912
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel131nf_x86_64_sse
 .globl _nb_kernel131nf_x86_64_sse
 nb_kernel131nf_x86_64_sse:     
@@ -1271,16 +1319,49 @@ _nb_kernel131nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 520            ;# local variable stack space (n*16+8)
+       sub rsp, 512            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1962,17 +2043,31 @@ _nb_kernel131nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index 0d039ace9b5a16359c8b0cb87307c66be7c46bce..49826a962ef092fc4a751573de8409fd6e5c609e 100644 (file)
@@ -190,17 +190,49 @@ _nb_kernel132_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1682,16 +1714,32 @@ _nb_kernel132_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1699,7 +1747,6 @@ _nb_kernel132_x86_64_sse:
 
 
 
-
 .globl nb_kernel132nf_x86_64_sse
 .globl _nb_kernel132nf_x86_64_sse
 nb_kernel132nf_x86_64_sse:     
@@ -1795,19 +1842,52 @@ _nb_kernel132nf_x86_64_sse:
 .equiv          nb132nf_nn1,            848
 .equiv          nb132nf_nouter,         852
 .equiv          nb132nf_ninner,         856
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       sub rsp, 864            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2654,16 +2734,32 @@ _nb_kernel132nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
index 5bcff3f4a541b2461877d6a8e9584a8b299bbaf0..90a0e5ac57714d5b9a2f416f80678e8ced5a7df2 100644 (file)
@@ -155,19 +155,51 @@ _nb_kernel133_x86_64_sse:
 .equiv          nb133_nouter,           1060
 .equiv          nb133_ninner,           1064
        
-        push rbp
-        mov  rbp, rsp
-        push rbx
-       
-       
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1080           ;# local variable stack space (n*16+8)
+       sub rsp, 1072           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1308,16 +1340,32 @@ _nb_kernel133_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1080
+       add rsp, 1072
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1325,8 +1373,6 @@ _nb_kernel133_x86_64_sse:
 
 
 
-
-
        
 .globl nb_kernel133nf_x86_64_sse
 .globl _nb_kernel133nf_x86_64_sse
@@ -1408,20 +1454,51 @@ _nb_kernel133nf_x86_64_sse:
 .equiv          nb133nf_nouter,         584
 .equiv          nb133nf_ninner,         588
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 600            ;# local variable stack space (n*16+8)
+       sub rsp, 592            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2138,18 +2215,31 @@ _nb_kernel133nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 600
+       add rsp, 592
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
index 2363e72a2d62a049acfbb42a90322dfd9d0cf696..e83d9fa152e13ebfdf7aec511ce79e99153bd2ea 100644 (file)
@@ -207,17 +207,49 @@ _nb_kernel134_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1912           ;# local variable stack space (n*16+8)
+       sub rsp, 1904           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1946,20 +1978,35 @@ _nb_kernel134_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1912
+       add rsp, 1904
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
        
 .globl nb_kernel134nf_x86_64_sse
 .globl _nb_kernel134nf_x86_64_sse
@@ -2065,19 +2112,51 @@ _nb_kernel134nf_x86_64_sse:
 .equiv          nb134nf_nouter,         980
 .equiv          nb134nf_ninner,         984
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1000           ;# local variable stack space (n*16+8)
+       sub rsp, 992            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2990,16 +3069,32 @@ _nb_kernel134nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1000
+       add rsp, 992
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
index a5b589e396a8a3ee356232bba521dff14efb18b6..4f18e2cb67c3d72b4106b74c2b49d94b1ee8a46a 100644 (file)
@@ -112,16 +112,49 @@ _nb_kernel200_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 360            ;# local variable stack space (n*16+8)
+       sub rsp, 352            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -712,23 +745,37 @@ _nb_kernel200_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 360
+       add rsp, 352
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
 .globl nb_kernel200nf_x86_64_sse
 .globl _nb_kernel200nf_x86_64_sse
 nb_kernel200nf_x86_64_sse:     
@@ -788,16 +835,49 @@ _nb_kernel200nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 248            ;# local variable stack space (n*16+8)
+       sub rsp, 240            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1220,16 +1300,31 @@ _nb_kernel200nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index d2fec41f9241f39babd7b189fcc828fa70b9c3d2..f4b213a5e5bb641d99f48d83c4df7dcb841d7aa8 100644 (file)
@@ -144,16 +144,49 @@ _nb_kernel201_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 800            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -961,20 +994,35 @@ _nb_kernel201_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
        
 
 .globl nb_kernel201nf_x86_64_sse
@@ -1048,16 +1096,49 @@ _nb_kernel201nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 432            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1552,15 +1633,31 @@ _nb_kernel201nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 8d7c0cf68c6140749dd90041fb9c09358fa09c3a..bf5eba997a5922fde6b2d2347ed57ec0027ea0e9 100644 (file)
@@ -185,16 +185,49 @@ _nb_kernel202_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-       
-       
-       sub rsp, 1544           ;# local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 1536           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1559,23 +1592,38 @@ _nb_kernel202_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1544
+       add rsp, 1536
        emms
 
-
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
        
 .globl nb_kernel202nf_x86_64_sse
 .globl _nb_kernel202nf_x86_64_sse
@@ -1671,10 +1719,49 @@ _nb_kernel202nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       sub rsp, 800            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2397,12 +2484,31 @@ _nb_kernel202nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-       
index 964fc138a0c268bd50f9f3579855473d63143071..1d029b9b881a70b64919eb7fc4885a27516103a0 100644 (file)
@@ -139,16 +139,50 @@ _nb_kernel203_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       sub rsp, 800            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -955,21 +989,36 @@ _nb_kernel203_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 
 
@@ -1046,16 +1095,49 @@ _nb_kernel203nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       sub rsp, 432            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1540,15 +1622,31 @@ _nb_kernel203nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index b84b306ea54bac1ff11d74ea1f97b39879fe2413..214f7bdd804bdefb88815de982d5accb788c9f43 100644 (file)
@@ -186,16 +186,49 @@ _nb_kernel204_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1544           ;# local variable stack space (n*16+8)
+       sub rsp, 1536           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1559,16 +1592,32 @@ _nb_kernel204_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1544
+       add rsp, 1536
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1577,7 +1626,6 @@ _nb_kernel204_x86_64_sse:
 
 
 
-
        
 .globl nb_kernel204nf_x86_64_sse
 .globl _nb_kernel204nf_x86_64_sse
@@ -1673,16 +1721,49 @@ _nb_kernel204nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       sub rsp, 800            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2373,15 +2454,31 @@ _nb_kernel204nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index f7952f1b44eac2773ba69b9e8f0cf0ebc1b72e5f..06f84481775c80ad95a53d7495ea6ff98c13209c 100644 (file)
@@ -114,20 +114,51 @@ _nb_kernel210_x86_64_sse:
 .equiv          nb210_nouter,           428
 .equiv          nb210_ninner,           432
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       sub rsp, 432            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -881,16 +912,32 @@ _nb_kernel210_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -898,8 +945,6 @@ _nb_kernel210_x86_64_sse:
 
 
 
-
-
 .globl nb_kernel210nf_x86_64_sse
 .globl _nb_kernel210nf_x86_64_sse
 nb_kernel210nf_x86_64_sse:     
@@ -964,16 +1009,49 @@ _nb_kernel210nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       sub rsp, 304            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1535,15 +1613,31 @@ _nb_kernel210nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 6be6b4724d7a6fba79d0db180cfefa166b35a775..407ce09e6a4cf58fdac7a902e468d4c0ac5e1525 100644 (file)
@@ -145,16 +145,49 @@ _nb_kernel211_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       sub rsp, 864            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1061,22 +1094,37 @@ _nb_kernel211_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel211nf_x86_64_sse
 .globl _nb_kernel211nf_x86_64_sse
 nb_kernel211nf_x86_64_sse:     
@@ -1152,16 +1200,49 @@ _nb_kernel211nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 488            ;# local variable stack space (n*16+8)
+       sub rsp, 480            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1756,17 +1837,32 @@ _nb_kernel211nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 488
+       add rsp, 480
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
index 2256cecb07b279614006151b778304db7ef0dcaa..059b9960ea9cd35d9e8aa7bf037ca8853cbcfc59 100644 (file)
@@ -190,15 +190,49 @@ _nb_kernel212_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-               
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1628,23 +1662,38 @@ _nb_kernel212_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
-
 .globl nb_kernel212nf_x86_64_sse
 .globl _nb_kernel212nf_x86_64_sse
 nb_kernel212nf_x86_64_sse:     
@@ -1741,11 +1790,49 @@ _nb_kernel212nf_x86_64_sse:
 .equiv          nb212nf_ninner,         840
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 856            ;# local variable stack space (n*16+8)
+       sub rsp, 848            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2581,10 +2668,31 @@ _nb_kernel212nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 856
+       add rsp, 848
        emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 7f99135ead7dda958dc9663c93fc31566d85ed75..1945351f6d454fe0a39f428db7e1ea2b9eec9513 100644 (file)
@@ -156,17 +156,49 @@ _nb_kernel213_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1064           ;# local variable stack space (n*16+8)
+       sub rsp, 1056           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1202,16 +1234,32 @@ _nb_kernel213_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1064
+       add rsp, 1056
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1220,7 +1268,6 @@ _nb_kernel213_x86_64_sse:
 
 
 
-
        
 .globl nb_kernel213nf_x86_64_sse
 .globl _nb_kernel213nf_x86_64_sse
@@ -1301,21 +1348,51 @@ _nb_kernel213nf_x86_64_sse:
 .equiv          nb213nf_nn1,            580
 .equiv          nb213nf_nouter,         584
 .equiv          nb213nf_ninner,         588
-
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 600            ;# local variable stack space (n*16+8)
+       sub rsp, 592            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1936,18 +2013,31 @@ _nb_kernel213nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 600
+       add rsp, 592
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
index cd25eb5df2a64552e5a03a61a19dab614373dec2..2f083d9d36d70073fe303450fa14ba5a352323a8 100644 (file)
@@ -208,17 +208,50 @@ _nb_kernel214_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1912           ;# local variable stack space (n*16+8)
+       sub rsp, 1904           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1901,16 +1934,32 @@ _nb_kernel214_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1912
+       add rsp, 1904
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -2020,19 +2069,51 @@ _nb_kernel214nf_x86_64_sse:
 .equiv          nb214nf_nouter,         980
 .equiv          nb214nf_ninner,         984
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1000           ;# local variable stack space (n*16+8)
+       sub rsp, 992            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2865,16 +2946,31 @@ _nb_kernel214nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1000
+       add rsp, 992
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index f798c8d86e68af3b6574843bdac6ab2d39422f7e..1ede9872581e07ba583ebdb27ff12bd9c7ba424d 100644 (file)
@@ -117,20 +117,52 @@ _nb_kernel230_x86_64_sse:
 .equiv          nb230_nouter,           428
 .equiv          nb230_ninner,           432
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 456            ;# local variable stack space (n*16+8)
+       sub rsp, 448            ;# local variable stack space (n*16)
+
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1112,16 +1144,32 @@ _nb_kernel230_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 456
+       add rsp, 448
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1196,17 +1244,51 @@ _nb_kernel230nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
        sub rsp, 328            ;# local variable stack space (n*16+8)
 
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb230nf_nouter], eax
@@ -1969,13 +2051,28 @@ _nb_kernel230nf_x86_64_sse:
        add rsp, 328
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 372eca947a24697948dea582429ab190f674d31d..cdb8651f5f406614ab844cf855131ef87628fe90 100644 (file)
@@ -146,18 +146,51 @@ _nb_kernel231_x86_64_sse:
 .equiv          nb231_nouter,           900
 .equiv          nb231_ninner,           904
 
-        push rbp
-        mov  rbp, rsp
-        push rbx
-
-        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-        sub rsp, 920   ; # local variable stack space (n*16+8)
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+       emms
+    sub rsp, 912       ; # local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1227,16 +1260,32 @@ _nb_kernel231_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 920
+       add rsp, 912
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1320,18 +1369,51 @@ _nb_kernel231nf_x86_64_sse:
 .equiv          nb231nf_nouter,         532
 .equiv          nb231nf_ninner,         536
        
-        push rbp
-        mov  rbp, rsp
-        push rbx
-       
-        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-        sub rsp, 552         ; # local variable stack space (n*16+8)
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+       emms
+    sub rsp, 544         ; # local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2060,17 +2142,31 @@ _nb_kernel231nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 552
+       add rsp, 544
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index e99ebbe4ec058649888dccabe3f2230276ffcaf4..1db62fe11514de1d403d79fbf24c4a0dd5a08f34 100644 (file)
@@ -190,15 +190,49 @@ _nb_kernel232_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-               
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1793,15 +1827,32 @@ _nb_kernel232_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1809,7 +1860,6 @@ _nb_kernel232_x86_64_sse:
 
 
 
-
 .globl nb_kernel232nf_x86_64_sse
 .globl _nb_kernel232nf_x86_64_sse
 nb_kernel232nf_x86_64_sse:     
@@ -1907,11 +1957,49 @@ _nb_kernel232nf_x86_64_sse:
 .equiv          nb232nf_ninner,         856
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       sub rsp, 864            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2876,10 +2964,31 @@ _nb_kernel232nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 0c2ade0f6c52bd436a3406a894db318fe2323f97..7851f75c0a40aeb921ddebef0443ddb539303682 100644 (file)
@@ -155,19 +155,52 @@ _nb_kernel233_x86_64_sse:
 .equiv          nb233_nouter,           1068
 .equiv          nb233_ninner,           1072
        
-        push rbp
-        mov  rbp, rsp
-        push rbx
-       
-       
-        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+       emms
 
-        sub rsp, 1096          ;# local variable stack space (n*16+8)
+    sub rsp, 1088              ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1365,16 +1398,32 @@ _nb_kernel233_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1096
+       add rsp, 1088
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1382,8 +1431,6 @@ _nb_kernel233_x86_64_sse:
 
 
 
-
-
        
 .globl nb_kernel233nf_x86_64_sse
 .globl _nb_kernel233nf_x86_64_sse
@@ -1466,20 +1513,51 @@ _nb_kernel233nf_x86_64_sse:
 .equiv          nb233nf_nouter,         596
 .equiv          nb233nf_ninner,         600
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 616            ;# local variable stack space (n*16+8)
+       sub rsp, 608            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2251,18 +2329,31 @@ _nb_kernel233nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 616
+       add rsp, 608
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
index 2015f6cd57ff2540e3130250f0ee2475023247d6..fa49b8a5d9c95c24b793562ade4532d5102c154a 100644 (file)
@@ -207,17 +207,50 @@ _nb_kernel234_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1912           ;# local variable stack space (n*16+8)
+       sub rsp, 1904           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2064,20 +2097,35 @@ _nb_kernel234_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1912
+       add rsp, 1904
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
        
 .globl nb_kernel234nf_x86_64_sse
 .globl _nb_kernel234nf_x86_64_sse
@@ -2183,19 +2231,51 @@ _nb_kernel234nf_x86_64_sse:
 .equiv          nb234nf_nouter,         980
 .equiv          nb234nf_ninner,         984
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1000           ;# local variable stack space (n*16+8)
+       sub rsp, 992            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3250,18 +3330,33 @@ _nb_kernel234nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1000
+       add rsp, 992
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
index cee5941f7966e638df52ac6c647b496d55de4f80..131bf3f1699a1ae903b48d2d29104878aae1e7de 100644 (file)
@@ -111,19 +111,52 @@ _nb_kernel300_x86_64_sse:
 .equiv          nb300_nouter,           360
 .equiv          nb300_ninner,           364
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 376            ;# local variable stack space (n*16+8)
+       sub rsp, 368            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -828,24 +861,38 @@ _nb_kernel300_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 376
+       add rsp, 368
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
-
 .globl nb_kernel300nf_x86_64_sse
 .globl _nb_kernel300nf_x86_64_sse
 nb_kernel300nf_x86_64_sse:     
@@ -904,16 +951,49 @@ _nb_kernel300nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 248            ;# local variable stack space (n*16+8)
+       sub rsp, 240            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1448,18 +1528,31 @@ _nb_kernel300nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
index add0981f5e75454c9da8fdc19aa5cd7cc54cbf10..9b10e02565ed1d3a21dcd13ca9da77b584f5ce1f 100644 (file)
@@ -139,19 +139,51 @@ _nb_kernel301_x86_64_sse:
 .equiv          nb301_nouter,           804
 .equiv          nb301_ninner,           808
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 824            ;# local variable stack space (n*16+8)
+       sub rsp, 816            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1149,21 +1181,35 @@ _nb_kernel301_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 824
+       add rsp, 816
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-       
-
 
 
 
@@ -1240,16 +1286,49 @@ _nb_kernel301nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       sub rsp, 464            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1934,16 +2013,31 @@ _nb_kernel301nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 4107c97d9a62dd3c07a7ecc865a9095e3a63fd41..e310b72e07c7a022254c5c79be520450284110f5 100644 (file)
@@ -183,15 +183,49 @@ _nb_kernel302_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       push r12
-       push r13
-       push r14
-       push r15
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 1528           ;# local variable stack space (n*4+8)
+       sub rsp, 1520           ;# local variable stack space (n*4+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2138,20 +2172,36 @@ _nb_kernel302_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1528
+       add rsp, 1520
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 
        
@@ -2247,10 +2297,49 @@ _nb_kernel302nf_x86_64_sse:
 .equiv          nb302nf_ninner,         776
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 792            ;# local variable stack space (n*4+8)
+       sub rsp, 784            ;# local variable stack space (n*4+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3549,11 +3638,31 @@ _nb_kernel302nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index ffd42fb15ee4a860f9fae31ef86d6f2b50dbc9b0..fae983bc22745175614c70695882502f91565917 100644 (file)
@@ -141,16 +141,49 @@ _nb_kernel303_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 824            ;# local variable stack space (n*16+8)
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
+       sub rsp, 816            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1148,19 +1181,34 @@ _nb_kernel303_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 824
+       add rsp, 816
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
 
 
@@ -1236,16 +1284,49 @@ _nb_kernel303nf_x86_64_sse:
 .equiv          nb303nf_ninner,         456
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       sub rsp, 464            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1928,15 +2009,31 @@ _nb_kernel303nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 20aed5191ed1654424faf36065f2498503678eed..fe598578981318d18e01af5d57e6668ab1b7a58a 100644 (file)
@@ -185,16 +185,49 @@ _nb_kernel304_x86_64_sse:
 .equiv          nb304_ninner,           1512
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1528           ;# local variable stack space (n*16+8)
+       sub rsp, 1520           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2137,19 +2170,34 @@ _nb_kernel304_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1528
+       add rsp, 1520
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
 
        
@@ -2247,16 +2295,49 @@ _nb_kernel304nf_x86_64_sse:
 .equiv          nb304nf_ninner,         776
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 792            ;# local variable stack space (n*16+8)
+       sub rsp, 784            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3545,19 +3626,31 @@ _nb_kernel304nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
-       
index 09755f9a7e79def989f2558e81ce2bae67f37052..3474e31c788c5980c7d717aef98e2364691eb10c 100644 (file)
@@ -118,20 +118,51 @@ _nb_kernel310_x86_64_sse:
 .equiv          nb310_nouter,           444
 .equiv          nb310_ninner,           448
 
-
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       sub rsp, 464            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1014,16 +1045,32 @@ _nb_kernel310_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1031,7 +1078,6 @@ _nb_kernel310_x86_64_sse:
 
 
 
-
 .globl nb_kernel310nf_x86_64_sse
 .globl _nb_kernel310nf_x86_64_sse
 nb_kernel310nf_x86_64_sse:     
@@ -1096,17 +1142,49 @@ _nb_kernel310nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       sub rsp, 304            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1790,15 +1868,31 @@ _nb_kernel310nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index f40b0783288b264d052a2fb90f864d39d65a8305..485f6e961ef53c75ba0c5e11894013c1895f8162 100644 (file)
@@ -147,15 +147,50 @@ _nb_kernel311_x86_64_sse:
 .equiv          nb311_ninner,           892
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 904            ;# local variable stack space (n*16+8)
+       sub rsp, 896            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1260,16 +1295,32 @@ _nb_kernel311_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 904
+       add rsp, 896
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1353,15 +1404,49 @@ _nb_kernel311nf_x86_64_sse:
 .equiv          nb311nf_ninner,         508
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 520            ;# local variable stack space (n*16+8)
+       sub rsp, 512            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2143,16 +2228,32 @@ _nb_kernel311nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
index 62bcb0b5e5b7c1cb3a3b70b4efb7f49cd5a03895..9d4746e217f96cc63053df7025a991a7142db8e9 100644 (file)
@@ -189,15 +189,49 @@ _nb_kernel312_x86_64_sse:
 .equiv          nb312_ninner,           1608
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2214,21 +2248,37 @@ _nb_kernel312_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
        
 .globl nb_kernel312nf_x86_64_sse
 .globl _nb_kernel312nf_x86_64_sse
@@ -2325,10 +2375,49 @@ _nb_kernel312nf_x86_64_sse:
 .equiv          nb312nf_ninner,         824
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 840            ;# local variable stack space (n*16+8)
+       sub rsp, 832            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3689,11 +3778,32 @@ _nb_kernel312nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 840
+       add rsp, 832
        emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
index 5cd3f140938b3bfdf0e510cbc5b82181aae3f9ea..f914e725e79907e4981d72d7ea502abe503f4f7a 100644 (file)
@@ -154,16 +154,49 @@ _nb_kernel313_x86_64_sse:
 .equiv          nb313_ninner,           1036
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1048           ;# local variable stack space (n*16+8)
+       sub rsp, 1040           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1393,19 +1426,34 @@ _nb_kernel313_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1048
+       add rsp, 1040
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
        
 
@@ -1491,16 +1539,49 @@ _nb_kernel313nf_x86_64_sse:
 .equiv          nb313nf_ninner,         572
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 584            ;# local variable stack space (n*16+8)
+       sub rsp, 576            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2314,19 +2395,32 @@ _nb_kernel313nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 584
+       add rsp, 576
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-       
        
index 962606f4659ec6e7cff896c6b58cf710d57686f4..fd434c236501ed9a069c9f9f9f6eacc4f4d84be5 100644 (file)
@@ -206,15 +206,50 @@ _nb_kernel314_x86_64_sse:
 .equiv          nb314_ninner,           1880
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1896           ;# local variable stack space (n*16+8)
+       sub rsp, 1888           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2468,23 +2503,38 @@ _nb_kernel314_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1896
+       add rsp, 1888
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
        
 
 
@@ -2591,15 +2641,49 @@ _nb_kernel314nf_x86_64_sse:
 .equiv          nb314nf_ninner,         968
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 984            ;# local variable stack space (n*16+8)
+       sub rsp, 976            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4027,17 +4111,32 @@ _nb_kernel314nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 984
+       add rsp, 976
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
index 23828a153082b10ecacb1f80d118121002a22729..ea39a711ff6d34650efe0cebd40e8a51cf7807ba 100644 (file)
@@ -119,17 +119,49 @@ _nb_kernel330_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       sub rsp, 432            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1143,20 +1175,35 @@ _nb_kernel330_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
        
 
 
@@ -1224,17 +1271,49 @@ _nb_kernel330nf_x86_64_sse:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       sub rsp, 304            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2032,19 +2111,31 @@ _nb_kernel330nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
-
index a76f5ea3310f2ac6c1d3486471c790bc5429fb2f..e0baa1d47656c4736621702554d101609a4933f8 100644 (file)
@@ -144,15 +144,50 @@ _nb_kernel331_x86_64_sse:
 .equiv          nb331_ninner,           860
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       sub rsp, 864            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1368,16 +1403,32 @@ _nb_kernel331_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1459,16 +1510,50 @@ _nb_kernel331nf_x86_64_sse:
 .equiv          nb331nf_ninner,         508
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 520            ;# local variable stack space (n*16+8)
+       sub rsp, 512            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2343,15 +2428,31 @@ _nb_kernel331nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 58c1b886b7528126f3f65d67a078188aa7d3d0bf..e662370bd6b89fa2cf910ad5c4c3834f99d89dd9 100644 (file)
@@ -187,15 +187,50 @@ _nb_kernel332_x86_64_sse:
 .equiv          nb332_ninner,           1576
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
-       push r12
-       push r13
-       push r14
-       push r15
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 1592           ;# local variable stack space (n*16+8)
+
+       sub rsp, 1584           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2343,22 +2378,37 @@ _nb_kernel332_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1592
+       add rsp, 1584
        emms
 
-       pop r15
-       pop r14
-       pop r13
-       pop r12
-       
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
        
 
        
@@ -2457,9 +2507,50 @@ _nb_kernel332nf_x86_64_sse:
 .equiv          nb332nf_ninner,         824
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-       sub rsp, 840            ;# local variable stack space (n*16+8)
+
+       sub rsp, 832            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3936,9 +4027,31 @@ _nb_kernel332nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 840
+       add rsp, 832
        emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 0aa68c09e71fd99d57b670d66eb42a6942ee3fcc..fac8625d00f464ee76cb54f70be6dd44216c71fe 100644 (file)
@@ -157,16 +157,50 @@ _nb_kernel333_x86_64_sse:
 .equiv          nb333_ninner,           1084
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1112           ;# local variable stack space (n*16+8)
+       sub rsp, 1104           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1558,19 +1592,34 @@ _nb_kernel333_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1112
+       add rsp, 1104
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
 
 
@@ -1655,16 +1704,50 @@ _nb_kernel333nf_x86_64_sse:
 .equiv          nb333nf_ninner,         588
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 600            ;# local variable stack space (n*16+8)
+       sub rsp, 592            ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2610,15 +2693,31 @@ _nb_kernel333nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 600
+       add rsp, 592
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 8f5085b2067eab7ee577e89a031795749edc8705..5f4e629aab322c54deabf495e587f6063160b996 100644 (file)
@@ -204,16 +204,50 @@ _nb_kernel334_x86_64_sse:
 .equiv          nb334_ninner,           1848
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1864           ;# local variable stack space (n*16+8)
+       sub rsp, 1856           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2675,16 +2709,32 @@ _nb_kernel334_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1864
+       add rsp, 1856
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -2792,18 +2842,52 @@ _nb_kernel334nf_x86_64_sse:
 .equiv          nb334nf_nn1,            1024
 .equiv          nb334nf_nouter,         1028
 .equiv          nb334nf_ninner,         1032
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 1048           ;# local variable stack space (n*16+8)
+       sub rsp, 1040           ;# local variable stack space (n*16+8)
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4427,16 +4511,31 @@ _nb_kernel334nf_x86_64_sse:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1048
+       add rsp, 1040
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 4ee7bd610db169cb9b65615637c16e1394935a4a..bd94cf8b4af228ae258e751c781ea6ffa96f48c6 100644 (file)
@@ -110,18 +110,53 @@ _nb_kernel010_x86_64_sse2:
 .equiv          nb010_ntype,            360
 .equiv          nb010_nouter,           364
 .equiv          nb010_ninner,           368
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 392            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 384            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -560,21 +595,35 @@ _nb_kernel010_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 392
+       add rsp, 384
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
-
        
 
 
@@ -636,18 +685,53 @@ _nb_kernel010nf_x86_64_sse2:
 .equiv          nb010nf_ntype,          224
 .equiv          nb010nf_nouter,         228
 .equiv          nb010nf_ninner,         232
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 248            ;# local variable stack space (n*16+8)
+       sub rsp, 240            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -999,15 +1083,31 @@ _nb_kernel010nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index fdf0a6e5c4696c2339ca3a4fa0bcdc7dc50a452a..a30699199b593ffea1552f42ac16fff0f07a42fa 100644 (file)
@@ -114,17 +114,50 @@ _nb_kernel030_x86_64_sse2:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 376            ;# local variable stack space (n*16+8)
+       sub rsp, 368            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -714,16 +747,32 @@ _nb_kernel030_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 376
+       add rsp, 368
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -731,8 +780,6 @@ _nb_kernel030_x86_64_sse2:
 
 
 
-
-
 .globl nb_kernel030nf_x86_64_sse2
 .globl _nb_kernel030nf_x86_64_sse2
 nb_kernel030nf_x86_64_sse2:    
@@ -793,17 +840,50 @@ _nb_kernel030nf_x86_64_sse2:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 248            ;# local variable stack space (n*16+8)
+       sub rsp, 240            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1291,15 +1371,31 @@ _nb_kernel030nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 6313b602a6920b855542869e05df87190ffbc177..eb82a17c4c7a044030d99d982dfe5d38f42d639c 100644 (file)
@@ -107,18 +107,53 @@ _nb_kernel100_x86_64_sse2:
 .equiv          nb100_nn1,              288
 .equiv          nb100_nouter,           292
 .equiv          nb100_ninner,           296
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 304            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -545,16 +580,32 @@ _nb_kernel100_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -615,19 +666,53 @@ _nb_kernel100nf_x86_64_sse2:
 .equiv          nb100nf_nn1,            196
 .equiv          nb100nf_nouter,         200
 .equiv          nb100nf_ninner,         204
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 216            ;# local variable stack space (n*16+8)
+       sub rsp, 208            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -951,19 +1036,33 @@ _nb_kernel100nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 216
+       add rsp, 208
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
-
index 4489fb598a786e4b084403bf2ae7bcfb597b5750..a1f0e97be74614f6e30b92725b75544159dc0e93 100644 (file)
@@ -131,18 +131,53 @@ _nb_kernel101_x86_64_sse2:
 .equiv          nb101_nn1,              672
 .equiv          nb101_nouter,           676
 .equiv          nb101_ninner,           680
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 696            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 688            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -966,23 +1001,39 @@ _nb_kernel101_x86_64_sse2:
         jmp   .nb101_threadloop
 .nb101_end:
 
-       emms
-
        mov eax, [rsp + nb101_nouter]
        mov ebx, [rsp + nb101_ninner]
        mov rcx, [rbp + nb101_outeriter]
        mov rdx, [rbp + nb101_inneriter]
        mov [rcx], eax
        mov [rdx], ebx
-        add rsp, 696
-       
 
-        pop r15
-        pop r14
-        pop r13
-        pop r12
+    add rsp, 688
+       emms
 
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1051,28 +1102,59 @@ _nb_kernel101nf_x86_64_sse2:
 .equiv          nb101nf_nn1,            336
 .equiv          nb101nf_nouter,         340
 .equiv          nb101nf_ninner,         344
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
+
        emms
+       sub rsp, 352            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb101nf_nouter], eax
        mov [rsp + nb101nf_ninner], eax
 
-
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 360            ;# local variable stack space (n*16+8)
-
-
-
        mov edi, [rdi]
        mov [rsp + nb101nf_nri], edi
        mov [rsp + nb101nf_iinr], rsi
@@ -1612,15 +1694,31 @@ _nb_kernel101nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 360
+       add rsp, 352
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index bf6f0bfde1c23a10a27a45d5afd471f4263519f0..96365dbc490b29e52623d401b68a42e22445c75d 100644 (file)
@@ -180,18 +180,53 @@ _nb_kernel102_x86_64_sse2:
 .equiv          nb102_nn1,              1472
 .equiv          nb102_nouter,           1476
 .equiv          nb102_ninner,           1480
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1496           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1488           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1772,16 +1807,32 @@ _nb_kernel102_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1496
+       add rsp, 1488
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1874,18 +1925,53 @@ _nb_kernel102nf_x86_64_sse2:
 .equiv          nb102nf_nn1,            752
 .equiv          nb102nf_nouter,         756
 .equiv          nb102nf_ninner,         760
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 792            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 784            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2821,15 +2907,31 @@ _nb_kernel102nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 6c6002d74eb39cc8db2ad7a8ef348c994e27a97f..8d137665aaa983023ed07028cd9bcc5498b247c8 100644 (file)
@@ -131,18 +131,53 @@ _nb_kernel103_x86_64_sse2:
 .equiv          nb103_nn1,              672
 .equiv          nb103_nouter,           676
 .equiv          nb103_ninner,           680
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 696            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 688            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -972,16 +1007,32 @@ _nb_kernel103_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 696
+       add rsp, 688
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1049,18 +1100,53 @@ _nb_kernel103nf_x86_64_sse2:
 .equiv          nb103nf_nn1,            336
 .equiv          nb103nf_nouter,         340
 .equiv          nb103nf_ninner,         344
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 360            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 352            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1606,16 +1692,31 @@ _nb_kernel103nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 360
+       add rsp, 352
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index a866c262acb3dda419fd92920ca7bb3cf988d559..4ab7c0f256253812537428f5e4aedb5e5a43139f 100644 (file)
@@ -179,18 +179,53 @@ _nb_kernel104_x86_64_sse2:
 .equiv          nb104_nn1,              1472
 .equiv          nb104_nouter,           1476
 .equiv          nb104_ninner,           1480
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1496           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1488           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1772,16 +1807,32 @@ _nb_kernel104_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1496
+       add rsp, 1488
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1876,18 +1927,53 @@ _nb_kernel104nf_x86_64_sse2:
 .equiv          nb104nf_nn1,            764
 .equiv          nb104nf_nouter,         768
 .equiv          nb104nf_ninner,         772
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 792            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 784            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2823,15 +2909,31 @@ _nb_kernel104nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 0485cf416c24dadb682887ba9a645cdd04c74a54..416bea0a7497af67f8686f13540a9c878cc6a645 100644 (file)
@@ -115,18 +115,53 @@ _nb_kernel110_x86_64_sse2:
 .equiv          nb110_ntype,            376
 .equiv          nb110_nouter,           380
 .equiv          nb110_ninner,           384
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 408            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 400            ;# local variable stack space (n*16+8)
        
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -617,16 +652,32 @@ _nb_kernel110_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 408
+       add rsp, 400
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -634,7 +685,6 @@ _nb_kernel110_x86_64_sse2:
 
 
 
-
 .globl nb_kernel110nf_x86_64_sse2
 .globl _nb_kernel110nf_x86_64_sse2
 nb_kernel110nf_x86_64_sse2:    
@@ -694,18 +744,53 @@ _nb_kernel110nf_x86_64_sse2:
 .equiv          nb110nf_ntype,          248
 .equiv          nb110nf_nouter,         252
 .equiv          nb110nf_ninner,         256
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 280            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 272            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1119,16 +1204,31 @@ _nb_kernel110nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 280
+       add rsp, 272
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
-       ret     
-
+       ret
index df745926a9c74758618c6425e06c103f6b711fd2..6f87a4678ab69eb1c73a340e300caadee657a2ea 100644 (file)
@@ -135,18 +135,53 @@ _nb_kernel111_x86_64_sse2:
 .equiv          nb111_nn1,              768
 .equiv          nb111_nouter,           772
 .equiv          nb111_ninner,           776
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 792            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 784            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1066,16 +1101,32 @@ _nb_kernel111_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1083,7 +1134,6 @@ _nb_kernel111_x86_64_sse2:
 
 
 
-
 .globl nb_kernel111nf_x86_64_sse2
 .globl _nb_kernel111nf_x86_64_sse2
 nb_kernel111nf_x86_64_sse2:    
@@ -1151,18 +1201,53 @@ _nb_kernel111nf_x86_64_sse2:
 .equiv          nb111nf_nn1,            388
 .equiv          nb111nf_nouter,         392
 .equiv          nb111nf_ninner,         396
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 408            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 400            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1801,15 +1886,31 @@ _nb_kernel111nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 408
+       add rsp, 400
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 98992bd533f0cbedcc3071be2db27aff6e80b0c6..b43e0ec4c5051e338672fd1fd54e24fe8c9a9917 100644 (file)
@@ -186,18 +186,53 @@ _nb_kernel112_x86_64_sse2:
 .equiv          nb112_nn1,              1564
 .equiv          nb112_nouter,           1568
 .equiv          nb112_ninner,           1572
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1592           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1584           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1858,16 +1893,32 @@ _nb_kernel112_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1592
+       add rsp, 1584
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1966,18 +2017,53 @@ _nb_kernel112nf_x86_64_sse2:
 .equiv          nb112nf_nn1,            800
 .equiv          nb112nf_nouter,         804
 .equiv          nb112nf_ninner,         808
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 824            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 816            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2971,17 +3057,31 @@ _nb_kernel112nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 824
+       add rsp, 816
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index ac4e4662ac3d444655620a9210c7e34f8896a2a6..3f60599cec83e28f3686a29fc9c4aa863f6f5d09 100644 (file)
@@ -147,18 +147,53 @@ _nb_kernel113_x86_64_sse2:
 .equiv          nb113_nn1,              964
 .equiv          nb113_nouter,           968
 .equiv          nb113_ninner,           972
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 984            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 976            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1240,16 +1275,32 @@ _nb_kernel113_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 984
+       add rsp, 976
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1257,7 +1308,6 @@ _nb_kernel113_x86_64_sse2:
 
 
 
-
 .globl nb_kernel113nf_x86_64_sse2
 .globl _nb_kernel113nf_x86_64_sse2
 nb_kernel113nf_x86_64_sse2:    
@@ -1329,18 +1379,53 @@ _nb_kernel113nf_x86_64_sse2:
 .equiv          nb113nf_nn1,            452
 .equiv          nb113nf_nouter,         456
 .equiv          nb113nf_ninner,         460
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 464            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2031,16 +2116,31 @@ _nb_kernel113nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index e7c456b921ab56270be75f215d014a83e71ad8e2..b4577b720e105e867dae53bcae37f7096582ea69 100644 (file)
@@ -201,18 +201,53 @@ _nb_kernel114_x86_64_sse2:
 .equiv          nb114_nn1,              1856
 .equiv          nb114_nouter,           1860
 .equiv          nb114_ninner,           1864
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1880           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1872           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2065,16 +2100,32 @@ _nb_kernel114_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1880
+       add rsp, 1872
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -2082,7 +2133,6 @@ _nb_kernel114_x86_64_sse2:
 
 
 
-
        
 .globl nb_kernel114nf_x86_64_sse2
 .globl _nb_kernel114nf_x86_64_sse2
@@ -2185,18 +2235,53 @@ _nb_kernel114nf_x86_64_sse2:
 .equiv          nb114nf_nn1,            944
 .equiv          nb114nf_nouter,         948
 .equiv          nb114nf_ninner,         952
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 968            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 960            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3310,17 +3395,31 @@ _nb_kernel114nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 968
+       add rsp, 960
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index adddab57277b169408947ca5f4c7b1a8f52aa2e5..18b3cc54cca4775aad66e8a566f1a6312d55f9c1 100644 (file)
@@ -116,18 +116,53 @@ _nb_kernel130_x86_64_sse2:
 .equiv          nb130_ntype,            424
 .equiv          nb130_nouter,           428
 .equiv          nb130_ninner,           432
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 456            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 448            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -760,16 +795,32 @@ _nb_kernel130_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 456
+       add rsp, 448
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -841,16 +892,50 @@ _nb_kernel130nf_x86_64_sse2:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 328            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 320            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1401,15 +1486,31 @@ _nb_kernel130nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 328
+       add rsp, 320
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 678d82f3a3c22818c426cd16147c5d1d468e6ecb..4925daaa218cb3374d00c2e170839ab955eea370 100644 (file)
@@ -145,18 +145,52 @@ _nb_kernel131_x86_64_sse2:
 .equiv          nb131_nouter,           900
 .equiv          nb131_ninner,           904
 
-        push rbp
-        mov  rbp, rsp
-        push rbx
-
-        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-        sub rsp, 920   ; # local variable stack space (n*16+8)
+       emms
+    sub rsp, 912       ; # local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1174,22 +1208,37 @@ _nb_kernel131_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 920
+       add rsp, 912
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel131nf_x86_64_sse2
 .globl _nb_kernel131nf_x86_64_sse2
 nb_kernel131nf_x86_64_sse2:    
@@ -1264,19 +1313,53 @@ _nb_kernel131nf_x86_64_sse2:
 .equiv          nb131nf_nn1,            496
 .equiv          nb131nf_nouter,         500
 .equiv          nb131nf_ninner,         504
-       
-        push rbp
-        mov  rbp, rsp
-        push rbx
-       
-        emms
 
-        push r12
-        push r13
-        push r14
-        push r15
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-        sub rsp, 520  ; # local variable stack space (n*16+8)
+       emms
+    sub rsp, 512  ; # local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2053,15 +2136,31 @@ _nb_kernel131nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 5a1e2760fc5d0f8c86b92c278c650063b4153ab9..3aa52ab956623c0192b7ab7b730450ca0986fe47 100644 (file)
@@ -186,17 +186,53 @@ _nb_kernel132_x86_64_sse2:
 .equiv          nb132_nn1,              1600
 .equiv          nb132_nouter,           1604
 .equiv          nb132_ninner,           1608
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1999,21 +2035,36 @@ _nb_kernel132_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel132nf_x86_64_sse2
 .globl _nb_kernel132nf_x86_64_sse2
@@ -2110,19 +2161,53 @@ _nb_kernel132nf_x86_64_sse2:
 .equiv          nb132nf_nn1,            848
 .equiv          nb132nf_nouter,         852
 .equiv          nb132nf_ninner,         856
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       sub rsp, 864            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3246,17 +3331,31 @@ _nb_kernel132nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index e9ea33570828220cc2e7a09a4a908bede4d04746..10711605e372cac3cd0c3b7cc02471265ec19ec2 100644 (file)
@@ -153,17 +153,53 @@ _nb_kernel133_x86_64_sse2:
 .equiv          nb133_nn1,              1064
 .equiv          nb133_nouter,           1068
 .equiv          nb133_ninner,           1072
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1080           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1072           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1418,23 +1454,37 @@ _nb_kernel133_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1080
+       add rsp, 1072
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
 .globl nb_kernel133nf_x86_64_sse2
 .globl _nb_kernel133nf_x86_64_sse2
 nb_kernel133nf_x86_64_sse2:    
@@ -1513,18 +1563,53 @@ _nb_kernel133nf_x86_64_sse2:
 .equiv          nb133nf_nn1,            580
 .equiv          nb133nf_nouter,         584
 .equiv          nb133nf_ninner,         588
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 600            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 592            ;# local variable stack space (n*16+8)
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb133nf_nouter], eax
@@ -2377,16 +2462,32 @@ _nb_kernel133nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 600
+       add rsp, 592
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
index 82edf6951cdde072ce3d47865ff275d127cd8ffc..bb1eeceba72fdad4ce73640574fdacfc988c1512 100644 (file)
@@ -204,17 +204,53 @@ _nb_kernel134_x86_64_sse2:
 .equiv          nb134_nn1,              1888
 .equiv          nb134_nouter,           1892
 .equiv          nb134_ninner,           1896
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1912           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1904           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2195,21 +2231,36 @@ _nb_kernel134_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1912
+       add rsp, 1904
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel134nf_x86_64_sse2
 .globl _nb_kernel134nf_x86_64_sse2
@@ -2314,17 +2365,53 @@ _nb_kernel134nf_x86_64_sse2:
 .equiv          nb134nf_nn1,            976
 .equiv          nb134nf_nouter,         980
 .equiv          nb134nf_ninner,         984
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1000           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 992            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3567,17 +3654,31 @@ _nb_kernel134nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1000
+       add rsp, 992
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index c171042a1400f9c0d02b6f5b8775e07838b3e892..840557517d7b098ad714c6e4a73e218a7c3bfc76 100644 (file)
@@ -108,17 +108,53 @@ _nb_kernel200_x86_64_sse2:
 .equiv          nb200_nn1,              336
 .equiv          nb200_nouter,           340
 .equiv          nb200_ninner,           344
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 360            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 352            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -556,22 +592,39 @@ _nb_kernel200_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 360
+       add rsp, 352
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
+
 .globl nb_kernel200nf_x86_64_sse2
 .globl _nb_kernel200nf_x86_64_sse2
 nb_kernel200nf_x86_64_sse2:    
@@ -628,17 +681,53 @@ _nb_kernel200nf_x86_64_sse2:
 .equiv          nb200nf_nn1,            224
 .equiv          nb200nf_nouter,         228
 .equiv          nb200nf_ninner,         232
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 248            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 240            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -985,16 +1074,32 @@ _nb_kernel200nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
index 74a710368aa7e192e7d3f35d18f1f3034118b71a..6383d8b1137e1c51d756c02d172dd6eaf093409e 100644 (file)
@@ -137,17 +137,53 @@ _nb_kernel201_x86_64_sse2:
 .equiv          nb201_nn1,              784
 .equiv          nb201_nouter,           788
 .equiv          nb201_ninner,           792
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 800            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1041,16 +1077,32 @@ _nb_kernel201_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1126,18 +1178,53 @@ _nb_kernel201nf_x86_64_sse2:
 .equiv          nb201nf_nn1,            416
 .equiv          nb201nf_nouter,         420
 .equiv          nb201nf_ninner,         424
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       sub rsp, 432            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1723,15 +1810,31 @@ _nb_kernel201nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 264480a01aaa68b36ab6977534646194beaf812c..02dbb82c9b89f79d6b351fb548836b00910c6636 100644 (file)
@@ -182,17 +182,53 @@ _nb_kernel202_x86_64_sse2:
 .equiv          nb202_nn1,              1520
 .equiv          nb202_nouter,           1524
 .equiv          nb202_ninner,           1528
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1544           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1536           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1952,16 +1988,32 @@ _nb_kernel202_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1544
+       add rsp, 1536
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -2060,17 +2112,53 @@ _nb_kernel202nf_x86_64_sse2:
 .equiv          nb202nf_nn1,            784
 .equiv          nb202nf_nouter,         788
 .equiv          nb202nf_ninner,         792
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 800            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3126,17 +3214,31 @@ _nb_kernel202nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-       
index e1c8839a658a7aca9b8d87e2e75d1f50e869b0fc..5a574754dd5347390a9c94bcc7320fce23cc7f53 100644 (file)
@@ -137,17 +137,53 @@ _nb_kernel203_x86_64_sse2:
 .equiv          nb203_nn1,              784
 .equiv          nb203_nouter,           788
 .equiv          nb203_ninner,           792
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 800            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1037,22 +1073,37 @@ _nb_kernel203_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel203nf_x86_64_sse2
 .globl _nb_kernel203nf_x86_64_sse2
 nb_kernel203nf_x86_64_sse2:    
@@ -1121,17 +1172,53 @@ _nb_kernel203nf_x86_64_sse2:
 .equiv          nb203nf_nn1,            416
 .equiv          nb203nf_nouter,         420
 .equiv          nb203nf_ninner,         424
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 432            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1717,15 +1804,31 @@ _nb_kernel203nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index b3ef009739bf6bf916a63562bdf3ca9a7dd869e9..1c59a4278de782b3b48ccd64ab886deddc117e18 100644 (file)
@@ -183,17 +183,53 @@ _nb_kernel204_x86_64_sse2:
 .equiv          nb204_nn1,              1520
 .equiv          nb204_nouter,           1524
 .equiv          nb204_ninner,           1528
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1544           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1536           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1948,20 +1984,35 @@ _nb_kernel204_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1544
+       add rsp, 1536
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
        
 
        
@@ -2056,17 +2107,53 @@ _nb_kernel204nf_x86_64_sse2:
 .equiv          nb204nf_nn1,            784
 .equiv          nb204nf_nouter,         788
 .equiv          nb204nf_ninner,         792
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 808            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 800            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3123,16 +3210,31 @@ _nb_kernel204nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 808
+       add rsp, 800
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 8162f743e9f543197a74f540f597bd1388a70fa8..e4ef58e147bc7b11be11a2f026f273147af36e16 100644 (file)
@@ -115,18 +115,53 @@ _nb_kernel210_x86_64_sse2:
 .equiv          nb210_ntype,            424
 .equiv          nb210_nouter,           428
 .equiv          nb210_ninner,           432
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 456            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 448            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -649,16 +684,32 @@ _nb_kernel210_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 456
+       add rsp, 448
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -726,18 +777,53 @@ _nb_kernel210nf_x86_64_sse2:
 .equiv          nb210nf_ntype,          280
 .equiv          nb210nf_nouter,         284
 .equiv          nb210nf_ninner,         288
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 304            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1168,15 +1254,31 @@ _nb_kernel210nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 9090a692ee7c17d0795e6ae3b47eb71442183821..a2668985b3c201dea1f6394ca58abde949d1c37a 100644 (file)
@@ -142,17 +142,53 @@ _nb_kernel211_x86_64_sse2:
 .equiv          nb211_nn1,              852
 .equiv          nb211_nouter,           856
 .equiv          nb211_ninner,           860
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 864            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1145,16 +1181,32 @@ _nb_kernel211_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1233,17 +1285,53 @@ _nb_kernel211nf_x86_64_sse2:
 .equiv          nb211nf_nn1,            468
 .equiv          nb211nf_nouter,         472
 .equiv          nb211nf_ninner,         476
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 488            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 480            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1934,15 +2022,31 @@ _nb_kernel211nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 488
+       add rsp, 480
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index f10764fe247fc28943efc12a080dab264af33800..a393fc7d77a84c34944bafd3be42ebc0a96eb54d 100644 (file)
@@ -187,17 +187,53 @@ _nb_kernel212_x86_64_sse2:
 .equiv          nb212_nn1,              1600
 .equiv          nb212_nouter,           1604
 .equiv          nb212_ninner,           1608
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2017,21 +2053,36 @@ _nb_kernel212_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel212nf_x86_64_sse2
 .globl _nb_kernel212nf_x86_64_sse2
@@ -2127,17 +2178,53 @@ _nb_kernel212nf_x86_64_sse2:
 .equiv          nb212nf_nn1,            832
 .equiv          nb212nf_nouter,         836
 .equiv          nb212nf_ninner,         840
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 856            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 848            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3319,17 +3406,31 @@ _nb_kernel212nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 856
+       add rsp, 848
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index 6fb14aebfa18ea8e124c42cf060e3e421a7ec51c..efc3ea8b787d8a7837f0c8c04dac81d4b8259c74 100644 (file)
@@ -153,17 +153,53 @@ _nb_kernel213_x86_64_sse2:
 .equiv          nb213_nn1,              1044
 .equiv          nb213_nouter,           1048
 .equiv          nb213_ninner,           1052
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1064           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1056           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1320,16 +1356,32 @@ _nb_kernel213_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1064
+       add rsp, 1056
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1416,18 +1468,53 @@ _nb_kernel213nf_x86_64_sse2:
 .equiv          nb213nf_nn1,            580
 .equiv          nb213nf_nouter,         584
 .equiv          nb213nf_ninner,         588
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 600            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 592            ;# local variable stack space (n*16+8)
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb213nf_nouter], eax
@@ -2179,16 +2266,31 @@ _nb_kernel213nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 600
+       add rsp, 592
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 40bd3dd3b18a77259997b01857f951af4357f1b9..6492ade226bb7fcc871d3b88928f202c028f8aaa 100644 (file)
@@ -204,17 +204,53 @@ _nb_kernel214_x86_64_sse2:
 .equiv          nb214_nn1,              1888
 .equiv          nb214_nouter,           1892
 .equiv          nb214_ninner,           1896
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1912           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1904           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2245,21 +2281,36 @@ _nb_kernel214_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1912
+       add rsp, 1904
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel214nf_x86_64_sse2
 .globl _nb_kernel214nf_x86_64_sse2
@@ -2364,17 +2415,53 @@ _nb_kernel214nf_x86_64_sse2:
 .equiv          nb214nf_nn1,            976
 .equiv          nb214nf_nouter,         980
 .equiv          nb214nf_ninner,         984
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1000           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 992            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3684,15 +3771,31 @@ _nb_kernel214nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1000
+       add rsp, 992
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 81d5cf45246d0dca01076d5107945870fa94ade4..bcf2c6719c6cce13cb46d66995604b17d3ec9dbb 100644 (file)
@@ -116,18 +116,53 @@ _nb_kernel230_x86_64_sse2:
 .equiv          nb230_ntype,            424
 .equiv          nb230_nouter,           428
 .equiv          nb230_ninner,           432
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 456            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 448            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -790,19 +825,34 @@ _nb_kernel230_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 456
+       add rsp, 448
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
 
 
@@ -872,16 +922,50 @@ _nb_kernel230nf_x86_64_sse2:
 
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 328            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 320            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1450,15 +1534,31 @@ _nb_kernel230nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 328
+       add rsp, 320
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index de28c0fb9c659e675c74047a0d7852ecd3470ed1..7b6c2389f69ad781c968185fbda4493fa375b62f 100644 (file)
@@ -146,18 +146,52 @@ _nb_kernel231_x86_64_sse2:
 .equiv          nb231_nouter,           900
 .equiv          nb231_ninner,           904
 
-        push rbp
-        mov  rbp, rsp
-        push rbx
-
-        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-        sub rsp, 920    ;  # local variable stack space (n*16+8)
+       emms
+    sub rsp, 912    ;  # local variable stack space (n*16+8)
        
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1307,16 +1341,32 @@ _nb_kernel231_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 920
+       add rsp, 912
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -1399,19 +1449,53 @@ _nb_kernel231nf_x86_64_sse2:
 .equiv          nb231nf_nn1,            528
 .equiv          nb231nf_nouter,         532
 .equiv          nb231nf_ninner,         536
-       
-        push rbp
-        mov  rbp, rsp
-        push rbx
-               
-       emms
 
-        push r12
-        push r13
-        push r14
-        push r15
+       push rbp
+       mov  rbp, rsp
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 552            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 544            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2266,15 +2350,31 @@ _nb_kernel231nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 552
+       add rsp, 544
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 2ae729ac89e181cccfa4bc00026aad99e1fc32cd..a465c8cdb42c5b677ab679186c222e99045296c9 100644 (file)
@@ -186,17 +186,53 @@ _nb_kernel232_x86_64_sse2:
 .equiv          nb232_nn1,              1600
 .equiv          nb232_nouter,           1604
 .equiv          nb232_ninner,           1608
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2161,21 +2197,36 @@ _nb_kernel232_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel232nf_x86_64_sse2
 .globl _nb_kernel232nf_x86_64_sse2
@@ -2272,19 +2323,53 @@ _nb_kernel232nf_x86_64_sse2:
 .equiv          nb232nf_nn1,            848
 .equiv          nb232nf_nouter,         852
 .equiv          nb232nf_ninner,         856
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       
        emms
-
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       sub rsp, 864            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3611,19 +3696,31 @@ _nb_kernel232nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
-
-
index 2fd582eed51ca456e5331d717d804453a5dc76db..396e1253ccccc214ee037820e1b1f307d6e77383 100644 (file)
@@ -154,17 +154,53 @@ _nb_kernel233_x86_64_sse2:
 .equiv          nb233_nn1,              1056
 .equiv          nb233_nouter,           1060
 .equiv          nb233_ninner,           1064
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1080           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1072           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1491,23 +1527,38 @@ _nb_kernel233_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1080
+       add rsp, 1072
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
 .globl nb_kernel233nf_x86_64_sse2
 .globl _nb_kernel233nf_x86_64_sse2
 nb_kernel233nf_x86_64_sse2:    
@@ -1588,18 +1639,53 @@ _nb_kernel233nf_x86_64_sse2:
 .equiv          nb233nf_nn1,            592
 .equiv          nb233nf_nouter,         596
 .equiv          nb233nf_ninner,         600
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 616            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 608            ;# local variable stack space (n*16+8)
        ;# zero 32-bit iteration counters
        mov eax, 0
        mov [rsp + nb233nf_nouter], eax
@@ -2539,16 +2625,31 @@ _nb_kernel233nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 616
+       add rsp, 608
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 86e619826beb66f55cc8ab641d5ececea3d48beb..ab9e2ed20f7c09aee1eb40ae6fa162142f914f3d 100644 (file)
@@ -204,17 +204,53 @@ _nb_kernel234_x86_64_sse2:
 .equiv          nb234_nn1,              1888
 .equiv          nb234_nouter,           1892
 .equiv          nb234_ninner,           1896
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1912           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1904           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2371,21 +2407,38 @@ _nb_kernel234_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1912
+       add rsp, 1904
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
+
        
 .globl nb_kernel234nf_x86_64_sse2
 .globl _nb_kernel234nf_x86_64_sse2
@@ -2490,17 +2543,53 @@ _nb_kernel234nf_x86_64_sse2:
 .equiv          nb234nf_nn1,            976
 .equiv          nb234nf_nouter,         980
 .equiv          nb234nf_ninner,         984
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1000           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 992            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -3950,16 +4039,31 @@ _nb_kernel234nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1000
+       add rsp, 992
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 97cf1d0ed4f5a34bde4510e2d0af9a5403bea039..05ca96cd117f9295a70725297111817f82804404 100644 (file)
@@ -110,17 +110,53 @@ _nb_kernel300_x86_64_sse2:
 .equiv          nb300_nn1,              352
 .equiv          nb300_nouter,           356
 .equiv          nb300_ninner,           360
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-        push r12
-        push r13
-        push r14
-        push r15
-
-       sub rsp, 376            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 368            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -622,22 +658,37 @@ _nb_kernel300_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 376
+       add rsp, 368
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
        
 
 .globl nb_kernel300nf_x86_64_sse2
@@ -696,17 +747,53 @@ _nb_kernel300nf_x86_64_sse2:
 .equiv          nb300nf_nn1,            224
 .equiv          nb300nf_nouter,         228
 .equiv          nb300nf_ninner,         232
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 248            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 240            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1104,15 +1191,31 @@ _nb_kernel300nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 248
+       add rsp, 240
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 15cf778a32f53efc2a6414ecff9feb89d26806e0..80af0445b8dff9af627863bfdf775606d1a0d4a0 100644 (file)
@@ -141,17 +141,53 @@ _nb_kernel301_x86_64_sse2:
 .equiv          nb301_nn1,              844
 .equiv          nb301_nouter,           848
 .equiv          nb301_ninner,           852
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 864            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1234,22 +1270,37 @@ _nb_kernel301_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel301nf_x86_64_sse2
 .globl _nb_kernel301nf_x86_64_sse2
 nb_kernel301nf_x86_64_sse2:    
@@ -1320,17 +1371,53 @@ _nb_kernel301nf_x86_64_sse2:
 .equiv          nb301nf_nn1,            448
 .equiv          nb301nf_nouter,         452
 .equiv          nb301nf_ninner,         456
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 464            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2103,16 +2190,31 @@ _nb_kernel301nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index c2156e1096bd416fcd99515f2e213585a2bc8afc..513dfd4d06848e61ac8ef3845dde00644c2eef98 100644 (file)
@@ -182,17 +182,53 @@ _nb_kernel302_x86_64_sse2:
 .equiv          nb302_nn1,              1504
 .equiv          nb302_nouter,           1508
 .equiv          nb302_ninner,           1512
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1528           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1520           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2482,23 +2518,37 @@ _nb_kernel302_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1528
+       add rsp, 1520
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
 .globl nb_kernel302nf_x86_64_sse2
 .globl _nb_kernel302nf_x86_64_sse2
 nb_kernel302nf_x86_64_sse2:    
@@ -2589,17 +2639,53 @@ _nb_kernel302nf_x86_64_sse2:
 .equiv          nb302nf_nn1,            768
 .equiv          nb302nf_nouter,         772
 .equiv          nb302nf_ninner,         776
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 792            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 784            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4230,17 +4316,31 @@ _nb_kernel302nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index 3ac4ed5552edf68b48259ad91526fef8f0e50119..e4cf226359be794ea17aa4fcb14d0ceb7027f6c7 100644 (file)
@@ -137,17 +137,53 @@ _nb_kernel303_x86_64_sse2:
 .equiv          nb303_nn1,              800
 .equiv          nb303_nouter,           804
 .equiv          nb303_ninner,           808
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 824            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 816            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1221,19 +1257,34 @@ _nb_kernel303_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 824
+       add rsp, 816
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
 
 
@@ -1307,17 +1358,53 @@ _nb_kernel303nf_x86_64_sse2:
 .equiv          nb303nf_nn1,            448
 .equiv          nb303nf_nouter,         452
 .equiv          nb303nf_ninner,         456
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 464            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2090,16 +2177,31 @@ _nb_kernel303nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index d322de13949baba89ff8a583ceb584eb2630491b..0d150b8e4bf878ca28d7f8d8747c9cbcbe5bbb1b 100644 (file)
@@ -182,17 +182,53 @@ _nb_kernel304_x86_64_sse2:
 .equiv          nb304_nn1,              1504
 .equiv          nb304_nouter,           1508
 .equiv          nb304_ninner,           1512
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1528           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1520           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2479,16 +2515,32 @@ _nb_kernel304_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1528
+       add rsp, 1520
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
@@ -2585,17 +2637,53 @@ _nb_kernel304nf_x86_64_sse2:
 .equiv          nb304nf_nn1,            768
 .equiv          nb304nf_nouter,         772
 .equiv          nb304nf_ninner,         776
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 792            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 784            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4226,15 +4314,31 @@ _nb_kernel304nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 792
+       add rsp, 784
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index a22420b4fcf093b327be7a906b8a55ebad1f4d98..9184c34e464c3850eee181ab03ce7ed1f8843222 100644 (file)
@@ -118,17 +118,53 @@ _nb_kernel310_x86_64_sse2:
 .equiv          nb310_ntype,            440
 .equiv          nb310_nouter,           444
 .equiv          nb310_ninner,           448
+
        push rbp
        mov  rbp, rsp
-       push rbx        
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 472            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 464            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -733,23 +769,37 @@ _nb_kernel310_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 472
+       add rsp, 464
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
 .globl nb_kernel310nf_x86_64_sse2
 .globl _nb_kernel310nf_x86_64_sse2
 nb_kernel310nf_x86_64_sse2:    
@@ -811,17 +861,53 @@ _nb_kernel310nf_x86_64_sse2:
 .equiv          nb310nf_ntype,          280
 .equiv          nb310nf_nouter,         284
 .equiv          nb310nf_ninner,         288
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 304            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1329,15 +1415,31 @@ _nb_kernel310nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 2807676f68e5e74b145dcf7980b4568d9d7d1112..e8572152ff1b2bbb7f9601d0f832ce1bf44fd821 100644 (file)
@@ -143,17 +143,53 @@ _nb_kernel311_x86_64_sse2:
 .equiv          nb311_nn1,              884
 .equiv          nb311_nouter,           888
 .equiv          nb311_ninner,           892
+
        push rbp
        mov  rbp, rsp
-       push rbx        
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 904            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 896            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1331,23 +1367,37 @@ _nb_kernel311_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 904
+       add rsp, 896
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
-
 .globl nb_kernel311nf_x86_64_sse2
 .globl _nb_kernel311nf_x86_64_sse2
 nb_kernel311nf_x86_64_sse2:    
@@ -1422,17 +1472,53 @@ _nb_kernel311nf_x86_64_sse2:
 .equiv          nb311nf_nn1,            500
 .equiv          nb311nf_nouter,         504
 .equiv          nb311nf_ninner,         508
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 520            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 512            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2309,15 +2395,31 @@ _nb_kernel311nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index c073b1a658581031d1b3f93c61898e6f34038885..18387f4a4084237d5ec0b6781f44b51cf046443e 100644 (file)
@@ -186,17 +186,53 @@ _nb_kernel312_x86_64_sse2:
 .equiv          nb312_nn1,              1600
 .equiv          nb312_nouter,           1604
 .equiv          nb312_ninner,           1608
+
        push rbp
        mov  rbp, rsp
-       push rbx        
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1624           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1616           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2549,21 +2585,36 @@ _nb_kernel312_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1624
+       add rsp, 1616
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel312nf_x86_64_sse2
 .globl _nb_kernel312nf_x86_64_sse2
@@ -2658,17 +2709,53 @@ _nb_kernel312nf_x86_64_sse2:
 .equiv          nb312nf_nn1,            816
 .equiv          nb312nf_nouter,         820
 .equiv          nb312nf_ninner,         824
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 840            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 832            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4357,16 +4444,31 @@ _nb_kernel312nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 840
+       add rsp, 832
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 15636afca91ca55b6f0e3a2b85c9098b8ce2757f..4d9ac6c682faf368a0f36ec9ff67e492ef9e5fbc 100644 (file)
@@ -157,17 +157,53 @@ _nb_kernel313_x86_64_sse2:
 .equiv          nb313_nn1,              1060
 .equiv          nb313_nouter,           1064
 .equiv          nb313_ninner,           1068
+
        push rbp
        mov  rbp, rsp
-       push rbx        
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1080           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1072           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1516,20 +1552,34 @@ _nb_kernel313_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1080
+       add rsp, 1072
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
        
 
 
@@ -1614,17 +1664,53 @@ _nb_kernel313nf_x86_64_sse2:
 .equiv          nb313nf_nn1,            596
 .equiv          nb313nf_nouter,         600
 .equiv          nb313nf_ninner,         604
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 616            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 608            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2558,17 +2644,31 @@ _nb_kernel313nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 616
+       add rsp, 608
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
-
index 07f522b7965de0775b89b31d30f77c7a52f9ac57..507ce3579e6a89f987738995152f011a15e9f3ff 100644 (file)
@@ -203,17 +203,53 @@ _nb_kernel314_x86_64_sse2:
 .equiv          nb314_nn1,              1856
 .equiv          nb314_nouter,           1860
 .equiv          nb314_ninner,           1864
+
        push rbp
        mov  rbp, rsp
-       push rbx        
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    
+    ;# Push integer registers on stack
+       push rbx
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1880           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1872           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2773,23 +2809,38 @@ _nb_kernel314_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1880
+       add rsp, 1872
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
 
-
        
 .globl nb_kernel314nf_x86_64_sse2
 .globl _nb_kernel314nf_x86_64_sse2
@@ -2892,17 +2943,53 @@ _nb_kernel314nf_x86_64_sse2:
 .equiv          nb314nf_nn1,            944
 .equiv          nb314nf_nouter,         948
 .equiv          nb314nf_ninner,         952
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 968            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 960            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4680,15 +4767,31 @@ _nb_kernel314nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 968
+       add rsp, 960
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 02d602898d08b66a66f52ed88b02f742b3fe38e0..8eff18cc8923d88e01706fd99740ea7b81b07d45 100644 (file)
@@ -113,17 +113,53 @@ _nb_kernel330_x86_64_sse2:
 .equiv          nb330_ntype,            408
 .equiv          nb330_nouter,           412
 .equiv          nb330_ninner,           416
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 440            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 432            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -797,22 +833,37 @@ _nb_kernel330_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 440
+       add rsp, 432
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
 
-
 .globl nb_kernel330nf_x86_64_sse2
 .globl _nb_kernel330nf_x86_64_sse2
 nb_kernel330nf_x86_64_sse2:    
@@ -874,17 +925,53 @@ _nb_kernel330nf_x86_64_sse2:
 .equiv          nb330nf_ntype,          280
 .equiv          nb330nf_nouter,         284
 .equiv          nb330nf_ninner,         288
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 312            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 304            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1459,15 +1546,31 @@ _nb_kernel330nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 312
+       add rsp, 304
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index e7e6e9265d07f454c8a92c80876ae15e8cdf53c1..14421b969b6badb38d82ad723d9b4ab969f6d1e1 100644 (file)
@@ -144,17 +144,53 @@ _nb_kernel331_x86_64_sse2:
 .equiv          nb331_nn1,              852
 .equiv          nb331_nouter,           856
 .equiv          nb331_ninner,           860
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 872            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 864            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1348,20 +1384,35 @@ _nb_kernel331_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 872
+       add rsp, 864
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
-
        
 
 
@@ -1440,17 +1491,53 @@ _nb_kernel331nf_x86_64_sse2:
 .equiv          nb331nf_nn1,            500
 .equiv          nb331nf_nouter,         504
 .equiv          nb331nf_ninner,         508
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 520            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 512            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2400,15 +2487,31 @@ _nb_kernel331nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 520
+       add rsp, 512
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index d405d4a5af1f9b52c23ead073eb6c7c6da48c39a..ab37b82a7ad5f309523c888acc9bd13c87f2e74d 100644 (file)
@@ -185,17 +185,53 @@ _nb_kernel332_x86_64_sse2:
 .equiv          nb332_nn1,              1568
 .equiv          nb332_nouter,           1572
 .equiv          nb332_ninner,           1576
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1592           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1584           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2674,20 +2710,34 @@ _nb_kernel332_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1592
+       add rsp, 1584
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
-       ret     
-
-
+       ret
 
 
 
@@ -2785,17 +2835,53 @@ _nb_kernel332nf_x86_64_sse2:
 .equiv          nb332nf_nn1,            816
 .equiv          nb332nf_nouter,         820
 .equiv          nb332nf_ninner,         824
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 840            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 832            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4581,15 +4667,31 @@ _nb_kernel332nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 840
+       add rsp, 832
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index 9bf00fc6f4d93422542cd4ead8a431f85b001e28..6245db61ca79f2f107f8a7e4f02a935ec7eb4d7f 100644 (file)
@@ -155,17 +155,53 @@ _nb_kernel333_x86_64_sse2:
 .equiv          nb333_nn1,              1028
 .equiv          nb333_nouter,           1032
 .equiv          nb333_ninner,           1036
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1048           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1040           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -1612,19 +1648,34 @@ _nb_kernel333_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1048
+       add rsp, 1040
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
        
 
 
@@ -1706,17 +1757,53 @@ _nb_kernel333nf_x86_64_sse2:
 .equiv          nb333nf_nn1,            516
 .equiv          nb333nf_nouter,         520
 .equiv          nb333nf_ninner,         524
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 536            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 528            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2780,15 +2867,31 @@ _nb_kernel333nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 536
+       add rsp, 528
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
index a5a620509cac2bae6fbad71793cac160431c9846..2450d316b87337372515904497cabe8a610c7e74 100644 (file)
@@ -203,17 +203,53 @@ _nb_kernel334_x86_64_sse2:
 .equiv          nb334_nn1,              1840
 .equiv          nb334_nouter,           1844
 .equiv          nb334_ninner,           1848
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 1864           ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 1856           ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -2925,21 +2961,36 @@ _nb_kernel334_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 1864
+       add rsp, 1856
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
 
 
-
        
 .globl nb_kernel334nf_x86_64_sse2
 .globl _nb_kernel334nf_x86_64_sse2
@@ -3042,17 +3093,53 @@ _nb_kernel334nf_x86_64_sse2:
 .equiv          nb334nf_nn1,            944
 .equiv          nb334nf_nouter,         948
 .equiv          nb334nf_ninner,         952
+
        push rbp
        mov  rbp, rsp
+    
+    ;# Push integer registers on stack
        push rbx
-       emms
-
-        push r12
-        push r13
-        push r14
-        push r15
+    push rsi
+    push rdi
+    push r12
+    push r13
+    push r14
+    push r15
+
+    ;# Make room for registers xmm6-xmm15 (10 registers=160 bytes)
+    sub rsp, 168
+    
+    ;# Save xmm registers to stack
+    movaps [rsp      ], xmm6
+    movaps [rsp + 16 ], xmm7
+    movaps [rsp + 32 ], xmm8
+    movaps [rsp + 48 ], xmm9
+    movaps [rsp + 64 ], xmm10
+    movaps [rsp + 80 ], xmm11
+    movaps [rsp + 96 ], xmm12
+    movaps [rsp + 112], xmm13
+    movaps [rsp + 128], xmm14
+    movaps [rsp + 144], xmm15
+    
+; .if 0    # block below only read by NASM - special calling convention on win64
+%ifidn __OUTPUT_FORMAT__, win64
+    ;# Adjust rbp to account for shadow space (32) & two extra args (2*8) on stack
+    add rbp, 48
+    ;# Adjust stack pointer for different alignment
+    ;# Move around arguments to fit AMD64 convention below
+    ;# AMD64 passes args in: rdi,rsi,rdx,rcx,r8,r9 + stack
+    ;# win64 passes args in: rcx,rdx,r8,r9         + stack
+    mov rdi, rcx
+    mov rsi, rdx
+    mov rdx, r8
+    mov rcx, r9
+    mov r8,  [rbp]
+    mov r9,  [rbp + 8]
+%endif
+; .endif   # end NASM- and win64-specific block
 
-       sub rsp, 968            ;# local variable stack space (n*16+8)
+       emms
+       sub rsp, 960            ;# local variable stack space (n*16+8)
 
        ;# zero 32-bit iteration counters
        mov eax, 0
@@ -4963,16 +5050,31 @@ _nb_kernel334nf_x86_64_sse2:
        mov [rcx], eax
        mov [rdx], ebx
 
-       add rsp, 968
+       add rsp, 960
        emms
 
-
-        pop r15
-        pop r14
-        pop r13
-        pop r12
-
-       pop rbx
+    ;# Save xmm registers to stack
+    movaps xmm6,  [rsp      ]
+    movaps xmm7,  [rsp + 16 ]
+    movaps xmm8,  [rsp + 32 ]
+    movaps xmm9,  [rsp + 48 ]
+    movaps xmm10, [rsp + 64 ]
+    movaps xmm11, [rsp + 80 ]
+    movaps xmm12, [rsp + 96 ]
+    movaps xmm13, [rsp + 112]
+    movaps xmm14, [rsp + 128]
+    movaps xmm15, [rsp + 144]
+
+    ;# Reset pointers after restoring xmm6-15
+    add rsp, 168
+
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rdi
+    pop rsi
+    pop rbx
+    
        pop     rbp
        ret
-
index 0f9464cd5e32e699e335ab4e0123bcd1f4fb88b6..08f88f62807264e1973c3c8eacb215f26129cc85 100644 (file)
@@ -282,14 +282,6 @@ gmx_setup_kernels(FILE *fplog,bool bGenericKernelOnly)
     nb_kernel_setup_x86_64_sse2(fplog,nb_kernel_list);
 #endif
 
-#if defined(GMX_SSE2) 
-#  ifdef GMX_DOUBLE
-       nb_kernel_setup_sse2_double(fplog,nb_kernel_list);
-#  else
-       nb_kernel_setup_sse2_single(fplog,nb_kernel_list);
-#  endif
-#endif
 #if (defined GMX_IA64_ASM && defined GMX_DOUBLE) 
     nb_kernel_setup_ia64_double(fplog,nb_kernel_list);
 #endif
@@ -561,7 +553,7 @@ void do_nonbonded(t_commrec *cr,t_forcerec *fr,
                     /* Not free energy */
 
                     kernelptr = nb_kernel_list[nrnb_ind];
-                    
+
                     if (kernelptr == NULL)
                     {
                         /* Call a generic nonbonded kernel */