This should make the codec work on Win64 (but doesn't for unknown reasons)


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3994 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/jpeg/acinclude.m4 b/common/jpeg/acinclude.m4
index 3627d23..b8254b6 100644
--- a/common/jpeg/acinclude.m4
+++ b/common/jpeg/acinclude.m4
@@ -82,7 +82,7 @@
 case "$objfmt" in
   MSOMF)      NAFLAGS='-fobj -DOBJ32';;
   Win32-COFF) NAFLAGS='-fwin32 -DWIN32';;
-  Win64-COFF) NAFLAGS='-fwin64 -DWIN32 -D__x86_64__';;
+  Win64-COFF) NAFLAGS='-fwin64 -DWIN64 -D__x86_64__';;
   COFF)       NAFLAGS='-fcoff -DCOFF';;
   a.out)      NAFLAGS='-faout -DAOUT';;
   BSD-a.out)  NAFLAGS='-faoutb -DAOUT';;
diff --git a/common/jpeg/simd/jcclrss2-64.asm b/common/jpeg/simd/jcclrss2-64.asm
index 31c5be6..89d2185 100644
--- a/common/jpeg/simd/jcclrss2-64.asm
+++ b/common/jpeg/simd/jcclrss2-64.asm
@@ -49,8 +49,8 @@
 	mov	[rsp],rax
 	mov	rbp,rsp				; rbp = aligned rbp
 	lea	rsp, [wk(0)]
-	push	rbx
 	collect_args
+	push	rbx
 
 	mov	rcx, r10
 	test	rcx,rcx
@@ -475,8 +475,8 @@
 	jg	near .rowloop
 
 .return:
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	mov	rsp,rbp		; rsp <- aligned rbp
 	pop	rsp		; rsp <- original rbp
 	pop	rbp
