Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -asm-verbose=false -mtriple=aarch64-none-eabi | FileCheck %s
      2 
      3 define <4 x half> @add_h(<4 x half> %a, <4 x half> %b) {
      4 entry:
      5 ; CHECK-LABEL: add_h:
      6 ; CHECK-DAG: fcvtl [[OP1:v[0-9]+\.4s]], v0.4h
      7 ; CHECK-DAG: fcvtl [[OP2:v[0-9]+\.4s]], v1.4h
      8 ; CHECK: fadd [[RES:v[0-9]+.4s]], [[OP1]], [[OP2]]
      9 ; CHECK: fcvtn v0.4h, [[RES]]
     10   %0 = fadd <4 x half> %a, %b
     11   ret <4 x half> %0
     12 }
     13 
     14 
     15 define <4 x half> @build_h4(<4 x half> %a) {
     16 entry:
     17 ; CHECK-LABEL: build_h4:
     18 ; CHECK: movz [[GPR:w[0-9]+]], #0x3ccd
     19 ; CHECK: dup v0.4h, [[GPR]]
     20   ret <4 x half> <half 0xH3CCD, half 0xH3CCD, half 0xH3CCD, half 0xH3CCD>
     21 }
     22 
     23 
     24 define <4 x half> @sub_h(<4 x half> %a, <4 x half> %b) {
     25 entry:
     26 ; CHECK-LABEL: sub_h:
     27 ; CHECK-DAG: fcvtl [[OP1:v[0-9]+\.4s]], v0.4h
     28 ; CHECK-DAG: fcvtl [[OP2:v[0-9]+\.4s]], v1.4h
     29 ; CHECK: fsub [[RES:v[0-9]+.4s]], [[OP1]], [[OP2]]
     30 ; CHECK: fcvtn v0.4h, [[RES]]
     31   %0 = fsub <4 x half> %a, %b
     32   ret <4 x half> %0
     33 }
     34 
     35 
     36 define <4 x half> @mul_h(<4 x half> %a, <4 x half> %b) {
     37 entry:
     38 ; CHECK-LABEL: mul_h:
     39 ; CHECK-DAG: fcvtl [[OP1:v[0-9]+\.4s]], v0.4h
     40 ; CHECK-DAG: fcvtl [[OP2:v[0-9]+\.4s]], v1.4h
     41 ; CHECK: fmul [[RES:v[0-9]+.4s]], [[OP1]], [[OP2]]
     42 ; CHECK: fcvtn v0.4h, [[RES]]
     43   %0 = fmul <4 x half> %a, %b
     44   ret <4 x half> %0
     45 }
     46 
     47 
     48 define <4 x half> @div_h(<4 x half> %a, <4 x half> %b) {
     49 entry:
     50 ; CHECK-LABEL: div_h:
     51 ; CHECK-DAG: fcvtl [[OP1:v[0-9]+\.4s]], v0.4h
     52 ; CHECK-DAG: fcvtl [[OP2:v[0-9]+\.4s]], v1.4h
     53 ; CHECK: fdiv [[RES:v[0-9]+.4s]], [[OP1]], [[OP2]]
     54 ; CHECK: fcvtn v0.4h, [[RES]]
     55   %0 = fdiv <4 x half> %a, %b
     56   ret <4 x half> %0
     57 }
     58 
     59 
     60 define <4 x half> @load_h(<4 x half>* %a) {
     61 entry:
     62 ; CHECK-LABEL: load_h:
     63 ; CHECK: ldr d0, [x0]
     64   %0 = load <4 x half>, <4 x half>* %a, align 4
     65   ret <4 x half> %0
     66 }
     67 
     68 
     69 define void @store_h(<4 x half>* %a, <4 x half> %b) {
     70 entry:
     71 ; CHECK-LABEL: store_h:
     72 ; CHECK: str d0, [x0]
     73   store <4 x half> %b, <4 x half>* %a, align 4
     74   ret void
     75 }
     76 
     77 define <4 x half> @s_to_h(<4 x float> %a) {
     78 ; CHECK-LABEL: s_to_h:
     79 ; CHECK: fcvtn v0.4h, v0.4s
     80   %1 = fptrunc <4 x float> %a to <4 x half>
     81   ret <4 x half> %1
     82 }
     83 
     84 define <4 x half> @d_to_h(<4 x double> %a) {
     85 ; CHECK-LABEL: d_to_h:
     86 ; CHECK-DAG: fcvt
     87 ; CHECK-DAG: fcvt
     88 ; CHECK-DAG: fcvt
     89 ; CHECK-DAG: fcvt
     90 ; CHECK-DAG: ins
     91 ; CHECK-DAG: ins
     92 ; CHECK-DAG: ins
     93 ; CHECK-DAG: ins
     94   %1 = fptrunc <4 x double> %a to <4 x half>
     95   ret <4 x half> %1
     96 }
     97 
     98 define <4 x float> @h_to_s(<4 x half> %a) {
     99 ; CHECK-LABEL: h_to_s:
    100 ; CHECK: fcvtl v0.4s, v0.4h
    101   %1 = fpext <4 x half> %a to <4 x float>
    102   ret <4 x float> %1
    103 }
    104 
    105 define <4 x double> @h_to_d(<4 x half> %a) {
    106 ; CHECK-LABEL: h_to_d:
    107 ; CHECK-DAG: fcvt
    108 ; CHECK-DAG: fcvt
    109 ; CHECK-DAG: fcvt
    110 ; CHECK-DAG: fcvt
    111 ; CHECK-DAG: ins
    112 ; CHECK-DAG: ins
    113 ; CHECK-DAG: ins
    114 ; CHECK-DAG: ins
    115   %1 = fpext <4 x half> %a to <4 x double>
    116   ret <4 x double> %1
    117 }
    118 
    119 define <4 x half> @bitcast_i_to_h(float, <4 x i16> %a) {
    120 ; CHECK-LABEL: bitcast_i_to_h:
    121 ; CHECK: mov v0.16b, v1.16b
    122   %2 = bitcast <4 x i16> %a to <4 x half>
    123   ret <4 x half> %2
    124 }
    125 
    126 define <4 x i16> @bitcast_h_to_i(float, <4 x half> %a) {
    127 ; CHECK-LABEL: bitcast_h_to_i:
    128 ; CHECK: mov v0.16b, v1.16b
    129   %2 = bitcast <4 x half> %a to <4 x i16>
    130   ret <4 x i16> %2
    131 }
    132 
    133 define <4 x half> @sitofp_i8(<4 x i8> %a) #0 {
    134 ; CHECK-LABEL: sitofp_i8:
    135 ; CHECK-NEXT: shl [[OP1:v[0-9]+\.4h]], v0.4h, #8
    136 ; CHECK-NEXT: sshr [[OP2:v[0-9]+\.4h]], [[OP1]], #8
    137 ; CHECK-NEXT: sshll [[OP3:v[0-9]+\.4s]], [[OP2]], #0
    138 ; CHECK-NEXT: scvtf [[OP4:v[0-9]+\.4s]], [[OP3]]
    139 ; CHECK-NEXT: fcvtn v0.4h, [[OP4]]
    140 ; CHECK-NEXT: ret
    141   %1 = sitofp <4 x i8> %a to <4 x half>
    142   ret <4 x half> %1
    143 }
    144 
    145 
    146 define <4 x half> @sitofp_i16(<4 x i16> %a) #0 {
    147 ; CHECK-LABEL: sitofp_i16:
    148 ; CHECK-NEXT: sshll [[OP1:v[0-9]+\.4s]], v0.4h, #0
    149 ; CHECK-NEXT: scvtf [[OP2:v[0-9]+\.4s]], [[OP1]]
    150 ; CHECK-NEXT: fcvtn v0.4h, [[OP2]]
    151 ; CHECK-NEXT: ret
    152   %1 = sitofp <4 x i16> %a to <4 x half>
    153   ret <4 x half> %1
    154 }
    155 
    156 
    157 define <4 x half> @sitofp_i32(<4 x i32> %a) #0 {
    158 ; CHECK-LABEL: sitofp_i32:
    159 ; CHECK-NEXT: scvtf [[OP1:v[0-9]+\.4s]], v0.4s
    160 ; CHECK-NEXT: fcvtn v0.4h, [[OP1]]
    161   %1 = sitofp <4 x i32> %a to <4 x half>
    162   ret <4 x half> %1
    163 }
    164 
    165 
    166 define <4 x half> @sitofp_i64(<4 x i64> %a) #0 {
    167 ; CHECK-LABEL: sitofp_i64:
    168 ; CHECK-DAG: scvtf [[OP1:v[0-9]+\.2d]], v0.2d
    169 ; CHECK-DAG: scvtf [[OP2:v[0-9]+\.2d]], v1.2d
    170 ; CHECK-DAG: fcvtn [[OP3:v[0-9]+]].2s, [[OP1]]
    171 ; CHECK-NEXT: fcvtn2 [[OP3]].4s, [[OP2]]
    172 ; CHECK-NEXT: fcvtn v0.4h, [[OP3]].4s
    173   %1 = sitofp <4 x i64> %a to <4 x half>
    174   ret <4 x half> %1
    175 }
    176 
    177 define <4 x half> @uitofp_i8(<4 x i8> %a) #0 {
    178 ; CHECK-LABEL: uitofp_i8:
    179 ; CHECK-NEXT: bic v0.4h, #0xff, lsl #8
    180 ; CHECK-NEXT: ushll [[OP1:v[0-9]+\.4s]], v0.4h, #0
    181 ; CHECK-NEXT: ucvtf [[OP2:v[0-9]+\.4s]], [[OP1]]
    182 ; CHECK-NEXT: fcvtn v0.4h, [[OP2]]
    183 ; CHECK-NEXT: ret
    184   %1 = uitofp <4 x i8> %a to <4 x half>
    185   ret <4 x half> %1
    186 }
    187 
    188 
    189 define <4 x half> @uitofp_i16(<4 x i16> %a) #0 {
    190 ; CHECK-LABEL: uitofp_i16:
    191 ; CHECK-NEXT: ushll [[OP1:v[0-9]+\.4s]], v0.4h, #0
    192 ; CHECK-NEXT: ucvtf [[OP2:v[0-9]+\.4s]], [[OP1]]
    193 ; CHECK-NEXT: fcvtn v0.4h, [[OP2]]
    194 ; CHECK-NEXT: ret
    195   %1 = uitofp <4 x i16> %a to <4 x half>
    196   ret <4 x half> %1
    197 }
    198 
    199 
    200 define <4 x half> @uitofp_i32(<4 x i32> %a) #0 {
    201 ; CHECK-LABEL: uitofp_i32:
    202 ; CHECK-NEXT: ucvtf [[OP1:v[0-9]+\.4s]], v0.4s
    203 ; CHECK-NEXT: fcvtn v0.4h, [[OP1]]
    204   %1 = uitofp <4 x i32> %a to <4 x half>
    205   ret <4 x half> %1
    206 }
    207 
    208 
    209 define <4 x half> @uitofp_i64(<4 x i64> %a) #0 {
    210 ; CHECK-LABEL: uitofp_i64:
    211 ; CHECK-DAG: ucvtf [[OP1:v[0-9]+\.2d]], v0.2d
    212 ; CHECK-DAG: ucvtf [[OP2:v[0-9]+\.2d]], v1.2d
    213 ; CHECK-DAG: fcvtn [[OP3:v[0-9]+]].2s, [[OP1]]
    214 ; CHECK-NEXT: fcvtn2 [[OP3]].4s, [[OP2]]
    215 ; CHECK-NEXT: fcvtn v0.4h, [[OP3]].4s
    216   %1 = uitofp <4 x i64> %a to <4 x half>
    217   ret <4 x half> %1
    218 }
    219 
    220 define void @test_insert_at_zero(half %a, <4 x half>* %b) #0 {
    221 ; CHECK-LABEL: test_insert_at_zero:
    222 ; CHECK-NEXT: str d0, [x0]
    223 ; CHECK-NEXT: ret
    224   %1 = insertelement <4 x half> undef, half %a, i64 0
    225   store <4 x half> %1, <4 x half>* %b, align 4
    226   ret void
    227 }
    228 
    229 define <4 x i8> @fptosi_i8(<4 x half> %a) #0 {
    230 ; CHECK-LABEL: fptosi_i8:
    231 ; CHECK-NEXT: fcvtl  [[REG1:v[0-9]+\.4s]], v0.4h
    232 ; CHECK-NEXT: fcvtzs [[REG2:v[0-9]+\.4s]], [[REG1]]
    233 ; CHECK-NEXT: xtn    v0.4h, [[REG2]]
    234 ; CHECK-NEXT: ret
    235   %1 = fptosi<4 x half> %a to <4 x i8>
    236   ret <4 x i8> %1
    237 }
    238 
    239 define <4 x i16> @fptosi_i16(<4 x half> %a) #0 {
    240 ; CHECK-LABEL: fptosi_i16:
    241 ; CHECK-NEXT: fcvtl  [[REG1:v[0-9]+\.4s]], v0.4h
    242 ; CHECK-NEXT: fcvtzs [[REG2:v[0-9]+\.4s]], [[REG1]]
    243 ; CHECK-NEXT: xtn    v0.4h, [[REG2]]
    244 ; CHECK-NEXT: ret
    245   %1 = fptosi<4 x half> %a to <4 x i16>
    246   ret <4 x i16> %1
    247 }
    248 
    249 define <4 x i8> @fptoui_i8(<4 x half> %a) #0 {
    250 ; CHECK-LABEL: fptoui_i8:
    251 ; CHECK-NEXT: fcvtl  [[REG1:v[0-9]+\.4s]], v0.4h
    252 ; NOTE: fcvtzs selected here because the xtn shaves the sign bit
    253 ; CHECK-NEXT: fcvtzs [[REG2:v[0-9]+\.4s]], [[REG1]]
    254 ; CHECK-NEXT: xtn    v0.4h, [[REG2]]
    255 ; CHECK-NEXT: ret
    256   %1 = fptoui<4 x half> %a to <4 x i8>
    257   ret <4 x i8> %1
    258 }
    259 
    260 define <4 x i16> @fptoui_i16(<4 x half> %a) #0 {
    261 ; CHECK-LABEL: fptoui_i16:
    262 ; CHECK-NEXT: fcvtl  [[REG1:v[0-9]+\.4s]], v0.4h
    263 ; CHECK-NEXT: fcvtzu [[REG2:v[0-9]+\.4s]], [[REG1]]
    264 ; CHECK-NEXT: xtn    v0.4h, [[REG2]]
    265 ; CHECK-NEXT: ret
    266   %1 = fptoui<4 x half> %a to <4 x i16>
    267   ret <4 x i16> %1
    268 }
    269 
    270 ; Function Attrs: nounwind readnone
    271 ; CHECK-LABEL: test_fcmp_une:
    272 ; CHECK-DAG: fcvt
    273 ; CHECK-DAG: fcvt
    274 ; CHECK-DAG: fcvt
    275 ; CHECK-DAG: fcvt
    276 ; CHECK-DAG: fcvt
    277 ; CHECK-DAG: fcvt
    278 ; CHECK-DAG: fcvt
    279 ; CHECK-DAG: fcvt
    280 ; CHECK-DAG: csel {{.*}}, wzr, ne
    281 ; CHECK-DAG: csel {{.*}}, wzr, ne
    282 ; CHECK-DAG: csel {{.*}}, wzr, ne
    283 ; CHECK-DAG: csel {{.*}}, wzr, ne
    284 define <4 x i1> @test_fcmp_une(<4 x half> %a, <4 x half> %b) #0 {
    285   %1 = fcmp une <4 x half> %a, %b
    286   ret <4 x i1> %1
    287 }
    288 
    289 ; Function Attrs: nounwind readnone
    290 ; CHECK-LABEL: test_fcmp_ueq:
    291 ; CHECK-DAG: fcvt
    292 ; CHECK-DAG: fcvt
    293 ; CHECK-DAG: fcvt
    294 ; CHECK-DAG: fcvt
    295 ; CHECK-DAG: fcvt
    296 ; CHECK-DAG: fcvt
    297 ; CHECK-DAG: fcvt
    298 ; CHECK-DAG: fcvt
    299 ; CHECK-DAG: csel {{.*}}, wzr, eq
    300 ; CHECK-DAG: csel {{.*}}, wzr, eq
    301 ; CHECK-DAG: csel {{.*}}, wzr, eq
    302 ; CHECK-DAG: csel {{.*}}, wzr, eq
    303 ; CHECK-DAG: csel {{.*}}, vs
    304 ; CHECK-DAG: csel {{.*}}, vs
    305 ; CHECK-DAG: csel {{.*}}, vs
    306 ; CHECK-DAG: csel {{.*}}, vs
    307 define <4 x i1> @test_fcmp_ueq(<4 x half> %a, <4 x half> %b) #0 {
    308   %1 = fcmp ueq <4 x half> %a, %b
    309   ret <4 x i1> %1
    310 }
    311 
    312 ; Function Attrs: nounwind readnone
    313 ; CHECK-LABEL: test_fcmp_ugt:
    314 ; CHECK-DAG: fcvt
    315 ; CHECK-DAG: fcvt
    316 ; CHECK-DAG: fcvt
    317 ; CHECK-DAG: fcvt
    318 ; CHECK-DAG: fcvt
    319 ; CHECK-DAG: fcvt
    320 ; CHECK-DAG: fcvt
    321 ; CHECK-DAG: fcvt
    322 ; CHECK-DAG: csel {{.*}}, wzr, hi
    323 ; CHECK-DAG: csel {{.*}}, wzr, hi
    324 ; CHECK-DAG: csel {{.*}}, wzr, hi
    325 ; CHECK-DAG: csel {{.*}}, wzr, hi
    326 define <4 x i1> @test_fcmp_ugt(<4 x half> %a, <4 x half> %b) #0 {
    327   %1 = fcmp ugt <4 x half> %a, %b
    328   ret <4 x i1> %1
    329 }
    330 
    331 ; Function Attrs: nounwind readnone
    332 ; CHECK-LABEL: test_fcmp_uge:
    333 ; CHECK-DAG: fcvt
    334 ; CHECK-DAG: fcvt
    335 ; CHECK-DAG: fcvt
    336 ; CHECK-DAG: fcvt
    337 ; CHECK-DAG: fcvt
    338 ; CHECK-DAG: fcvt
    339 ; CHECK-DAG: fcvt
    340 ; CHECK-DAG: fcvt
    341 ; CHECK-DAG: csel {{.*}}, wzr, pl
    342 ; CHECK-DAG: csel {{.*}}, wzr, pl
    343 ; CHECK-DAG: csel {{.*}}, wzr, pl
    344 ; CHECK-DAG: csel {{.*}}, wzr, pl
    345 define <4 x i1> @test_fcmp_uge(<4 x half> %a, <4 x half> %b) #0 {
    346   %1 = fcmp uge <4 x half> %a, %b
    347   ret <4 x i1> %1
    348 }
    349 
    350 ; Function Attrs: nounwind readnone
    351 ; CHECK-LABEL: test_fcmp_ult:
    352 ; CHECK-DAG: fcvt
    353 ; CHECK-DAG: fcvt
    354 ; CHECK-DAG: fcvt
    355 ; CHECK-DAG: fcvt
    356 ; CHECK-DAG: fcvt
    357 ; CHECK-DAG: fcvt
    358 ; CHECK-DAG: fcvt
    359 ; CHECK-DAG: fcvt
    360 ; CHECK-DAG: csel {{.*}}, wzr, lt
    361 ; CHECK-DAG: csel {{.*}}, wzr, lt
    362 ; CHECK-DAG: csel {{.*}}, wzr, lt
    363 ; CHECK-DAG: csel {{.*}}, wzr, lt
    364 define <4 x i1> @test_fcmp_ult(<4 x half> %a, <4 x half> %b) #0 {
    365   %1 = fcmp ult <4 x half> %a, %b
    366   ret <4 x i1> %1
    367 }
    368 
    369 ; Function Attrs: nounwind readnone
    370 ; CHECK-LABEL: test_fcmp_ule:
    371 ; CHECK-DAG: fcvt
    372 ; CHECK-DAG: fcvt
    373 ; CHECK-DAG: fcvt
    374 ; CHECK-DAG: fcvt
    375 ; CHECK-DAG: fcvt
    376 ; CHECK-DAG: fcvt
    377 ; CHECK-DAG: fcvt
    378 ; CHECK-DAG: fcvt
    379 ; CHECK-DAG: csel {{.*}}, wzr, le
    380 ; CHECK-DAG: csel {{.*}}, wzr, le
    381 ; CHECK-DAG: csel {{.*}}, wzr, le
    382 ; CHECK-DAG: csel {{.*}}, wzr, le
    383 define <4 x i1> @test_fcmp_ule(<4 x half> %a, <4 x half> %b) #0 {
    384   %1 = fcmp ule <4 x half> %a, %b
    385   ret <4 x i1> %1
    386 }
    387 
    388 ; Function Attrs: nounwind readnone
    389 ; CHECK-LABEL: test_fcmp_uno:
    390 ; CHECK-DAG: fcvt
    391 ; CHECK-DAG: fcvt
    392 ; CHECK-DAG: fcvt
    393 ; CHECK-DAG: fcvt
    394 ; CHECK-DAG: fcvt
    395 ; CHECK-DAG: fcvt
    396 ; CHECK-DAG: fcvt
    397 ; CHECK-DAG: fcvt
    398 ; CHECK-DAG: csel {{.*}}, wzr, vs
    399 ; CHECK-DAG: csel {{.*}}, wzr, vs
    400 ; CHECK-DAG: csel {{.*}}, wzr, vs
    401 ; CHECK-DAG: csel {{.*}}, wzr, vs
    402 define <4 x i1> @test_fcmp_uno(<4 x half> %a, <4 x half> %b) #0 {
    403   %1 = fcmp uno <4 x half> %a, %b
    404   ret <4 x i1> %1
    405 }
    406 
    407 ; Function Attrs: nounwind readnone
    408 ; CHECK-LABEL: test_fcmp_one:
    409 ; CHECK-DAG: fcvt
    410 ; CHECK-DAG: fcvt
    411 ; CHECK-DAG: fcvt
    412 ; CHECK-DAG: fcvt
    413 ; CHECK-DAG: fcvt
    414 ; CHECK-DAG: fcvt
    415 ; CHECK-DAG: fcvt
    416 ; CHECK-DAG: fcvt
    417 ; CHECK-DAG: csel {{.*}}, wzr, mi
    418 ; CHECK-DAG: csel {{.*}}, wzr, mi
    419 ; CHECK-DAG: csel {{.*}}, wzr, mi
    420 ; CHECK-DAG: csel {{.*}}, wzr, mi
    421 ; CHECK-DAG: csel {{.*}}, gt
    422 ; CHECK-DAG: csel {{.*}}, gt
    423 ; CHECK-DAG: csel {{.*}}, gt
    424 ; CHECK-DAG: csel {{.*}}, gt
    425 define <4 x i1> @test_fcmp_one(<4 x half> %a, <4 x half> %b) #0 {
    426   %1 = fcmp one <4 x half> %a, %b
    427   ret <4 x i1> %1
    428 }
    429 
    430 ; Function Attrs: nounwind readnone
    431 ; CHECK-LABEL: test_fcmp_oeq:
    432 ; CHECK-DAG: fcvt
    433 ; CHECK-DAG: fcvt
    434 ; CHECK-DAG: fcvt
    435 ; CHECK-DAG: fcvt
    436 ; CHECK-DAG: fcvt
    437 ; CHECK-DAG: fcvt
    438 ; CHECK-DAG: fcvt
    439 ; CHECK-DAG: fcvt
    440 ; CHECK-DAG: csel {{.*}}, wzr, eq
    441 ; CHECK-DAG: csel {{.*}}, wzr, eq
    442 ; CHECK-DAG: csel {{.*}}, wzr, eq
    443 ; CHECK-DAG: csel {{.*}}, wzr, eq
    444 define <4 x i1> @test_fcmp_oeq(<4 x half> %a, <4 x half> %b) #0 {
    445   %1 = fcmp oeq <4 x half> %a, %b
    446   ret <4 x i1> %1
    447 }
    448 
    449 ; Function Attrs: nounwind readnone
    450 ; CHECK-LABEL: test_fcmp_ogt:
    451 ; CHECK-DAG: fcvt
    452 ; CHECK-DAG: fcvt
    453 ; CHECK-DAG: fcvt
    454 ; CHECK-DAG: fcvt
    455 ; CHECK-DAG: fcvt
    456 ; CHECK-DAG: fcvt
    457 ; CHECK-DAG: fcvt
    458 ; CHECK-DAG: fcvt
    459 ; CHECK-DAG: csel {{.*}}, wzr, gt
    460 ; CHECK-DAG: csel {{.*}}, wzr, gt
    461 ; CHECK-DAG: csel {{.*}}, wzr, gt
    462 ; CHECK-DAG: csel {{.*}}, wzr, gt
    463 define <4 x i1> @test_fcmp_ogt(<4 x half> %a, <4 x half> %b) #0 {
    464   %1 = fcmp ogt <4 x half> %a, %b
    465   ret <4 x i1> %1
    466 }
    467 
    468 ; Function Attrs: nounwind readnone
    469 ; CHECK-LABEL: test_fcmp_oge:
    470 ; CHECK-DAG: fcvt
    471 ; CHECK-DAG: fcvt
    472 ; CHECK-DAG: fcvt
    473 ; CHECK-DAG: fcvt
    474 ; CHECK-DAG: fcvt
    475 ; CHECK-DAG: fcvt
    476 ; CHECK-DAG: fcvt
    477 ; CHECK-DAG: fcvt
    478 ; CHECK-DAG: csel {{.*}}, wzr, ge
    479 ; CHECK-DAG: csel {{.*}}, wzr, ge
    480 ; CHECK-DAG: csel {{.*}}, wzr, ge
    481 ; CHECK-DAG: csel {{.*}}, wzr, ge
    482 define <4 x i1> @test_fcmp_oge(<4 x half> %a, <4 x half> %b) #0 {
    483   %1 = fcmp oge <4 x half> %a, %b
    484   ret <4 x i1> %1
    485 }
    486 
    487 ; Function Attrs: nounwind readnone
    488 ; CHECK-LABEL: test_fcmp_olt:
    489 ; CHECK-DAG: fcvt
    490 ; CHECK-DAG: fcvt
    491 ; CHECK-DAG: fcvt
    492 ; CHECK-DAG: fcvt
    493 ; CHECK-DAG: fcvt
    494 ; CHECK-DAG: fcvt
    495 ; CHECK-DAG: fcvt
    496 ; CHECK-DAG: fcvt
    497 ; CHECK-DAG: csel {{.*}}, wzr, mi
    498 ; CHECK-DAG: csel {{.*}}, wzr, mi
    499 ; CHECK-DAG: csel {{.*}}, wzr, mi
    500 ; CHECK-DAG: csel {{.*}}, wzr, mi
    501 define <4 x i1> @test_fcmp_olt(<4 x half> %a, <4 x half> %b) #0 {
    502   %1 = fcmp olt <4 x half> %a, %b
    503   ret <4 x i1> %1
    504 }
    505 
    506 ; Function Attrs: nounwind readnone
    507 ; CHECK-LABEL: test_fcmp_ole:
    508 ; CHECK-DAG: fcvt
    509 ; CHECK-DAG: fcvt
    510 ; CHECK-DAG: fcvt
    511 ; CHECK-DAG: fcvt
    512 ; CHECK-DAG: fcvt
    513 ; CHECK-DAG: fcvt
    514 ; CHECK-DAG: fcvt
    515 ; CHECK-DAG: fcvt
    516 ; CHECK-DAG: csel {{.*}}, wzr, ls
    517 ; CHECK-DAG: csel {{.*}}, wzr, ls
    518 ; CHECK-DAG: csel {{.*}}, wzr, ls
    519 ; CHECK-DAG: csel {{.*}}, wzr, ls
    520 define <4 x i1> @test_fcmp_ole(<4 x half> %a, <4 x half> %b) #0 {
    521   %1 = fcmp ole <4 x half> %a, %b
    522   ret <4 x i1> %1
    523 }
    524 
    525 ; Function Attrs: nounwind readnone
    526 ; CHECK-LABEL: test_fcmp_ord:
    527 ; CHECK-DAG: fcvt
    528 ; CHECK-DAG: fcvt
    529 ; CHECK-DAG: fcvt
    530 ; CHECK-DAG: fcvt
    531 ; CHECK-DAG: fcvt
    532 ; CHECK-DAG: fcvt
    533 ; CHECK-DAG: fcvt
    534 ; CHECK-DAG: fcvt
    535 ; CHECK-DAG: csel {{.*}}, wzr, vc
    536 ; CHECK-DAG: csel {{.*}}, wzr, vc
    537 ; CHECK-DAG: csel {{.*}}, wzr, vc
    538 ; CHECK-DAG: csel {{.*}}, wzr, vc
    539 define <4 x i1> @test_fcmp_ord(<4 x half> %a, <4 x half> %b) #0 {
    540   %1 = fcmp ord <4 x half> %a, %b
    541   ret <4 x i1> %1
    542 }
    543 
    544 attributes #0 = { nounwind }
    545