1*67e74705SXin Li // REQUIRES: arm-registered-target 2*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK 3*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK 4*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK 5*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK 6*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fnative-half-type %s \ 7*67e74705SXin Li // RUN: | FileCheck %s --check-prefix=NATIVE-HALF 8*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fnative-half-type %s \ 9*67e74705SXin Li // RUN: | FileCheck %s --check-prefix=NATIVE-HALF 10*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -x renderscript %s \ 11*67e74705SXin Li // RUN: | FileCheck %s --check-prefix=NATIVE-HALF 12*67e74705SXin Li typedef unsigned cond_t; 13*67e74705SXin Li 14*67e74705SXin Li volatile cond_t test; 15*67e74705SXin Li volatile int i0; 16*67e74705SXin Li volatile __fp16 h0 = 0.0, h1 = 1.0, h2; 17*67e74705SXin Li volatile float f0, f1, f2; 18*67e74705SXin Li volatile double d0; 19*67e74705SXin Li foo(void)20*67e74705SXin Livoid foo(void) { 21*67e74705SXin Li // CHECK-LABEL: define void @foo() 22*67e74705SXin Li 23*67e74705SXin Li // Check unary ops 24*67e74705SXin Li 25*67e74705SXin Li // NOHALF: [[F16TOF32:call float @llvm.convert.from.fp16.f32]] 26*67e74705SXin Li // HALF: [[F16TOF32:fpext half]] 27*67e74705SXin Li // CHECK: fptoui float 28*67e74705SXin Li // NATIVE-HALF: fptoui half 29*67e74705SXin Li test = (h0); 30*67e74705SXin Li // CHECK: uitofp i32 31*67e74705SXin Li // NOHALF: [[F32TOF16:call i16 @llvm.convert.to.fp16.f32]] 32*67e74705SXin Li // HALF: [[F32TOF16:fptrunc float]] 33*67e74705SXin Li // NATIVE-HALF: uitofp i32 {{.*}} to half 34*67e74705SXin Li h0 = (test); 35*67e74705SXin Li // CHECK: [[F16TOF32]] 36*67e74705SXin Li // CHECK: fcmp une float 37*67e74705SXin Li // NATIVE-HALF: fcmp une half 38*67e74705SXin Li test = (!h1); 39*67e74705SXin Li // CHECK: [[F16TOF32]] 40*67e74705SXin Li // CHECK: fsub float 41*67e74705SXin Li // NOHALF: [[F32TOF16]] 42*67e74705SXin Li // HALF: [[F32TOF16]] 43*67e74705SXin Li // NATIVE-HALF: fsub half 44*67e74705SXin Li h1 = -h1; 45*67e74705SXin Li // CHECK: [[F16TOF32]] 46*67e74705SXin Li // CHECK: [[F32TOF16]] 47*67e74705SXin Li // NATIVE-HALF: load volatile half 48*67e74705SXin Li // NATIVE-HALF-NEXT: store volatile half 49*67e74705SXin Li h1 = +h1; 50*67e74705SXin Li // CHECK: [[F16TOF32]] 51*67e74705SXin Li // CHECK: fadd float 52*67e74705SXin Li // CHECK: [[F32TOF16]] 53*67e74705SXin Li // NATIVE-HALF: fadd half 54*67e74705SXin Li h1++; 55*67e74705SXin Li // CHECK: [[F16TOF32]] 56*67e74705SXin Li // CHECK: fadd float 57*67e74705SXin Li // CHECK: [[F32TOF16]] 58*67e74705SXin Li // NATIVE-HALF: fadd half 59*67e74705SXin Li ++h1; 60*67e74705SXin Li // CHECK: [[F16TOF32]] 61*67e74705SXin Li // CHECK: fadd float 62*67e74705SXin Li // CHECK: [[F32TOF16]] 63*67e74705SXin Li // NATIVE-HALF: fadd half 64*67e74705SXin Li --h1; 65*67e74705SXin Li // CHECK: [[F16TOF32]] 66*67e74705SXin Li // CHECK: fadd float 67*67e74705SXin Li // CHECK: [[F32TOF16]] 68*67e74705SXin Li // NATIVE-HALF: fadd half 69*67e74705SXin Li h1--; 70*67e74705SXin Li 71*67e74705SXin Li // Check binary ops with various operands 72*67e74705SXin Li // CHECK: [[F16TOF32]] 73*67e74705SXin Li // CHECK: [[F16TOF32]] 74*67e74705SXin Li // CHECK: fmul float 75*67e74705SXin Li // CHECK: [[F32TOF16]] 76*67e74705SXin Li // NATIVE-HALF: fmul half 77*67e74705SXin Li h1 = h0 * h2; 78*67e74705SXin Li // CHECK: [[F16TOF32]] 79*67e74705SXin Li // NOHALF: [[F32TOF16]] 80*67e74705SXin Li // NOHALF: [[F16TOF32]] 81*67e74705SXin Li // CHECK: fmul float 82*67e74705SXin Li // CHECK: [[F32TOF16]] 83*67e74705SXin Li // NATIVE-HALF: fmul half 84*67e74705SXin Li h1 = h0 * (__fp16) -2.0f; 85*67e74705SXin Li // CHECK: [[F16TOF32]] 86*67e74705SXin Li // CHECK: fmul float 87*67e74705SXin Li // CHECK: [[F32TOF16]] 88*67e74705SXin Li // NATIVE-HALF: fpext half 89*67e74705SXin Li // NATIVE-HALF: fmul float 90*67e74705SXin Li h1 = h0 * f2; 91*67e74705SXin Li // CHECK: [[F16TOF32]] 92*67e74705SXin Li // CHECK: fmul float 93*67e74705SXin Li // CHECK: [[F32TOF16]] 94*67e74705SXin Li // NATIVE-HALF: fpext half 95*67e74705SXin Li // NATIVE-HALF: fmul float 96*67e74705SXin Li h1 = f0 * h2; 97*67e74705SXin Li // CHECK: [[F16TOF32]] 98*67e74705SXin Li // CHECK: fmul float 99*67e74705SXin Li // CHECK: [[F32TOF16]] 100*67e74705SXin Li // NATIVE-HALF: fmul half 101*67e74705SXin Li h1 = h0 * i0; 102*67e74705SXin Li 103*67e74705SXin Li // CHECK: [[F16TOF32]] 104*67e74705SXin Li // CHECK: [[F16TOF32]] 105*67e74705SXin Li // CHECK: fdiv float 106*67e74705SXin Li // CHECK: [[F32TOF16]] 107*67e74705SXin Li // NATIVE-HALF: fdiv half 108*67e74705SXin Li h1 = (h0 / h2); 109*67e74705SXin Li // CHECK: [[F16TOF32]] 110*67e74705SXin Li // NOHALF: [[F16TOF32]] 111*67e74705SXin Li // CHECK: fdiv float 112*67e74705SXin Li // CHECK: [[F32TOF16]] 113*67e74705SXin Li // NATIVE-HALF: fdiv half 114*67e74705SXin Li h1 = (h0 / (__fp16) -2.0f); 115*67e74705SXin Li // CHECK: [[F16TOF32]] 116*67e74705SXin Li // CHECK: fdiv float 117*67e74705SXin Li // CHECK: [[F32TOF16]] 118*67e74705SXin Li // NATIVE-HALF: fpext half 119*67e74705SXin Li // NATIVE-HALF: fdiv float 120*67e74705SXin Li h1 = (h0 / f2); 121*67e74705SXin Li // CHECK: [[F16TOF32]] 122*67e74705SXin Li // CHECK: fdiv float 123*67e74705SXin Li // CHECK: [[F32TOF16]] 124*67e74705SXin Li // NATIVE-HALF: fpext half 125*67e74705SXin Li // NATIVE-HALF: fdiv float 126*67e74705SXin Li h1 = (f0 / h2); 127*67e74705SXin Li // CHECK: [[F16TOF32]] 128*67e74705SXin Li // CHECK: fdiv float 129*67e74705SXin Li // CHECK: [[F32TOF16]] 130*67e74705SXin Li // NATIVE-HALF: fdiv half 131*67e74705SXin Li h1 = (h0 / i0); 132*67e74705SXin Li 133*67e74705SXin Li // CHECK: [[F16TOF32]] 134*67e74705SXin Li // CHECK: [[F16TOF32]] 135*67e74705SXin Li // CHECK: fadd float 136*67e74705SXin Li // CHECK: [[F32TOF16]] 137*67e74705SXin Li // NATIVE-HALF: fadd half 138*67e74705SXin Li h1 = (h2 + h0); 139*67e74705SXin Li // CHECK: [[F16TOF32]] 140*67e74705SXin Li // NOHALF: [[F16TOF32]] 141*67e74705SXin Li // CHECK: fadd float 142*67e74705SXin Li // CHECK: [[F32TOF16]] 143*67e74705SXin Li // NATIVE-HALF: fadd half 144*67e74705SXin Li h1 = ((__fp16)-2.0 + h0); 145*67e74705SXin Li // CHECK: [[F16TOF32]] 146*67e74705SXin Li // CHECK: fadd float 147*67e74705SXin Li // CHECK: [[F32TOF16]] 148*67e74705SXin Li // NATIVE-HALF: fpext half 149*67e74705SXin Li // NATIVE-HALF: fadd float 150*67e74705SXin Li h1 = (h2 + f0); 151*67e74705SXin Li // CHECK: [[F16TOF32]] 152*67e74705SXin Li // CHECK: fadd float 153*67e74705SXin Li // CHECK: [[F32TOF16]] 154*67e74705SXin Li // NATIVE-HALF: fpext half 155*67e74705SXin Li // NATIVE-HALF: fadd float 156*67e74705SXin Li h1 = (f2 + h0); 157*67e74705SXin Li // CHECK: [[F16TOF32]] 158*67e74705SXin Li // CHECK: fadd float 159*67e74705SXin Li // CHECK: [[F32TOF16]] 160*67e74705SXin Li // NATIVE-HALF: fadd half 161*67e74705SXin Li h1 = (h0 + i0); 162*67e74705SXin Li 163*67e74705SXin Li // CHECK: [[F16TOF32]] 164*67e74705SXin Li // CHECK: [[F16TOF32]] 165*67e74705SXin Li // CHECK: fsub float 166*67e74705SXin Li // CHECK: [[F32TOF16]] 167*67e74705SXin Li // NATIVE-HALF: fsub half 168*67e74705SXin Li h1 = (h2 - h0); 169*67e74705SXin Li // CHECK: [[F16TOF32]] 170*67e74705SXin Li // NOHALF: [[F16TOF32]] 171*67e74705SXin Li // CHECK: fsub float 172*67e74705SXin Li // CHECK: [[F32TOF16]] 173*67e74705SXin Li // NATIVE-HALF: fsub half 174*67e74705SXin Li h1 = ((__fp16)-2.0f - h0); 175*67e74705SXin Li // CHECK: [[F16TOF32]] 176*67e74705SXin Li // CHECK: fsub float 177*67e74705SXin Li // CHECK: [[F32TOF16]] 178*67e74705SXin Li // NATIVE-HALF: fpext half 179*67e74705SXin Li // NATIVE-HALF: fsub float 180*67e74705SXin Li h1 = (h2 - f0); 181*67e74705SXin Li // CHECK: [[F16TOF32]] 182*67e74705SXin Li // CHECK: fsub float 183*67e74705SXin Li // CHECK: [[F32TOF16]] 184*67e74705SXin Li // NATIVE-HALF: fpext half 185*67e74705SXin Li // NATIVE-HALF: fsub float 186*67e74705SXin Li h1 = (f2 - h0); 187*67e74705SXin Li // CHECK: [[F16TOF32]] 188*67e74705SXin Li // CHECK: fsub float 189*67e74705SXin Li // CHECK: [[F32TOF16]] 190*67e74705SXin Li // NATIVE-HALF: fsub half 191*67e74705SXin Li h1 = (h0 - i0); 192*67e74705SXin Li 193*67e74705SXin Li // CHECK: [[F16TOF32]] 194*67e74705SXin Li // CHECK: [[F16TOF32]] 195*67e74705SXin Li // CHECK: fcmp olt float 196*67e74705SXin Li // NATIVE-HALF: fcmp olt half 197*67e74705SXin Li test = (h2 < h0); 198*67e74705SXin Li // CHECK: [[F16TOF32]] 199*67e74705SXin Li // NOHALF: [[F16TOF32]] 200*67e74705SXin Li // CHECK: fcmp olt float 201*67e74705SXin Li // NATIVE-HALF: fcmp olt half 202*67e74705SXin Li test = (h2 < (__fp16)42.0); 203*67e74705SXin Li // CHECK: [[F16TOF32]] 204*67e74705SXin Li // CHECK: fcmp olt float 205*67e74705SXin Li // NATIVE-HALF: fpext half 206*67e74705SXin Li // NATIVE-HALF: fcmp olt float 207*67e74705SXin Li test = (h2 < f0); 208*67e74705SXin Li // CHECK: [[F16TOF32]] 209*67e74705SXin Li // CHECK: fcmp olt float 210*67e74705SXin Li // NATIVE-HALF: fpext half 211*67e74705SXin Li // NATIVE-HALF: fcmp olt float 212*67e74705SXin Li test = (f2 < h0); 213*67e74705SXin Li // CHECK: [[F16TOF32]] 214*67e74705SXin Li // CHECK: fcmp olt float 215*67e74705SXin Li // NATIVE-HALF: fcmp olt half 216*67e74705SXin Li test = (i0 < h0); 217*67e74705SXin Li // CHECK: [[F16TOF32]] 218*67e74705SXin Li // CHECK: fcmp olt float 219*67e74705SXin Li // NATIVE-HALF: fcmp olt half 220*67e74705SXin Li test = (h0 < i0); 221*67e74705SXin Li 222*67e74705SXin Li // CHECK: [[F16TOF32]] 223*67e74705SXin Li // CHECK: [[F16TOF32]] 224*67e74705SXin Li // CHECK: fcmp ogt float 225*67e74705SXin Li // NATIVE-HALF: fcmp ogt half 226*67e74705SXin Li test = (h0 > h2); 227*67e74705SXin Li // CHECK: [[F16TOF32]] 228*67e74705SXin Li // NOHALF: [[F16TOF32]] 229*67e74705SXin Li // CHECK: fcmp ogt float 230*67e74705SXin Li // NATIVE-HALF: fcmp ogt half 231*67e74705SXin Li test = ((__fp16)42.0 > h2); 232*67e74705SXin Li // CHECK: [[F16TOF32]] 233*67e74705SXin Li // CHECK: fcmp ogt float 234*67e74705SXin Li // NATIVE-HALF: fpext half 235*67e74705SXin Li // NATIVE-HALF: fcmp ogt float 236*67e74705SXin Li test = (h0 > f2); 237*67e74705SXin Li // CHECK: [[F16TOF32]] 238*67e74705SXin Li // CHECK: fcmp ogt float 239*67e74705SXin Li // NATIVE-HALF: fpext half 240*67e74705SXin Li // NATIVE-HALF: fcmp ogt float 241*67e74705SXin Li test = (f0 > h2); 242*67e74705SXin Li // CHECK: [[F16TOF32]] 243*67e74705SXin Li // CHECK: fcmp ogt float 244*67e74705SXin Li // NATIVE-HALF: fcmp ogt half 245*67e74705SXin Li test = (i0 > h0); 246*67e74705SXin Li // CHECK: [[F16TOF32]] 247*67e74705SXin Li // CHECK: fcmp ogt float 248*67e74705SXin Li // NATIVE-HALF: fcmp ogt half 249*67e74705SXin Li test = (h0 > i0); 250*67e74705SXin Li 251*67e74705SXin Li // CHECK: [[F16TOF32]] 252*67e74705SXin Li // CHECK: [[F16TOF32]] 253*67e74705SXin Li // CHECK: fcmp ole float 254*67e74705SXin Li // NATIVE-HALF: fcmp ole half 255*67e74705SXin Li test = (h2 <= h0); 256*67e74705SXin Li // CHECK: [[F16TOF32]] 257*67e74705SXin Li // NOHALF: [[F16TOF32]] 258*67e74705SXin Li // CHECK: fcmp ole float 259*67e74705SXin Li // NATIVE-HALF: fcmp ole half 260*67e74705SXin Li test = (h2 <= (__fp16)42.0); 261*67e74705SXin Li // CHECK: [[F16TOF32]] 262*67e74705SXin Li // CHECK: fcmp ole float 263*67e74705SXin Li // NATIVE-HALF: fpext half 264*67e74705SXin Li // NATIVE-HALF: fcmp ole float 265*67e74705SXin Li test = (h2 <= f0); 266*67e74705SXin Li // CHECK: [[F16TOF32]] 267*67e74705SXin Li // CHECK: fcmp ole float 268*67e74705SXin Li // NATIVE-HALF: fpext half 269*67e74705SXin Li // NATIVE-HALF: fcmp ole float 270*67e74705SXin Li test = (f2 <= h0); 271*67e74705SXin Li // CHECK: [[F16TOF32]] 272*67e74705SXin Li // CHECK: fcmp ole float 273*67e74705SXin Li // NATIVE-HALF: fcmp ole half 274*67e74705SXin Li test = (i0 <= h0); 275*67e74705SXin Li // CHECK: [[F16TOF32]] 276*67e74705SXin Li // CHECK: fcmp ole float 277*67e74705SXin Li // NATIVE-HALF: fcmp ole half 278*67e74705SXin Li test = (h0 <= i0); 279*67e74705SXin Li 280*67e74705SXin Li 281*67e74705SXin Li // CHECK: [[F16TOF32]] 282*67e74705SXin Li // CHECK: [[F16TOF32]] 283*67e74705SXin Li // CHECK: fcmp oge float 284*67e74705SXin Li // NATIVE-HALF: fcmp oge half 285*67e74705SXin Li test = (h0 >= h2); 286*67e74705SXin Li // CHECK: [[F16TOF32]] 287*67e74705SXin Li // NOHALF: [[F16TOF32]] 288*67e74705SXin Li // CHECK: fcmp oge float 289*67e74705SXin Li // NATIVE-HALF: fcmp oge half 290*67e74705SXin Li test = (h0 >= (__fp16)-2.0); 291*67e74705SXin Li // CHECK: [[F16TOF32]] 292*67e74705SXin Li // CHECK: fcmp oge float 293*67e74705SXin Li // NATIVE-HALF: fpext half 294*67e74705SXin Li // NATIVE-HALF: fcmp oge float 295*67e74705SXin Li test = (h0 >= f2); 296*67e74705SXin Li // CHECK: [[F16TOF32]] 297*67e74705SXin Li // CHECK: fcmp oge float 298*67e74705SXin Li // NATIVE-HALF: fpext half 299*67e74705SXin Li // NATIVE-HALF: fcmp oge float 300*67e74705SXin Li test = (f0 >= h2); 301*67e74705SXin Li // CHECK: [[F16TOF32]] 302*67e74705SXin Li // CHECK: fcmp oge float 303*67e74705SXin Li // NATIVE-HALF: fcmp oge half 304*67e74705SXin Li test = (i0 >= h0); 305*67e74705SXin Li // CHECK: [[F16TOF32]] 306*67e74705SXin Li // CHECK: fcmp oge float 307*67e74705SXin Li // NATIVE-HALF: fcmp oge half 308*67e74705SXin Li test = (h0 >= i0); 309*67e74705SXin Li 310*67e74705SXin Li // CHECK: [[F16TOF32]] 311*67e74705SXin Li // CHECK: [[F16TOF32]] 312*67e74705SXin Li // CHECK: fcmp oeq float 313*67e74705SXin Li // NATIVE-HALF: fcmp oeq half 314*67e74705SXin Li test = (h1 == h2); 315*67e74705SXin Li // CHECK: [[F16TOF32]] 316*67e74705SXin Li // NOHALF: [[F16TOF32]] 317*67e74705SXin Li // CHECK: fcmp oeq float 318*67e74705SXin Li // NATIVE-HALF: fcmp oeq half 319*67e74705SXin Li test = (h1 == (__fp16)1.0); 320*67e74705SXin Li // CHECK: [[F16TOF32]] 321*67e74705SXin Li // CHECK: fcmp oeq float 322*67e74705SXin Li // NATIVE-HALF: fpext half 323*67e74705SXin Li // NATIVE-HALF: fcmp oeq float 324*67e74705SXin Li test = (h1 == f1); 325*67e74705SXin Li // CHECK: [[F16TOF32]] 326*67e74705SXin Li // CHECK: fcmp oeq float 327*67e74705SXin Li // NATIVE-HALF: fpext half 328*67e74705SXin Li // NATIVE-HALF: fcmp oeq float 329*67e74705SXin Li test = (f1 == h1); 330*67e74705SXin Li // CHECK: [[F16TOF32]] 331*67e74705SXin Li // CHECK: fcmp oeq float 332*67e74705SXin Li // NATIVE-HALF: fcmp oeq half 333*67e74705SXin Li test = (i0 == h0); 334*67e74705SXin Li // CHECK: [[F16TOF32]] 335*67e74705SXin Li // CHECK: fcmp oeq float 336*67e74705SXin Li // NATIVE-HALF: fcmp oeq half 337*67e74705SXin Li test = (h0 == i0); 338*67e74705SXin Li 339*67e74705SXin Li // CHECK: [[F16TOF32]] 340*67e74705SXin Li // CHECK: [[F16TOF32]] 341*67e74705SXin Li // CHECK: fcmp une float 342*67e74705SXin Li // NATIVE-HALF: fcmp une half 343*67e74705SXin Li test = (h1 != h2); 344*67e74705SXin Li // CHECK: [[F16TOF32]] 345*67e74705SXin Li // NOHALF: [[F16TOF32]] 346*67e74705SXin Li // CHECK: fcmp une float 347*67e74705SXin Li // NATIVE-HALF: fcmp une half 348*67e74705SXin Li test = (h1 != (__fp16)1.0); 349*67e74705SXin Li // CHECK: [[F16TOF32]] 350*67e74705SXin Li // CHECK: fcmp une float 351*67e74705SXin Li // NATIVE-HALF: fpext half 352*67e74705SXin Li // NATIVE-HALF: fcmp une float 353*67e74705SXin Li test = (h1 != f1); 354*67e74705SXin Li // CHECK: [[F16TOF32]] 355*67e74705SXin Li // CHECK: fcmp une float 356*67e74705SXin Li // NATIVE-HALF: fpext half 357*67e74705SXin Li // NATIVE-HALF: fcmp une float 358*67e74705SXin Li test = (f1 != h1); 359*67e74705SXin Li // CHECK: [[F16TOF32]] 360*67e74705SXin Li // CHECK: fcmp une float 361*67e74705SXin Li // NATIVE-HALF: fcmp une half 362*67e74705SXin Li test = (i0 != h0); 363*67e74705SXin Li // CHECK: [[F16TOF32]] 364*67e74705SXin Li // CHECK: fcmp une float 365*67e74705SXin Li // NATIVE-HALF: fcmp une half 366*67e74705SXin Li test = (h0 != i0); 367*67e74705SXin Li 368*67e74705SXin Li // CHECK: [[F16TOF32]] 369*67e74705SXin Li // CHECK: fcmp une float 370*67e74705SXin Li // CHECK: [[F16TOF32]] 371*67e74705SXin Li // CHECK: [[F16TOF32]] 372*67e74705SXin Li // CHECK: [[F32TOF16]] 373*67e74705SXin Li // NATIVE-HALF: fcmp une half {{.*}}, 0xH0000 374*67e74705SXin Li h1 = (h1 ? h2 : h0); 375*67e74705SXin Li // Check assignments (inc. compound) 376*67e74705SXin Li h0 = h1; 377*67e74705SXin Li // NOHALF: [[F32TOF16]] 378*67e74705SXin Li // HALF: store {{.*}} half 0xHC000 379*67e74705SXin Li // NATIVE-HALF: store {{.*}} half 0xHC000 380*67e74705SXin Li h0 = (__fp16)-2.0f; 381*67e74705SXin Li // CHECK: [[F32TOF16]] 382*67e74705SXin Li // NATIVE-HALF: fptrunc float 383*67e74705SXin Li h0 = f0; 384*67e74705SXin Li 385*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 386*67e74705SXin Li // CHECK: [[F32TOF16]] 387*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 388*67e74705SXin Li h0 = i0; 389*67e74705SXin Li // CHECK: [[F16TOF32]] 390*67e74705SXin Li // CHECK: fptosi float {{.*}} to i32 391*67e74705SXin Li // NATIVE-HALF: fptosi half {{.*}} to i32 392*67e74705SXin Li i0 = h0; 393*67e74705SXin Li 394*67e74705SXin Li // CHECK: [[F16TOF32]] 395*67e74705SXin Li // CHECK: [[F16TOF32]] 396*67e74705SXin Li // CHECK: fadd float 397*67e74705SXin Li // CHECK: [[F32TOF16]] 398*67e74705SXin Li // NATIVE-HALF: fadd half 399*67e74705SXin Li h0 += h1; 400*67e74705SXin Li // CHECK: [[F16TOF32]] 401*67e74705SXin Li // NOHALF: [[F16TOF32]] 402*67e74705SXin Li // CHECK: fadd float 403*67e74705SXin Li // CHECK: [[F32TOF16]] 404*67e74705SXin Li // NATIVE-HALF: fadd half 405*67e74705SXin Li h0 += (__fp16)1.0f; 406*67e74705SXin Li // CHECK: [[F16TOF32]] 407*67e74705SXin Li // CHECK: fadd float 408*67e74705SXin Li // CHECK: [[F32TOF16]] 409*67e74705SXin Li // NATIVE-HALF: fpext half 410*67e74705SXin Li // NATIVE-HALF: fadd float 411*67e74705SXin Li // NATIVE-HALF: fptrunc float 412*67e74705SXin Li h0 += f2; 413*67e74705SXin Li // CHECK: [[F16TOF32]] 414*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 415*67e74705SXin Li // CHECK: fadd float 416*67e74705SXin Li // CHECK: fptosi float {{.*}} to i32 417*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 418*67e74705SXin Li // NATIVE-HALF: fadd half 419*67e74705SXin Li // NATIVE-HALF: fptosi half {{.*}} to i32 420*67e74705SXin Li i0 += h0; 421*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 422*67e74705SXin Li // CHECK: [[F16TOF32]] 423*67e74705SXin Li // CHECK: fadd float 424*67e74705SXin Li // CHECK: [[F32TOF16]] 425*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 426*67e74705SXin Li // NATIVE-HALF: fadd half 427*67e74705SXin Li h0 += i0; 428*67e74705SXin Li 429*67e74705SXin Li // CHECK: [[F16TOF32]] 430*67e74705SXin Li // CHECK: [[F16TOF32]] 431*67e74705SXin Li // CHECK: fsub float 432*67e74705SXin Li // CHECK: [[F32TOF16]] 433*67e74705SXin Li // NATIVE-HALF: fsub half 434*67e74705SXin Li h0 -= h1; 435*67e74705SXin Li // CHECK: [[F16TOF32]] 436*67e74705SXin Li // NOHALF: [[F16TOF32]] 437*67e74705SXin Li // CHECK: fsub float 438*67e74705SXin Li // CHECK: [[F32TOF16]] 439*67e74705SXin Li // NATIVE-HALF: fsub half 440*67e74705SXin Li h0 -= (__fp16)1.0; 441*67e74705SXin Li // CHECK: [[F16TOF32]] 442*67e74705SXin Li // CHECK: fsub float 443*67e74705SXin Li // CHECK: [[F32TOF16]] 444*67e74705SXin Li // NATIVE-HALF: fpext half 445*67e74705SXin Li // NATIVE-HALF: fsub float 446*67e74705SXin Li // NATIVE-HALF: fptrunc float 447*67e74705SXin Li h0 -= f2; 448*67e74705SXin Li // CHECK: [[F16TOF32]] 449*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 450*67e74705SXin Li // CHECK: fsub float 451*67e74705SXin Li // CHECK: fptosi float {{.*}} to i32 452*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 453*67e74705SXin Li // NATIVE-HALF: fsub half 454*67e74705SXin Li // NATIVE-HALF: fptosi half {{.*}} to i32 455*67e74705SXin Li i0 -= h0; 456*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 457*67e74705SXin Li // CHECK: [[F16TOF32]] 458*67e74705SXin Li // CHECK: fsub float 459*67e74705SXin Li // CHECK: [[F32TOF16]] 460*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 461*67e74705SXin Li // NATIVE-HALF: fsub half 462*67e74705SXin Li h0 -= i0; 463*67e74705SXin Li 464*67e74705SXin Li // CHECK: [[F16TOF32]] 465*67e74705SXin Li // CHECK: [[F16TOF32]] 466*67e74705SXin Li // CHECK: fmul float 467*67e74705SXin Li // CHECK: [[F32TOF16]] 468*67e74705SXin Li // NATIVE-HALF: fmul half 469*67e74705SXin Li h0 *= h1; 470*67e74705SXin Li // CHECK: [[F16TOF32]] 471*67e74705SXin Li // NOHALF: [[F16TOF32]] 472*67e74705SXin Li // CHECK: fmul float 473*67e74705SXin Li // CHECK: [[F32TOF16]] 474*67e74705SXin Li // NATIVE-HALF: fmul half 475*67e74705SXin Li h0 *= (__fp16)1.0; 476*67e74705SXin Li // CHECK: [[F16TOF32]] 477*67e74705SXin Li // CHECK: fmul float 478*67e74705SXin Li // CHECK: [[F32TOF16]] 479*67e74705SXin Li // NATIVE-HALF: fpext half 480*67e74705SXin Li // NATIVE-HALF: fmul float 481*67e74705SXin Li // NATIVE-HALF: fptrunc float 482*67e74705SXin Li h0 *= f2; 483*67e74705SXin Li // CHECK: [[F16TOF32]] 484*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 485*67e74705SXin Li // CHECK: fmul float 486*67e74705SXin Li // CHECK: fptosi float {{.*}} to i32 487*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 488*67e74705SXin Li // NATIVE-HALF: fmul half 489*67e74705SXin Li // NATIVE-HALF: fptosi half {{.*}} to i32 490*67e74705SXin Li i0 *= h0; 491*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 492*67e74705SXin Li // CHECK: [[F16TOF32]] 493*67e74705SXin Li // CHECK: fmul float 494*67e74705SXin Li // CHECK: [[F32TOF16]] 495*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 496*67e74705SXin Li // NATIVE-HALF: fmul half 497*67e74705SXin Li h0 *= i0; 498*67e74705SXin Li 499*67e74705SXin Li // CHECK: [[F16TOF32]] 500*67e74705SXin Li // CHECK: [[F16TOF32]] 501*67e74705SXin Li // CHECK: fdiv float 502*67e74705SXin Li // CHECK: [[F32TOF16]] 503*67e74705SXin Li // NATIVE-HALF: fdiv half 504*67e74705SXin Li h0 /= h1; 505*67e74705SXin Li // CHECK: [[F16TOF32]] 506*67e74705SXin Li // NOHALF: [[F16TOF32]] 507*67e74705SXin Li // CHECK: fdiv float 508*67e74705SXin Li // CHECK: [[F32TOF16]] 509*67e74705SXin Li // NATIVE-HALF: fdiv half 510*67e74705SXin Li h0 /= (__fp16)1.0; 511*67e74705SXin Li // CHECK: [[F16TOF32]] 512*67e74705SXin Li // CHECK: fdiv float 513*67e74705SXin Li // CHECK: [[F32TOF16]] 514*67e74705SXin Li // NATIVE-HALF: fpext half 515*67e74705SXin Li // NATIVE-HALF: fdiv float 516*67e74705SXin Li // NATIVE-HALF: fptrunc float 517*67e74705SXin Li h0 /= f2; 518*67e74705SXin Li // CHECK: [[F16TOF32]] 519*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 520*67e74705SXin Li // CHECK: fdiv float 521*67e74705SXin Li // CHECK: fptosi float {{.*}} to i32 522*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 523*67e74705SXin Li // NATIVE-HALF: fdiv half 524*67e74705SXin Li // NATIVE-HALF: fptosi half {{.*}} to i32 525*67e74705SXin Li i0 /= h0; 526*67e74705SXin Li // CHECK: sitofp i32 {{.*}} to float 527*67e74705SXin Li // CHECK: [[F16TOF32]] 528*67e74705SXin Li // CHECK: fdiv float 529*67e74705SXin Li // CHECK: [[F32TOF16]] 530*67e74705SXin Li // NATIVE-HALF: sitofp i32 {{.*}} to half 531*67e74705SXin Li // NATIVE-HALF: fdiv half 532*67e74705SXin Li h0 /= i0; 533*67e74705SXin Li 534*67e74705SXin Li // Check conversions to/from double 535*67e74705SXin Li // NOHALF: call i16 @llvm.convert.to.fp16.f64( 536*67e74705SXin Li // HALF: fptrunc double {{.*}} to half 537*67e74705SXin Li // NATIVE-HALF: fptrunc double {{.*}} to half 538*67e74705SXin Li h0 = d0; 539*67e74705SXin Li 540*67e74705SXin Li // CHECK: [[MID:%.*]] = fptrunc double {{%.*}} to float 541*67e74705SXin Li // NOHALF: call i16 @llvm.convert.to.fp16.f32(float [[MID]]) 542*67e74705SXin Li // HALF: fptrunc float [[MID]] to half 543*67e74705SXin Li // NATIVE-HALF: [[MID:%.*]] = fptrunc double {{%.*}} to float 544*67e74705SXin Li // NATIVE-HALF: fptrunc float {{.*}} to half 545*67e74705SXin Li h0 = (float)d0; 546*67e74705SXin Li 547*67e74705SXin Li // NOHALF: call double @llvm.convert.from.fp16.f64( 548*67e74705SXin Li // HALF: fpext half {{.*}} to double 549*67e74705SXin Li // NATIVE-HALF: fpext half {{.*}} to double 550*67e74705SXin Li d0 = h0; 551*67e74705SXin Li 552*67e74705SXin Li // NOHALF: [[MID:%.*]] = call float @llvm.convert.from.fp16.f32( 553*67e74705SXin Li // HALF: [[MID:%.*]] = fpext half {{.*}} to float 554*67e74705SXin Li // CHECK: fpext float [[MID]] to double 555*67e74705SXin Li // NATIVE-HALF: [[MID:%.*]] = fpext half {{.*}} to float 556*67e74705SXin Li // NATIVE-HALF: fpext float [[MID]] to double 557*67e74705SXin Li d0 = (float)h0; 558*67e74705SXin Li } 559