x86_64-gf2m.pl: add missing Windows build fix for #2963.
[openssl.git] / crypto / bn / asm / x86_64-gcc.c
index acb0b401181e32983b94d7ce19c002b41585f31b..dfb7506267c41e31ebba74983ad5521c652c89bf 100644 (file)
@@ -55,7 +55,7 @@
  *    machine.
  */
 
-#ifdef _WIN64
+#if defined(_WIN64) || !defined(__LP64__)
 #define BN_ULONG unsigned long long
 #else
 #define BN_ULONG unsigned long
@@ -63,7 +63,6 @@
 
 #undef mul
 #undef mul_add
-#undef sqr
 
 /*
  * "m"(a), "+m"(r)     is the way to favor DirectPath ยต-code;
@@ -99,7 +98,7 @@
                : "cc");                \
        (r)=carry, carry=high;          \
        } while (0)
-
+#undef sqr
 #define sqr(r0,r1,a)                   \
        asm ("mulq %2"                  \
                : "=a"(r0),"=d"(r1)     \
@@ -185,20 +184,22 @@ BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d)
 }
 
 BN_ULONG bn_add_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int n)
-{ BN_ULONG ret=0,i=0;
+{ BN_ULONG ret;
+  size_t i=0;
 
        if (n <= 0) return 0;
 
        asm (
-       "       subq    %2,%2           \n"
+       "       subq    %0,%0           \n"     /* clear carry */
+       "       jmp     1f              \n"
        ".p2align 4                     \n"
        "1:     movq    (%4,%2,8),%0    \n"
        "       adcq    (%5,%2,8),%0    \n"
        "       movq    %0,(%3,%2,8)    \n"
-       "       leaq    1(%2),%2        \n"
+       "       lea     1(%2),%2        \n"
        "       loop    1b              \n"
        "       sbbq    %0,%0           \n"
-               : "=&a"(ret),"+c"(n),"=&r"(i)
+               : "=&r"(ret),"+c"(n),"+r"(i)
                : "r"(rp),"r"(ap),"r"(bp)
                : "cc"
        );
@@ -208,20 +209,22 @@ BN_ULONG bn_add_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
 
 #ifndef SIMICS
 BN_ULONG bn_sub_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int n)
-{ BN_ULONG ret=0,i=0;
+{ BN_ULONG ret;
+  size_t i=0;
 
        if (n <= 0) return 0;
 
        asm (
-       "       subq    %2,%2           \n"
+       "       subq    %0,%0           \n"     /* clear borrow */
+       "       jmp     1f              \n"
        ".p2align 4                     \n"
        "1:     movq    (%4,%2,8),%0    \n"
        "       sbbq    (%5,%2,8),%0    \n"
        "       movq    %0,(%3,%2,8)    \n"
-       "       leaq    1(%2),%2        \n"
+       "       lea     1(%2),%2        \n"
        "       loop    1b              \n"
        "       sbbq    %0,%0           \n"
-               : "=&a"(ret),"+c"(n),"=&r"(i)
+               : "=&r"(ret),"+c"(n),"+r"(i)
                : "r"(rp),"r"(ap),"r"(bp)
                : "cc"
        );