#include <stdint.h> namespace types { struct uint128_t { uint64_t lo ; uint64_t hi ; } __attribute__ (( __aligned__ ( 16 ) )); } template < class T > inline bool cas ( volatile T * src , T cmp , T with ); template <> inline bool cas ( volatile types :: uint128_t * src , types :: uint128_t cmp , types :: uint128_t with ) { bool result ; __asm__ __volatile__ ( "lock cmpxchg16b %1\n\t" "setz %0" : "=q" ( result ) , "+m" ( * src ) , "+d" ( cmp . hi ) , "+a" ( cmp . lo ) : "c" ( with . hi ) , "b" ( with . lo ) : "cc" ); return result ; } int main () { using namespace types ; uint128_t test = { 0xdecafbad , 0xfeedbeef }; uint128_t cmp = test ; uint128_t with = { 0x55555555 , 0xaaaaaaaa }; return ! cas ( & test , cmp , with ); }