Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
      8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
      9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
     10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
     11 
     12 ;
     13 ; Equal
     14 ;
     15 
     16 define <2 x i64> @eq_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
     17 ; SSE2-LABEL: eq_v2i64:
     18 ; SSE2:       # BB#0:
     19 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
     20 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
     21 ; SSE2-NEXT:    pand %xmm1, %xmm0
     22 ; SSE2-NEXT:    retq
     23 ;
     24 ; SSE41-LABEL: eq_v2i64:
     25 ; SSE41:       # BB#0:
     26 ; SSE41-NEXT:    pcmpeqq %xmm1, %xmm0
     27 ; SSE41-NEXT:    retq
     28 ;
     29 ; SSE42-LABEL: eq_v2i64:
     30 ; SSE42:       # BB#0:
     31 ; SSE42-NEXT:    pcmpeqq %xmm1, %xmm0
     32 ; SSE42-NEXT:    retq
     33 ;
     34 ; AVX-LABEL: eq_v2i64:
     35 ; AVX:       # BB#0:
     36 ; AVX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
     37 ; AVX-NEXT:    retq
     38 ;
     39 ; XOP-LABEL: eq_v2i64:
     40 ; XOP:       # BB#0:
     41 ; XOP-NEXT:    vpcomeqq %xmm1, %xmm0, %xmm0
     42 ; XOP-NEXT:    retq
     43   %1 = icmp eq <2 x i64> %a, %b
     44   %2 = sext <2 x i1> %1 to <2 x i64>
     45   ret <2 x i64> %2
     46 }
     47 
     48 define <4 x i32> @eq_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
     49 ; SSE-LABEL: eq_v4i32:
     50 ; SSE:       # BB#0:
     51 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
     52 ; SSE-NEXT:    retq
     53 ;
     54 ; AVX-LABEL: eq_v4i32:
     55 ; AVX:       # BB#0:
     56 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
     57 ; AVX-NEXT:    retq
     58 ;
     59 ; XOP-LABEL: eq_v4i32:
     60 ; XOP:       # BB#0:
     61 ; XOP-NEXT:    vpcomeqd %xmm1, %xmm0, %xmm0
     62 ; XOP-NEXT:    retq
     63   %1 = icmp eq <4 x i32> %a, %b
     64   %2 = sext <4 x i1> %1 to <4 x i32>
     65   ret <4 x i32> %2
     66 }
     67 
     68 define <8 x i16> @eq_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
     69 ; SSE-LABEL: eq_v8i16:
     70 ; SSE:       # BB#0:
     71 ; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
     72 ; SSE-NEXT:    retq
     73 ;
     74 ; AVX-LABEL: eq_v8i16:
     75 ; AVX:       # BB#0:
     76 ; AVX-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
     77 ; AVX-NEXT:    retq
     78 ;
     79 ; XOP-LABEL: eq_v8i16:
     80 ; XOP:       # BB#0:
     81 ; XOP-NEXT:    vpcomeqw %xmm1, %xmm0, %xmm0
     82 ; XOP-NEXT:    retq
     83   %1 = icmp eq <8 x i16> %a, %b
     84   %2 = sext <8 x i1> %1 to <8 x i16>
     85   ret <8 x i16> %2
     86 }
     87 
     88 define <16 x i8> @eq_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
     89 ; SSE-LABEL: eq_v16i8:
     90 ; SSE:       # BB#0:
     91 ; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
     92 ; SSE-NEXT:    retq
     93 ;
     94 ; AVX-LABEL: eq_v16i8:
     95 ; AVX:       # BB#0:
     96 ; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
     97 ; AVX-NEXT:    retq
     98 ;
     99 ; XOP-LABEL: eq_v16i8:
    100 ; XOP:       # BB#0:
    101 ; XOP-NEXT:    vpcomeqb %xmm1, %xmm0, %xmm0
    102 ; XOP-NEXT:    retq
    103   %1 = icmp eq <16 x i8> %a, %b
    104   %2 = sext <16 x i1> %1 to <16 x i8>
    105   ret <16 x i8> %2
    106 }
    107 
    108 ;
    109 ; Not Equal
    110 ;
    111 
    112 define <2 x i64> @ne_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
    113 ; SSE2-LABEL: ne_v2i64:
    114 ; SSE2:       # BB#0:
    115 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
    116 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
    117 ; SSE2-NEXT:    pand %xmm1, %xmm0
    118 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
    119 ; SSE2-NEXT:    pxor %xmm1, %xmm0
    120 ; SSE2-NEXT:    retq
    121 ;
    122 ; SSE41-LABEL: ne_v2i64:
    123 ; SSE41:       # BB#0:
    124 ; SSE41-NEXT:    pcmpeqq %xmm1, %xmm0
    125 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
    126 ; SSE41-NEXT:    pxor %xmm1, %xmm0
    127 ; SSE41-NEXT:    retq
    128 ;
    129 ; SSE42-LABEL: ne_v2i64:
    130 ; SSE42:       # BB#0:
    131 ; SSE42-NEXT:    pcmpeqq %xmm1, %xmm0
    132 ; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
    133 ; SSE42-NEXT:    pxor %xmm1, %xmm0
    134 ; SSE42-NEXT:    retq
    135 ;
    136 ; AVX-LABEL: ne_v2i64:
    137 ; AVX:       # BB#0:
    138 ; AVX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
    139 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    140 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    141 ; AVX-NEXT:    retq
    142 ;
    143 ; XOP-LABEL: ne_v2i64:
    144 ; XOP:       # BB#0:
    145 ; XOP-NEXT:    vpcomneqq %xmm1, %xmm0, %xmm0
    146 ; XOP-NEXT:    retq
    147   %1 = icmp ne <2 x i64> %a, %b
    148   %2 = sext <2 x i1> %1 to <2 x i64>
    149   ret <2 x i64> %2
    150 }
    151 
    152 define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    153 ; SSE-LABEL: ne_v4i32:
    154 ; SSE:       # BB#0:
    155 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
    156 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
    157 ; SSE-NEXT:    pxor %xmm1, %xmm0
    158 ; SSE-NEXT:    retq
    159 ;
    160 ; AVX-LABEL: ne_v4i32:
    161 ; AVX:       # BB#0:
    162 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
    163 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    164 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    165 ; AVX-NEXT:    retq
    166 ;
    167 ; XOP-LABEL: ne_v4i32:
    168 ; XOP:       # BB#0:
    169 ; XOP-NEXT:    vpcomneqd %xmm1, %xmm0, %xmm0
    170 ; XOP-NEXT:    retq
    171   %1 = icmp ne <4 x i32> %a, %b
    172   %2 = sext <4 x i1> %1 to <4 x i32>
    173   ret <4 x i32> %2
    174 }
    175 
    176 define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    177 ; SSE-LABEL: ne_v8i16:
    178 ; SSE:       # BB#0:
    179 ; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
    180 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
    181 ; SSE-NEXT:    pxor %xmm1, %xmm0
    182 ; SSE-NEXT:    retq
    183 ;
    184 ; AVX-LABEL: ne_v8i16:
    185 ; AVX:       # BB#0:
    186 ; AVX-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
    187 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    188 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    189 ; AVX-NEXT:    retq
    190 ;
    191 ; XOP-LABEL: ne_v8i16:
    192 ; XOP:       # BB#0:
    193 ; XOP-NEXT:    vpcomneqw %xmm1, %xmm0, %xmm0
    194 ; XOP-NEXT:    retq
    195   %1 = icmp ne <8 x i16> %a, %b
    196   %2 = sext <8 x i1> %1 to <8 x i16>
    197   ret <8 x i16> %2
    198 }
    199 
    200 define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    201 ; SSE-LABEL: ne_v16i8:
    202 ; SSE:       # BB#0:
    203 ; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
    204 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
    205 ; SSE-NEXT:    pxor %xmm1, %xmm0
    206 ; SSE-NEXT:    retq
    207 ;
    208 ; AVX-LABEL: ne_v16i8:
    209 ; AVX:       # BB#0:
    210 ; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
    211 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    212 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    213 ; AVX-NEXT:    retq
    214 ;
    215 ; XOP-LABEL: ne_v16i8:
    216 ; XOP:       # BB#0:
    217 ; XOP-NEXT:    vpcomneqb %xmm1, %xmm0, %xmm0
    218 ; XOP-NEXT:    retq
    219   %1 = icmp ne <16 x i8> %a, %b
    220   %2 = sext <16 x i1> %1 to <16 x i8>
    221   ret <16 x i8> %2
    222 }
    223 
    224 ;
    225 ; Greater Than Or Equal
    226 ;
    227 
    228 define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
    229 ; SSE2-LABEL: ge_v2i64:
    230 ; SSE2:       # BB#0:
    231 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    232 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    233 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    234 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    235 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
    236 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    237 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
    238 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
    239 ; SSE2-NEXT:    pand %xmm3, %xmm0
    240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
    241 ; SSE2-NEXT:    por %xmm0, %xmm1
    242 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
    243 ; SSE2-NEXT:    pxor %xmm1, %xmm0
    244 ; SSE2-NEXT:    retq
    245 ;
    246 ; SSE41-LABEL: ge_v2i64:
    247 ; SSE41:       # BB#0:
    248 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    249 ; SSE41-NEXT:    pxor %xmm2, %xmm0
    250 ; SSE41-NEXT:    pxor %xmm2, %xmm1
    251 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    252 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
    253 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    254 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    255 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
    256 ; SSE41-NEXT:    pand %xmm3, %xmm0
    257 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
    258 ; SSE41-NEXT:    por %xmm0, %xmm1
    259 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
    260 ; SSE41-NEXT:    pxor %xmm1, %xmm0
    261 ; SSE41-NEXT:    retq
    262 ;
    263 ; SSE42-LABEL: ge_v2i64:
    264 ; SSE42:       # BB#0:
    265 ; SSE42-NEXT:    pcmpgtq %xmm0, %xmm1
    266 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm0
    267 ; SSE42-NEXT:    pxor %xmm1, %xmm0
    268 ; SSE42-NEXT:    retq
    269 ;
    270 ; AVX-LABEL: ge_v2i64:
    271 ; AVX:       # BB#0:
    272 ; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
    273 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    274 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    275 ; AVX-NEXT:    retq
    276 ;
    277 ; XOP-LABEL: ge_v2i64:
    278 ; XOP:       # BB#0:
    279 ; XOP-NEXT:    vpcomgeq %xmm1, %xmm0, %xmm0
    280 ; XOP-NEXT:    retq
    281   %1 = icmp sge <2 x i64> %a, %b
    282   %2 = sext <2 x i1> %1 to <2 x i64>
    283   ret <2 x i64> %2
    284 }
    285 
    286 define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    287 ; SSE-LABEL: ge_v4i32:
    288 ; SSE:       # BB#0:
    289 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
    290 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
    291 ; SSE-NEXT:    pxor %xmm1, %xmm0
    292 ; SSE-NEXT:    retq
    293 ;
    294 ; AVX-LABEL: ge_v4i32:
    295 ; AVX:       # BB#0:
    296 ; AVX-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
    297 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    298 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    299 ; AVX-NEXT:    retq
    300 ;
    301 ; XOP-LABEL: ge_v4i32:
    302 ; XOP:       # BB#0:
    303 ; XOP-NEXT:    vpcomged %xmm1, %xmm0, %xmm0
    304 ; XOP-NEXT:    retq
    305   %1 = icmp sge <4 x i32> %a, %b
    306   %2 = sext <4 x i1> %1 to <4 x i32>
    307   ret <4 x i32> %2
    308 }
    309 
    310 define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    311 ; SSE-LABEL: ge_v8i16:
    312 ; SSE:       # BB#0:
    313 ; SSE-NEXT:    pcmpgtw %xmm0, %xmm1
    314 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
    315 ; SSE-NEXT:    pxor %xmm1, %xmm0
    316 ; SSE-NEXT:    retq
    317 ;
    318 ; AVX-LABEL: ge_v8i16:
    319 ; AVX:       # BB#0:
    320 ; AVX-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
    321 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    322 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    323 ; AVX-NEXT:    retq
    324 ;
    325 ; XOP-LABEL: ge_v8i16:
    326 ; XOP:       # BB#0:
    327 ; XOP-NEXT:    vpcomgew %xmm1, %xmm0, %xmm0
    328 ; XOP-NEXT:    retq
    329   %1 = icmp sge <8 x i16> %a, %b
    330   %2 = sext <8 x i1> %1 to <8 x i16>
    331   ret <8 x i16> %2
    332 }
    333 
    334 define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    335 ; SSE-LABEL: ge_v16i8:
    336 ; SSE:       # BB#0:
    337 ; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
    338 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm0
    339 ; SSE-NEXT:    pxor %xmm1, %xmm0
    340 ; SSE-NEXT:    retq
    341 ;
    342 ; AVX-LABEL: ge_v16i8:
    343 ; AVX:       # BB#0:
    344 ; AVX-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
    345 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    346 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    347 ; AVX-NEXT:    retq
    348 ;
    349 ; XOP-LABEL: ge_v16i8:
    350 ; XOP:       # BB#0:
    351 ; XOP-NEXT:    vpcomgeb %xmm1, %xmm0, %xmm0
    352 ; XOP-NEXT:    retq
    353   %1 = icmp sge <16 x i8> %a, %b
    354   %2 = sext <16 x i1> %1 to <16 x i8>
    355   ret <16 x i8> %2
    356 }
    357 
    358 ;
    359 ; Greater Than
    360 ;
    361 
    362 define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
    363 ; SSE2-LABEL: gt_v2i64:
    364 ; SSE2:       # BB#0:
    365 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    366 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    367 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    368 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    369 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
    370 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    371 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
    372 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    373 ; SSE2-NEXT:    pand %xmm3, %xmm1
    374 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    375 ; SSE2-NEXT:    por %xmm1, %xmm0
    376 ; SSE2-NEXT:    retq
    377 ;
    378 ; SSE41-LABEL: gt_v2i64:
    379 ; SSE41:       # BB#0:
    380 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    381 ; SSE41-NEXT:    pxor %xmm2, %xmm1
    382 ; SSE41-NEXT:    pxor %xmm2, %xmm0
    383 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    384 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
    385 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    386 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
    387 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    388 ; SSE41-NEXT:    pand %xmm3, %xmm1
    389 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    390 ; SSE41-NEXT:    por %xmm1, %xmm0
    391 ; SSE41-NEXT:    retq
    392 ;
    393 ; SSE42-LABEL: gt_v2i64:
    394 ; SSE42:       # BB#0:
    395 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
    396 ; SSE42-NEXT:    retq
    397 ;
    398 ; AVX-LABEL: gt_v2i64:
    399 ; AVX:       # BB#0:
    400 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
    401 ; AVX-NEXT:    retq
    402 ;
    403 ; XOP-LABEL: gt_v2i64:
    404 ; XOP:       # BB#0:
    405 ; XOP-NEXT:    vpcomgtq %xmm1, %xmm0, %xmm0
    406 ; XOP-NEXT:    retq
    407   %1 = icmp sgt <2 x i64> %a, %b
    408   %2 = sext <2 x i1> %1 to <2 x i64>
    409   ret <2 x i64> %2
    410 }
    411 
    412 define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    413 ; SSE-LABEL: gt_v4i32:
    414 ; SSE:       # BB#0:
    415 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
    416 ; SSE-NEXT:    retq
    417 ;
    418 ; AVX-LABEL: gt_v4i32:
    419 ; AVX:       # BB#0:
    420 ; AVX-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
    421 ; AVX-NEXT:    retq
    422 ;
    423 ; XOP-LABEL: gt_v4i32:
    424 ; XOP:       # BB#0:
    425 ; XOP-NEXT:    vpcomgtd %xmm1, %xmm0, %xmm0
    426 ; XOP-NEXT:    retq
    427   %1 = icmp sgt <4 x i32> %a, %b
    428   %2 = sext <4 x i1> %1 to <4 x i32>
    429   ret <4 x i32> %2
    430 }
    431 
    432 define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    433 ; SSE-LABEL: gt_v8i16:
    434 ; SSE:       # BB#0:
    435 ; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
    436 ; SSE-NEXT:    retq
    437 ;
    438 ; AVX-LABEL: gt_v8i16:
    439 ; AVX:       # BB#0:
    440 ; AVX-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
    441 ; AVX-NEXT:    retq
    442 ;
    443 ; XOP-LABEL: gt_v8i16:
    444 ; XOP:       # BB#0:
    445 ; XOP-NEXT:    vpcomgtw %xmm1, %xmm0, %xmm0
    446 ; XOP-NEXT:    retq
    447   %1 = icmp sgt <8 x i16> %a, %b
    448   %2 = sext <8 x i1> %1 to <8 x i16>
    449   ret <8 x i16> %2
    450 }
    451 
    452 define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    453 ; SSE-LABEL: gt_v16i8:
    454 ; SSE:       # BB#0:
    455 ; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
    456 ; SSE-NEXT:    retq
    457 ;
    458 ; AVX-LABEL: gt_v16i8:
    459 ; AVX:       # BB#0:
    460 ; AVX-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
    461 ; AVX-NEXT:    retq
    462 ;
    463 ; XOP-LABEL: gt_v16i8:
    464 ; XOP:       # BB#0:
    465 ; XOP-NEXT:    vpcomgtb %xmm1, %xmm0, %xmm0
    466 ; XOP-NEXT:    retq
    467   %1 = icmp sgt <16 x i8> %a, %b
    468   %2 = sext <16 x i1> %1 to <16 x i8>
    469   ret <16 x i8> %2
    470 }
    471 
    472 ;
    473 ; Less Than Or Equal
    474 ;
    475 
    476 define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
    477 ; SSE2-LABEL: le_v2i64:
    478 ; SSE2:       # BB#0:
    479 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    480 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    481 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    482 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    483 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
    484 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    485 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
    486 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
    487 ; SSE2-NEXT:    pand %xmm3, %xmm0
    488 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
    489 ; SSE2-NEXT:    por %xmm0, %xmm1
    490 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
    491 ; SSE2-NEXT:    pxor %xmm1, %xmm0
    492 ; SSE2-NEXT:    retq
    493 ;
    494 ; SSE41-LABEL: le_v2i64:
    495 ; SSE41:       # BB#0:
    496 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    497 ; SSE41-NEXT:    pxor %xmm2, %xmm1
    498 ; SSE41-NEXT:    pxor %xmm2, %xmm0
    499 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    500 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm2
    501 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    502 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
    503 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
    504 ; SSE41-NEXT:    pand %xmm3, %xmm0
    505 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
    506 ; SSE41-NEXT:    por %xmm0, %xmm1
    507 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
    508 ; SSE41-NEXT:    pxor %xmm1, %xmm0
    509 ; SSE41-NEXT:    retq
    510 ;
    511 ; SSE42-LABEL: le_v2i64:
    512 ; SSE42:       # BB#0:
    513 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
    514 ; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
    515 ; SSE42-NEXT:    pxor %xmm1, %xmm0
    516 ; SSE42-NEXT:    retq
    517 ;
    518 ; AVX-LABEL: le_v2i64:
    519 ; AVX:       # BB#0:
    520 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
    521 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    522 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    523 ; AVX-NEXT:    retq
    524 ;
    525 ; XOP-LABEL: le_v2i64:
    526 ; XOP:       # BB#0:
    527 ; XOP-NEXT:    vpcomleq %xmm1, %xmm0, %xmm0
    528 ; XOP-NEXT:    retq
    529   %1 = icmp sle <2 x i64> %a, %b
    530   %2 = sext <2 x i1> %1 to <2 x i64>
    531   ret <2 x i64> %2
    532 }
    533 
    534 define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    535 ; SSE-LABEL: le_v4i32:
    536 ; SSE:       # BB#0:
    537 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
    538 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
    539 ; SSE-NEXT:    pxor %xmm1, %xmm0
    540 ; SSE-NEXT:    retq
    541 ;
    542 ; AVX-LABEL: le_v4i32:
    543 ; AVX:       # BB#0:
    544 ; AVX-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
    545 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    546 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    547 ; AVX-NEXT:    retq
    548 ;
    549 ; XOP-LABEL: le_v4i32:
    550 ; XOP:       # BB#0:
    551 ; XOP-NEXT:    vpcomled %xmm1, %xmm0, %xmm0
    552 ; XOP-NEXT:    retq
    553   %1 = icmp sle <4 x i32> %a, %b
    554   %2 = sext <4 x i1> %1 to <4 x i32>
    555   ret <4 x i32> %2
    556 }
    557 
    558 define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    559 ; SSE-LABEL: le_v8i16:
    560 ; SSE:       # BB#0:
    561 ; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
    562 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
    563 ; SSE-NEXT:    pxor %xmm1, %xmm0
    564 ; SSE-NEXT:    retq
    565 ;
    566 ; AVX-LABEL: le_v8i16:
    567 ; AVX:       # BB#0:
    568 ; AVX-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
    569 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    570 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    571 ; AVX-NEXT:    retq
    572 ;
    573 ; XOP-LABEL: le_v8i16:
    574 ; XOP:       # BB#0:
    575 ; XOP-NEXT:    vpcomlew %xmm1, %xmm0, %xmm0
    576 ; XOP-NEXT:    retq
    577   %1 = icmp sle <8 x i16> %a, %b
    578   %2 = sext <8 x i1> %1 to <8 x i16>
    579   ret <8 x i16> %2
    580 }
    581 
    582 define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    583 ; SSE-LABEL: le_v16i8:
    584 ; SSE:       # BB#0:
    585 ; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
    586 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
    587 ; SSE-NEXT:    pxor %xmm1, %xmm0
    588 ; SSE-NEXT:    retq
    589 ;
    590 ; AVX-LABEL: le_v16i8:
    591 ; AVX:       # BB#0:
    592 ; AVX-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
    593 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
    594 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
    595 ; AVX-NEXT:    retq
    596 ;
    597 ; XOP-LABEL: le_v16i8:
    598 ; XOP:       # BB#0:
    599 ; XOP-NEXT:    vpcomleb %xmm1, %xmm0, %xmm0
    600 ; XOP-NEXT:    retq
    601   %1 = icmp sle <16 x i8> %a, %b
    602   %2 = sext <16 x i1> %1 to <16 x i8>
    603   ret <16 x i8> %2
    604 }
    605 
    606 ;
    607 ; Less Than
    608 ;
    609 
    610 define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
    611 ; SSE2-LABEL: lt_v2i64:
    612 ; SSE2:       # BB#0:
    613 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    614 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    615 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    616 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    617 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
    618 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    619 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
    620 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    621 ; SSE2-NEXT:    pand %xmm3, %xmm1
    622 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    623 ; SSE2-NEXT:    por %xmm1, %xmm0
    624 ; SSE2-NEXT:    retq
    625 ;
    626 ; SSE41-LABEL: lt_v2i64:
    627 ; SSE41:       # BB#0:
    628 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
    629 ; SSE41-NEXT:    pxor %xmm2, %xmm0
    630 ; SSE41-NEXT:    pxor %xmm2, %xmm1
    631 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    632 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
    633 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    634 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    635 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    636 ; SSE41-NEXT:    pand %xmm3, %xmm1
    637 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    638 ; SSE41-NEXT:    por %xmm1, %xmm0
    639 ; SSE41-NEXT:    retq
    640 ;
    641 ; SSE42-LABEL: lt_v2i64:
    642 ; SSE42:       # BB#0:
    643 ; SSE42-NEXT:    pcmpgtq %xmm0, %xmm1
    644 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
    645 ; SSE42-NEXT:    retq
    646 ;
    647 ; AVX-LABEL: lt_v2i64:
    648 ; AVX:       # BB#0:
    649 ; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
    650 ; AVX-NEXT:    retq
    651 ;
    652 ; XOP-LABEL: lt_v2i64:
    653 ; XOP:       # BB#0:
    654 ; XOP-NEXT:    vpcomltq %xmm1, %xmm0, %xmm0
    655 ; XOP-NEXT:    retq
    656   %1 = icmp slt <2 x i64> %a, %b
    657   %2 = sext <2 x i1> %1 to <2 x i64>
    658   ret <2 x i64> %2
    659 }
    660 
    661 define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
    662 ; SSE-LABEL: lt_v4i32:
    663 ; SSE:       # BB#0:
    664 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
    665 ; SSE-NEXT:    movdqa %xmm1, %xmm0
    666 ; SSE-NEXT:    retq
    667 ;
    668 ; AVX-LABEL: lt_v4i32:
    669 ; AVX:       # BB#0:
    670 ; AVX-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
    671 ; AVX-NEXT:    retq
    672 ;
    673 ; XOP-LABEL: lt_v4i32:
    674 ; XOP:       # BB#0:
    675 ; XOP-NEXT:    vpcomltd %xmm1, %xmm0, %xmm0
    676 ; XOP-NEXT:    retq
    677   %1 = icmp slt <4 x i32> %a, %b
    678   %2 = sext <4 x i1> %1 to <4 x i32>
    679   ret <4 x i32> %2
    680 }
    681 
    682 define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
    683 ; SSE-LABEL: lt_v8i16:
    684 ; SSE:       # BB#0:
    685 ; SSE-NEXT:    pcmpgtw %xmm0, %xmm1
    686 ; SSE-NEXT:    movdqa %xmm1, %xmm0
    687 ; SSE-NEXT:    retq
    688 ;
    689 ; AVX-LABEL: lt_v8i16:
    690 ; AVX:       # BB#0:
    691 ; AVX-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
    692 ; AVX-NEXT:    retq
    693 ;
    694 ; XOP-LABEL: lt_v8i16:
    695 ; XOP:       # BB#0:
    696 ; XOP-NEXT:    vpcomltw %xmm1, %xmm0, %xmm0
    697 ; XOP-NEXT:    retq
    698   %1 = icmp slt <8 x i16> %a, %b
    699   %2 = sext <8 x i1> %1 to <8 x i16>
    700   ret <8 x i16> %2
    701 }
    702 
    703 define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
    704 ; SSE-LABEL: lt_v16i8:
    705 ; SSE:       # BB#0:
    706 ; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
    707 ; SSE-NEXT:    movdqa %xmm1, %xmm0
    708 ; SSE-NEXT:    retq
    709 ;
    710 ; AVX-LABEL: lt_v16i8:
    711 ; AVX:       # BB#0:
    712 ; AVX-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
    713 ; AVX-NEXT:    retq
    714 ;
    715 ; XOP-LABEL: lt_v16i8:
    716 ; XOP:       # BB#0:
    717 ; XOP-NEXT:    vpcomltb %xmm1, %xmm0, %xmm0
    718 ; XOP-NEXT:    retq
    719   %1 = icmp slt <16 x i8> %a, %b
    720   %2 = sext <16 x i1> %1 to <16 x i8>
    721   ret <16 x i8> %2
    722 }
    723