https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80878
--- Comment #33 from Niall Douglas <s_gccbugzilla at nedprod dot com> --- (In reply to Andrew Pinski from comment #31) > > Again the problem is stuff like: > static const _Atomic __int128_t t = 2000; > > __int128_t g(void) > { > return t; > } > > DOES NOT WORK if you use CAS (or ldaxp/stlxp). I think we are talking about different things here. You are talking about calling convention. I'm talking about std::atomic<__int128>::compare_exchange_weak() i.e. that the specific member function compare_exchange_weak() is not generating cmpxchg16b if compiled with GCC, but does with clang. Re: your original point, I cannot say anything about _Atomic. However, for std::atomic<__int128>, as __int128 is not an integral type it seems reasonable to me that its specialisation tell the compiler to not store it in read only memory. Mark it with attribute section, give it a non-trivial destructor, or whatever it needs. Perhaps I ought to open a separate issue here, as my specific problem is that std::atomic<__int128>::compare_exchange_weak() is not using cmpxchg16b? Mr. Wakely your thoughts?