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 -mattr=+sse2    | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3   | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
      4 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx     | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2    | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
      6 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512
      7 
      8 define <4 x i32> @test1(<4 x i32> %a) nounwind {
      9 ; SSE2-LABEL: test1:
     10 ; SSE2:       # BB#0:
     11 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
     12 ; SSE2-NEXT:    psrad $31, %xmm1
     13 ; SSE2-NEXT:    paddd %xmm1, %xmm0
     14 ; SSE2-NEXT:    pxor %xmm1, %xmm0
     15 ; SSE2-NEXT:    retq
     16 ;
     17 ; SSSE3-LABEL: test1:
     18 ; SSSE3:       # BB#0:
     19 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
     20 ; SSSE3-NEXT:    retq
     21 ;
     22 ; AVX-LABEL: test1:
     23 ; AVX:       # BB#0:
     24 ; AVX-NEXT:    vpabsd %xmm0, %xmm0
     25 ; AVX-NEXT:    retq
     26   %tmp1neg = sub <4 x i32> zeroinitializer, %a
     27   %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1>
     28   %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
     29   ret <4 x i32> %abs
     30 }
     31 
     32 define <4 x i32> @test2(<4 x i32> %a) nounwind {
     33 ; SSE2-LABEL: test2:
     34 ; SSE2:       # BB#0:
     35 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
     36 ; SSE2-NEXT:    psrad $31, %xmm1
     37 ; SSE2-NEXT:    paddd %xmm1, %xmm0
     38 ; SSE2-NEXT:    pxor %xmm1, %xmm0
     39 ; SSE2-NEXT:    retq
     40 ;
     41 ; SSSE3-LABEL: test2:
     42 ; SSSE3:       # BB#0:
     43 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
     44 ; SSSE3-NEXT:    retq
     45 ;
     46 ; AVX-LABEL: test2:
     47 ; AVX:       # BB#0:
     48 ; AVX-NEXT:    vpabsd %xmm0, %xmm0
     49 ; AVX-NEXT:    retq
     50   %tmp1neg = sub <4 x i32> zeroinitializer, %a
     51   %b = icmp sge <4 x i32> %a, zeroinitializer
     52   %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg
     53   ret <4 x i32> %abs
     54 }
     55 
     56 define <8 x i16> @test3(<8 x i16> %a) nounwind {
     57 ; SSE2-LABEL: test3:
     58 ; SSE2:       # BB#0:
     59 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
     60 ; SSE2-NEXT:    psraw $15, %xmm1
     61 ; SSE2-NEXT:    paddw %xmm1, %xmm0
     62 ; SSE2-NEXT:    pxor %xmm1, %xmm0
     63 ; SSE2-NEXT:    retq
     64 ;
     65 ; SSSE3-LABEL: test3:
     66 ; SSSE3:       # BB#0:
     67 ; SSSE3-NEXT:    pabsw %xmm0, %xmm0
     68 ; SSSE3-NEXT:    retq
     69 ;
     70 ; AVX-LABEL: test3:
     71 ; AVX:       # BB#0:
     72 ; AVX-NEXT:    vpabsw %xmm0, %xmm0
     73 ; AVX-NEXT:    retq
     74   %tmp1neg = sub <8 x i16> zeroinitializer, %a
     75   %b = icmp sgt <8 x i16> %a, zeroinitializer
     76   %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg
     77   ret <8 x i16> %abs
     78 }
     79 
     80 define <16 x i8> @test4(<16 x i8> %a) nounwind {
     81 ; SSE2-LABEL: test4:
     82 ; SSE2:       # BB#0:
     83 ; SSE2-NEXT:    pxor %xmm1, %xmm1
     84 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
     85 ; SSE2-NEXT:    paddb %xmm1, %xmm0
     86 ; SSE2-NEXT:    pxor %xmm1, %xmm0
     87 ; SSE2-NEXT:    retq
     88 ;
     89 ; SSSE3-LABEL: test4:
     90 ; SSSE3:       # BB#0:
     91 ; SSSE3-NEXT:    pabsb %xmm0, %xmm0
     92 ; SSSE3-NEXT:    retq
     93 ;
     94 ; AVX-LABEL: test4:
     95 ; AVX:       # BB#0:
     96 ; AVX-NEXT:    vpabsb %xmm0, %xmm0
     97 ; AVX-NEXT:    retq
     98   %tmp1neg = sub <16 x i8> zeroinitializer, %a
     99   %b = icmp slt <16 x i8> %a, zeroinitializer
    100   %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a
    101   ret <16 x i8> %abs
    102 }
    103 
    104 define <4 x i32> @test5(<4 x i32> %a) nounwind {
    105 ; SSE2-LABEL: test5:
    106 ; SSE2:       # BB#0:
    107 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    108 ; SSE2-NEXT:    psrad $31, %xmm1
    109 ; SSE2-NEXT:    paddd %xmm1, %xmm0
    110 ; SSE2-NEXT:    pxor %xmm1, %xmm0
    111 ; SSE2-NEXT:    retq
    112 ;
    113 ; SSSE3-LABEL: test5:
    114 ; SSSE3:       # BB#0:
    115 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
    116 ; SSSE3-NEXT:    retq
    117 ;
    118 ; AVX-LABEL: test5:
    119 ; AVX:       # BB#0:
    120 ; AVX-NEXT:    vpabsd %xmm0, %xmm0
    121 ; AVX-NEXT:    retq
    122   %tmp1neg = sub <4 x i32> zeroinitializer, %a
    123   %b = icmp sle <4 x i32> %a, zeroinitializer
    124   %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a
    125   ret <4 x i32> %abs
    126 }
    127 
    128 define <8 x i32> @test6(<8 x i32> %a) nounwind {
    129 ; SSE2-LABEL: test6:
    130 ; SSE2:       # BB#0:
    131 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    132 ; SSE2-NEXT:    psrad $31, %xmm2
    133 ; SSE2-NEXT:    paddd %xmm2, %xmm0
    134 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    135 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    136 ; SSE2-NEXT:    psrad $31, %xmm2
    137 ; SSE2-NEXT:    paddd %xmm2, %xmm1
    138 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    139 ; SSE2-NEXT:    retq
    140 ;
    141 ; SSSE3-LABEL: test6:
    142 ; SSSE3:       # BB#0:
    143 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
    144 ; SSSE3-NEXT:    pabsd %xmm1, %xmm1
    145 ; SSSE3-NEXT:    retq
    146 ;
    147 ; AVX1-LABEL: test6:
    148 ; AVX1:       # BB#0:
    149 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    150 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
    151 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
    152 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
    153 ; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
    154 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    155 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
    156 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
    157 ; AVX1-NEXT:    retq
    158 ;
    159 ; AVX2-LABEL: test6:
    160 ; AVX2:       # BB#0:
    161 ; AVX2-NEXT:    vpabsd %ymm0, %ymm0
    162 ; AVX2-NEXT:    retq
    163 ;
    164 ; AVX512-LABEL: test6:
    165 ; AVX512:       # BB#0:
    166 ; AVX512-NEXT:    vpabsd %ymm0, %ymm0
    167 ; AVX512-NEXT:    retq
    168   %tmp1neg = sub <8 x i32> zeroinitializer, %a
    169   %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
    170   %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
    171   ret <8 x i32> %abs
    172 }
    173 
    174 define <8 x i32> @test7(<8 x i32> %a) nounwind {
    175 ; SSE2-LABEL: test7:
    176 ; SSE2:       # BB#0:
    177 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    178 ; SSE2-NEXT:    psrad $31, %xmm2
    179 ; SSE2-NEXT:    paddd %xmm2, %xmm0
    180 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    181 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    182 ; SSE2-NEXT:    psrad $31, %xmm2
    183 ; SSE2-NEXT:    paddd %xmm2, %xmm1
    184 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    185 ; SSE2-NEXT:    retq
    186 ;
    187 ; SSSE3-LABEL: test7:
    188 ; SSSE3:       # BB#0:
    189 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
    190 ; SSSE3-NEXT:    pabsd %xmm1, %xmm1
    191 ; SSSE3-NEXT:    retq
    192 ;
    193 ; AVX1-LABEL: test7:
    194 ; AVX1:       # BB#0:
    195 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    196 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
    197 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
    198 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
    199 ; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
    200 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    201 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
    202 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
    203 ; AVX1-NEXT:    retq
    204 ;
    205 ; AVX2-LABEL: test7:
    206 ; AVX2:       # BB#0:
    207 ; AVX2-NEXT:    vpabsd %ymm0, %ymm0
    208 ; AVX2-NEXT:    retq
    209 ;
    210 ; AVX512-LABEL: test7:
    211 ; AVX512:       # BB#0:
    212 ; AVX512-NEXT:    vpabsd %ymm0, %ymm0
    213 ; AVX512-NEXT:    retq
    214   %tmp1neg = sub <8 x i32> zeroinitializer, %a
    215   %b = icmp sge <8 x i32> %a, zeroinitializer
    216   %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg
    217   ret <8 x i32> %abs
    218 }
    219 
    220 define <16 x i16> @test8(<16 x i16> %a) nounwind {
    221 ; SSE2-LABEL: test8:
    222 ; SSE2:       # BB#0:
    223 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    224 ; SSE2-NEXT:    psraw $15, %xmm2
    225 ; SSE2-NEXT:    paddw %xmm2, %xmm0
    226 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    227 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    228 ; SSE2-NEXT:    psraw $15, %xmm2
    229 ; SSE2-NEXT:    paddw %xmm2, %xmm1
    230 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    231 ; SSE2-NEXT:    retq
    232 ;
    233 ; SSSE3-LABEL: test8:
    234 ; SSSE3:       # BB#0:
    235 ; SSSE3-NEXT:    pabsw %xmm0, %xmm0
    236 ; SSSE3-NEXT:    pabsw %xmm1, %xmm1
    237 ; SSSE3-NEXT:    retq
    238 ;
    239 ; AVX1-LABEL: test8:
    240 ; AVX1:       # BB#0:
    241 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    242 ; AVX1-NEXT:    vpsraw $15, %xmm1, %xmm2
    243 ; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
    244 ; AVX1-NEXT:    vpsraw $15, %xmm0, %xmm3
    245 ; AVX1-NEXT:    vpaddw %xmm3, %xmm0, %xmm0
    246 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    247 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
    248 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
    249 ; AVX1-NEXT:    retq
    250 ;
    251 ; AVX2-LABEL: test8:
    252 ; AVX2:       # BB#0:
    253 ; AVX2-NEXT:    vpabsw %ymm0, %ymm0
    254 ; AVX2-NEXT:    retq
    255 ;
    256 ; AVX512-LABEL: test8:
    257 ; AVX512:       # BB#0:
    258 ; AVX512-NEXT:    vpabsw %ymm0, %ymm0
    259 ; AVX512-NEXT:    retq
    260   %tmp1neg = sub <16 x i16> zeroinitializer, %a
    261   %b = icmp sgt <16 x i16> %a, zeroinitializer
    262   %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg
    263   ret <16 x i16> %abs
    264 }
    265 
    266 define <32 x i8> @test9(<32 x i8> %a) nounwind {
    267 ; SSE2-LABEL: test9:
    268 ; SSE2:       # BB#0:
    269 ; SSE2-NEXT:    pxor %xmm2, %xmm2
    270 ; SSE2-NEXT:    pxor %xmm3, %xmm3
    271 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm3
    272 ; SSE2-NEXT:    paddb %xmm3, %xmm0
    273 ; SSE2-NEXT:    pxor %xmm3, %xmm0
    274 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
    275 ; SSE2-NEXT:    paddb %xmm2, %xmm1
    276 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    277 ; SSE2-NEXT:    retq
    278 ;
    279 ; SSSE3-LABEL: test9:
    280 ; SSSE3:       # BB#0:
    281 ; SSSE3-NEXT:    pabsb %xmm0, %xmm0
    282 ; SSSE3-NEXT:    pabsb %xmm1, %xmm1
    283 ; SSSE3-NEXT:    retq
    284 ;
    285 ; AVX1-LABEL: test9:
    286 ; AVX1:       # BB#0:
    287 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    288 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    289 ; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm3
    290 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm2
    291 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm4
    292 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
    293 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
    294 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    295 ; AVX1-NEXT:    vxorps %ymm4, %ymm0, %ymm0
    296 ; AVX1-NEXT:    retq
    297 ;
    298 ; AVX2-LABEL: test9:
    299 ; AVX2:       # BB#0:
    300 ; AVX2-NEXT:    vpabsb %ymm0, %ymm0
    301 ; AVX2-NEXT:    retq
    302 ;
    303 ; AVX512-LABEL: test9:
    304 ; AVX512:       # BB#0:
    305 ; AVX512-NEXT:    vpabsb %ymm0, %ymm0
    306 ; AVX512-NEXT:    retq
    307   %tmp1neg = sub <32 x i8> zeroinitializer, %a
    308   %b = icmp slt <32 x i8> %a, zeroinitializer
    309   %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a
    310   ret <32 x i8> %abs
    311 }
    312 
    313 define <8 x i32> @test10(<8 x i32> %a) nounwind {
    314 ; SSE2-LABEL: test10:
    315 ; SSE2:       # BB#0:
    316 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    317 ; SSE2-NEXT:    psrad $31, %xmm2
    318 ; SSE2-NEXT:    paddd %xmm2, %xmm0
    319 ; SSE2-NEXT:    pxor %xmm2, %xmm0
    320 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    321 ; SSE2-NEXT:    psrad $31, %xmm2
    322 ; SSE2-NEXT:    paddd %xmm2, %xmm1
    323 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    324 ; SSE2-NEXT:    retq
    325 ;
    326 ; SSSE3-LABEL: test10:
    327 ; SSSE3:       # BB#0:
    328 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
    329 ; SSSE3-NEXT:    pabsd %xmm1, %xmm1
    330 ; SSSE3-NEXT:    retq
    331 ;
    332 ; AVX1-LABEL: test10:
    333 ; AVX1:       # BB#0:
    334 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    335 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
    336 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
    337 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm3
    338 ; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
    339 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    340 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm1
    341 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
    342 ; AVX1-NEXT:    retq
    343 ;
    344 ; AVX2-LABEL: test10:
    345 ; AVX2:       # BB#0:
    346 ; AVX2-NEXT:    vpabsd %ymm0, %ymm0
    347 ; AVX2-NEXT:    retq
    348 ;
    349 ; AVX512-LABEL: test10:
    350 ; AVX512:       # BB#0:
    351 ; AVX512-NEXT:    vpabsd %ymm0, %ymm0
    352 ; AVX512-NEXT:    retq
    353   %tmp1neg = sub <8 x i32> zeroinitializer, %a
    354   %b = icmp sle <8 x i32> %a, zeroinitializer
    355   %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a
    356   ret <8 x i32> %abs
    357 }
    358 
    359 define <16 x i32> @test11(<16 x i32> %a) nounwind {
    360 ; SSE2-LABEL: test11:
    361 ; SSE2:       # BB#0:
    362 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
    363 ; SSE2-NEXT:    psrad $31, %xmm4
    364 ; SSE2-NEXT:    paddd %xmm4, %xmm0
    365 ; SSE2-NEXT:    pxor %xmm4, %xmm0
    366 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    367 ; SSE2-NEXT:    psrad $31, %xmm4
    368 ; SSE2-NEXT:    paddd %xmm4, %xmm1
    369 ; SSE2-NEXT:    pxor %xmm4, %xmm1
    370 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
    371 ; SSE2-NEXT:    psrad $31, %xmm4
    372 ; SSE2-NEXT:    paddd %xmm4, %xmm2
    373 ; SSE2-NEXT:    pxor %xmm4, %xmm2
    374 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    375 ; SSE2-NEXT:    psrad $31, %xmm4
    376 ; SSE2-NEXT:    paddd %xmm4, %xmm3
    377 ; SSE2-NEXT:    pxor %xmm4, %xmm3
    378 ; SSE2-NEXT:    retq
    379 ;
    380 ; SSSE3-LABEL: test11:
    381 ; SSSE3:       # BB#0:
    382 ; SSSE3-NEXT:    pabsd %xmm0, %xmm0
    383 ; SSSE3-NEXT:    pabsd %xmm1, %xmm1
    384 ; SSSE3-NEXT:    pabsd %xmm2, %xmm2
    385 ; SSSE3-NEXT:    pabsd %xmm3, %xmm3
    386 ; SSSE3-NEXT:    retq
    387 ;
    388 ; AVX1-LABEL: test11:
    389 ; AVX1:       # BB#0:
    390 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    391 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
    392 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
    393 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
    394 ; AVX1-NEXT:    vpaddd %xmm4, %xmm0, %xmm0
    395 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    396 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
    397 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
    398 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    399 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
    400 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
    401 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
    402 ; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm1
    403 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
    404 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
    405 ; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
    406 ; AVX1-NEXT:    retq
    407 ;
    408 ; AVX2-LABEL: test11:
    409 ; AVX2:       # BB#0:
    410 ; AVX2-NEXT:    vpabsd %ymm0, %ymm0
    411 ; AVX2-NEXT:    vpabsd %ymm1, %ymm1
    412 ; AVX2-NEXT:    retq
    413 ;
    414 ; AVX512-LABEL: test11:
    415 ; AVX512:       # BB#0:
    416 ; AVX512-NEXT:    vpabsd %zmm0, %zmm0
    417 ; AVX512-NEXT:    retq
    418   %tmp1neg = sub <16 x i32> zeroinitializer, %a
    419   %b = icmp sle <16 x i32> %a, zeroinitializer
    420   %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a
    421   ret <16 x i32> %abs
    422 }
    423 
    424 define <8 x i64> @test12(<8 x i64> %a) nounwind {
    425 ; SSE-LABEL: test12:
    426 ; SSE:       # BB#0:
    427 ; SSE-NEXT:    movdqa %xmm0, %xmm4
    428 ; SSE-NEXT:    psrad $31, %xmm4
    429 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    430 ; SSE-NEXT:    paddq %xmm4, %xmm0
    431 ; SSE-NEXT:    pxor %xmm4, %xmm0
    432 ; SSE-NEXT:    movdqa %xmm1, %xmm4
    433 ; SSE-NEXT:    psrad $31, %xmm4
    434 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    435 ; SSE-NEXT:    paddq %xmm4, %xmm1
    436 ; SSE-NEXT:    pxor %xmm4, %xmm1
    437 ; SSE-NEXT:    movdqa %xmm2, %xmm4
    438 ; SSE-NEXT:    psrad $31, %xmm4
    439 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    440 ; SSE-NEXT:    paddq %xmm4, %xmm2
    441 ; SSE-NEXT:    pxor %xmm4, %xmm2
    442 ; SSE-NEXT:    movdqa %xmm3, %xmm4
    443 ; SSE-NEXT:    psrad $31, %xmm4
    444 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    445 ; SSE-NEXT:    paddq %xmm4, %xmm3
    446 ; SSE-NEXT:    pxor %xmm4, %xmm3
    447 ; SSE-NEXT:    retq
    448 ;
    449 ; AVX1-LABEL: test12:
    450 ; AVX1:       # BB#0:
    451 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    452 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
    453 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    454 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
    455 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
    456 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    457 ; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
    458 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    459 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
    460 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
    461 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    462 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
    463 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    464 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
    465 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
    466 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    467 ; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1
    468 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
    469 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
    470 ; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
    471 ; AVX1-NEXT:    retq
    472 ;
    473 ; AVX2-LABEL: test12:
    474 ; AVX2:       # BB#0:
    475 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
    476 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
    477 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
    478 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
    479 ; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
    480 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
    481 ; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
    482 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
    483 ; AVX2-NEXT:    retq
    484 ;
    485 ; AVX512-LABEL: test12:
    486 ; AVX512:       # BB#0:
    487 ; AVX512-NEXT:    vpabsq %zmm0, %zmm0
    488 ; AVX512-NEXT:    retq
    489   %tmp1neg = sub <8 x i64> zeroinitializer, %a
    490   %b = icmp sle <8 x i64> %a, zeroinitializer
    491   %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
    492   ret <8 x i64> %abs
    493 }
    494 
    495 define <8 x i64> @test13(<8 x i64>* %a.ptr) nounwind {
    496 ; SSE-LABEL: test13:
    497 ; SSE:       # BB#0:
    498 ; SSE-NEXT:    movdqu (%rdi), %xmm0
    499 ; SSE-NEXT:    movdqu 16(%rdi), %xmm1
    500 ; SSE-NEXT:    movdqu 32(%rdi), %xmm2
    501 ; SSE-NEXT:    movdqu 48(%rdi), %xmm3
    502 ; SSE-NEXT:    movdqa %xmm0, %xmm4
    503 ; SSE-NEXT:    psrad $31, %xmm4
    504 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    505 ; SSE-NEXT:    paddq %xmm4, %xmm0
    506 ; SSE-NEXT:    pxor %xmm4, %xmm0
    507 ; SSE-NEXT:    movdqa %xmm1, %xmm4
    508 ; SSE-NEXT:    psrad $31, %xmm4
    509 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    510 ; SSE-NEXT:    paddq %xmm4, %xmm1
    511 ; SSE-NEXT:    pxor %xmm4, %xmm1
    512 ; SSE-NEXT:    movdqa %xmm2, %xmm4
    513 ; SSE-NEXT:    psrad $31, %xmm4
    514 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    515 ; SSE-NEXT:    paddq %xmm4, %xmm2
    516 ; SSE-NEXT:    pxor %xmm4, %xmm2
    517 ; SSE-NEXT:    movdqa %xmm3, %xmm4
    518 ; SSE-NEXT:    psrad $31, %xmm4
    519 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    520 ; SSE-NEXT:    paddq %xmm4, %xmm3
    521 ; SSE-NEXT:    pxor %xmm4, %xmm3
    522 ; SSE-NEXT:    retq
    523 ;
    524 ; AVX1-LABEL: test13:
    525 ; AVX1:       # BB#0:
    526 ; AVX1-NEXT:    vmovups (%rdi), %ymm0
    527 ; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
    528 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    529 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
    530 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    531 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
    532 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm4
    533 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    534 ; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
    535 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
    536 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
    537 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
    538 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    539 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm3
    540 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    541 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
    542 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm4
    543 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    544 ; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1
    545 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
    546 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm2
    547 ; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
    548 ; AVX1-NEXT:    retq
    549 ;
    550 ; AVX2-LABEL: test13:
    551 ; AVX2:       # BB#0:
    552 ; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
    553 ; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
    554 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
    555 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
    556 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
    557 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
    558 ; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
    559 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
    560 ; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
    561 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
    562 ; AVX2-NEXT:    retq
    563 ;
    564 ; AVX512-LABEL: test13:
    565 ; AVX512:       # BB#0:
    566 ; AVX512-NEXT:    vpabsq (%rdi), %zmm0
    567 ; AVX512-NEXT:    retq
    568   %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8
    569   %tmp1neg = sub <8 x i64> zeroinitializer, %a
    570   %b = icmp sle <8 x i64> %a, zeroinitializer
    571   %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a
    572   ret <8 x i64> %abs
    573 }
    574