diff --git a/lib/stdatomic.c b/lib/stdatomic.c
index e26fa1b2..f9919c08 100644
--- a/lib/stdatomic.c
+++ b/lib/stdatomic.c
@@ -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; \
     }
 
diff --git a/tccgen.c b/tccgen.c
index fe0c2137..c36032ab 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -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)