Home | History | Annotate | Download | only in SystemZ
      1 ; Test that vector compare / select combinations do not produce any
      2 ; unnecessary pack /unpack / shift instructions.
      3 ;
      4 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
      5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s -check-prefix=CHECK-Z14
      6 
      7 define <2 x i8> @fun0(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4) {
      8 ; CHECK-LABEL: fun0:
      9 ; CHECK:       # %bb.0:
     10 ; CHECK-NEXT:    vceqb %v0, %v24, %v26
     11 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
     12 ; CHECK-NEXT:    br %r14
     13   %cmp = icmp eq <2 x i8> %val1, %val2
     14   %sel = select <2 x i1> %cmp, <2 x i8> %val3, <2 x i8> %val4
     15   ret <2 x i8> %sel
     16 }
     17 
     18 define <2 x i16> @fun1(<2 x i8> %val1, <2 x i8> %val2, <2 x i16> %val3, <2 x i16> %val4) {
     19 ; CHECK-LABEL: fun1:
     20 ; CHECK:       # %bb.0:
     21 ; CHECK-NEXT:    vceqb %v0, %v24, %v26
     22 ; CHECK-NEXT:    vuphb %v0, %v0
     23 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
     24 ; CHECK-NEXT:    br %r14
     25   %cmp = icmp eq <2 x i8> %val1, %val2
     26   %sel = select <2 x i1> %cmp, <2 x i16> %val3, <2 x i16> %val4
     27   ret <2 x i16> %sel
     28 }
     29 
     30 define <16 x i8> @fun2(<16 x i8> %val1, <16 x i8> %val2, <16 x i8> %val3, <16 x i8> %val4) {
     31 ; CHECK-LABEL: fun2:
     32 ; CHECK:       # %bb.0:
     33 ; CHECK-NEXT:    vceqb %v0, %v24, %v26
     34 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
     35 ; CHECK-NEXT:    br %r14
     36   %cmp = icmp eq <16 x i8> %val1, %val2
     37   %sel = select <16 x i1> %cmp, <16 x i8> %val3, <16 x i8> %val4
     38   ret <16 x i8> %sel
     39 }
     40 
     41 define <16 x i16> @fun3(<16 x i8> %val1, <16 x i8> %val2, <16 x i16> %val3, <16 x i16> %val4) {
     42 ; CHECK-LABEL: fun3:
     43 ; CHECK:       # %bb.0:
     44 ; CHECK-NEXT:    vceqb %v0, %v24, %v26
     45 ; CHECK-DAG:     vuphb [[REG0:%v[0-9]+]], %v0
     46 ; CHECK-DAG:     vmrlg [[REG1:%v[0-9]+]], %v0, %v0
     47 ; CHECK-DAG:     vuphb [[REG1]], [[REG1]]
     48 ; CHECK-NEXT:    vsel %v24, %v28, %v25, [[REG0]]
     49 ; CHECK-NEXT:    vsel %v26, %v30, %v27, [[REG1]]
     50 ; CHECK-NEXT:    br %r14
     51   %cmp = icmp eq <16 x i8> %val1, %val2
     52   %sel = select <16 x i1> %cmp, <16 x i16> %val3, <16 x i16> %val4
     53   ret <16 x i16> %sel
     54 }
     55 
     56 define <32 x i8> @fun4(<32 x i8> %val1, <32 x i8> %val2, <32 x i8> %val3, <32 x i8> %val4) {
     57 ; CHECK-LABEL: fun4:
     58 ; CHECK:       # %bb.0:
     59 ; CHECK-DAG:     vceqb [[REG0:%v[0-9]+]], %v26, %v30
     60 ; CHECK-DAG:     vceqb [[REG1:%v[0-9]+]], %v24, %v28
     61 ; CHECK-DAG:     vsel %v24, %v25, %v29, [[REG1]]
     62 ; CHECK-DAG:     vsel %v26, %v27, %v31, [[REG0]]
     63 ; CHECK-NEXT:    br %r14
     64   %cmp = icmp eq <32 x i8> %val1, %val2
     65   %sel = select <32 x i1> %cmp, <32 x i8> %val3, <32 x i8> %val4
     66   ret <32 x i8> %sel
     67 }
     68 
     69 define <2 x i8> @fun5(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4) {
     70 ; CHECK-LABEL: fun5:
     71 ; CHECK:       # %bb.0:
     72 ; CHECK-NEXT:    vceqh %v0, %v24, %v26
     73 ; CHECK-NEXT:    vpkh %v0, %v0, %v0
     74 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
     75 ; CHECK-NEXT:    br %r14
     76   %cmp = icmp eq <2 x i16> %val1, %val2
     77   %sel = select <2 x i1> %cmp, <2 x i8> %val3, <2 x i8> %val4
     78   ret <2 x i8> %sel
     79 }
     80 
     81 define <2 x i16> @fun6(<2 x i16> %val1, <2 x i16> %val2, <2 x i16> %val3, <2 x i16> %val4) {
     82 ; CHECK-LABEL: fun6:
     83 ; CHECK:       # %bb.0:
     84 ; CHECK-NEXT:    vceqh %v0, %v24, %v26
     85 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
     86 ; CHECK-NEXT:    br %r14
     87   %cmp = icmp eq <2 x i16> %val1, %val2
     88   %sel = select <2 x i1> %cmp, <2 x i16> %val3, <2 x i16> %val4
     89   ret <2 x i16> %sel
     90 }
     91 
     92 define <2 x i32> @fun7(<2 x i16> %val1, <2 x i16> %val2, <2 x i32> %val3, <2 x i32> %val4) {
     93 ; CHECK-LABEL: fun7:
     94 ; CHECK:       # %bb.0:
     95 ; CHECK-NEXT:    vceqh %v0, %v24, %v26
     96 ; CHECK-NEXT:    vuphh %v0, %v0
     97 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
     98 ; CHECK-NEXT:    br %r14
     99   %cmp = icmp eq <2 x i16> %val1, %val2
    100   %sel = select <2 x i1> %cmp, <2 x i32> %val3, <2 x i32> %val4
    101   ret <2 x i32> %sel
    102 }
    103 
    104 define <8 x i8> @fun8(<8 x i16> %val1, <8 x i16> %val2, <8 x i8> %val3, <8 x i8> %val4) {
    105 ; CHECK-LABEL: fun8:
    106 ; CHECK:       # %bb.0:
    107 ; CHECK-NEXT:    vceqh %v0, %v24, %v26
    108 ; CHECK-NEXT:    vpkh %v0, %v0, %v0
    109 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    110 ; CHECK-NEXT:    br %r14
    111   %cmp = icmp eq <8 x i16> %val1, %val2
    112   %sel = select <8 x i1> %cmp, <8 x i8> %val3, <8 x i8> %val4
    113   ret <8 x i8> %sel
    114 }
    115 
    116 define <8 x i16> @fun9(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4) {
    117 ; CHECK-LABEL: fun9:
    118 ; CHECK:       # %bb.0:
    119 ; CHECK-NEXT:    vceqh %v0, %v24, %v26
    120 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    121 ; CHECK-NEXT:    br %r14
    122   %cmp = icmp eq <8 x i16> %val1, %val2
    123   %sel = select <8 x i1> %cmp, <8 x i16> %val3, <8 x i16> %val4
    124   ret <8 x i16> %sel
    125 }
    126 
    127 define <8 x i32> @fun10(<8 x i16> %val1, <8 x i16> %val2, <8 x i32> %val3, <8 x i32> %val4) {
    128 ; CHECK-LABEL: fun10:
    129 ; CHECK:       # %bb.0:
    130 ; CHECK-NEXT:    vceqh %v0, %v24, %v26
    131 ; CHECK-DAG:     vuphh [[REG0:%v[0-9]+]], %v0
    132 ; CHECK-DAG:     vmrlg [[REG1:%v[0-9]+]], %v0, %v0
    133 ; CHECK-DAG:     vuphh [[REG1]], [[REG1]]
    134 ; CHECK-NEXT:    vsel %v24, %v28, %v25, [[REG0]]
    135 ; CHECK-NEXT:    vsel %v26, %v30, %v27, [[REG1]]
    136 ; CHECK-NEXT:    br %r14
    137   %cmp = icmp eq <8 x i16> %val1, %val2
    138   %sel = select <8 x i1> %cmp, <8 x i32> %val3, <8 x i32> %val4
    139   ret <8 x i32> %sel
    140 }
    141 
    142 define <16 x i8> @fun11(<16 x i16> %val1, <16 x i16> %val2, <16 x i8> %val3, <16 x i8> %val4) {
    143 ; CHECK-LABEL: fun11:
    144 ; CHECK:       # %bb.0:
    145 ; CHECK-NEXT:    vceqh %v0, %v26, %v30
    146 ; CHECK-NEXT:    vceqh %v1, %v24, %v28
    147 ; CHECK-NEXT:    vpkh %v0, %v1, %v0
    148 ; CHECK-NEXT:    vsel %v24, %v25, %v27, %v0
    149 ; CHECK-NEXT:    br %r14
    150   %cmp = icmp eq <16 x i16> %val1, %val2
    151   %sel = select <16 x i1> %cmp, <16 x i8> %val3, <16 x i8> %val4
    152   ret <16 x i8> %sel
    153 }
    154 
    155 define <16 x i16> @fun12(<16 x i16> %val1, <16 x i16> %val2, <16 x i16> %val3, <16 x i16> %val4) {
    156 ; CHECK-LABEL: fun12:
    157 ; CHECK:       # %bb.0:
    158 ; CHECK-DAG:     vceqh [[REG0:%v[0-9]+]], %v26, %v30
    159 ; CHECK-DAG:     vceqh [[REG1:%v[0-9]+]], %v24, %v28
    160 ; CHECK-DAG:     vsel %v24, %v25, %v29, [[REG1]]
    161 ; CHECK-DAG:     vsel %v26, %v27, %v31, [[REG0]]
    162 ; CHECK-NEXT:    br %r14
    163   %cmp = icmp eq <16 x i16> %val1, %val2
    164   %sel = select <16 x i1> %cmp, <16 x i16> %val3, <16 x i16> %val4
    165   ret <16 x i16> %sel
    166 }
    167 
    168 define <2 x i16> @fun13(<2 x i32> %val1, <2 x i32> %val2, <2 x i16> %val3, <2 x i16> %val4) {
    169 ; CHECK-LABEL: fun13:
    170 ; CHECK:       # %bb.0:
    171 ; CHECK-NEXT:    vceqf %v0, %v24, %v26
    172 ; CHECK-NEXT:    vpkf %v0, %v0, %v0
    173 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    174 ; CHECK-NEXT:    br %r14
    175   %cmp = icmp eq <2 x i32> %val1, %val2
    176   %sel = select <2 x i1> %cmp, <2 x i16> %val3, <2 x i16> %val4
    177   ret <2 x i16> %sel
    178 }
    179 
    180 define <2 x i32> @fun14(<2 x i32> %val1, <2 x i32> %val2, <2 x i32> %val3, <2 x i32> %val4) {
    181 ; CHECK-LABEL: fun14:
    182 ; CHECK:       # %bb.0:
    183 ; CHECK-NEXT:    vceqf %v0, %v24, %v26
    184 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    185 ; CHECK-NEXT:    br %r14
    186   %cmp = icmp eq <2 x i32> %val1, %val2
    187   %sel = select <2 x i1> %cmp, <2 x i32> %val3, <2 x i32> %val4
    188   ret <2 x i32> %sel
    189 }
    190 
    191 define <2 x i64> @fun15(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4) {
    192 ; CHECK-LABEL: fun15:
    193 ; CHECK:       # %bb.0:
    194 ; CHECK-NEXT:    vceqf %v0, %v24, %v26
    195 ; CHECK-NEXT:    vuphf %v0, %v0
    196 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    197 ; CHECK-NEXT:    br %r14
    198   %cmp = icmp eq <2 x i32> %val1, %val2
    199   %sel = select <2 x i1> %cmp, <2 x i64> %val3, <2 x i64> %val4
    200   ret <2 x i64> %sel
    201 }
    202 
    203 define <4 x i16> @fun16(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4) {
    204 ; CHECK-LABEL: fun16:
    205 ; CHECK:       # %bb.0:
    206 ; CHECK-NEXT:    vceqf %v0, %v24, %v26
    207 ; CHECK-NEXT:    vpkf %v0, %v0, %v0
    208 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    209 ; CHECK-NEXT:    br %r14
    210   %cmp = icmp eq <4 x i32> %val1, %val2
    211   %sel = select <4 x i1> %cmp, <4 x i16> %val3, <4 x i16> %val4
    212   ret <4 x i16> %sel
    213 }
    214 
    215 define <4 x i32> @fun17(<4 x i32> %val1, <4 x i32> %val2, <4 x i32> %val3, <4 x i32> %val4) {
    216 ; CHECK-LABEL: fun17:
    217 ; CHECK:       # %bb.0:
    218 ; CHECK-NEXT:    vceqf %v0, %v24, %v26
    219 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    220 ; CHECK-NEXT:    br %r14
    221   %cmp = icmp eq <4 x i32> %val1, %val2
    222   %sel = select <4 x i1> %cmp, <4 x i32> %val3, <4 x i32> %val4
    223   ret <4 x i32> %sel
    224 }
    225 
    226 define <4 x i64> @fun18(<4 x i32> %val1, <4 x i32> %val2, <4 x i64> %val3, <4 x i64> %val4) {
    227 ; CHECK-LABEL: fun18:
    228 ; CHECK:       # %bb.0:
    229 ; CHECK-NEXT:    vceqf %v0, %v24, %v26
    230 ; CHECK-DAG:     vuphf [[REG0:%v[0-9]+]], %v0
    231 ; CHECK-DAG:     vmrlg [[REG1:%v[0-9]+]], %v0, %v0
    232 ; CHECK-DAG:     vuphf [[REG1]], [[REG1]]
    233 ; CHECK-NEXT:    vsel %v24, %v28, %v25, [[REG0]]
    234 ; CHECK-NEXT:    vsel %v26, %v30, %v27, [[REG1]]
    235 ; CHECK-NEXT:    br %r14
    236   %cmp = icmp eq <4 x i32> %val1, %val2
    237   %sel = select <4 x i1> %cmp, <4 x i64> %val3, <4 x i64> %val4
    238   ret <4 x i64> %sel
    239 }
    240 
    241 define <8 x i16> @fun19(<8 x i32> %val1, <8 x i32> %val2, <8 x i16> %val3, <8 x i16> %val4) {
    242 ; CHECK-LABEL: fun19:
    243 ; CHECK:       # %bb.0:
    244 ; CHECK-NEXT:    vceqf %v0, %v26, %v30
    245 ; CHECK-NEXT:    vceqf %v1, %v24, %v28
    246 ; CHECK-NEXT:    vpkf %v0, %v1, %v0
    247 ; CHECK-NEXT:    vsel %v24, %v25, %v27, %v0
    248 ; CHECK-NEXT:    br %r14
    249   %cmp = icmp eq <8 x i32> %val1, %val2
    250   %sel = select <8 x i1> %cmp, <8 x i16> %val3, <8 x i16> %val4
    251   ret <8 x i16> %sel
    252 }
    253 
    254 define <8 x i32> @fun20(<8 x i32> %val1, <8 x i32> %val2, <8 x i32> %val3, <8 x i32> %val4) {
    255 ; CHECK-LABEL: fun20:
    256 ; CHECK:       # %bb.0:
    257 ; CHECK-DAG:     vceqf [[REG0:%v[0-9]+]], %v26, %v30
    258 ; CHECK-DAG:     vceqf [[REG1:%v[0-9]+]], %v24, %v28
    259 ; CHECK-DAG:     vsel %v24, %v25, %v29, [[REG1]]
    260 ; CHECK-DAG:     vsel %v26, %v27, %v31, [[REG0]]
    261 ; CHECK-NEXT:    br %r14
    262   %cmp = icmp eq <8 x i32> %val1, %val2
    263   %sel = select <8 x i1> %cmp, <8 x i32> %val3, <8 x i32> %val4
    264   ret <8 x i32> %sel
    265 }
    266 
    267 define <2 x i32> @fun21(<2 x i64> %val1, <2 x i64> %val2, <2 x i32> %val3, <2 x i32> %val4) {
    268 ; CHECK-LABEL: fun21:
    269 ; CHECK:       # %bb.0:
    270 ; CHECK-NEXT:    vceqg %v0, %v24, %v26
    271 ; CHECK-NEXT:    vpkg %v0, %v0, %v0
    272 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    273 ; CHECK-NEXT:    br %r14
    274   %cmp = icmp eq <2 x i64> %val1, %val2
    275   %sel = select <2 x i1> %cmp, <2 x i32> %val3, <2 x i32> %val4
    276   ret <2 x i32> %sel
    277 }
    278 
    279 define <2 x i64> @fun22(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3, <2 x i64> %val4) {
    280 ; CHECK-LABEL: fun22:
    281 ; CHECK:       # %bb.0:
    282 ; CHECK-NEXT:    vceqg %v0, %v24, %v26
    283 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    284 ; CHECK-NEXT:    br %r14
    285   %cmp = icmp eq <2 x i64> %val1, %val2
    286   %sel = select <2 x i1> %cmp, <2 x i64> %val3, <2 x i64> %val4
    287   ret <2 x i64> %sel
    288 }
    289 
    290 define <4 x i32> @fun23(<4 x i64> %val1, <4 x i64> %val2, <4 x i32> %val3, <4 x i32> %val4) {
    291 ; CHECK-LABEL: fun23:
    292 ; CHECK:       # %bb.0:
    293 ; CHECK-NEXT:    vceqg %v0, %v26, %v30
    294 ; CHECK-NEXT:    vceqg %v1, %v24, %v28
    295 ; CHECK-NEXT:    vpkg %v0, %v1, %v0
    296 ; CHECK-NEXT:    vsel %v24, %v25, %v27, %v0
    297 ; CHECK-NEXT:    br %r14
    298   %cmp = icmp eq <4 x i64> %val1, %val2
    299   %sel = select <4 x i1> %cmp, <4 x i32> %val3, <4 x i32> %val4
    300   ret <4 x i32> %sel
    301 }
    302 
    303 define <4 x i64> @fun24(<4 x i64> %val1, <4 x i64> %val2, <4 x i64> %val3, <4 x i64> %val4) {
    304 ; CHECK-LABEL: fun24:
    305 ; CHECK:       # %bb.0:
    306 ; CHECK-DAG:     vceqg [[REG0:%v[0-9]+]], %v26, %v30
    307 ; CHECK-DAG:     vceqg [[REG1:%v[0-9]+]], %v24, %v28
    308 ; CHECK-DAG:     vsel %v24, %v25, %v29, [[REG1]]
    309 ; CHECK-DAG:     vsel %v26, %v27, %v31, [[REG0]]
    310 ; CHECK-NEXT:    br %r14
    311   %cmp = icmp eq <4 x i64> %val1, %val2
    312   %sel = select <4 x i1> %cmp, <4 x i64> %val3, <4 x i64> %val4
    313   ret <4 x i64> %sel
    314 }
    315 
    316 define <2 x float> @fun25(<2 x float> %val1, <2 x float> %val2, <2 x float> %val3, <2 x float> %val4) {
    317 ; CHECK-LABEL: fun25:
    318 ; CHECK:       # %bb.0:
    319 ; CHECK-NEXT:    vmrlf %v0, %v26, %v26
    320 ; CHECK-NEXT:    vmrlf %v1, %v24, %v24
    321 ; CHECK-NEXT:    vldeb %v0, %v0
    322 ; CHECK-NEXT:    vldeb %v1, %v1
    323 ; CHECK-NEXT:    vfchdb %v0, %v1, %v0
    324 ; CHECK-NEXT:    vmrhf %v1, %v26, %v26
    325 ; CHECK-NEXT:    vmrhf %v2, %v24, %v24
    326 ; CHECK-NEXT:    vldeb %v1, %v1
    327 ; CHECK-NEXT:    vldeb %v2, %v2
    328 ; CHECK-NEXT:    vfchdb %v1, %v2, %v1
    329 ; CHECK-NEXT:    vpkg %v0, %v1, %v0
    330 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    331 ; CHECK-NEXT:    br %r14
    332 
    333 ; CHECK-Z14-LABEL: fun25:
    334 ; CHECK-Z14:       # %bb.0:
    335 ; CHECK-Z14-NEXT:    vfchsb  %v0, %v24, %v26
    336 ; CHECK-Z14-NEXT:    vsel    %v24, %v28, %v30, %v0
    337 ; CHECK-Z14-NEXT:    br %r14
    338 
    339   %cmp = fcmp ogt <2 x float> %val1, %val2
    340   %sel = select <2 x i1> %cmp, <2 x float> %val3, <2 x float> %val4
    341   ret <2 x float> %sel
    342 }
    343 
    344 define <2 x double> @fun26(<2 x float> %val1, <2 x float> %val2, <2 x double> %val3, <2 x double> %val4) {
    345 ; CHECK-LABEL: fun26:
    346 ; CHECK:       # %bb.0:
    347 ; CHECK-NEXT:    vmrlf %v0, %v26, %v26
    348 ; CHECK-NEXT:    vmrlf %v1, %v24, %v24
    349 ; CHECK-NEXT:    vldeb %v0, %v0
    350 ; CHECK-NEXT:    vldeb %v1, %v1
    351 ; CHECK-NEXT:    vfchdb %v0, %v1, %v0
    352 ; CHECK-NEXT:    vmrhf %v1, %v26, %v26
    353 ; CHECK-NEXT:    vmrhf %v2, %v24, %v24
    354 ; CHECK-NEXT:    vldeb %v1, %v1
    355 ; CHECK-NEXT:    vldeb %v2, %v2
    356 ; CHECK-NEXT:    vfchdb %v1, %v2, %v1
    357 ; CHECK-NEXT:    vpkg %v0, %v1, %v0
    358 ; CHECK-NEXT:    vuphf %v0, %v0
    359 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    360 ; CHECK-NEXT:    br %r14
    361 
    362 ; CHECK-Z14-LABEL: fun26:
    363 ; CHECK-Z14:       # %bb.0:
    364 ; CHECK-Z14-NEXT:    vfchsb  %v0, %v24, %v26
    365 ; CHECK-Z14-NEXT:    vuphf   %v0, %v0
    366 ; CHECK-Z14-NEXT:    vsel    %v24, %v28, %v30, %v0
    367 ; CHECK-Z14-NEXT:    br %r14
    368 
    369   %cmp = fcmp ogt <2 x float> %val1, %val2
    370   %sel = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
    371   ret <2 x double> %sel
    372 }
    373 
    374 ; Test a widening select of floats.
    375 define <2 x float> @fun27(<2 x i8> %val1, <2 x i8> %val2, <2 x float> %val3, <2 x float> %val4) {
    376 ; CHECK-LABEL: fun27:
    377 ; CHECK:       # %bb.0:
    378 ; CHECK-NEXT:    vceqb %v0, %v24, %v26
    379 ; CHECK-NEXT:    vuphb %v0, %v0
    380 ; CHECK-NEXT:    vuphh %v0, %v0
    381 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    382 ; CHECK-NEXT:    br %r14
    383 
    384   %cmp = icmp eq <2 x i8> %val1, %val2
    385   %sel = select <2 x i1> %cmp, <2 x float> %val3, <2 x float> %val4
    386   ret <2 x float> %sel
    387 }
    388 
    389 define <4 x float> @fun28(<4 x float> %val1, <4 x float> %val2, <4 x float> %val3, <4 x float> %val4) {
    390 ; CHECK-LABEL: fun28:
    391 ; CHECK:       # %bb.0:
    392 ; CHECK-NEXT:    vmrlf %v0, %v26, %v26
    393 ; CHECK-NEXT:    vmrlf %v1, %v24, %v24
    394 ; CHECK-NEXT:    vldeb %v0, %v0
    395 ; CHECK-NEXT:    vldeb %v1, %v1
    396 ; CHECK-NEXT:    vfchdb %v0, %v1, %v0
    397 ; CHECK-NEXT:    vmrhf %v1, %v26, %v26
    398 ; CHECK-NEXT:    vmrhf %v2, %v24, %v24
    399 ; CHECK-NEXT:    vldeb %v1, %v1
    400 ; CHECK-NEXT:    vldeb %v2, %v2
    401 ; CHECK-NEXT:    vfchdb %v1, %v2, %v1
    402 ; CHECK-NEXT:    vpkg %v0, %v1, %v0
    403 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    404 ; CHECK-NEXT:    br %r14
    405 
    406 ; CHECK-Z14-LABEL: fun28:
    407 ; CHECK-Z14:       # %bb.0:
    408 ; CHECK-Z14-NEXT:    vfchsb  %v0, %v24, %v26
    409 ; CHECK-Z14-NEXT:    vsel    %v24, %v28, %v30, %v0
    410 ; CHECK-Z14-NEXT:    br %r14
    411 
    412   %cmp = fcmp ogt <4 x float> %val1, %val2
    413   %sel = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
    414   ret <4 x float> %sel
    415 }
    416 
    417 define <4 x double> @fun29(<4 x float> %val1, <4 x float> %val2, <4 x double> %val3, <4 x double> %val4) {
    418 ; CHECK-LABEL: fun29:
    419 ; CHECK:       # %bb.0:
    420 ; CHECK-NEXT:    vmrlf %v0, %v26, %v26
    421 ; CHECK-NEXT:    vmrlf %v1, %v24, %v24
    422 ; CHECK-NEXT:    vldeb %v0, %v0
    423 ; CHECK-NEXT:    vldeb %v1, %v1
    424 ; CHECK-NEXT:    vfchdb %v0, %v1, %v0
    425 ; CHECK-NEXT:    vmrhf %v1, %v26, %v26
    426 ; CHECK-NEXT:    vmrhf %v2, %v24, %v24
    427 ; CHECK-NEXT:    vldeb %v1, %v1
    428 ; CHECK-NEXT:    vldeb %v2, %v2
    429 ; CHECK-NEXT:    vfchdb %v1, %v2, %v1
    430 ; CHECK-NEXT:    vpkg [[REG0:%v[0-9]+]], %v1, %v0
    431 ; CHECK-DAG:     vmrlg [[REG1:%v[0-9]+]], [[REG0]], [[REG0]]
    432 ; CHECK-DAG:     vuphf [[REG1]], [[REG1]]
    433 ; CHECK-DAG:     vuphf [[REG2:%v[0-9]+]], [[REG0]]
    434 ; CHECK-NEXT:    vsel %v24, %v28, %v25, [[REG2]]
    435 ; CHECK-NEXT:    vsel %v26, %v30, %v27, [[REG1]]
    436 ; CHECK-NEXT:    br %r14
    437 
    438 ; CHECK-Z14-LABEL: fun29:
    439 ; CHECK-Z14:       # %bb.0:
    440 ; CHECK-Z14-NEXT:    vfchsb  %v0, %v24, %v26
    441 ; CHECK-Z14-DAG:     vuphf   [[REG0:%v[0-9]+]], %v0
    442 ; CHECK-Z14-DAG:     vmrlg   [[REG1:%v[0-9]+]], %v0, %v0
    443 ; CHECK-Z14-DAG:     vuphf   [[REG1]], [[REG1]]
    444 ; CHECK-Z14-NEXT:    vsel    %v24, %v28, %v25, [[REG0]]
    445 ; CHECK-Z14-NEXT:    vsel    %v26, %v30, %v27, [[REG1]]
    446 ; CHECK-Z14-NEXT:    br %r14
    447 
    448   %cmp = fcmp ogt <4 x float> %val1, %val2
    449   %sel = select <4 x i1> %cmp, <4 x double> %val3, <4 x double> %val4
    450   ret <4 x double> %sel
    451 }
    452 
    453 define <8 x float> @fun30(<8 x float> %val1, <8 x float> %val2, <8 x float> %val3, <8 x float> %val4) {
    454 ; CHECK-Z14-LABEL: fun30:
    455 ; CHECK-Z14:       # %bb.0:
    456 ; CHECK-Z14-DAG:     vfchsb  [[REG0:%v[0-9]+]], %v26, %v30
    457 ; CHECK-Z14-DAG:     vfchsb  [[REG1:%v[0-9]+]], %v24, %v28
    458 ; CHECK-Z14-DAG:     vsel    %v24, %v25, %v29, [[REG1]]
    459 ; CHECK-Z14-DAG:     vsel    %v26, %v27, %v31, [[REG0]]
    460 ; CHECK-Z14-NEXT:    br %r14
    461   %cmp = fcmp ogt <8 x float> %val1, %val2
    462   %sel = select <8 x i1> %cmp, <8 x float> %val3, <8 x float> %val4
    463   ret <8 x float> %sel
    464 }
    465 
    466 define <2 x float> @fun31(<2 x double> %val1, <2 x double> %val2, <2 x float> %val3, <2 x float> %val4) {
    467 ; CHECK-LABEL: fun31:
    468 ; CHECK:       # %bb.0:
    469 ; CHECK-NEXT:    vfchdb %v0, %v24, %v26
    470 ; CHECK-NEXT:    vpkg %v0, %v0, %v0
    471 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    472 ; CHECK-NEXT:    br %r14
    473 
    474   %cmp = fcmp ogt <2 x double> %val1, %val2
    475   %sel = select <2 x i1> %cmp, <2 x float> %val3, <2 x float> %val4
    476   ret <2 x float> %sel
    477 }
    478 
    479 define <2 x double> @fun32(<2 x double> %val1, <2 x double> %val2, <2 x double> %val3, <2 x double> %val4) {
    480 ; CHECK-LABEL: fun32:
    481 ; CHECK:       # %bb.0:
    482 ; CHECK-NEXT:    vfchdb %v0, %v24, %v26
    483 ; CHECK-NEXT:    vsel %v24, %v28, %v30, %v0
    484 ; CHECK-NEXT:    br %r14
    485   %cmp = fcmp ogt <2 x double> %val1, %val2
    486   %sel = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4
    487   ret <2 x double> %sel
    488 }
    489 
    490 define <4 x float> @fun33(<4 x double> %val1, <4 x double> %val2, <4 x float> %val3, <4 x float> %val4) {
    491 ; CHECK-LABEL: fun33:
    492 ; CHECK:       # %bb.0:
    493 ; CHECK-NEXT:    vfchdb %v0, %v26, %v30
    494 ; CHECK-NEXT:    vfchdb %v1, %v24, %v28
    495 ; CHECK-NEXT:    vpkg %v0, %v1, %v0
    496 ; CHECK-NEXT:    vsel %v24, %v25, %v27, %v0
    497 ; CHECK-NEXT:    br %r14
    498   %cmp = fcmp ogt <4 x double> %val1, %val2
    499   %sel = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
    500   ret <4 x float> %sel
    501 }
    502 
    503 define <4 x double> @fun34(<4 x double> %val1, <4 x double> %val2, <4 x double> %val3, <4 x double> %val4) {
    504 ; CHECK-LABEL: fun34:
    505 ; CHECK:       # %bb.0:
    506 ; CHECK-DAG:     vfchdb [[REG0:%v[0-9]+]], %v26, %v30
    507 ; CHECK-DAG:     vfchdb [[REG1:%v[0-9]+]], %v24, %v28
    508 ; CHECK-DAG:     vsel %v24, %v25, %v29, [[REG1]]
    509 ; CHECK-DAG:     vsel %v26, %v27, %v31, [[REG0]]
    510 ; CHECK-NEXT:    br %r14
    511   %cmp = fcmp ogt <4 x double> %val1, %val2
    512   %sel = select <4 x i1> %cmp, <4 x double> %val3, <4 x double> %val4
    513   ret <4 x double> %sel
    514 }
    515