Add volatile qualifications to two blocks of inline asm to stop GCC from
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.
(cherry picked from commit 7753a3a684
)
Conflicts:
crypto/bn/asm/x86_64-gcc.c
Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:

committed by
Emilia Kasper

parent
0ed8e95c4b
commit
a90b1e32d2
@@ -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;
|
if (n <= 0) return 0;
|
||||||
|
|
||||||
asm (
|
asm volatile (
|
||||||
" subq %2,%2 \n"
|
" subq %2,%2 \n"
|
||||||
".p2align 4 \n"
|
".p2align 4 \n"
|
||||||
"1: movq (%4,%2,8),%0 \n"
|
"1: movq (%4,%2,8),%0 \n"
|
||||||
@@ -200,7 +200,7 @@ BN_ULONG bn_add_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
|
|||||||
" sbbq %0,%0 \n"
|
" sbbq %0,%0 \n"
|
||||||
: "=&a"(ret),"+c"(n),"=&r"(i)
|
: "=&a"(ret),"+c"(n),"=&r"(i)
|
||||||
: "r"(rp),"r"(ap),"r"(bp)
|
: "r"(rp),"r"(ap),"r"(bp)
|
||||||
: "cc"
|
: "cc", "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
return ret&1;
|
return ret&1;
|
||||||
@@ -212,7 +212,7 @@ BN_ULONG bn_sub_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
|
|||||||
|
|
||||||
if (n <= 0) return 0;
|
if (n <= 0) return 0;
|
||||||
|
|
||||||
asm (
|
asm volatile (
|
||||||
" subq %2,%2 \n"
|
" subq %2,%2 \n"
|
||||||
".p2align 4 \n"
|
".p2align 4 \n"
|
||||||
"1: movq (%4,%2,8),%0 \n"
|
"1: movq (%4,%2,8),%0 \n"
|
||||||
@@ -223,7 +223,7 @@ BN_ULONG bn_sub_words (BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int
|
|||||||
" sbbq %0,%0 \n"
|
" sbbq %0,%0 \n"
|
||||||
: "=&a"(ret),"+c"(n),"=&r"(i)
|
: "=&a"(ret),"+c"(n),"=&r"(i)
|
||||||
: "r"(rp),"r"(ap),"r"(bp)
|
: "r"(rp),"r"(ap),"r"(bp)
|
||||||
: "cc"
|
: "cc", "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
return ret&1;
|
return ret&1;
|
||||||
|
Reference in New Issue
Block a user