1*834f7dc7SSjoerd Meijer; RUN: llc < %s -mtriple=arm-eabi -mattr=+fullfp16 -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck %s 2*834f7dc7SSjoerd Meijer; RUN: llc < %s -mtriple thumbv7a -mattr=+fullfp16 -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck %s 3*834f7dc7SSjoerd Meijer 4*834f7dc7SSjoerd Meijer; TODO: we can't pass half-precision arguments as "half" types yet. We do 5*834f7dc7SSjoerd Meijer; that for the time being by passing "float %f.coerce" and the necessary 6*834f7dc7SSjoerd Meijer; bitconverts/truncates. In these tests we pass i16 and use 1 bitconvert, which 7*834f7dc7SSjoerd Meijer; is the shortest way to get a half type. But when we can pass half types, we 8*834f7dc7SSjoerd Meijer; want to use that here. 9*834f7dc7SSjoerd Meijer 10*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_o(i16 signext %a, i16 signext %b) { 11*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_o: 12*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 13*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 14*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S2]], [[S0]] 15*834f7dc7SSjoerd Meijerentry: 16*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 17*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 18*834f7dc7SSjoerd Meijer %cmp = fcmp fast olt half %0, %1 19*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 20*834f7dc7SSjoerd Meijer ret half %cond 21*834f7dc7SSjoerd Meijer} 22*834f7dc7SSjoerd Meijer 23*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_o_rev(i16 signext %a, i16 signext %b) { 24*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_o_rev: 25*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 26*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 27*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S2]], [[S0]] 28*834f7dc7SSjoerd Meijerentry: 29*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 30*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 31*834f7dc7SSjoerd Meijer %cmp = fcmp fast ogt half %0, %1 32*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %1, half %0 33*834f7dc7SSjoerd Meijer ret half %cond 34*834f7dc7SSjoerd Meijer} 35*834f7dc7SSjoerd Meijer 36*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_u(i16 signext %a, i16 signext %b) { 37*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_u: 38*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 39*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 40*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S2]], [[S0]] 41*834f7dc7SSjoerd Meijerentry: 42*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 43*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 44*834f7dc7SSjoerd Meijer %cmp = fcmp fast ult half %0, %1 45*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 46*834f7dc7SSjoerd Meijer ret half %cond 47*834f7dc7SSjoerd Meijer} 48*834f7dc7SSjoerd Meijer 49*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_ule(i16 signext %a, i16 signext %b) { 50*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_ule: 51*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 52*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 53*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S2]], [[S0]] 54*834f7dc7SSjoerd Meijerentry: 55*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 56*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 57*834f7dc7SSjoerd Meijer %cmp = fcmp fast ule half %0, %1 58*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 59*834f7dc7SSjoerd Meijer ret half %cond 60*834f7dc7SSjoerd Meijer} 61*834f7dc7SSjoerd Meijer 62*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_u_rev(i16 signext %a, i16 signext %b) { 63*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_u_rev: 64*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 65*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 66*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S2]], [[S0]] 67*834f7dc7SSjoerd Meijerentry: 68*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 69*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 70*834f7dc7SSjoerd Meijer %cmp = fcmp fast ugt half %0, %1 71*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %1, half %0 72*834f7dc7SSjoerd Meijer ret half %cond 73*834f7dc7SSjoerd Meijer} 74*834f7dc7SSjoerd Meijer 75*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_o(i16 signext %a, i16 signext %b) { 76*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_o: 77*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 78*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 79*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 80*834f7dc7SSjoerd Meijerentry: 81*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 82*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 83*834f7dc7SSjoerd Meijer %cmp = fcmp fast ogt half %0, %1 84*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 85*834f7dc7SSjoerd Meijer ret half %cond 86*834f7dc7SSjoerd Meijer} 87*834f7dc7SSjoerd Meijer 88*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_oge(i16 signext %a, i16 signext %b) { 89*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_oge: 90*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 91*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 92*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 93*834f7dc7SSjoerd Meijerentry: 94*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 95*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 96*834f7dc7SSjoerd Meijer %cmp = fcmp fast oge half %0, %1 97*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 98*834f7dc7SSjoerd Meijer ret half %cond 99*834f7dc7SSjoerd Meijer} 100*834f7dc7SSjoerd Meijer 101*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_o_rev(i16 signext %a, i16 signext %b) { 102*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_o_rev: 103*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 104*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 105*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 106*834f7dc7SSjoerd Meijerentry: 107*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 108*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 109*834f7dc7SSjoerd Meijer %cmp = fcmp fast olt half %0, %1 110*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %1, half %0 111*834f7dc7SSjoerd Meijer ret half %cond 112*834f7dc7SSjoerd Meijer} 113*834f7dc7SSjoerd Meijer 114*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_ole_rev(i16 signext %a, i16 signext %b) { 115*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_ole_rev: 116*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 117*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 118*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 119*834f7dc7SSjoerd Meijerentry: 120*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 121*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 122*834f7dc7SSjoerd Meijer %cmp = fcmp fast ole half %0, %1 123*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %1, half %0 124*834f7dc7SSjoerd Meijer ret half %cond 125*834f7dc7SSjoerd Meijer} 126*834f7dc7SSjoerd Meijer 127*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_u(i16 signext %a, i16 signext %b) { 128*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_u: 129*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 130*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 131*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 132*834f7dc7SSjoerd Meijerentry: 133*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 134*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 135*834f7dc7SSjoerd Meijer %cmp = fcmp fast ugt half %0, %1 136*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 137*834f7dc7SSjoerd Meijer ret half %cond 138*834f7dc7SSjoerd Meijer} 139*834f7dc7SSjoerd Meijer 140*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_uge(i16 signext %a, i16 signext %b) { 141*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_uge: 142*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 143*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 144*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 145*834f7dc7SSjoerd Meijerentry: 146*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 147*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 148*834f7dc7SSjoerd Meijer %cmp = fcmp fast uge half %0, %1 149*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %0, half %1 150*834f7dc7SSjoerd Meijer ret half %cond 151*834f7dc7SSjoerd Meijer} 152*834f7dc7SSjoerd Meijer 153*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_u_rev(i16 signext %a, i16 signext %b) { 154*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_u_rev: 155*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 156*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 157*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 158*834f7dc7SSjoerd Meijerentry: 159*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 160*834f7dc7SSjoerd Meijer %1 = bitcast i16 %b to half 161*834f7dc7SSjoerd Meijer %cmp = fcmp fast ult half %0, %1 162*834f7dc7SSjoerd Meijer %cond = select i1 %cmp, half %1, half %0 163*834f7dc7SSjoerd Meijer ret half %cond 164*834f7dc7SSjoerd Meijer} 165*834f7dc7SSjoerd Meijer 166*834f7dc7SSjoerd Meijer; known non-NaNs 167*834f7dc7SSjoerd Meijer 168*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNo(i16 signext %a) { 169*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNo: 170*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 171*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], #1.200000e+01 172*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 173*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 174*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 175*834f7dc7SSjoerd Meijerentry: 176*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 177*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast olt half %0, 12. 178*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half 12. 179*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast olt half 34., %cond1 180*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half 34., half %cond1 181*834f7dc7SSjoerd Meijer ret half %cond2 182*834f7dc7SSjoerd Meijer} 183*834f7dc7SSjoerd Meijer 184*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNo_rev(i16 signext %a) { 185*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNo_rev: 186*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 187*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 188*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 189*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 190*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 191*834f7dc7SSjoerd Meijerentry: 192*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 193*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ogt half %0, 56. 194*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 56., half %0 195*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ogt half 78., %cond1 196*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 78. 197*834f7dc7SSjoerd Meijer ret half %cond2 198*834f7dc7SSjoerd Meijer} 199*834f7dc7SSjoerd Meijer 200*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNu(i16 signext %b) { 201*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNu: 202*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 203*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], #1.200000e+01 204*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 205*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 206*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 207*834f7dc7SSjoerd Meijerentry: 208*834f7dc7SSjoerd Meijer %0 = bitcast i16 %b to half 209*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ult half 12., %0 210*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 12., half %0 211*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ult half %cond1, 34. 212*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 34. 213*834f7dc7SSjoerd Meijer ret half %cond2 214*834f7dc7SSjoerd Meijer} 215*834f7dc7SSjoerd Meijer 216*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNule(i16 signext %b) { 217*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNule: 218*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 219*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 220*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 221*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 222*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 223*834f7dc7SSjoerd Meijerentry: 224*834f7dc7SSjoerd Meijer %0 = bitcast i16 %b to half 225*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ule half 34., %0 226*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 34., half %0 227*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ule half %cond1, 56. 228*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 56. 229*834f7dc7SSjoerd Meijer ret half %cond2 230*834f7dc7SSjoerd Meijer} 231*834f7dc7SSjoerd Meijer 232*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNu_rev(i16 signext %b) { 233*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNu_rev: 234*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 235*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 236*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 237*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 238*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s0, [[S0]], [[S2]] 239*834f7dc7SSjoerd Meijerentry: 240*834f7dc7SSjoerd Meijer %0 = bitcast i16 %b to half 241*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ugt half 56., %0 242*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half 56. 243*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ugt half %cond1, 78. 244*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half 78., half %cond1 245*834f7dc7SSjoerd Meijer ret half %cond2 246*834f7dc7SSjoerd Meijer} 247*834f7dc7SSjoerd Meijer 248*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNo(i16 signext %a) { 249*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNo: 250*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 251*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], #1.200000e+01 252*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 253*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 254*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 255*834f7dc7SSjoerd Meijerentry: 256*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 257*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ogt half %0, 12. 258*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half 12. 259*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ogt half 34., %cond1 260*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half 34., half %cond1 261*834f7dc7SSjoerd Meijer ret half %cond2 262*834f7dc7SSjoerd Meijer} 263*834f7dc7SSjoerd Meijer 264*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNoge(i16 signext %a) { 265*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNoge: 266*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 267*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 268*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 269*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 270*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 271*834f7dc7SSjoerd Meijerentry: 272*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 273*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast oge half %0, 34. 274*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half 34. 275*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast oge half 56., %cond1 276*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half 56., half %cond1 277*834f7dc7SSjoerd Meijer ret half %cond2 278*834f7dc7SSjoerd Meijer} 279*834f7dc7SSjoerd Meijer 280*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNo_rev(i16 signext %a) { 281*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNo_rev: 282*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 283*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 284*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 285*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 286*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 287*834f7dc7SSjoerd Meijerentry: 288*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 289*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast olt half %0, 56. 290*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 56., half %0 291*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast olt half 78., %cond1 292*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 78. 293*834f7dc7SSjoerd Meijer ret half %cond2 294*834f7dc7SSjoerd Meijer} 295*834f7dc7SSjoerd Meijer 296*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNole_rev(i16 signext %a) { 297*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNole_rev: 298*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 299*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 300*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 301*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 302*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 303*834f7dc7SSjoerd Meijerentry: 304*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 305*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ole half %0, 78. 306*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 78., half %0 307*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ole half 90., %cond1 308*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 90. 309*834f7dc7SSjoerd Meijer ret half %cond2 310*834f7dc7SSjoerd Meijer} 311*834f7dc7SSjoerd Meijer 312*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNu(i16 signext %b) { 313*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNu: 314*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 315*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], #1.200000e+01 316*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 317*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 318*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 319*834f7dc7SSjoerd Meijerentry: 320*834f7dc7SSjoerd Meijer %0 = bitcast i16 %b to half 321*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ugt half 12., %0 322*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 12., half %0 323*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ugt half %cond1, 34. 324*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 34. 325*834f7dc7SSjoerd Meijer ret half %cond2 326*834f7dc7SSjoerd Meijer} 327*834f7dc7SSjoerd Meijer 328*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNuge(i16 signext %b) { 329*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNuge: 330*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 331*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 332*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 333*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 334*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 335*834f7dc7SSjoerd Meijerentry: 336*834f7dc7SSjoerd Meijer %0 = bitcast i16 %b to half 337*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast uge half 34., %0 338*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 34., half %0 339*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast uge half %cond1, 56. 340*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 56. 341*834f7dc7SSjoerd Meijer ret half %cond2 342*834f7dc7SSjoerd Meijer} 343*834f7dc7SSjoerd Meijer 344*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNu_rev(i16 signext %b) { 345*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNu_rev: 346*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 347*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S0:s[0-9]]], r{{.}} 348*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 349*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s2, .LCPI{{.*}} 350*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S0]], [[S2]] 351*834f7dc7SSjoerd Meijerentry: 352*834f7dc7SSjoerd Meijer %0 = bitcast i16 %b to half 353*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ult half 56., %0 354*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half 56. 355*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ult half %cond1, 78. 356*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half 78., half %cond1 357*834f7dc7SSjoerd Meijer ret half %cond2 358*834f7dc7SSjoerd Meijer} 359*834f7dc7SSjoerd Meijer 360*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_0(i16 signext %a) { 361*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_0: 362*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s0, .LCPI{{.*}} 363*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 364*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s2, s2, s0 365*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 366*834f7dc7SSjoerd Meijerentry: 367*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 368*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast olt half %0, 0. 369*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half 0. 370*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ogt half %cond1, 0. 371*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half 0. 372*834f7dc7SSjoerd Meijer ret half %cond2 373*834f7dc7SSjoerd Meijer} 374*834f7dc7SSjoerd Meijer 375*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_neg0(i16 signext %a) { 376*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_neg0: 377*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s0, .LCPI{{.*}} 378*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 379*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s2, s2, s0 380*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 381*834f7dc7SSjoerd Meijerentry: 382*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 383*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast olt half %0, -0. 384*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half %0, half -0. 385*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast ugt half %cond1, -0. 386*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half %cond1, half -0. 387*834f7dc7SSjoerd Meijer ret half %cond2 388*834f7dc7SSjoerd Meijer} 389*834f7dc7SSjoerd Meijer 390*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_e_0(i16 signext %a) { 391*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_e_0: 392*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s0, .LCPI{{.*}} 393*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 394*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s2, s2, s0 395*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 396*834f7dc7SSjoerd Meijerentry: 397*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 398*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ule half 0., %0 399*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half 0., half %0 400*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast uge half 0., %cond1 401*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half 0., half %cond1 402*834f7dc7SSjoerd Meijer ret half %cond2 403*834f7dc7SSjoerd Meijer} 404*834f7dc7SSjoerd Meijer 405*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_e_neg0(i16 signext %a) { 406*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_e_neg0: 407*834f7dc7SSjoerd Meijer; CHECK: vldr.16 s0, .LCPI{{.*}} 408*834f7dc7SSjoerd Meijer; CHECK: vmov.f16 [[S2:s[0-9]]], r{{.}} 409*834f7dc7SSjoerd Meijer; CHECK: vminnm.f16 s2, s2, s0 410*834f7dc7SSjoerd Meijer; CHECK: vmaxnm.f16 s0, [[S2]], [[S0]] 411*834f7dc7SSjoerd Meijerentry: 412*834f7dc7SSjoerd Meijer %0 = bitcast i16 %a to half 413*834f7dc7SSjoerd Meijer %cmp1 = fcmp fast ule half -0., %0 414*834f7dc7SSjoerd Meijer %cond1 = select i1 %cmp1, half -0., half %0 415*834f7dc7SSjoerd Meijer %cmp2 = fcmp fast oge half -0., %cond1 416*834f7dc7SSjoerd Meijer %cond2 = select i1 %cmp2, half -0., half %cond1 417*834f7dc7SSjoerd Meijer ret half %cond2 418*834f7dc7SSjoerd Meijer} 419