Add W64 support for mpi amd64 assembly
authorJussi Kivilinna <jussi.kivilinna@iki.fi>
Wed, 29 Apr 2015 15:18:07 +0000 (18:18 +0300)
committerJussi Kivilinna <jussi.kivilinna@iki.fi>
Fri, 1 May 2015 16:18:43 +0000 (19:18 +0300)
acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Set
'ac_cv_sys_symbol_underscore=no' on MingW-W64.
mpi/amd64/func_abi.h: New.
mpi/amd64/mpih-add1.S (_gcry_mpih_add_n): Add FUNC_ENTRY and FUNC_EXIT.
mpi/amd64/mpih-lshift.S (_gcry_mpih_lshift): Ditto.
mpi/amd64/mpih-mul1.S (_gcry_mpih_mul_1): Ditto.
mpi/amd64/mpih-mul2.S (_gcry_mpih_addmul_1): Ditto.
mpi/amd64/mpih-mul3.S (_gcry_mpih_submul_1): Ditto.
mpi/amd64/mpih-rshift.S (_gcry_mpih_rshift): Ditto.
mpi/amd64/mpih-sub1.S (_gcry_mpih_sub_n): Ditto.
mpi/config.links [host=x86_64-*mingw*]: Enable assembly modules.
[host=x86_64-*-*]: Append mpi/amd64/func_abi.h to mpi/asm-syntax.h.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
acinclude.m4
mpi/amd64/func_abi.h [new file with mode: 0644]
mpi/amd64/mpih-add1.S
mpi/amd64/mpih-lshift.S
mpi/amd64/mpih-mul1.S
mpi/amd64/mpih-mul2.S
mpi/amd64/mpih-mul3.S
mpi/amd64/mpih-rshift.S
mpi/amd64/mpih-sub1.S
mpi/config.links

index 0791b84..764efd4 100644 (file)
@@ -101,9 +101,12 @@ AC_DEFUN([GNUPG_CHECK_GNUMAKE],
 AC_DEFUN([GNUPG_SYS_SYMBOL_UNDERSCORE],
 [tmp_do_check="no"
 case "${host}" in
-    *-mingw32*)
+    i?86-*-mingw32*)
         ac_cv_sys_symbol_underscore=yes
         ;;
+    x86_64-*-mingw32*)
+        ac_cv_sys_symbol_underscore=no
+        ;;
     i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
         ac_cv_sys_symbol_underscore=yes
         ;;
diff --git a/mpi/amd64/func_abi.h b/mpi/amd64/func_abi.h
new file mode 100644 (file)
index 0000000..ce44674
--- /dev/null
@@ -0,0 +1,19 @@
+#ifdef USE_MS_ABI
+ /* Store registers and move four first input arguments from MS ABI to
+  * SYSV ABI.  */
+ #define FUNC_ENTRY() \
+       pushq %rsi; \
+       pushq %rdi; \
+       movq %rdx, %rsi; \
+       movq %rcx, %rdi; \
+       movq %r8, %rdx; \
+       movq %r9, %rcx;
+
+ /* Restore registers.  */
+ #define FUNC_EXIT() \
+       popq %rdi; \
+       popq %rsi;
+#else
+ #define FUNC_ENTRY() /**/
+ #define FUNC_EXIT() /**/
+#endif
index f0ec89c..6a90262 100644 (file)
@@ -43,6 +43,7 @@
 .text
        .globl C_SYMBOL_NAME(_gcry_mpih_add_n)
 C_SYMBOL_NAME(_gcry_mpih_add_n:)
+       FUNC_ENTRY()
        leaq    (%rsi,%rcx,8), %rsi
        leaq    (%rdi,%rcx,8), %rdi
        leaq    (%rdx,%rcx,8), %rdx
@@ -59,5 +60,6 @@ C_SYMBOL_NAME(_gcry_mpih_add_n:)
 
        movq    %rcx, %rax              /* zero %rax */
        adcq    %rax, %rax
+       FUNC_EXIT()
        ret
        
\ No newline at end of file
index e87dd1a..9e8979b 100644 (file)
@@ -42,6 +42,7 @@
 .text
        .globl C_SYMBOL_NAME(_gcry_mpih_lshift)
 C_SYMBOL_NAME(_gcry_mpih_lshift:)
+       FUNC_ENTRY()
        movq    -8(%rsi,%rdx,8), %mm7
        movd    %ecx, %mm1
        movl    $64, %eax
