// RUN: %clang_cc1 -triple s390x-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s // // Test that floating point atomic stores and loads do not get casted to/from // integer. #include _Atomic float Af; _Atomic double Ad; _Atomic long double Ald; //// Atomic stores of floating point values. void fun0(float Arg) { // CHECK-LABEL: @fun0 // CHECK: store atomic float %Arg, ptr @Af seq_cst, align 4 Af = Arg; } void fun1(double Arg) { // CHECK-LABEL: @fun1 // CHECK: store atomic double %Arg, ptr @Ad seq_cst, align 8 Ad = Arg; } void fun2(long double Arg) { // CHECK-LABEL: @fun2 // CHECK: store atomic fp128 %Arg, ptr @Ald seq_cst, align 16 Ald = Arg; } void fun3(_Atomic float *Dst, float Arg) { // CHECK-LABEL: @fun // CHECK: store atomic float %Arg, ptr %Dst seq_cst, align 4 *Dst = Arg; } void fun4(_Atomic double *Dst, double Arg) { // CHECK-LABEL: @fun4 // CHECK: store atomic double %Arg, ptr %Dst seq_cst, align 8 *Dst = Arg; } void fun5(_Atomic long double *Dst, long double Arg) { // CHECK-LABEL: @fun5 // CHECK: store atomic fp128 %Arg, ptr %Dst seq_cst, align 16 *Dst = Arg; } //// Atomic loads of floating point values. float fun6() { // CHECK-LABEL: @fun6 // CHECK: %atomic-load = load atomic float, ptr @Af seq_cst, align 4 return Af; } float fun7() { // CHECK-LABEL: @fun7 // CHECK: %atomic-load = load atomic double, ptr @Ad seq_cst, align 8 return Ad; } float fun8() { // CHECK-LABEL: @fun8 // CHECK: %atomic-load = load atomic fp128, ptr @Ald seq_cst, align 16 return Ald; } float fun9(_Atomic float *Src) { // CHECK-LABEL: @fun9 // CHECK: %atomic-load = load atomic float, ptr %Src seq_cst, align 4 return *Src; } double fun10(_Atomic double *Src) { // CHECK-LABEL: @fun10 // CHECK: %atomic-load = load atomic double, ptr %Src seq_cst, align 8 return *Src; } long double fun11(_Atomic long double *Src) { // CHECK-LABEL: @fun11 // CHECK: %atomic-load = load atomic fp128, ptr %Src seq_cst, align 16 return *Src; } //// Same, but with 'volatile' as well: _Atomic volatile float Af_vol; _Atomic volatile double Ad_vol; _Atomic volatile long double Ald_vol; //// Atomic volatile stores of floating point values. void fun0_vol(float Arg) { // CHECK-LABEL: @fun0_vol // CHECK: store atomic volatile float %Arg, ptr @Af_vol seq_cst, align 4 Af_vol = Arg; } void fun1_vol(double Arg) { // CHECK-LABEL: @fun1_vol // CHECK: store atomic volatile double %Arg, ptr @Ad_vol seq_cst, align 8 Ad_vol = Arg; } void fun2_vol(long double Arg) { // CHECK-LABEL: @fun2_vol // CHECK: store atomic volatile fp128 %Arg, ptr @Ald_vol seq_cst, align 16 Ald_vol = Arg; } void fun3_vol(_Atomic volatile float *Dst, float Arg) { // CHECK-LABEL: @fun3_vol // CHECK: store atomic volatile float %Arg, ptr %Dst seq_cst, align 4 *Dst = Arg; } void fun4_vol(_Atomic volatile double *Dst, double Arg) { // CHECK-LABEL: @fun4_vol // CHECK: store atomic volatile double %Arg, ptr %Dst seq_cst, align 8 *Dst = Arg; } void fun5_vol(_Atomic volatile long double *Dst, long double Arg) { // CHECK-LABEL: @fun5_vol // CHECK: store atomic volatile fp128 %Arg, ptr %Dst seq_cst, align 16 *Dst = Arg; } //// Atomic volatile loads of floating point values. float fun6_vol() { // CHECK-LABEL: @fun6_vol // CHECK: %atomic-load = load atomic volatile float, ptr @Af_vol seq_cst, align 4 return Af_vol; } float fun7_vol() { // CHECK-LABEL: @fun7_vol // CHECK: %atomic-load = load atomic volatile double, ptr @Ad_vol seq_cst, align 8 return Ad_vol; } float fun8_vol() { // CHECK-LABEL: @fun8_vol // CHECK: %atomic-load = load atomic volatile fp128, ptr @Ald_vol seq_cst, align 16 return Ald_vol; } float fun9_vol(_Atomic volatile float *Src) { // CHECK-LABEL: @fun9_vol // CHECK: %atomic-load = load atomic volatile float, ptr %Src seq_cst, align 4 return *Src; } double fun10_vol(_Atomic volatile double *Src) { // CHECK-LABEL: @fun10_vol // CHECK: %atomic-load = load atomic volatile double, ptr %Src seq_cst, align 8 return *Src; } long double fun11_vol(_Atomic volatile long double *Src) { // CHECK-LABEL: @fun11_vol // CHECK: %atomic-load = load atomic volatile fp128, ptr %Src seq_cst, align 16 return *Src; }