Make lib/stdatomic.c gcc compatible

This commit is contained in:
herman ten brugge 2021-04-14 11:59:57 +02:00
parent 0f0f701212
commit f8e50d23f5
2 changed files with 26 additions and 9 deletions

View file

@ -14,40 +14,50 @@
#define __ATOMIC_SEQ_CST 5
#define ATOMIC_X86_COMPARE_EXCHANGE(TYPE, MODE, SUFFIX) \
bool __atomic_compare_exchange_##MODE(_Atomic(TYPE) *atom, TYPE *ref, TYPE xchg) \
bool __atomic_compare_exchange_##MODE \
(volatile void *atom, void *ref, TYPE xchg, \
bool weak, int success_memorder, int failure_memorder) \
{ \
TYPE rv; \
TYPE cmp = *ref; \
TYPE cmp = *(TYPE *)ref; \
asm volatile( \
"lock cmpxchg" SUFFIX " %2,%1\n" \
: "=a" (rv), "+m" (*atom) \
: "=a" (rv), "+m" (*(TYPE *)atom) \
: "q" (xchg), "0" (cmp) \
: "memory" \
); \
*ref = rv; \
*(TYPE *)ref = rv; \
return (rv == cmp); \
}
#define ATOMIC_X86_LOAD(TYPE, MODE) \
TYPE __atomic_load_##MODE(const _Atomic(TYPE) *atom) \
TYPE __atomic_load_##MODE(const volatile void *atom, int memorder) \
{ \
return *(volatile TYPE *)atom; \
}
#define ATOMIC_X86_STORE(TYPE, MODE) \
void __atomic_store_##MODE(_Atomic(TYPE) *atom, TYPE value) \
void __atomic_store_##MODE(volatile void *atom, TYPE value, int memorder) \
{ \
*(volatile TYPE *)atom = value; \
}
#if defined(__GNUC__)
#define ATOMIC_LOAD(t,a,b,c) t b; __atomic_load((t *)a, (t *)&b, c)
#define COMPARE_EXCHANGE(t,a,b,c,d,e,f) __atomic_compare_exchange((t *)a,b,&c,d,e,f)
#else
#define ATOMIC_LOAD(t,a,b,c) t b = __atomic_load((t *)a, c)
#define COMPARE_EXCHANGE(t,a,b,c,d,e,f) __atomic_compare_exchange((t *)a,b,c,d,e,f)
#endif
#define ATOMIC_GEN_OP(TYPE, MODE, NAME, OP) \
TYPE __atomic_##NAME##_##MODE(_Atomic(TYPE) *atom, TYPE value) \
TYPE __atomic_##NAME##_##MODE(volatile void *atom, TYPE value, int memorder) \
{ \
TYPE xchg; \
TYPE cmp = __atomic_load(atom, __ATOMIC_RELAXED); \
ATOMIC_LOAD(TYPE, atom, cmp, __ATOMIC_RELAXED); \
do { \
xchg = (OP); \
} while (!__atomic_compare_exchange(atom, &cmp, xchg, true, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)); \
} while (!COMPARE_EXCHANGE(TYPE, atom, &cmp, xchg, true, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)); \
return cmp; \
}

View file

@ -5835,6 +5835,13 @@ static void parse_atomic(int atok)
vpush(&ct);
PUT_R_RET(vtop, ct.t);
if (ct.t == VT_BOOL) {
#ifdef PROMOTE_RET
vtop->r |= BFVAL(VT_MUSTCAST, 1);
#else
vtop->type.t = VT_INT;
#endif
}
}
ST_FUNC void unary(void)