xref: /llvm-project/clang/test/CodeGen/fp-atomic-ops.c (revision 54ad4d2dd1526c53c3647eee26f8ecc2ff63f30c)
1 // RUN: %clang_cc1 %s -emit-llvm -DDOUBLE -O0 -o - -triple=amdgcn-amd-amdhsa \
2 // RUN:   | FileCheck -check-prefixes=FLOAT,DOUBLE %s
3 
4 // RUN: %clang_cc1 %s -emit-llvm -DDOUBLE -O0 -o - -triple=aarch64-linux-gnu \
5 // RUN:   | FileCheck -check-prefixes=FLOAT,DOUBLE %s
6 
7 // RUN: %clang_cc1 %s -emit-llvm -O0 -o - -triple=armv8-apple-ios7.0 \
8 // RUN:   | FileCheck -check-prefixes=FLOAT %s
9 
10 // RUN: %clang_cc1 %s -emit-llvm -DDOUBLE -O0 -o - -triple=hexagon \
11 // RUN:   | FileCheck -check-prefixes=FLOAT,DOUBLE %s
12 
13 // RUN: %clang_cc1 %s -emit-llvm -DDOUBLE -O0 -o - -triple=mips64-mti-linux-gnu \
14 // RUN:   | FileCheck -check-prefixes=FLOAT,DOUBLE %s
15 
16 // RUN: %clang_cc1 %s -emit-llvm -O0 -o - -triple=i686-linux-gnu \
17 // RUN:   | FileCheck -check-prefixes=FLOAT %s
18 
19 // RUN: %clang_cc1 %s -emit-llvm -DDOUBLE -O0 -o - -triple=x86_64-linux-gnu \
20 // RUN:   | FileCheck -check-prefixes=FLOAT,DOUBLE %s
21 
22 typedef enum memory_order {
23   memory_order_relaxed = __ATOMIC_RELAXED,
24   memory_order_acquire = __ATOMIC_ACQUIRE,
25   memory_order_release = __ATOMIC_RELEASE,
26   memory_order_acq_rel = __ATOMIC_ACQ_REL,
27   memory_order_seq_cst = __ATOMIC_SEQ_CST
28 } memory_order;
29 
test(float * f,float ff,double * d,double dd)30 void test(float *f, float ff, double *d, double dd) {
31   // FLOAT: atomicrmw fadd ptr {{.*}} monotonic
32   __atomic_fetch_add(f, ff, memory_order_relaxed);
33 
34   // FLOAT: atomicrmw fsub ptr {{.*}} monotonic
35   __atomic_fetch_sub(f, ff, memory_order_relaxed);
36 
37 #ifdef DOUBLE
38   // DOUBLE: atomicrmw fadd ptr {{.*}} monotonic
39   __atomic_fetch_add(d, dd, memory_order_relaxed);
40 
41   // DOUBLE: atomicrmw fsub ptr {{.*}} monotonic
42   __atomic_fetch_sub(d, dd, memory_order_relaxed);
43 #endif
44 }
45