// 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 <stdatomic.h>
_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;
}