Stop using the '+' constraint modifier with inline assembly. The '+'
constraint is actually only allowed for register operands. Instead, use separate input and output memory constraints. Education from: alc Reviewed by: alc Tested on: i386, alpha MFC after: 1 week
This commit is contained in:
parent
d11c07ba56
commit
80d52f16da
@ -56,12 +56,12 @@ static __inline void atomic_set_32(volatile u_int32_t *p, u_int32_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldl_l %0, %2\n\t" /* load old value */
|
||||
"bis %0, %3, %0\n\t" /* calculate new value */
|
||||
"1:\tldl_l %0, %3\n\t" /* load old value */
|
||||
"bis %0, %2, %0\n\t" /* calculate new value */
|
||||
"stl_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "m" (*p), "r" (v)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -72,12 +72,12 @@ static __inline void atomic_clear_32(volatile u_int32_t *p, u_int32_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldl_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldl_l %0, %3\n\t" /* load old value */
|
||||
"bic %0, %2, %0\n\t" /* calculate new value */
|
||||
"stl_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -88,12 +88,12 @@ static __inline void atomic_add_32(volatile u_int32_t *p, u_int32_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldl_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldl_l %0, %3\n\t" /* load old value */
|
||||
"addl %0, %2, %0\n\t" /* calculate new value */
|
||||
"stl_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -104,12 +104,12 @@ static __inline void atomic_subtract_32(volatile u_int32_t *p, u_int32_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldl_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldl_l %0, %3\n\t" /* load old value */
|
||||
"subl %0, %2, %0\n\t" /* calculate new value */
|
||||
"stl_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -121,12 +121,12 @@ static __inline u_int32_t atomic_readandclear_32(volatile u_int32_t *addr)
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"wmb\n" /* ensure pending writes have drained */
|
||||
"1:\tldl_l %0,%2\n\t" /* load current value, asserting lock */
|
||||
"1:\tldl_l %0,%3\n\t" /* load current value, asserting lock */
|
||||
"ldiq %1,0\n\t" /* value to store */
|
||||
"stl_c %1,%2\n\t" /* attempt to store */
|
||||
"beq %1,1b\n" /* if the store failed, spin */
|
||||
: "=&r"(result), "=&r"(temp), "+m" (*addr)
|
||||
:
|
||||
: "=&r"(result), "=&r"(temp), "=m" (*addr)
|
||||
: "m" (*addr)
|
||||
: "memory");
|
||||
#endif
|
||||
|
||||
@ -139,12 +139,12 @@ static __inline void atomic_set_64(volatile u_int64_t *p, u_int64_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldq_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldq_l %0, %3\n\t" /* load old value */
|
||||
"bis %0, %2, %0\n\t" /* calculate new value */
|
||||
"stq_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -155,12 +155,12 @@ static __inline void atomic_clear_64(volatile u_int64_t *p, u_int64_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldq_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldq_l %0, %3\n\t" /* load old value */
|
||||
"bic %0, %2, %0\n\t" /* calculate new value */
|
||||
"stq_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -171,12 +171,12 @@ static __inline void atomic_add_64(volatile u_int64_t *p, u_int64_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldq_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldq_l %0, %3\n\t" /* load old value */
|
||||
"addq %0, %2, %0\n\t" /* calculate new value */
|
||||
"stq_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -187,12 +187,12 @@ static __inline void atomic_subtract_64(volatile u_int64_t *p, u_int64_t v)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldq_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldq_l %0, %3\n\t" /* load old value */
|
||||
"subq %0, %2, %0\n\t" /* calculate new value */
|
||||
"stq_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (v), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
}
|
||||
@ -204,12 +204,12 @@ static __inline u_int64_t atomic_readandclear_64(volatile u_int64_t *addr)
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"wmb\n" /* ensure pending writes have drained */
|
||||
"1:\tldq_l %0,%2\n\t" /* load current value, asserting lock */
|
||||
"1:\tldq_l %0,%3\n\t" /* load current value, asserting lock */
|
||||
"ldiq %1,0\n\t" /* value to store */
|
||||
"stq_c %1,%2\n\t" /* attempt to store */
|
||||
"beq %1,1b\n" /* if the store failed, spin */
|
||||
: "=&r"(result), "=&r"(temp), "+m" (*addr)
|
||||
:
|
||||
: "=&r"(result), "=&r"(temp), "=m" (*addr)
|
||||
: "m" (*addr)
|
||||
: "memory");
|
||||
#endif
|
||||
|
||||
@ -289,15 +289,15 @@ atomic_cmpset_32(volatile u_int32_t* p, u_int32_t cmpval, u_int32_t newval)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldl_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldl_l %0, %4\n\t" /* load old value */
|
||||
"cmpeq %0, %2, %0\n\t" /* compare */
|
||||
"beq %0, 2f\n\t" /* exit if not equal */
|
||||
"mov %3, %0\n\t" /* value to store */
|
||||
"stl_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n\t" /* if it failed, spin */
|
||||
"2:\n"
|
||||
: "=&r" (ret), "+m" (*p)
|
||||
: "r" ((long)(int)cmpval), "r" (newval)
|
||||
: "=&r" (ret), "=m" (*p)
|
||||
: "r" ((long)(int)cmpval), "r" (newval), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
|
||||
@ -316,15 +316,15 @@ atomic_cmpset_64(volatile u_int64_t* p, u_int64_t cmpval, u_int64_t newval)
|
||||
|
||||
#ifdef __GNUCLIKE_ASM
|
||||
__asm __volatile (
|
||||
"1:\tldq_l %0, %1\n\t" /* load old value */
|
||||
"1:\tldq_l %0, %4\n\t" /* load old value */
|
||||
"cmpeq %0, %2, %0\n\t" /* compare */
|
||||
"beq %0, 2f\n\t" /* exit if not equal */
|
||||
"mov %3, %0\n\t" /* value to store */
|
||||
"stq_c %0, %1\n\t" /* attempt to store */
|
||||
"beq %0, 1b\n\t" /* if it failed, spin */
|
||||
"2:\n"
|
||||
: "=&r" (ret), "+m" (*p)
|
||||
: "r" (cmpval), "r" (newval)
|
||||
: "=&r" (ret), "=m" (*p)
|
||||
: "r" (cmpval), "r" (newval), "m" (*p)
|
||||
: "memory");
|
||||
#endif
|
||||
|
||||
|
@ -99,8 +99,8 @@ static __inline void \
|
||||
atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
|
||||
{ \
|
||||
__asm __volatile(__XSTRING(MPLOCKED) OP \
|
||||
: "+m" (*p) \
|
||||
: CONS (V)); \
|
||||
: "=m" (*p) \
|
||||
: CONS (V), "m" (*p)); \
|
||||
} \
|
||||
struct __hack
|
||||
|
||||
@ -119,15 +119,16 @@ atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
|
||||
|
||||
__asm __volatile (
|
||||
" " __XSTRING(MPLOCKED) " "
|
||||
" cmpxchgl %1,%2 ; "
|
||||
" cmpxchgl %2,%1 ; "
|
||||
" setz %%al ; "
|
||||
" movzbl %%al,%0 ; "
|
||||
"1: "
|
||||
"# atomic_cmpset_int"
|
||||
: "+a" (res) /* 0 (result) */
|
||||
: "r" (src), /* 1 */
|
||||
"m" (*(dst)) /* 2 */
|
||||
: "memory");
|
||||
: "+a" (res), /* 0 (result) */
|
||||
"=m" (*dst) /* 1 */
|
||||
: "r" (src), /* 2 */
|
||||
"m" (*dst) /* 3 */
|
||||
: "memory");
|
||||
|
||||
return (res);
|
||||
}
|
||||
@ -139,15 +140,16 @@ atomic_cmpset_long(volatile u_long *dst, u_long exp, u_long src)
|
||||
|
||||
__asm __volatile (
|
||||
" " __XSTRING(MPLOCKED) " "
|
||||
" cmpxchgq %1,%2 ; "
|
||||
" cmpxchgq %2,%1 ; "
|
||||
" setz %%al ; "
|
||||
" movzbq %%al,%0 ; "
|
||||
"1: "
|
||||
"# atomic_cmpset_long"
|
||||
: "+a" (res) /* 0 (result) */
|
||||
: "r" (src), /* 1 */
|
||||
"m" (*(dst)) /* 2 */
|
||||
: "memory");
|
||||
: "+a" (res), /* 0 (result) */
|
||||
"=m" (*dst) /* 1 */
|
||||
: "r" (src), /* 2 */
|
||||
"m" (*dst) /* 3 */
|
||||
: "memory");
|
||||
|
||||
return (res);
|
||||
}
|
||||
@ -185,8 +187,9 @@ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \
|
||||
\
|
||||
__asm __volatile(__XSTRING(MPLOCKED) LOP \
|
||||
: "=a" (res), /* 0 (result) */\
|
||||
"+m" (*p) /* 1 */ \
|
||||
: : "memory"); \
|
||||
"=m" (*p) /* 1 */ \
|
||||
: "m" (*p) /* 2 */ \
|
||||
: "memory"); \
|
||||
\
|
||||
return (res); \
|
||||
} \
|
||||
@ -198,9 +201,9 @@ static __inline void \
|
||||
atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
|
||||
{ \
|
||||
__asm __volatile(SOP \
|
||||
: "+m" (*p), /* 0 */ \
|
||||
: "=m" (*p), /* 0 */ \
|
||||
"+r" (v) /* 1 */ \
|
||||
: : "memory"); \
|
||||
: "m" (*p)); /* 2 */ \
|
||||
} \
|
||||
struct __hack
|
||||
|
||||
@ -246,12 +249,13 @@ atomic_readandclear_int(volatile u_int *addr)
|
||||
{
|
||||
u_int result;
|
||||
|
||||
result = 0;
|
||||
__asm __volatile (
|
||||
" xorl %0,%0 ; "
|
||||
" xchgl %1,%0 ; "
|
||||
"# atomic_readandclear_int"
|
||||
: "=&r" (result) /* 0 (result) */
|
||||
: "m" (*addr)); /* 1 (addr) */
|
||||
: "+r" (result), /* 0 (result) */
|
||||
"=m" (*addr) /* 1 (addr) */
|
||||
: "m" (*addr));
|
||||
|
||||
return (result);
|
||||
}
|
||||
@ -261,12 +265,13 @@ atomic_readandclear_long(volatile u_long *addr)
|
||||
{
|
||||
u_long result;
|
||||
|
||||
result = 0;
|
||||
__asm __volatile (
|
||||
" xorq %0,%0 ; "
|
||||
" xchgq %1,%0 ; "
|
||||
"# atomic_readandclear_long"
|
||||
: "=&r" (result) /* 0 (result) */
|
||||
: "m" (*addr)); /* 1 (addr) */
|
||||
: "+r" (result), /* 0 (result) */
|
||||
"=m" (*addr) /* 1 (addr) */
|
||||
: "m" (*addr));
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
@ -98,8 +98,8 @@ static __inline void \
|
||||
atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
|
||||
{ \
|
||||
__asm __volatile(__XSTRING(MPLOCKED) OP \
|
||||
: "+m" (*p) \
|
||||
: CONS (V)); \
|
||||
: "=m" (*p) \
|
||||
: CONS (V), "m" (*p)); \
|
||||
} \
|
||||
struct __hack
|
||||
|
||||
@ -121,17 +121,18 @@ atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
|
||||
__asm __volatile(
|
||||
" pushfl ; "
|
||||
" cli ; "
|
||||
" cmpl %0,%2 ; "
|
||||
" cmpl %0,%3 ; "
|
||||
" jne 1f ; "
|
||||
" movl %1,%2 ; "
|
||||
" movl %2,%1 ; "
|
||||
"1: "
|
||||
" sete %%al; "
|
||||
" movzbl %%al,%0 ; "
|
||||
" popfl ; "
|
||||
"# atomic_cmpset_int"
|
||||
: "+a" (res) /* 0 (result) */
|
||||
: "r" (src), /* 1 */
|
||||
"m" (*(dst)) /* 2 */
|
||||
: "+a" (res), /* 0 (result) */
|
||||
"=m" (*dst) /* 1 */
|
||||
: "r" (src), /* 2 */
|
||||
"m" (*dst) /* 3 */
|
||||
: "memory");
|
||||
|
||||
return (res);
|
||||
@ -146,15 +147,16 @@ atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
|
||||
|
||||
__asm __volatile (
|
||||
" " __XSTRING(MPLOCKED) " "
|
||||
" cmpxchgl %1,%2 ; "
|
||||
" cmpxchgl %2,%1 ; "
|
||||
" setz %%al ; "
|
||||
" movzbl %%al,%0 ; "
|
||||
"1: "
|
||||
"# atomic_cmpset_int"
|
||||
: "+a" (res) /* 0 (result) */
|
||||
: "r" (src), /* 1 */
|
||||
"m" (*(dst)) /* 2 */
|
||||
: "memory");
|
||||
: "+a" (res), /* 0 (result) */
|
||||
"=m" (*dst) /* 1 */
|
||||
: "r" (src), /* 2 */
|
||||
"m" (*dst) /* 3 */
|
||||
: "memory");
|
||||
|
||||
return (res);
|
||||
}
|
||||
@ -194,8 +196,9 @@ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \
|
||||
\
|
||||
__asm __volatile(__XSTRING(MPLOCKED) LOP \
|
||||
: "=a" (res), /* 0 (result) */\
|
||||
"+m" (*p) /* 1 */ \
|
||||
: : "memory"); \
|
||||
"=m" (*p) /* 1 */ \
|
||||
: "m" (*p) /* 2 */ \
|
||||
: "memory"); \
|
||||
\
|
||||
return (res); \
|
||||
} \
|
||||
@ -207,9 +210,9 @@ static __inline void \
|
||||
atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
|
||||
{ \
|
||||
__asm __volatile(SOP \
|
||||
: "+m" (*p), /* 0 */ \
|
||||
: "=m" (*p), /* 0 */ \
|
||||
"+r" (v) /* 1 */ \
|
||||
: : "memory"); \
|
||||
: "m" (*p)); /* 2 */ \
|
||||
} \
|
||||
struct __hack
|
||||
|
||||
@ -263,12 +266,13 @@ atomic_readandclear_int(volatile u_int *addr)
|
||||
{
|
||||
u_int result;
|
||||
|
||||
result = 0;
|
||||
__asm __volatile (
|
||||
" xorl %0,%0 ; "
|
||||
" xchgl %1,%0 ; "
|
||||
"# atomic_readandclear_int"
|
||||
: "=&r" (result) /* 0 (result) */
|
||||
: "m" (*addr)); /* 1 (addr) */
|
||||
: "+r" (result), /* 0 (result) */
|
||||
"=m" (*addr) /* 1 (addr) */
|
||||
: "m" (*addr));
|
||||
|
||||
return (result);
|
||||
}
|
||||
@ -278,12 +282,13 @@ atomic_readandclear_long(volatile u_long *addr)
|
||||
{
|
||||
u_long result;
|
||||
|
||||
result = 0;
|
||||
__asm __volatile (
|
||||
" xorl %0,%0 ; "
|
||||
" xchgl %1,%0 ; "
|
||||
"# atomic_readandclear_long"
|
||||
: "=&r" (result) /* 0 (result) */
|
||||
: "m" (*addr)); /* 1 (addr) */
|
||||
: "+r" (result), /* 0 (result) */
|
||||
"=m" (*addr) /* 1 (addr) */
|
||||
: "m" (*addr));
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
@ -63,8 +63,8 @@ atomic_set_32(volatile uint32_t *p, uint32_t v)
|
||||
"or %0, %3, %0\n\t" /* calculate new value */
|
||||
"stwcx. %0, 0, %2\n\t" /* attempt to store */
|
||||
"bne- 1b\n\t" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (p), "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (p), "r" (v), "m" (*p)
|
||||
: "cc", "memory");
|
||||
#endif
|
||||
}
|
||||
@ -80,8 +80,8 @@ atomic_clear_32(volatile uint32_t *p, uint32_t v)
|
||||
"andc %0, %0, %3\n\t" /* calculate new value */
|
||||
"stwcx. %0, 0, %2\n\t" /* attempt to store */
|
||||
"bne- 1b\n\t" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (p), "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (p), "r" (v), "m" (*p)
|
||||
: "cc", "memory");
|
||||
#endif
|
||||
}
|
||||
@ -97,8 +97,8 @@ atomic_add_32(volatile uint32_t *p, uint32_t v)
|
||||
"add %0, %3, %0\n\t" /* calculate new value */
|
||||
"stwcx. %0, 0, %2\n\t" /* attempt to store */
|
||||
"bne- 1b\n\t" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (p), "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (p), "r" (v), "m" (*p)
|
||||
: "cc", "memory");
|
||||
#endif
|
||||
}
|
||||
@ -114,8 +114,8 @@ atomic_subtract_32(volatile uint32_t *p, uint32_t v)
|
||||
"subf %0, %3, %0\n\t" /* calculate new value */
|
||||
"stwcx. %0, 0, %2\n\t" /* attempt to store */
|
||||
"bne- 1b\n\t" /* spin if failed */
|
||||
: "=&r" (temp), "+m" (*p)
|
||||
: "r" (p), "r" (v)
|
||||
: "=&r" (temp), "=m" (*p)
|
||||
: "r" (p), "r" (v), "m" (*p)
|
||||
: "cc", "memory");
|
||||
#endif
|
||||
}
|
||||
@ -132,8 +132,8 @@ atomic_readandclear_32(volatile uint32_t *addr)
|
||||
"li %1, 0\n\t" /* load new value */
|
||||
"stwcx. %1, 0, %3\n\t" /* attempt to store */
|
||||
"bne- 1b\n\t" /* spin if failed */
|
||||
: "=&r"(result), "=&r"(temp), "+m" (*addr)
|
||||
: "r" (addr)
|
||||
: "=&r"(result), "=&r"(temp), "=m" (*addr)
|
||||
: "r" (addr), "m" (*addr)
|
||||
: "cc", "memory");
|
||||
#endif
|
||||
|
||||
@ -382,8 +382,8 @@ atomic_cmpset_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval)
|
||||
"stwcx. %0, 0, %2\n\t" /* clear reservation (74xx) */
|
||||
"li %0, 0\n\t" /* failure - retval = 0 */
|
||||
"3:\n\t"
|
||||
: "=&r" (ret), "+m" (*p)
|
||||
: "r" (p), "r" (cmpval), "r" (newval)
|
||||
: "=&r" (ret), "=m" (*p)
|
||||
: "r" (p), "r" (cmpval), "r" (newval), "m" (*p)
|
||||
: "cc", "memory");
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user