Hey Guys,
I have a newbie question about supporting the GNU atomic builtin, __sync_fetch_and_nand. It appears that LLVM 29 produces X86 assembly like the GCC versions below v4.4, i.e.
NEGATE and AND
notq %rax
movq 48(%rsp), %rcx
andq %rcx, %rax
I’m looking to produce X86 assembly like GCC v4.4 and greater, i.e.
NOT AND
movq 48(%rsp), %rcx
andq %rcx, %rax
notq %rax
I currently have custom code to make the switch between implementations, but it’s invasive at best. Has the newer implementation already been written and I missed it? If so, could someone please point me to that code? If not, are there any plans in the near future to support the newer GCC implementation?
mcinally/MERGE_29> cat llvm.c
#include <stdio.h>
typedef int16_t T;
T a = 10;
int main() {
volatile T *p = &a;
T x = 2;
int failed = 0;
printf( “Testing %d bit objects\n”, sizeof( T ) * 8 );
p = 15; / Or any value with the 2nd bit set */
__sync_fetch_and_nand(p,x);
if ( ~*p != 2 ) {
failed = 1;
}
if ( !failed ) printf( “Test PASSED\n” );
else printf( “Test FAILED\n” );
return 0;
}
Thanks,
Cameron