165 lines · c
1// RUN: %clang_cc1 -triple s390x-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s2//3// Test that floating point atomic stores and loads do not get casted to/from4// 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.13void fun0(float Arg) {14// CHECK-LABEL: @fun015// CHECK: store atomic float %Arg, ptr @Af seq_cst, align 416 Af = Arg;17}18 19void fun1(double Arg) {20// CHECK-LABEL: @fun121// CHECK: store atomic double %Arg, ptr @Ad seq_cst, align 822 Ad = Arg;23}24 25void fun2(long double Arg) {26// CHECK-LABEL: @fun227// CHECK: store atomic fp128 %Arg, ptr @Ald seq_cst, align 1628 Ald = Arg;29}30 31void fun3(_Atomic float *Dst, float Arg) {32// CHECK-LABEL: @fun33// CHECK: store atomic float %Arg, ptr %Dst seq_cst, align 434 *Dst = Arg;35}36 37void fun4(_Atomic double *Dst, double Arg) {38// CHECK-LABEL: @fun439// CHECK: store atomic double %Arg, ptr %Dst seq_cst, align 840 *Dst = Arg;41}42 43void fun5(_Atomic long double *Dst, long double Arg) {44// CHECK-LABEL: @fun545// CHECK: store atomic fp128 %Arg, ptr %Dst seq_cst, align 1646 *Dst = Arg;47}48 49//// Atomic loads of floating point values.50float fun6() {51// CHECK-LABEL: @fun652// CHECK: %atomic-load = load atomic float, ptr @Af seq_cst, align 453 return Af;54}55 56float fun7() {57// CHECK-LABEL: @fun758// CHECK: %atomic-load = load atomic double, ptr @Ad seq_cst, align 859 return Ad;60}61 62float fun8() {63// CHECK-LABEL: @fun864// CHECK: %atomic-load = load atomic fp128, ptr @Ald seq_cst, align 1665 return Ald;66}67 68float fun9(_Atomic float *Src) {69// CHECK-LABEL: @fun970// CHECK: %atomic-load = load atomic float, ptr %Src seq_cst, align 471 return *Src;72}73 74double fun10(_Atomic double *Src) {75// CHECK-LABEL: @fun1076// CHECK: %atomic-load = load atomic double, ptr %Src seq_cst, align 877 return *Src;78}79 80long double fun11(_Atomic long double *Src) {81// CHECK-LABEL: @fun1182// CHECK: %atomic-load = load atomic fp128, ptr %Src seq_cst, align 1683 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.93void fun0_vol(float Arg) {94// CHECK-LABEL: @fun0_vol95// CHECK: store atomic volatile float %Arg, ptr @Af_vol seq_cst, align 496 Af_vol = Arg;97}98 99void fun1_vol(double Arg) {100// CHECK-LABEL: @fun1_vol101// CHECK: store atomic volatile double %Arg, ptr @Ad_vol seq_cst, align 8102 Ad_vol = Arg;103}104 105void fun2_vol(long double Arg) {106// CHECK-LABEL: @fun2_vol107// CHECK: store atomic volatile fp128 %Arg, ptr @Ald_vol seq_cst, align 16108 Ald_vol = Arg;109}110 111void fun3_vol(_Atomic volatile float *Dst, float Arg) {112// CHECK-LABEL: @fun3_vol113// CHECK: store atomic volatile float %Arg, ptr %Dst seq_cst, align 4114 *Dst = Arg;115}116 117void fun4_vol(_Atomic volatile double *Dst, double Arg) {118// CHECK-LABEL: @fun4_vol119// CHECK: store atomic volatile double %Arg, ptr %Dst seq_cst, align 8120 *Dst = Arg;121}122 123void fun5_vol(_Atomic volatile long double *Dst, long double Arg) {124// CHECK-LABEL: @fun5_vol125// CHECK: store atomic volatile fp128 %Arg, ptr %Dst seq_cst, align 16126 *Dst = Arg;127}128 129//// Atomic volatile loads of floating point values.130float fun6_vol() {131// CHECK-LABEL: @fun6_vol132// CHECK: %atomic-load = load atomic volatile float, ptr @Af_vol seq_cst, align 4133 return Af_vol;134}135 136float fun7_vol() {137// CHECK-LABEL: @fun7_vol138// CHECK: %atomic-load = load atomic volatile double, ptr @Ad_vol seq_cst, align 8139 return Ad_vol;140}141 142float fun8_vol() {143// CHECK-LABEL: @fun8_vol144// CHECK: %atomic-load = load atomic volatile fp128, ptr @Ald_vol seq_cst, align 16145 return Ald_vol;146}147 148float fun9_vol(_Atomic volatile float *Src) {149// CHECK-LABEL: @fun9_vol150// CHECK: %atomic-load = load atomic volatile float, ptr %Src seq_cst, align 4151 return *Src;152}153 154double fun10_vol(_Atomic volatile double *Src) {155// CHECK-LABEL: @fun10_vol156// CHECK: %atomic-load = load atomic volatile double, ptr %Src seq_cst, align 8157 return *Src;158}159 160long double fun11_vol(_Atomic volatile long double *Src) {161// CHECK-LABEL: @fun11_vol162// CHECK: %atomic-load = load atomic volatile fp128, ptr %Src seq_cst, align 16163 return *Src;164}165