diff --git a/common/jpeg/simd/jcqnts2f-64.asm b/common/jpeg/simd/jcqnts2f-64.asm
index e09387c..6d8a123 100644
--- a/common/jpeg/simd/jcqnts2f-64.asm
+++ b/common/jpeg/simd/jcqnts2f-64.asm
@@ -40,9 +40,10 @@
 
 EXTN(jsimd_convsamp_float_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
-	push	rbx
 	collect_args
+	push	rbx
 
 	pcmpeqw  xmm7,xmm7
 	psllw    xmm7,7
@@ -89,8 +90,8 @@
 	dec	rcx
 	jnz	short .convloop
 
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	pop	rbp
 	ret
 
@@ -113,6 +114,7 @@
 
 EXTN(jsimd_quantize_float_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
 	collect_args
 
diff --git a/common/jpeg/simd/jcqnts2i-64.asm b/common/jpeg/simd/jcqnts2i-64.asm
index 4568dfc..419c593 100644
--- a/common/jpeg/simd/jcqnts2i-64.asm
+++ b/common/jpeg/simd/jcqnts2i-64.asm
@@ -40,9 +40,10 @@
 
 EXTN(jsimd_convsamp_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
-	push	rbx
 	collect_args
+	push	rbx
 
 	pxor	xmm6,xmm6		; xmm6=(all 0's)
 	pcmpeqw	xmm7,xmm7
@@ -84,8 +85,8 @@
 	dec	rcx
 	jnz	short .convloop
 
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	pop	rbp
 	ret
 
@@ -115,6 +116,7 @@
 
 EXTN(jsimd_quantize_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
 	collect_args
 
diff --git a/common/jpeg/simd/jcsamss2-64.asm b/common/jpeg/simd/jcsamss2-64.asm
index 29c3f4f..502d225 100644
--- a/common/jpeg/simd/jcsamss2-64.asm
+++ b/common/jpeg/simd/jcsamss2-64.asm
@@ -45,6 +45,7 @@
 
 EXTN(jsimd_h2v1_downsample_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
 	collect_args
 
@@ -188,6 +189,7 @@
 
 EXTN(jsimd_h2v2_downsample_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
 	collect_args
 
diff --git a/common/jpeg/simd/jdclrss2-64.asm b/common/jpeg/simd/jdclrss2-64.asm
index ea9d2ac..52d133f 100644
--- a/common/jpeg/simd/jdclrss2-64.asm
+++ b/common/jpeg/simd/jdclrss2-64.asm
@@ -51,8 +51,8 @@
 	mov	[rsp],rax
 	mov	rbp,rsp				; rbp = aligned rbp
 	lea	rsp, [wk(0)]
-	push	rbx
 	collect_args
+	push	rbx
 
 	mov	rcx, r10	; num_cols
 	test	rcx,rcx
@@ -475,8 +475,8 @@
 	sfence		; flush the write buffer
 
 .return:
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	mov	rsp,rbp		; rsp <- aligned rbp
 	pop	rsp		; rsp <- original rbp
 	pop	rbp
diff --git a/common/jpeg/simd/jdmrgss2-64.asm b/common/jpeg/simd/jdmrgss2-64.asm
index 3e54c7a..c51c91b 100644
--- a/common/jpeg/simd/jdmrgss2-64.asm
+++ b/common/jpeg/simd/jdmrgss2-64.asm
@@ -12,7 +12,7 @@
 ; This file should be assembled with NASM (Netwide Assembler),
 ; can *not* be assembled with Microsoft's MASM or any compatible
 ; assembler (including Borland's Turbo Assembler).
-; NASM is available from http://nasm.sourceforge.net/ or
+; NASM is available from http://nasm.sourceforge.net/ for
 ; http://sourceforge.net/project/showfiles.php?group_id=6208
 ;
 ; [TAB8]
@@ -51,8 +51,8 @@
 	mov	[rsp],rax
 	mov	rbp,rsp				; rbp = aligned rbp
 	lea	rsp, [wk(0)]
-	push	rbx
 	collect_args
+	push	rbx
 
 	mov	rcx, r10	; col
 	test	rcx,rcx
@@ -468,8 +468,8 @@
 	sfence		; flush the write buffer
 
 .return:
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	mov	rsp,rbp		; rsp <- aligned rbp
 	pop	rsp		; rsp <- original rbp
 	pop	rbp
@@ -496,9 +496,10 @@
 
 EXTN(jsimd_h2v2_merged_upsample_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
-	push	rbx
 	collect_args
+	push	rbx
 
 	mov	rax, r10
 
@@ -519,10 +520,17 @@
 	push	rcx
 	push	rax
 
+	%ifdef WIN64
+	; rcx already parameter 1
+	mov rdx, rdi
+	mov r8, rax
+	mov r9, rbx
+	%else
 	mov rdx, rcx
 	mov rcx, rdi
 	mov	rdi, rax
 	mov rsi, rbx
+	%endif
 
 	call	EXTN(jsimd_h2v1_merged_upsample_sse2)
 
@@ -545,10 +553,17 @@
 	push	rcx
 	push	rax
 
+	%ifdef WIN64
+	; rcx already parameter 1
+	mov rdx, rdi
+	mov r8, rax
+	mov r9, rbx
+	%else
 	mov rdx, rcx
 	mov rcx, rdi
 	mov	rdi, rax
 	mov rsi, rbx
+	%endif
 
 	call	EXTN(jsimd_h2v1_merged_upsample_sse2)
 
@@ -559,8 +574,8 @@
 	pop rbx
 	pop rdx
 
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	pop	rbp
 	ret
 
diff --git a/common/jpeg/simd/jdsamss2-64.asm b/common/jpeg/simd/jdsamss2-64.asm
index 8521491..f9c61fc 100644
--- a/common/jpeg/simd/jdsamss2-64.asm
+++ b/common/jpeg/simd/jdsamss2-64.asm
@@ -63,6 +63,7 @@
 
 EXTN(jsimd_h2v1_fancy_upsample_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
 	collect_args
 
@@ -210,8 +211,8 @@
 	mov	[rsp],rax
 	mov	rbp,rsp				; rbp = aligned rbp
 	lea	rsp, [wk(0)]
-	push	rbx
 	collect_args
+	push	rbx
 
 	mov	rax, r11  ; colctr
 	test	rax,rax
@@ -472,8 +473,8 @@
 	jg	near .rowloop
 
 .return:
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	mov	rsp,rbp		; rsp <- aligned rbp
 	pop	rsp		; rsp <- original rbp
 	pop	rbp
@@ -501,6 +502,7 @@
 
 EXTN(jsimd_h2v1_upsample_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
 	collect_args
 
@@ -589,9 +591,10 @@
 
 EXTN(jsimd_h2v2_upsample_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
-	push	rbx
 	collect_args
+	push	rbx
 
 	mov	rdx, r11
 	add	rdx, byte (2*SIZEOF_XMMWORD)-1
@@ -658,8 +661,8 @@
 	jg	near .rowloop
 
 .return:
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	pop	rbp
 	ret
 
diff --git a/common/jpeg/simd/jiss2flt-64.asm b/common/jpeg/simd/jiss2flt-64.asm
index 96bfa5c..3db52ee 100644
--- a/common/jpeg/simd/jiss2flt-64.asm
+++ b/common/jpeg/simd/jiss2flt-64.asm
@@ -84,8 +84,8 @@
 	mov	[rsp],rax
 	mov	rbp,rsp				; rbp = aligned rbp
 	lea	rsp, [workspace]
-	push	rbx
 	collect_args
+	push	rbx
 
 	; ---- Pass 1: process columns from input, store into work array.
 
@@ -471,8 +471,8 @@
 	dec	rcx				; ctr
 	jnz	near .rowloop
 
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	mov	rsp,rbp		; rsp <- aligned rbp
 	pop	rsp		; rsp <- original rbp
 	pop	rbp
diff --git a/common/jpeg/simd/jiss2red-64.asm b/common/jpeg/simd/jiss2red-64.asm
index eddaded..f390367 100644
--- a/common/jpeg/simd/jiss2red-64.asm
+++ b/common/jpeg/simd/jiss2red-64.asm
@@ -417,9 +417,10 @@
 
 EXTN(jsimd_idct_2x2_sse2):
 	push	rbp
+	mov	rax,rsp
 	mov	rbp,rsp
-	push	rbx
 	collect_args
+	push	rbx
 
 	; ---- Pass 1: process columns from input.
 
@@ -565,8 +566,8 @@
 	mov	WORD [rdx+rax*SIZEOF_JSAMPLE], bx
 	mov	WORD [rsi+rax*SIZEOF_JSAMPLE], cx
 
-	uncollect_args
 	pop	rbx
+	uncollect_args
 	pop	rbp
 	ret
 
diff --git a/common/jpeg/simd/jsimdext.inc b/common/jpeg/simd/jsimdext.inc
index 4695360..d0b47e6 100644
--- a/common/jpeg/simd/jsimdext.inc
+++ b/common/jpeg/simd/jsimdext.inc
@@ -40,6 +40,17 @@
 %define SEG_TEXT    .text  align=16 public use32 class=CODE
 %define SEG_CONST   .rdata align=16 public use32 class=CONST
 
+%elifdef WIN64	; ----(nasm -fwin64 -DWIN64 ...)--------
+; * Microsoft Visual C++
+
+; -- segment definition --
+;
+%define SEG_TEXT    .text  align=16 public use64 class=CODE
+%define SEG_CONST   .rdata align=16 public use64 class=CONST
+%ifdef MSVC
+%define EXTN(name)  name			; foo() -> foo
+%endif
+
 %elifdef OBJ32	; ----(nasm -fobj -DOBJ32 ...)----------
 ; * Borland C++ (Win32)
 
@@ -283,6 +294,26 @@
 %endmacro
 
 %ifdef __x86_64__
+
+%ifdef WIN64
+
+%imacro collect_args 0
+	push r10
+	push r11
+	push r12
+	push r13
+	push r14
+	push r15
+	mov r10, rcx
+	mov r11, rdx
+	mov r12, r8
+	mov r13, r9
+	mov r14, [rax+48]
+	mov r15, [rax+56]
+%endmacro
+
+%else
+
 %imacro collect_args 0
 	push r10
 	push r11
@@ -298,6 +329,8 @@
 	mov r15, r9
 %endmacro
 
+%endif
+
 %imacro uncollect_args 0
 	pop r15
 	pop r14
diff --git a/common/jpeg/simd/nasm_lt.sh b/common/jpeg/simd/nasm_lt.sh
index 7ba5253..6cd7329 100755
--- a/common/jpeg/simd/nasm_lt.sh
+++ b/common/jpeg/simd/nasm_lt.sh
@@ -12,7 +12,7 @@
             fi
             ;;
         -f|-fbin|-faout|-faoutb|-fcoff|-felf|-felf64|-fas86| \
-        -fobj|-fwin32|-frdf|-fieee|-fmacho|-fmacho64)
+        -fobj|-fwin32|-fwin64|-frdf|-fieee|-fmacho|-fmacho64)
             # it's a file format specifier for nasm.
             command="$command $1"
             ;;