Use 'e' instead of 'i' constraints with 64-bit atomic operations on amd64.
The ADD, AND, OR, and SUB instructions take at most a 32-bit sign-extended immediate operand. 64-bit constants that do not fit into that constraint need to be loaded into a register. The 'i' constraint tells the compiler it can pass any integer constant to the assembler, whereas the 'e' constrain only permits constants that fit into a 32-bit sign-extended value. This fixes using atomic_add/clear/set/subtract_long/64 with constants that do not fit into a 32-bit sign-extended immediate. Reported by: several folks Tested by: Pete Wright <pete@nomadlogic.org> MFC after: 2 weeks
This commit is contained in:
parent
cd1acc77e6
commit
79ba91952d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335913
@ -446,10 +446,10 @@ ATOMIC_ASM(clear, int, "andl %1,%0", "ir", ~v);
|
||||
ATOMIC_ASM(add, int, "addl %1,%0", "ir", v);
|
||||
ATOMIC_ASM(subtract, int, "subl %1,%0", "ir", v);
|
||||
|
||||
ATOMIC_ASM(set, long, "orq %1,%0", "ir", v);
|
||||
ATOMIC_ASM(clear, long, "andq %1,%0", "ir", ~v);
|
||||
ATOMIC_ASM(add, long, "addq %1,%0", "ir", v);
|
||||
ATOMIC_ASM(subtract, long, "subq %1,%0", "ir", v);
|
||||
ATOMIC_ASM(set, long, "orq %1,%0", "er", v);
|
||||
ATOMIC_ASM(clear, long, "andq %1,%0", "er", ~v);
|
||||
ATOMIC_ASM(add, long, "addq %1,%0", "er", v);
|
||||
ATOMIC_ASM(subtract, long, "subq %1,%0", "er", v);
|
||||
|
||||
#define ATOMIC_LOADSTORE(TYPE) \
|
||||
ATOMIC_LOAD(TYPE); \
|
||||
|
Loading…
Reference in New Issue
Block a user