@@ -74,4 +75,5 @@ C_SYMBOL_NAME(_gcry_mpih_lshift:)
 .Lende:        psllq   %mm1, %mm2
        movq    %mm2, (%rdi)
        emms
+       FUNC_EXIT()
        ret
index 54b0ab4..67ab47e 100644 (file)
@@ -46,6 +46,7 @@
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_mul_1)
 C_SYMBOL_NAME(_gcry_mpih_mul_1:)
 
+       FUNC_ENTRY()
        movq    %rdx, %r11
        leaq    (%rsi,%rdx,8), %rsi
        leaq    (%rdi,%rdx,8), %rdi
@@ -62,4 +63,5 @@ C_SYMBOL_NAME(_gcry_mpih_mul_1:)
        jne     .Loop
 
        movq    %r8, %rax
+       FUNC_EXIT()
        ret
index a332a1d..1aa4fa0 100644 (file)
@@ -41,6 +41,7 @@
        TEXT
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_addmul_1)
 C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
+       FUNC_ENTRY()
        movq    %rdx, %r11
        leaq    (%rsi,%rdx,8), %rsi
        leaq    (%rdi,%rdx,8), %rdi
@@ -61,4 +62,5 @@ C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
        jne     .Loop
 
        movq    %r8, %rax
+       FUNC_EXIT()
        ret
index 4d458a7..bc41c4e 100644 (file)
@@ -42,7 +42,7 @@
        TEXT
        GLOBL   C_SYMBOL_NAME(_gcry_mpih_submul_1)
 C_SYMBOL_NAME(_gcry_mpih_submul_1:)
-
+       FUNC_ENTRY()
        movq    %rdx, %r11
        leaq    (%rsi,%r11,8), %rsi
        leaq    (%rdi,%r11,8), %rdi
@@ -63,4 +63,5 @@ C_SYMBOL_NAME(_gcry_mpih_submul_1:)
        jne     .Loop
 
        movq    %r8, %rax
+       FUNC_EXIT()
        ret
index 4cfc8f6..311b85b 100644 (file)
@@ -42,6 +42,7 @@
 .text
        .globl C_SYMBOL_NAME(_gcry_mpih_rshift)
 C_SYMBOL_NAME(_gcry_mpih_rshift:)
+       FUNC_ENTRY()
        movq    (%rsi), %mm7
        movd    %ecx, %mm1
        movl    $64, %eax
@@ -77,4 +78,5 @@ C_SYMBOL_NAME(_gcry_mpih_rshift:)
 .Lende:        psrlq   %mm1, %mm2
        movq    %mm2, -8(%rdi)
        emms
+       FUNC_EXIT()
        ret
index b3609b0..ccf6496 100644 (file)
@@ -42,6 +42,7 @@
 .text
        .globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
 C_SYMBOL_NAME(_gcry_mpih_sub_n:)
+       FUNC_ENTRY()
        leaq    (%rsi,%rcx,8), %rsi
        leaq    (%rdi,%rcx,8), %rdi
        leaq    (%rdx,%rcx,8), %rdx
@@ -58,4 +59,5 @@ C_SYMBOL_NAME(_gcry_mpih_sub_n:)
 
        movq    %rcx, %rax              /* zero %rax */
        adcq    %rax, %rax
+       FUNC_EXIT()
        ret
index d71918a..2fb5e8a 100644 (file)
@@ -129,17 +129,22 @@ case "${host}" in
     x86_64-apple-darwin*)
        echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/amd64/func_abi.h   >>./mpi/asm-syntax.h
        path="amd64"
         mpi_cpu_arch="x86"
        ;;
     x86_64-*mingw32*)
-       echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
-       path=""
-       mpi_cpu_arch="x86"
+       echo '#define USE_MS_ABI' >>./mpi/asm-syntax.h
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/amd64/func_abi.h   >>./mpi/asm-syntax.h
+       path="amd64"
+        mpi_cpu_arch="x86"
         ;;
     x86_64-*-*)
        echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
        cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/amd64/func_abi.h   >>./mpi/asm-syntax.h
        path="amd64"
         mpi_cpu_arch="x86"
        ;;
@@ -314,7 +319,7 @@ case "${host}" in
        echo '#define ELF_SYNTAX'               >>./mpi/asm-syntax.h
        cat   $srcdir/mpi/powerpc32/syntax.h    >>./mpi/asm-syntax.h
        path="powerpc32"
-       mpi_cpu_arch="ppc"
+       mpi_cpu_arch="ppc"
        ;;
 
     rs6000-*-aix[456789]*    | \