typedef unsigned cond_t;
volatile cond_t test;
+volatile int i0;
volatile __fp16 h0 = 0.0, h1 = 1.0, h2;
volatile float f0, f1, f2;
volatile double d0;
// NATIVE-HALF: fpext half
// NATIVE-HALF: fmul float
h1 = f0 * h2;
+ // CHECK: [[F16TOF32]]
+ // CHECK: fmul float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: fmul half
+ h1 = h0 * i0;
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fdiv float
h1 = (f0 / h2);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fdiv float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: fdiv half
+ h1 = (h0 / i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fadd float
h1 = (f2 + h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fadd float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: fadd half
+ h1 = (h0 + i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fsub float
h1 = (f2 - h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fsub float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: fsub half
+ h1 = (h0 - i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fcmp olt float
test = (f2 < h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp olt float
+ // NATIVE-HALF: fcmp olt half
+ test = (i0 < h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp olt float
+ // NATIVE-HALF: fcmp olt half
+ test = (h0 < i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fcmp ogt float
test = (f0 > h2);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp ogt float
+ // NATIVE-HALF: fcmp ogt half
+ test = (i0 > h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp ogt float
+ // NATIVE-HALF: fcmp ogt half
+ test = (h0 > i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fcmp ole float
test = (f2 <= h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp ole float
+ // NATIVE-HALF: fcmp ole half
+ test = (i0 <= h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp ole float
+ // NATIVE-HALF: fcmp ole half
+ test = (h0 <= i0);
+
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fcmp oge float
test = (f0 >= h2);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp oge float
+ // NATIVE-HALF: fcmp oge half
+ test = (i0 >= h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp oge float
+ // NATIVE-HALF: fcmp oge half
+ test = (h0 >= i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fcmp oeq float
test = (f1 == h1);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp oeq float
+ // NATIVE-HALF: fcmp oeq half
+ test = (i0 == h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp oeq float
+ // NATIVE-HALF: fcmp oeq half
+ test = (h0 == i0);
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fpext half
// NATIVE-HALF: fcmp une float
test = (f1 != h1);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp une float
+ // NATIVE-HALF: fcmp une half
+ test = (i0 != h0);
+ // CHECK: [[F16TOF32]]
+ // CHECK: fcmp une float
+ // NATIVE-HALF: fcmp une half
+ test = (h0 != i0);
// CHECK: [[F16TOF32]]
// CHECK: fcmp une float
// NATIVE-HALF: fptrunc float
h0 = f0;
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ h0 = i0;
+ // CHECK: [[F16TOF32]]
+ // CHECK: fptosi float {{.*}} to i32
+ // NATIVE-HALF: fptosi half {{.*}} to i32
+ i0 = h0;
+
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// CHECK: fadd float
// NATIVE-HALF: fadd float
// NATIVE-HALF: fptrunc float
h0 += f2;
+ // CHECK: [[F16TOF32]]
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: fadd float
+ // CHECK: fptosi float {{.*}} to i32
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fadd half
+ // NATIVE-HALF: fptosi half {{.*}} to i32
+ i0 += h0;
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: [[F16TOF32]]
+ // CHECK: fadd float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fadd half
+ h0 += i0;
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fsub float
// NATIVE-HALF: fptrunc float
h0 -= f2;
+ // CHECK: [[F16TOF32]]
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: fsub float
+ // CHECK: fptosi float {{.*}} to i32
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fsub half
+ // NATIVE-HALF: fptosi half {{.*}} to i32
+ i0 -= h0;
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: [[F16TOF32]]
+ // CHECK: fsub float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fsub half
+ h0 -= i0;
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fmul float
// NATIVE-HALF: fptrunc float
h0 *= f2;
+ // CHECK: [[F16TOF32]]
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: fmul float
+ // CHECK: fptosi float {{.*}} to i32
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fmul half
+ // NATIVE-HALF: fptosi half {{.*}} to i32
+ i0 *= h0;
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: [[F16TOF32]]
+ // CHECK: fmul float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fmul half
+ h0 *= i0;
// CHECK: [[F16TOF32]]
// CHECK: [[F16TOF32]]
// NATIVE-HALF: fdiv float
// NATIVE-HALF: fptrunc float
h0 /= f2;
+ // CHECK: [[F16TOF32]]
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: fdiv float
+ // CHECK: fptosi float {{.*}} to i32
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fdiv half
+ // NATIVE-HALF: fptosi half {{.*}} to i32
+ i0 /= h0;
+ // CHECK: sitofp i32 {{.*}} to float
+ // CHECK: [[F16TOF32]]
+ // CHECK: fdiv float
+ // CHECK: [[F32TOF16]]
+ // NATIVE-HALF: sitofp i32 {{.*}} to half
+ // NATIVE-HALF: fdiv half
+ h0 /= i0;
// Check conversions to/from double
// NOHALF: call i16 @llvm.convert.to.fp16.f64(