30 lines
		
	
	
		
			901 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			901 B
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -target-cpu core2 %s -S -emit-llvm -o - | FileCheck %s
 | |
| 
 | |
| // All atomics up to 16 bytes should be emitted inline on x86_64. The
 | |
| // backend can reform __sync_whatever calls if necessary (e.g. the CPU
 | |
| // doesn't have cmpxchg16b).
 | |
| 
 | |
| __int128 test_sync_call(__int128 *addr, __int128 val) {
 | |
|   // CHECK-LABEL: @test_sync_call
 | |
|   // CHECK: atomicrmw add i128
 | |
|   return __sync_fetch_and_add(addr, val);
 | |
| }
 | |
| 
 | |
| __int128 test_c11_call(_Atomic __int128 *addr, __int128 val) {
 | |
|   // CHECK-LABEL: @test_c11_call
 | |
|   // CHECK: atomicrmw sub
 | |
|   return __c11_atomic_fetch_sub(addr, val, 0);
 | |
| }
 | |
| 
 | |
| __int128 test_atomic_call(__int128 *addr, __int128 val) {
 | |
|   // CHECK-LABEL: @test_atomic_call
 | |
|   // CHECK: atomicrmw or
 | |
|   return __atomic_fetch_or(addr, val, 0);
 | |
| }
 | |
| 
 | |
| __int128 test_expression(_Atomic __int128 *addr) {
 | |
|   // CHECK-LABEL: @test_expression
 | |
|   // CHECK: atomicrmw and
 | |
|   *addr &= 1;
 | |
| }
 |