xref: /llvm-project/clang/test/CodeGen/SystemZ/atomic_fp_load_store.c (revision 9f7ed36f92c304050d401f00b013186de15130e8)
1 // RUN: %clang_cc1 -triple s390x-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s
2 //
3 // Test that floating point atomic stores and loads do not get casted to/from
4 // integer.
5 
6 #include <stdatomic.h>
7 
8 _Atomic float Af;
9 _Atomic double Ad;
10 _Atomic long double Ald;
11 
12 //// Atomic stores of floating point values.
fun0(float Arg)13 void fun0(float Arg) {
14 // CHECK-LABEL: @fun0
15 // CHECK:       store atomic float %Arg, ptr @Af seq_cst, align 4
16   Af = Arg;
17 }
18 
fun1(double Arg)19 void fun1(double Arg) {
20 // CHECK-LABEL: @fun1
21 // CHECK:       store atomic double %Arg, ptr @Ad seq_cst, align 8
22   Ad = Arg;
23 }
24 
fun2(long double Arg)25 void fun2(long double Arg) {
26 // CHECK-LABEL: @fun2
27 // CHECK:       store atomic fp128 %Arg, ptr @Ald seq_cst, align 16
28   Ald = Arg;
29 }
30 
fun3(_Atomic float * Dst,float Arg)31 void fun3(_Atomic float *Dst, float Arg) {
32 // CHECK-LABEL: @fun
33 // CHECK:       store atomic float %Arg, ptr %Dst seq_cst, align 4
34   *Dst = Arg;
35 }
36 
fun4(_Atomic double * Dst,double Arg)37 void fun4(_Atomic double *Dst, double Arg) {
38 // CHECK-LABEL: @fun4
39 // CHECK:       store atomic double %Arg, ptr %Dst seq_cst, align 8
40   *Dst = Arg;
41 }
42 
fun5(_Atomic long double * Dst,long double Arg)43 void fun5(_Atomic long double *Dst, long double Arg) {
44 // CHECK-LABEL: @fun5
45 // CHECK:       store atomic fp128 %Arg, ptr %Dst seq_cst, align 16
46   *Dst = Arg;
47 }
48 
49 //// Atomic loads of floating point values.
fun6()50 float fun6() {
51 // CHECK-LABEL: @fun6
52 // CHECK:       %atomic-load = load atomic float, ptr @Af seq_cst, align 4
53   return Af;
54 }
55 
fun7()56 float fun7() {
57 // CHECK-LABEL: @fun7
58 // CHECK:       %atomic-load = load atomic double, ptr @Ad seq_cst, align 8
59   return Ad;
60 }
61 
fun8()62 float fun8() {
63 // CHECK-LABEL: @fun8
64 // CHECK:       %atomic-load = load atomic fp128, ptr @Ald seq_cst, align 16
65   return Ald;
66 }
67 
fun9(_Atomic float * Src)68 float fun9(_Atomic float *Src) {
69 // CHECK-LABEL: @fun9
70 // CHECK:       %atomic-load = load atomic float, ptr %Src seq_cst, align 4
71   return *Src;
72 }
73 
fun10(_Atomic double * Src)74 double fun10(_Atomic double *Src) {
75 // CHECK-LABEL: @fun10
76 // CHECK:       %atomic-load = load atomic double, ptr %Src seq_cst, align 8
77   return *Src;
78 }
79 
fun11(_Atomic long double * Src)80 long double fun11(_Atomic long double *Src) {
81 // CHECK-LABEL: @fun11
82 // CHECK:       %atomic-load = load atomic fp128, ptr %Src seq_cst, align 16
83   return *Src;
84 }
85 
86 //// Same, but with 'volatile' as well:
87 
88 _Atomic volatile float Af_vol;
89 _Atomic volatile double Ad_vol;
90 _Atomic volatile long double Ald_vol;
91 
92 //// Atomic volatile stores of floating point values.
fun0_vol(float Arg)93 void fun0_vol(float Arg) {
94 // CHECK-LABEL: @fun0_vol
95 // CHECK:       store atomic volatile float %Arg, ptr @Af_vol seq_cst, align 4
96   Af_vol = Arg;
97 }
98 
fun1_vol(double Arg)99 void fun1_vol(double Arg) {
100 // CHECK-LABEL: @fun1_vol
101 // CHECK:       store atomic volatile double %Arg, ptr @Ad_vol seq_cst, align 8
102   Ad_vol = Arg;
103 }
104 
fun2_vol(long double Arg)105 void fun2_vol(long double Arg) {
106 // CHECK-LABEL: @fun2_vol
107 // CHECK:       store atomic volatile fp128 %Arg, ptr @Ald_vol seq_cst, align 16
108   Ald_vol = Arg;
109 }
110 
fun3_vol(_Atomic volatile float * Dst,float Arg)111 void fun3_vol(_Atomic volatile float *Dst, float Arg) {
112 // CHECK-LABEL: @fun3_vol
113 // CHECK:       store atomic volatile float %Arg, ptr %Dst seq_cst, align 4
114   *Dst = Arg;
115 }
116 
fun4_vol(_Atomic volatile double * Dst,double Arg)117 void fun4_vol(_Atomic volatile double *Dst, double Arg) {
118 // CHECK-LABEL: @fun4_vol
119 // CHECK:       store atomic volatile double %Arg, ptr %Dst seq_cst, align 8
120   *Dst = Arg;
121 }
122 
fun5_vol(_Atomic volatile long double * Dst,long double Arg)123 void fun5_vol(_Atomic volatile long double *Dst, long double Arg) {
124 // CHECK-LABEL: @fun5_vol
125 // CHECK:       store atomic volatile fp128 %Arg, ptr %Dst seq_cst, align 16
126   *Dst = Arg;
127 }
128 
129 //// Atomic volatile loads of floating point values.
fun6_vol()130 float fun6_vol() {
131 // CHECK-LABEL: @fun6_vol
132 // CHECK:       %atomic-load = load atomic volatile float, ptr @Af_vol seq_cst, align 4
133   return Af_vol;
134 }
135 
fun7_vol()136 float fun7_vol() {
137 // CHECK-LABEL: @fun7_vol
138 // CHECK:       %atomic-load = load atomic volatile double, ptr @Ad_vol seq_cst, align 8
139   return Ad_vol;
140 }
141 
fun8_vol()142 float fun8_vol() {
143 // CHECK-LABEL: @fun8_vol
144 // CHECK:       %atomic-load = load atomic volatile fp128, ptr @Ald_vol seq_cst, align 16
145   return Ald_vol;
146 }
147 
fun9_vol(_Atomic volatile float * Src)148 float fun9_vol(_Atomic volatile float *Src) {
149 // CHECK-LABEL: @fun9_vol
150 // CHECK:       %atomic-load = load atomic volatile float, ptr %Src seq_cst, align 4
151   return *Src;
152 }
153 
fun10_vol(_Atomic volatile double * Src)154 double fun10_vol(_Atomic volatile double *Src) {
155 // CHECK-LABEL: @fun10_vol
156 // CHECK:       %atomic-load = load atomic volatile double, ptr %Src seq_cst, align 8
157   return *Src;
158 }
159 
fun11_vol(_Atomic volatile long double * Src)160 long double fun11_vol(_Atomic volatile long double *Src) {
161 // CHECK-LABEL: @fun11_vol
162 // CHECK:       %atomic-load = load atomic volatile fp128, ptr %Src seq_cst, align 16
163   return *Src;
164 }
165