Add volatile qualifications to two blocks of inline asm to stop GCC from
authorAdam Langley <agl@chromium.org>
Mon, 3 Jun 2013 19:45:11 +0000 (15:45 -0400)
committerBen Laurie <ben@links.org>
Tue, 4 Jun 2013 17:46:25 +0000 (18:46 +0100)
eliminating them as dead code.

Both volatile and "memory" are used because of some concern that the compiler
may still cache values across the asm block without it, and because this was
such a painful debugging session that I wanted to ensure that it's never
repeated.

crypto/bn/asm/x86_64-gcc.c

index dfb7506267c41e31ebba74983ad5521c652c89bf..7d97c0bedc4a9cf451b3aa90aba98d8c250d9bd1 100644 (file)
@@ -189,7 +189,7 @@ BN_ULONG bn_add_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
 
        if (n <= 0) return 0;
 
-       asm (
+       asm volatile (
        "       subq    %0,%0           \n"     /* clear carry */
        "       jmp     1f              \n"
        ".p2align 4                     \n"
@@ -201,7 +201,7 @@ BN_ULONG bn_add_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
        "       sbbq    %0,%0           \n"
                : "=&r"(ret),"+c"(n),"+r"(i)
                : "r"(rp),"r"(ap),"r"(bp)
-               : "cc"
+               : "cc", "memory"
        );
 
   return ret&1;
@@ -214,7 +214,7 @@ BN_ULONG bn_sub_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
 
        if (n <= 0) return 0;
 
-       asm (
+       asm volatile (
        "       subq    %0,%0           \n"     /* clear borrow */
        "       jmp     1f              \n"
        ".p2align 4                     \n"
@@ -226,7 +226,7 @@ BN_ULONG bn_sub_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
        "       sbbq    %0,%0           \n"
                : "=&r"(ret),"+c"(n),"+r"(i)
                : "r"(rp),"r"(ap),"r"(bp)
-               : "cc"
+               : "cc", "memory"
        );
 
   return ret&1;