Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc -mcpu=pwr6 -mattr=+altivec < %s | FileCheck %s
      2 
      3 ; Check vector comparisons using altivec. For non-native types, just basic
      4 ; comparison instruction check is done. For altivec supported type (16i8,
      5 ; 8i16, 4i32, and 4f32) all the comparisons operators (==, !=, >, >=, <, <=)
      6 ; are checked.
      7 
      8 
      9 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
     10 target triple = "powerpc64-unknown-linux-gnu"
     11 
     12 define <2 x i8> @v2si8_cmp(<2 x i8> %x, <2 x i8> %y) nounwind readnone {
     13   %cmp = icmp eq <2 x i8> %x, %y
     14   %sext = sext <2 x i1> %cmp to <2 x i8>
     15   ret <2 x i8> %sext
     16 }
     17 ; CHECK-LABEL: v2si8_cmp:
     18 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
     19 
     20 
     21 define <4 x i8> @v4si8_cmp(<4 x i8> %x, <4 x i8> %y) nounwind readnone {
     22   %cmp = icmp eq <4 x i8> %x, %y
     23   %sext = sext <4 x i1> %cmp to <4 x i8>
     24   ret <4 x i8> %sext
     25 }
     26 ; CHECK-LABEL: v4si8_cmp:
     27 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
     28 
     29 
     30 define <8 x i8> @v8si8_cmp(<8 x i8> %x, <8 x i8> %y) nounwind readnone {
     31   %cmp = icmp eq <8 x i8> %x, %y
     32   %sext = sext <8 x i1> %cmp to <8 x i8>
     33   ret <8 x i8> %sext
     34 }
     35 ; CHECK-LABEL: v8si8_cmp:
     36 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
     37 
     38 
     39 ; Additional tests for v16i8 since it is a altivec native type
     40 
     41 define <16 x i8> @v16si8_cmp_eq(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     42   %cmp = icmp eq <16 x i8> %x, %y
     43   %sext = sext <16 x i1> %cmp to <16 x i8>
     44   ret <16 x i8> %sext
     45 }
     46 ; CHECK-LABEL: v16si8_cmp_eq:
     47 ; CHECK: vcmpequb 2, 2, 3
     48 
     49 define <16 x i8> @v16si8_cmp_ne(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     50 entry:
     51   %cmp = icmp ne <16 x i8> %x, %y
     52   %sext = sext <16 x i1> %cmp to <16 x i8>
     53   ret <16 x i8> %sext
     54 }
     55 ; CHECK-LABEL:     v16si8_cmp_ne:
     56 ; CHECK:     vcmpequb [[RET:[0-9]+]], 2, 3
     57 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
     58 
     59 define <16 x i8> @v16si8_cmp_le(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     60 entry:
     61   %cmp = icmp sle <16 x i8> %x, %y
     62   %sext = sext <16 x i1> %cmp to <16 x i8>
     63   ret <16 x i8> %sext
     64 }
     65 ; CHECK-LABEL:      v16si8_cmp_le:
     66 ; CHECK:      vcmpgtsb [[RET:[0-9]+]], 2, 3
     67 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
     68 
     69 define <16 x i8> @v16ui8_cmp_le(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     70 entry:
     71   %cmp = icmp ule <16 x i8> %x, %y
     72   %sext = sext <16 x i1> %cmp to <16 x i8>
     73   ret <16 x i8> %sext
     74 }
     75 ; CHECK-LABEL:      v16ui8_cmp_le:
     76 ; CHECK:      vcmpgtub [[RET:[0-9]+]], 2, 3
     77 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
     78 
     79 define <16 x i8> @v16si8_cmp_lt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     80 entry:
     81   %cmp = icmp slt <16 x i8> %x, %y
     82   %sext = sext <16 x i1> %cmp to <16 x i8>
     83   ret <16 x i8> %sext
     84 }
     85 ; CHECK-LABEL: v16si8_cmp_lt:
     86 ; CHECK: vcmpgtsb 2, 3, 2
     87 
     88 define <16 x i8> @v16ui8_cmp_lt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     89 entry:
     90   %cmp = icmp ult <16 x i8> %x, %y
     91   %sext = sext <16 x i1> %cmp to <16 x i8>
     92   ret <16 x i8> %sext
     93 }
     94 ; CHECK-LABEL: v16ui8_cmp_lt:
     95 ; CHECK: vcmpgtub 2, 3, 2
     96 
     97 define <16 x i8> @v16si8_cmp_gt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
     98 entry:
     99   %cmp = icmp sgt <16 x i8> %x, %y
    100   %sext = sext <16 x i1> %cmp to <16 x i8>
    101   ret <16 x i8> %sext
    102 }
    103 ; CHECK-LABEL: v16si8_cmp_gt:
    104 ; CHECK: vcmpgtsb 2, 2, 3
    105 
    106 define <16 x i8> @v16ui8_cmp_gt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
    107 entry:
    108   %cmp = icmp ugt <16 x i8> %x, %y
    109   %sext = sext <16 x i1> %cmp to <16 x i8>
    110   ret <16 x i8> %sext
    111 }
    112 ; CHECK-LABEL: v16ui8_cmp_gt:
    113 ; CHECK: vcmpgtub 2, 2, 3
    114 
    115 define <16 x i8> @v16si8_cmp_ge(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
    116 entry:
    117   %cmp = icmp sge <16 x i8> %x, %y
    118   %sext = sext <16 x i1> %cmp to <16 x i8>
    119   ret <16 x i8> %sext
    120 }
    121 ; CHECK-LABEL:      v16si8_cmp_ge:
    122 ; CHECK:      vcmpgtsb [[RET:[0-9]+]], 3, 2
    123 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    124 
    125 define <16 x i8> @v16ui8_cmp_ge(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
    126 entry:
    127   %cmp = icmp uge <16 x i8> %x, %y
    128   %sext = sext <16 x i1> %cmp to <16 x i8>
    129   ret <16 x i8> %sext
    130 }
    131 ; CHECK-LABEL:      v16ui8_cmp_ge:
    132 ; CHECK:      vcmpgtub [[RET:[0-9]+]], 3, 2
    133 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    134 
    135 
    136 define <32 x i8> @v32si8_cmp(<32 x i8> %x, <32 x i8> %y) nounwind readnone {
    137   %cmp = icmp eq <32 x i8> %x, %y
    138   %sext = sext <32 x i1> %cmp to <32 x i8>
    139   ret <32 x i8> %sext
    140 }
    141 ; CHECK-LABEL: v32si8_cmp:
    142 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    143 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    144 
    145 
    146 define <2 x i16> @v2si16_cmp(<2 x i16> %x, <2 x i16> %y) nounwind readnone {
    147   %cmp = icmp eq <2 x i16> %x, %y
    148   %sext = sext <2 x i1> %cmp to <2 x i16>
    149   ret <2 x i16> %sext
    150 }
    151 ; CHECK-LABEL: v2si16_cmp:
    152 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    153 
    154 
    155 define <4 x i16> @v4si16_cmp(<4 x i16> %x, <4 x i16> %y) nounwind readnone {
    156   %cmp = icmp eq <4 x i16> %x, %y
    157   %sext = sext <4 x i1> %cmp to <4 x i16>
    158   ret <4 x i16> %sext
    159 }
    160 ; CHECK-LABEL: v4si16_cmp:
    161 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    162 
    163 
    164 ; Additional tests for v8i16 since it is an altivec native type
    165 
    166 define <8 x i16> @v8si16_cmp_eq(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    167 entry:
    168   %cmp = icmp eq <8 x i16> %x, %y
    169   %sext = sext <8 x i1> %cmp to <8 x i16>
    170   ret <8 x i16> %sext
    171 }
    172 ; CHECK-LABEL: v8si16_cmp_eq:
    173 ; CHECK: vcmpequh 2, 2, 3
    174 
    175 define <8 x i16> @v8si16_cmp_ne(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    176 entry:
    177   %cmp = icmp ne <8 x i16> %x, %y
    178   %sext = sext <8 x i1> %cmp to <8 x i16>
    179   ret <8 x i16> %sext
    180 }
    181 ; CHECK-LABEL:      v8si16_cmp_ne:
    182 ; CHECK:      vcmpequh [[RET:[0-9]+]], 2, 3
    183 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    184 
    185 define <8 x i16> @v8si16_cmp_le(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    186 entry:
    187   %cmp = icmp sle <8 x i16> %x, %y
    188   %sext = sext <8 x i1> %cmp to <8 x i16>
    189   ret <8 x i16> %sext
    190 }
    191 ; CHECK-LABEL:      v8si16_cmp_le:
    192 ; CHECK:      vcmpgtsh [[RET:[0-9]+]], 2, 3
    193 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    194 
    195 define <8 x i16> @v8ui16_cmp_le(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    196 entry:
    197   %cmp = icmp ule <8 x i16> %x, %y
    198   %sext = sext <8 x i1> %cmp to <8 x i16>
    199   ret <8 x i16> %sext
    200 }
    201 ; CHECK-LABEL:      v8ui16_cmp_le:
    202 ; CHECK:      vcmpgtuh [[RET:[0-9]+]], 2, 3
    203 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    204 
    205 define <8 x i16> @v8si16_cmp_lt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    206 entry:
    207   %cmp = icmp slt <8 x i16> %x, %y
    208   %sext = sext <8 x i1> %cmp to <8 x i16>
    209   ret <8 x i16> %sext
    210 }
    211 ; CHECK-LABEL: v8si16_cmp_lt:
    212 ; CHECK: vcmpgtsh 2, 3, 2
    213 
    214 define <8 x i16> @v8ui16_cmp_lt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    215 entry:
    216   %cmp = icmp ult <8 x i16> %x, %y
    217   %sext = sext <8 x i1> %cmp to <8 x i16>
    218   ret <8 x i16> %sext
    219 }
    220 ; CHECK-LABEL: v8ui16_cmp_lt:
    221 ; CHECK: vcmpgtuh 2, 3, 2
    222 
    223 define <8 x i16> @v8si16_cmp_gt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    224 entry:
    225   %cmp = icmp sgt <8 x i16> %x, %y
    226   %sext = sext <8 x i1> %cmp to <8 x i16>
    227   ret <8 x i16> %sext
    228 }
    229 ; CHECK-LABEL: v8si16_cmp_gt:
    230 ; CHECK: vcmpgtsh 2, 2, 3
    231 
    232 define <8 x i16> @v8ui16_cmp_gt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    233 entry:
    234   %cmp = icmp ugt <8 x i16> %x, %y
    235   %sext = sext <8 x i1> %cmp to <8 x i16>
    236   ret <8 x i16> %sext
    237 }
    238 ; CHECK-LABEL: v8ui16_cmp_gt:
    239 ; CHECK: vcmpgtuh 2, 2, 3
    240 
    241 define <8 x i16> @v8si16_cmp_ge(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    242 entry:
    243   %cmp = icmp sge <8 x i16> %x, %y
    244   %sext = sext <8 x i1> %cmp to <8 x i16>
    245   ret <8 x i16> %sext
    246 }
    247 ; CHECK-LABEL:      v8si16_cmp_ge:
    248 ; CHECK:      vcmpgtsh [[RET:[0-9]+]], 3, 2
    249 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    250 
    251 define <8 x i16> @v8ui16_cmp_ge(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
    252 entry:
    253   %cmp = icmp uge <8 x i16> %x, %y
    254   %sext = sext <8 x i1> %cmp to <8 x i16>
    255   ret <8 x i16> %sext
    256 }
    257 ; CHECK-LABEL:      v8ui16_cmp_ge:
    258 ; CHECK:      vcmpgtuh [[RET:[0-9]+]], 3, 2
    259 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    260 
    261 
    262 define <16 x i16> @v16si16_cmp(<16 x i16> %x, <16 x i16> %y) nounwind readnone {
    263   %cmp = icmp eq <16 x i16> %x, %y
    264   %sext = sext <16 x i1> %cmp to <16 x i16>
    265   ret <16 x i16> %sext
    266 }
    267 ; CHECK-LABEL: v16si16_cmp:
    268 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    269 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    270 
    271 
    272 define <32 x i16> @v32si16_cmp(<32 x i16> %x, <32 x i16> %y) nounwind readnone {
    273   %cmp = icmp eq <32 x i16> %x, %y
    274   %sext = sext <32 x i1> %cmp to <32 x i16>
    275   ret <32 x i16> %sext
    276 }
    277 ; CHECK-LABEL: v32si16_cmp:
    278 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    279 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    280 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    281 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    282 
    283 
    284 define <2 x i32> @v2si32_cmp(<2 x i32> %x, <2 x i32> %y) nounwind readnone {
    285   %cmp = icmp eq <2 x i32> %x, %y
    286   %sext = sext <2 x i1> %cmp to <2 x i32>
    287   ret <2 x i32> %sext
    288 }
    289 ; CHECK-LABEL: v2si32_cmp:
    290 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    291 
    292 
    293 ; Additional tests for v4si32 since it is an altivec native type
    294 
    295 define <4 x i32> @v4si32_cmp_eq(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    296 entry:
    297   %cmp = icmp eq <4 x i32> %x, %y
    298   %sext = sext <4 x i1> %cmp to <4 x i32>
    299   ret <4 x i32> %sext
    300 }
    301 ; CHECK-LABEL: v4si32_cmp_eq:
    302 ; CHECK: vcmpequw 2, 2, 3
    303 
    304 define <4 x i32> @v4si32_cmp_ne(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    305 entry:
    306   %cmp = icmp ne <4 x i32> %x, %y
    307   %sext = sext <4 x i1> %cmp to <4 x i32>
    308   ret <4 x i32> %sext
    309 }
    310 ; CHECK-LABEL:      v4si32_cmp_ne:
    311 ; CHECK:      vcmpequw [[RCMP:[0-9]+]], 2, 3
    312 ; CHECK-NEXT: vnor     2, [[RCMP]], [[RCMP]]
    313 
    314 define <4 x i32> @v4si32_cmp_le(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    315 entry:
    316   %cmp = icmp sle <4 x i32> %x, %y
    317   %sext = sext <4 x i1> %cmp to <4 x i32>
    318   ret <4 x i32> %sext
    319 }
    320 ; CHECK-LABEL:      v4si32_cmp_le:
    321 ; CHECK:      vcmpgtsw [[RET:[0-9]+]], 2, 3
    322 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    323 
    324 define <4 x i32> @v4ui32_cmp_le(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    325 entry:
    326   %cmp = icmp ule <4 x i32> %x, %y
    327   %sext = sext <4 x i1> %cmp to <4 x i32>
    328   ret <4 x i32> %sext
    329 }
    330 ; CHECK-LABEL:      v4ui32_cmp_le:
    331 ; CHECK:      vcmpgtuw [[RET:[0-9]+]], 2, 3
    332 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    333 
    334 define <4 x i32> @v4si32_cmp_lt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    335 entry:
    336   %cmp = icmp slt <4 x i32> %x, %y
    337   %sext = sext <4 x i1> %cmp to <4 x i32>
    338   ret <4 x i32> %sext
    339 }
    340 ; CHECK-LABEL: v4si32_cmp_lt:
    341 ; CHECK: vcmpgtsw 2, 3, 2
    342 
    343 define <4 x i32> @v4ui32_cmp_lt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    344 entry:
    345   %cmp = icmp ult <4 x i32> %x, %y
    346   %sext = sext <4 x i1> %cmp to <4 x i32>
    347   ret <4 x i32> %sext
    348 }
    349 ; CHECK-LABEL: v4ui32_cmp_lt:
    350 ; CHECK: vcmpgtuw 2, 3, 2
    351 
    352 define <4 x i32> @v4si32_cmp_gt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    353 entry:
    354   %cmp = icmp sgt <4 x i32> %x, %y
    355   %sext = sext <4 x i1> %cmp to <4 x i32>
    356   ret <4 x i32> %sext
    357 }
    358 ; CHECK-LABEL: v4si32_cmp_gt:
    359 ; CHECK: vcmpgtsw 2, 2, 3
    360 
    361 define <4 x i32> @v4ui32_cmp_gt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    362 entry:
    363   %cmp = icmp ugt <4 x i32> %x, %y
    364   %sext = sext <4 x i1> %cmp to <4 x i32>
    365   ret <4 x i32> %sext
    366 }
    367 ; CHECK-LABEL: v4ui32_cmp_gt:
    368 ; CHECK: vcmpgtuw 2, 2, 3
    369 
    370 define <4 x i32> @v4si32_cmp_ge(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    371 entry:
    372   %cmp = icmp sge <4 x i32> %x, %y
    373   %sext = sext <4 x i1> %cmp to <4 x i32>
    374   ret <4 x i32> %sext
    375 }
    376 ; CHECK-LABEL:      v4si32_cmp_ge:
    377 ; CHECK:      vcmpgtsw [[RET:[0-9]+]], 3, 2
    378 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    379 
    380 define <4 x i32> @v4ui32_cmp_ge(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
    381 entry:
    382   %cmp = icmp uge <4 x i32> %x, %y
    383   %sext = sext <4 x i1> %cmp to <4 x i32>
    384   ret <4 x i32> %sext
    385 }
    386 ; CHECK-LABEL:      v4ui32_cmp_ge:
    387 ; CHECK:      vcmpgtuw [[RET:[0-9]+]], 3, 2
    388 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    389 
    390 
    391 define <8 x i32> @v8si32_cmp(<8 x i32> %x, <8 x i32> %y) nounwind readnone {
    392   %cmp = icmp eq <8 x i32> %x, %y
    393   %sext = sext <8 x i1> %cmp to <8 x i32>
    394   ret <8 x i32> %sext
    395 }
    396 ; CHECK-LABEL: v8si32_cmp:
    397 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    398 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    399 
    400 
    401 define <16 x i32> @v16si32_cmp(<16 x i32> %x, <16 x i32> %y) nounwind readnone {
    402   %cmp = icmp eq <16 x i32> %x, %y
    403   %sext = sext <16 x i1> %cmp to <16 x i32>
    404   ret <16 x i32> %sext
    405 }
    406 ; CHECK-LABEL: v16si32_cmp:
    407 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    408 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    409 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    410 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    411 
    412 
    413 define <32 x i32> @v32si32_cmp(<32 x i32> %x, <32 x i32> %y) nounwind readnone {
    414   %cmp = icmp eq <32 x i32> %x, %y
    415   %sext = sext <32 x i1> %cmp to <32 x i32>
    416   ret <32 x i32> %sext
    417 }
    418 ; CHECK-LABEL: v32si32_cmp:
    419 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    420 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    421 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    422 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    423 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    424 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    425 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    426 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    427 
    428 
    429 define <2 x float> @v2f32_cmp(<2 x float> %x, <2 x float> %y) nounwind readnone {
    430 entry:
    431   %cmp = fcmp oeq <2 x float> %x, %y
    432   %sext = sext <2 x i1> %cmp to <2 x i32>
    433   %0 = bitcast <2 x i32> %sext to <2 x float>
    434   ret <2 x float> %0
    435 }
    436 ; CHECK-LABEL: v2f32_cmp:
    437 ; CHECK: vcmpeqfp {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    438 
    439 
    440 ; Additional tests for v4f32 since it is a altivec native type
    441 
    442 define <4 x float> @v4f32_cmp_eq(<4 x float> %x, <4 x float> %y) nounwind readnone {
    443 entry:
    444   %cmp = fcmp oeq <4 x float> %x, %y
    445   %sext = sext <4 x i1> %cmp to <4 x i32>
    446   %0 = bitcast <4 x i32> %sext to <4 x float>
    447   ret <4 x float> %0
    448 }
    449 ; CHECK-LABEL: v4f32_cmp_eq:
    450 ; CHECK: vcmpeqfp 2, 2, 3
    451 
    452 define <4 x float> @v4f32_cmp_ne(<4 x float> %x, <4 x float> %y) nounwind readnone {
    453 entry:
    454   %cmp = fcmp une <4 x float> %x, %y
    455   %sext = sext <4 x i1> %cmp to <4 x i32>
    456   %0 = bitcast <4 x i32> %sext to <4 x float>
    457   ret <4 x float> %0
    458 }
    459 ; CHECK-LABEL:      v4f32_cmp_ne:
    460 ; CHECK:      vcmpeqfp [[RET:[0-9]+]], 2, 3
    461 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    462 
    463 define <4 x float> @v4f32_cmp_le(<4 x float> %x, <4 x float> %y) nounwind readnone {
    464 entry:
    465   %cmp = fcmp ole <4 x float> %x, %y
    466   %sext = sext <4 x i1> %cmp to <4 x i32>
    467   %0 = bitcast <4 x i32> %sext to <4 x float>
    468   ret <4 x float> %0
    469 }
    470 ; CHECK-LABEL:      v4f32_cmp_le:
    471 ; CHECK: vcmpgefp 2, 3, 2
    472 
    473 define <4 x float> @v4f32_cmp_lt(<4 x float> %x, <4 x float> %y) nounwind readnone {
    474 entry:
    475   %cmp = fcmp olt <4 x float> %x, %y
    476   %sext = sext <4 x i1> %cmp to <4 x i32>
    477   %0 = bitcast <4 x i32> %sext to <4 x float>
    478   ret <4 x float> %0
    479 }
    480 ; CHECK-LABEL: v4f32_cmp_lt:
    481 ; CHECK: vcmpgtfp 2, 3, 2
    482 
    483 define <4 x float> @v4f32_cmp_ge(<4 x float> %x, <4 x float> %y) nounwind readnone {
    484 entry:
    485   %cmp = fcmp oge <4 x float> %x, %y
    486   %sext = sext <4 x i1> %cmp to <4 x i32>
    487   %0 = bitcast <4 x i32> %sext to <4 x float>
    488   ret <4 x float> %0
    489 }
    490 ; CHECK-LABEL: v4f32_cmp_ge:
    491 ; CHECK: vcmpgefp 2, 2, 3
    492 
    493 define <4 x float> @v4f32_cmp_gt(<4 x float> %x, <4 x float> %y) nounwind readnone {
    494 entry:
    495   %cmp = fcmp ogt <4 x float> %x, %y
    496   %sext = sext <4 x i1> %cmp to <4 x i32>
    497   %0 = bitcast <4 x i32> %sext to <4 x float>
    498   ret <4 x float> %0
    499 }
    500 ; CHECK-LABEL: v4f32_cmp_gt:
    501 ; CHECK: vcmpgtfp 2, 2, 3
    502 
    503 define <4 x float> @v4f32_cmp_ule(<4 x float> %x, <4 x float> %y) nounwind readnone {
    504 entry:
    505   %cmp = fcmp ule <4 x float> %x, %y
    506   %sext = sext <4 x i1> %cmp to <4 x i32>
    507   %0 = bitcast <4 x i32> %sext to <4 x float>
    508   ret <4 x float> %0
    509 }
    510 ; CHECK-LABEL: v4f32_cmp_ule:
    511 ; CHECK:      vcmpgtfp [[RET:[0-9]+]], 2, 3
    512 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    513 
    514 define <4 x float> @v4f32_cmp_ult(<4 x float> %x, <4 x float> %y) nounwind readnone {
    515 entry:
    516   %cmp = fcmp ult <4 x float> %x, %y
    517   %sext = sext <4 x i1> %cmp to <4 x i32>
    518   %0 = bitcast <4 x i32> %sext to <4 x float>
    519   ret <4 x float> %0
    520 }
    521 ; CHECK-LABEL: v4f32_cmp_ult:
    522 ; CHECK:      vcmpgefp [[RET:[0-9]+]], 2, 3
    523 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    524 
    525 define <4 x float> @v4f32_cmp_uge(<4 x float> %x, <4 x float> %y) nounwind readnone {
    526 entry:
    527   %cmp = fcmp uge <4 x float> %x, %y
    528   %sext = sext <4 x i1> %cmp to <4 x i32>
    529   %0 = bitcast <4 x i32> %sext to <4 x float>
    530   ret <4 x float> %0
    531 }
    532 ; CHECK-LABEL: v4f32_cmp_uge:
    533 ; CHECK:      vcmpgtfp [[RET:[0-9]+]], 3, 2
    534 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    535 
    536 define <4 x float> @v4f32_cmp_ugt(<4 x float> %x, <4 x float> %y) nounwind readnone {
    537 entry:
    538   %cmp = fcmp ugt <4 x float> %x, %y
    539   %sext = sext <4 x i1> %cmp to <4 x i32>
    540   %0 = bitcast <4 x i32> %sext to <4 x float>
    541   ret <4 x float> %0
    542 }
    543 ; CHECK-LABEL: v4f32_cmp_ugt:
    544 ; CHECK:      vcmpgefp [[RET:[0-9]+]], 3, 2
    545 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
    546 
    547 
    548 define <8 x float> @v8f32_cmp(<8 x float> %x, <8 x float> %y) nounwind readnone {
    549 entry:
    550   %cmp = fcmp oeq <8 x float> %x, %y
    551   %sext = sext <8 x i1> %cmp to <8 x i32>
    552   %0 = bitcast <8 x i32> %sext to <8 x float>
    553   ret <8 x float> %0
    554 }
    555 ; CHECK-LABEL: v8f32_cmp:
    556 ; CHECK: vcmpeqfp {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    557 ; CHECK: vcmpeqfp {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
    558