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=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X32
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64
      4 
      5 define <4 x i64> @test_vpaddq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
      6 ; X32-LABEL: test_vpaddq:
      7 ; X32:       # %bb.0:
      8 ; X32-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
      9 ; X32-NEXT:    retl
     10 ;
     11 ; X64-LABEL: test_vpaddq:
     12 ; X64:       # %bb.0:
     13 ; X64-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
     14 ; X64-NEXT:    retq
     15   %x = add <4 x i64> %i, %j
     16   ret <4 x i64> %x
     17 }
     18 
     19 define <8 x i32> @test_vpaddd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
     20 ; X32-LABEL: test_vpaddd:
     21 ; X32:       # %bb.0:
     22 ; X32-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
     23 ; X32-NEXT:    retl
     24 ;
     25 ; X64-LABEL: test_vpaddd:
     26 ; X64:       # %bb.0:
     27 ; X64-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
     28 ; X64-NEXT:    retq
     29   %x = add <8 x i32> %i, %j
     30   ret <8 x i32> %x
     31 }
     32 
     33 define <16 x i16> @test_vpaddw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
     34 ; X32-LABEL: test_vpaddw:
     35 ; X32:       # %bb.0:
     36 ; X32-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
     37 ; X32-NEXT:    retl
     38 ;
     39 ; X64-LABEL: test_vpaddw:
     40 ; X64:       # %bb.0:
     41 ; X64-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
     42 ; X64-NEXT:    retq
     43   %x = add <16 x i16> %i, %j
     44   ret <16 x i16> %x
     45 }
     46 
     47 define <32 x i8> @test_vpaddb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
     48 ; X32-LABEL: test_vpaddb:
     49 ; X32:       # %bb.0:
     50 ; X32-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
     51 ; X32-NEXT:    retl
     52 ;
     53 ; X64-LABEL: test_vpaddb:
     54 ; X64:       # %bb.0:
     55 ; X64-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
     56 ; X64-NEXT:    retq
     57   %x = add <32 x i8> %i, %j
     58   ret <32 x i8> %x
     59 }
     60 
     61 define <4 x i64> @test_vpsubq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
     62 ; X32-LABEL: test_vpsubq:
     63 ; X32:       # %bb.0:
     64 ; X32-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
     65 ; X32-NEXT:    retl
     66 ;
     67 ; X64-LABEL: test_vpsubq:
     68 ; X64:       # %bb.0:
     69 ; X64-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
     70 ; X64-NEXT:    retq
     71   %x = sub <4 x i64> %i, %j
     72   ret <4 x i64> %x
     73 }
     74 
     75 define <8 x i32> @test_vpsubd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
     76 ; X32-LABEL: test_vpsubd:
     77 ; X32:       # %bb.0:
     78 ; X32-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
     79 ; X32-NEXT:    retl
     80 ;
     81 ; X64-LABEL: test_vpsubd:
     82 ; X64:       # %bb.0:
     83 ; X64-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
     84 ; X64-NEXT:    retq
     85   %x = sub <8 x i32> %i, %j
     86   ret <8 x i32> %x
     87 }
     88 
     89 define <16 x i16> @test_vpsubw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
     90 ; X32-LABEL: test_vpsubw:
     91 ; X32:       # %bb.0:
     92 ; X32-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
     93 ; X32-NEXT:    retl
     94 ;
     95 ; X64-LABEL: test_vpsubw:
     96 ; X64:       # %bb.0:
     97 ; X64-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
     98 ; X64-NEXT:    retq
     99   %x = sub <16 x i16> %i, %j
    100   ret <16 x i16> %x
    101 }
    102 
    103 define <32 x i8> @test_vpsubb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
    104 ; X32-LABEL: test_vpsubb:
    105 ; X32:       # %bb.0:
    106 ; X32-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
    107 ; X32-NEXT:    retl
    108 ;
    109 ; X64-LABEL: test_vpsubb:
    110 ; X64:       # %bb.0:
    111 ; X64-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
    112 ; X64-NEXT:    retq
    113   %x = sub <32 x i8> %i, %j
    114   ret <32 x i8> %x
    115 }
    116 
    117 define <8 x i32> @test_vpmulld(<8 x i32> %i, <8 x i32> %j) nounwind readnone {
    118 ; X32-LABEL: test_vpmulld:
    119 ; X32:       # %bb.0:
    120 ; X32-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
    121 ; X32-NEXT:    retl
    122 ;
    123 ; X64-LABEL: test_vpmulld:
    124 ; X64:       # %bb.0:
    125 ; X64-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
    126 ; X64-NEXT:    retq
    127   %x = mul <8 x i32> %i, %j
    128   ret <8 x i32> %x
    129 }
    130 
    131 define <16 x i16> @test_vpmullw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {
    132 ; X32-LABEL: test_vpmullw:
    133 ; X32:       # %bb.0:
    134 ; X32-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    135 ; X32-NEXT:    retl
    136 ;
    137 ; X64-LABEL: test_vpmullw:
    138 ; X64:       # %bb.0:
    139 ; X64-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    140 ; X64-NEXT:    retq
    141   %x = mul <16 x i16> %i, %j
    142   ret <16 x i16> %x
    143 }
    144 
    145 define <16 x i8> @mul_v16i8(<16 x i8> %i, <16 x i8> %j) nounwind readnone {
    146 ; X32-LABEL: mul_v16i8:
    147 ; X32:       # %bb.0:
    148 ; X32-NEXT:    vpmovsxbw %xmm1, %ymm1
    149 ; X32-NEXT:    vpmovsxbw %xmm0, %ymm0
    150 ; X32-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    151 ; X32-NEXT:    vextracti128 $1, %ymm0, %xmm1
    152 ; X32-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    153 ; X32-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    154 ; X32-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
    155 ; X32-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    156 ; X32-NEXT:    vzeroupper
    157 ; X32-NEXT:    retl
    158 ;
    159 ; X64-LABEL: mul_v16i8:
    160 ; X64:       # %bb.0:
    161 ; X64-NEXT:    vpmovsxbw %xmm1, %ymm1
    162 ; X64-NEXT:    vpmovsxbw %xmm0, %ymm0
    163 ; X64-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    164 ; X64-NEXT:    vextracti128 $1, %ymm0, %xmm1
    165 ; X64-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    166 ; X64-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    167 ; X64-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
    168 ; X64-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    169 ; X64-NEXT:    vzeroupper
    170 ; X64-NEXT:    retq
    171   %x = mul <16 x i8> %i, %j
    172   ret <16 x i8> %x
    173 }
    174 
    175 define <32 x i8> @mul_v32i8(<32 x i8> %i, <32 x i8> %j) nounwind readnone {
    176 ; X32-LABEL: mul_v32i8:
    177 ; X32:       # %bb.0:
    178 ; X32-NEXT:    vextracti128 $1, %ymm1, %xmm2
    179 ; X32-NEXT:    vpmovsxbw %xmm2, %ymm2
    180 ; X32-NEXT:    vextracti128 $1, %ymm0, %xmm3
    181 ; X32-NEXT:    vpmovsxbw %xmm3, %ymm3
    182 ; X32-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
    183 ; X32-NEXT:    vextracti128 $1, %ymm2, %xmm3
    184 ; X32-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    185 ; X32-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
    186 ; X32-NEXT:    vpshufb %xmm4, %xmm2, %xmm2
    187 ; X32-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
    188 ; X32-NEXT:    vpmovsxbw %xmm1, %ymm1
    189 ; X32-NEXT:    vpmovsxbw %xmm0, %ymm0
    190 ; X32-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    191 ; X32-NEXT:    vextracti128 $1, %ymm0, %xmm1
    192 ; X32-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
    193 ; X32-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
    194 ; X32-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    195 ; X32-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    196 ; X32-NEXT:    retl
    197 ;
    198 ; X64-LABEL: mul_v32i8:
    199 ; X64:       # %bb.0:
    200 ; X64-NEXT:    vextracti128 $1, %ymm1, %xmm2
    201 ; X64-NEXT:    vpmovsxbw %xmm2, %ymm2
    202 ; X64-NEXT:    vextracti128 $1, %ymm0, %xmm3
    203 ; X64-NEXT:    vpmovsxbw %xmm3, %ymm3
    204 ; X64-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
    205 ; X64-NEXT:    vextracti128 $1, %ymm2, %xmm3
    206 ; X64-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    207 ; X64-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
    208 ; X64-NEXT:    vpshufb %xmm4, %xmm2, %xmm2
    209 ; X64-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
    210 ; X64-NEXT:    vpmovsxbw %xmm1, %ymm1
    211 ; X64-NEXT:    vpmovsxbw %xmm0, %ymm0
    212 ; X64-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    213 ; X64-NEXT:    vextracti128 $1, %ymm0, %xmm1
    214 ; X64-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
    215 ; X64-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
    216 ; X64-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    217 ; X64-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    218 ; X64-NEXT:    retq
    219   %x = mul <32 x i8> %i, %j
    220   ret <32 x i8> %x
    221 }
    222 
    223 define <4 x i64> @mul_v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone {
    224 ; X32-LABEL: mul_v4i64:
    225 ; X32:       # %bb.0:
    226 ; X32-NEXT:    vpsrlq $32, %ymm0, %ymm2
    227 ; X32-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
    228 ; X32-NEXT:    vpsrlq $32, %ymm1, %ymm3
    229 ; X32-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
    230 ; X32-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
    231 ; X32-NEXT:    vpsllq $32, %ymm2, %ymm2
    232 ; X32-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
    233 ; X32-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
    234 ; X32-NEXT:    retl
    235 ;
    236 ; X64-LABEL: mul_v4i64:
    237 ; X64:       # %bb.0:
    238 ; X64-NEXT:    vpsrlq $32, %ymm0, %ymm2
    239 ; X64-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
    240 ; X64-NEXT:    vpsrlq $32, %ymm1, %ymm3
    241 ; X64-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
    242 ; X64-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
    243 ; X64-NEXT:    vpsllq $32, %ymm2, %ymm2
    244 ; X64-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
    245 ; X64-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
    246 ; X64-NEXT:    retq
    247   %x = mul <4 x i64> %i, %j
    248   ret <4 x i64> %x
    249 }
    250 
    251 define <8 x i32> @mul_const1(<8 x i32> %x) {
    252 ; X32-LABEL: mul_const1:
    253 ; X32:       # %bb.0:
    254 ; X32-NEXT:    vpaddd %ymm0, %ymm0, %ymm0
    255 ; X32-NEXT:    retl
    256 ;
    257 ; X64-LABEL: mul_const1:
    258 ; X64:       # %bb.0:
    259 ; X64-NEXT:    vpaddd %ymm0, %ymm0, %ymm0
    260 ; X64-NEXT:    retq
    261   %y = mul <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
    262   ret <8 x i32> %y
    263 }
    264 
    265 define <4 x i64> @mul_const2(<4 x i64> %x) {
    266 ; X32-LABEL: mul_const2:
    267 ; X32:       # %bb.0:
    268 ; X32-NEXT:    vpsllq $2, %ymm0, %ymm0
    269 ; X32-NEXT:    retl
    270 ;
    271 ; X64-LABEL: mul_const2:
    272 ; X64:       # %bb.0:
    273 ; X64-NEXT:    vpsllq $2, %ymm0, %ymm0
    274 ; X64-NEXT:    retq
    275   %y = mul <4 x i64> %x, <i64 4, i64 4, i64 4, i64 4>
    276   ret <4 x i64> %y
    277 }
    278 
    279 define <16 x i16> @mul_const3(<16 x i16> %x) {
    280 ; X32-LABEL: mul_const3:
    281 ; X32:       # %bb.0:
    282 ; X32-NEXT:    vpsllw $3, %ymm0, %ymm0
    283 ; X32-NEXT:    retl
    284 ;
    285 ; X64-LABEL: mul_const3:
    286 ; X64:       # %bb.0:
    287 ; X64-NEXT:    vpsllw $3, %ymm0, %ymm0
    288 ; X64-NEXT:    retq
    289   %y = mul <16 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
    290   ret <16 x i16> %y
    291 }
    292 
    293 define <4 x i64> @mul_const4(<4 x i64> %x) {
    294 ; X32-LABEL: mul_const4:
    295 ; X32:       # %bb.0:
    296 ; X32-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    297 ; X32-NEXT:    vpsubq %ymm0, %ymm1, %ymm0
    298 ; X32-NEXT:    retl
    299 ;
    300 ; X64-LABEL: mul_const4:
    301 ; X64:       # %bb.0:
    302 ; X64-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    303 ; X64-NEXT:    vpsubq %ymm0, %ymm1, %ymm0
    304 ; X64-NEXT:    retq
    305   %y = mul <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1>
    306   ret <4 x i64> %y
    307 }
    308 
    309 define <8 x i32> @mul_const5(<8 x i32> %x) {
    310 ; X32-LABEL: mul_const5:
    311 ; X32:       # %bb.0:
    312 ; X32-NEXT:    vxorps %xmm0, %xmm0, %xmm0
    313 ; X32-NEXT:    retl
    314 ;
    315 ; X64-LABEL: mul_const5:
    316 ; X64:       # %bb.0:
    317 ; X64-NEXT:    vxorps %xmm0, %xmm0, %xmm0
    318 ; X64-NEXT:    retq
    319   %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
    320   ret <8 x i32> %y
    321 }
    322 
    323 define <8 x i32> @mul_const6(<8 x i32> %x) {
    324 ; X32-LABEL: mul_const6:
    325 ; X32:       # %bb.0:
    326 ; X32-NEXT:    vpmulld {{\.LCPI.*}}, %ymm0, %ymm0
    327 ; X32-NEXT:    retl
    328 ;
    329 ; X64-LABEL: mul_const6:
    330 ; X64:       # %bb.0:
    331 ; X64-NEXT:    vpmulld {{.*}}(%rip), %ymm0, %ymm0
    332 ; X64-NEXT:    retq
    333   %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 2, i32 0, i32 2, i32 0, i32 0>
    334   ret <8 x i32> %y
    335 }
    336 
    337 define <8 x i64> @mul_const7(<8 x i64> %x) {
    338 ; X32-LABEL: mul_const7:
    339 ; X32:       # %bb.0:
    340 ; X32-NEXT:    vpaddq %ymm0, %ymm0, %ymm0
    341 ; X32-NEXT:    vpaddq %ymm1, %ymm1, %ymm1
    342 ; X32-NEXT:    retl
    343 ;
    344 ; X64-LABEL: mul_const7:
    345 ; X64:       # %bb.0:
    346 ; X64-NEXT:    vpaddq %ymm0, %ymm0, %ymm0
    347 ; X64-NEXT:    vpaddq %ymm1, %ymm1, %ymm1
    348 ; X64-NEXT:    retq
    349   %y = mul <8 x i64> %x, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2>
    350   ret <8 x i64> %y
    351 }
    352 
    353 define <8 x i16> @mul_const8(<8 x i16> %x) {
    354 ; X32-LABEL: mul_const8:
    355 ; X32:       # %bb.0:
    356 ; X32-NEXT:    vpsllw $3, %xmm0, %xmm0
    357 ; X32-NEXT:    retl
    358 ;
    359 ; X64-LABEL: mul_const8:
    360 ; X64:       # %bb.0:
    361 ; X64-NEXT:    vpsllw $3, %xmm0, %xmm0
    362 ; X64-NEXT:    retq
    363   %y = mul <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
    364   ret <8 x i16> %y
    365 }
    366 
    367 define <8 x i32> @mul_const9(<8 x i32> %x) {
    368 ; X32-LABEL: mul_const9:
    369 ; X32:       # %bb.0:
    370 ; X32-NEXT:    movl $2, %eax
    371 ; X32-NEXT:    vmovd %eax, %xmm1
    372 ; X32-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
    373 ; X32-NEXT:    retl
    374 ;
    375 ; X64-LABEL: mul_const9:
    376 ; X64:       # %bb.0:
    377 ; X64-NEXT:    movl $2, %eax
    378 ; X64-NEXT:    vmovd %eax, %xmm1
    379 ; X64-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
    380 ; X64-NEXT:    retq
    381   %y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
    382   ret <8 x i32> %y
    383 }
    384 
    385 ; %x * 0x01010101
    386 define <4 x i32> @mul_const10(<4 x i32> %x) {
    387 ; X32-LABEL: mul_const10:
    388 ; X32:       # %bb.0:
    389 ; X32-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16843009,16843009,16843009,16843009]
    390 ; X32-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
    391 ; X32-NEXT:    retl
    392 ;
    393 ; X64-LABEL: mul_const10:
    394 ; X64:       # %bb.0:
    395 ; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16843009,16843009,16843009,16843009]
    396 ; X64-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
    397 ; X64-NEXT:    retq
    398   %m = mul <4 x i32> %x, <i32 16843009, i32 16843009, i32 16843009, i32 16843009>
    399   ret <4 x i32> %m
    400 }
    401 
    402 ; %x * 0x80808080
    403 define <4 x i32> @mul_const11(<4 x i32> %x) {
    404 ; X32-LABEL: mul_const11:
    405 ; X32:       # %bb.0:
    406 ; X32-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2155905152,2155905152,2155905152,2155905152]
    407 ; X32-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
    408 ; X32-NEXT:    retl
    409 ;
    410 ; X64-LABEL: mul_const11:
    411 ; X64:       # %bb.0:
    412 ; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2155905152,2155905152,2155905152,2155905152]
    413 ; X64-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
    414 ; X64-NEXT:    retq
    415   %m = mul <4 x i32> %x, <i32 2155905152, i32 2155905152, i32 2155905152, i32 2155905152>
    416   ret <4 x i32> %m
    417 }
    418