1 // RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s 2 3 // Basic IRGen tests for __atomic_* 4 5 // FIXME: Need to implement __atomic_is_lock_free 6 7 typedef enum memory_order { 8 memory_order_relaxed, memory_order_consume, memory_order_acquire, 9 memory_order_release, memory_order_acq_rel, memory_order_seq_cst 10 } memory_order; 11 12 int fi1(_Atomic(int) *i) { 13 // CHECK: @fi1 14 // CHECK: load atomic i32* {{.*}} seq_cst 15 return __atomic_load(i, memory_order_seq_cst); 16 } 17 18 void fi2(_Atomic(int) *i) { 19 // CHECK: @fi2 20 // CHECK: store atomic i32 {{.*}} seq_cst 21 __atomic_store(i, 1, memory_order_seq_cst); 22 } 23 24 void fi3(_Atomic(int) *i) { 25 // CHECK: @fi3 26 // CHECK: atomicrmw and 27 __atomic_fetch_and(i, 1, memory_order_seq_cst); 28 } 29 30 void fi4(_Atomic(int) *i) { 31 // CHECK: @fi4 32 // CHECK: cmpxchg i32* 33 int cmp = 0; 34 __atomic_compare_exchange_strong(i, &cmp, 1, memory_order_acquire, memory_order_acquire); 35 } 36 37 float ff1(_Atomic(float) *d) { 38 // CHECK: @ff1 39 // CHECK: load atomic i32* {{.*}} monotonic 40 return __atomic_load(d, memory_order_relaxed); 41 } 42 43 void ff2(_Atomic(float) *d) { 44 // CHECK: @ff2 45 // CHECK: store atomic i32 {{.*}} release 46 __atomic_store(d, 1, memory_order_release); 47 } 48 49 float ff3(_Atomic(float) *d) { 50 return __atomic_exchange(d, 2, memory_order_seq_cst); 51 } 52 53 int* fp1(_Atomic(int*) *p) { 54 // CHECK: @fp1 55 // CHECK: load atomic i32* {{.*}} seq_cst 56 return __atomic_load(p, memory_order_seq_cst); 57 } 58 59 int* fp2(_Atomic(int*) *p) { 60 // CHECK: @fp2 61 // CHECK: store i32 4 62 // CHECK: atomicrmw add {{.*}} monotonic 63 return __atomic_fetch_add(p, 1, memory_order_relaxed); 64 } 65 66 _Complex float fc(_Atomic(_Complex float) *c) { 67 // CHECK: @fc 68 // CHECK: atomicrmw xchg i64* 69 return __atomic_exchange(c, 2, memory_order_seq_cst); 70 } 71 72 typedef struct X { int x; } X; 73 X fs(_Atomic(X) *c) { 74 // CHECK: @fs 75 // CHECK: atomicrmw xchg i32* 76 return __atomic_exchange(c, (X){2}, memory_order_seq_cst); 77 } 78 79 int lock_free() { 80 // CHECK: @lock_free 81 // CHECK: ret i32 1 82 return __atomic_is_lock_free(sizeof(_Atomic(int))); 83 } 84