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