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-pc-linux -mattr=+sse2 | FileCheck %s
      3 
      4 ; SSE2 Logical Shift Left
      5 
      6 define <8 x i16> @test_sllw_1(<8 x i16> %InVec) {
      7 ; CHECK-LABEL: test_sllw_1:
      8 ; CHECK:       # BB#0: # %entry
      9 ; CHECK-NEXT:    retq
     10 entry:
     11   %shl = shl <8 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
     12   ret <8 x i16> %shl
     13 }
     14 
     15 define <8 x i16> @test_sllw_2(<8 x i16> %InVec) {
     16 ; CHECK-LABEL: test_sllw_2:
     17 ; CHECK:       # BB#0: # %entry
     18 ; CHECK-NEXT:    paddw %xmm0, %xmm0
     19 ; CHECK-NEXT:    retq
     20 entry:
     21   %shl = shl <8 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
     22   ret <8 x i16> %shl
     23 }
     24 
     25 define <8 x i16> @test_sllw_3(<8 x i16> %InVec) {
     26 ; CHECK-LABEL: test_sllw_3:
     27 ; CHECK:       # BB#0: # %entry
     28 ; CHECK-NEXT:    psllw $15, %xmm0
     29 ; CHECK-NEXT:    retq
     30 entry:
     31   %shl = shl <8 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
     32   ret <8 x i16> %shl
     33 }
     34 
     35 define <4 x i32> @test_slld_1(<4 x i32> %InVec) {
     36 ; CHECK-LABEL: test_slld_1:
     37 ; CHECK:       # BB#0: # %entry
     38 ; CHECK-NEXT:    retq
     39 entry:
     40   %shl = shl <4 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0>
     41   ret <4 x i32> %shl
     42 }
     43 
     44 define <4 x i32> @test_slld_2(<4 x i32> %InVec) {
     45 ; CHECK-LABEL: test_slld_2:
     46 ; CHECK:       # BB#0: # %entry
     47 ; CHECK-NEXT:    paddd %xmm0, %xmm0
     48 ; CHECK-NEXT:    retq
     49 entry:
     50   %shl = shl <4 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1>
     51   ret <4 x i32> %shl
     52 }
     53 
     54 define <4 x i32> @test_slld_3(<4 x i32> %InVec) {
     55 ; CHECK-LABEL: test_slld_3:
     56 ; CHECK:       # BB#0: # %entry
     57 ; CHECK-NEXT:    pslld $31, %xmm0
     58 ; CHECK-NEXT:    retq
     59 entry:
     60   %shl = shl <4 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31>
     61   ret <4 x i32> %shl
     62 }
     63 
     64 define <2 x i64> @test_sllq_1(<2 x i64> %InVec) {
     65 ; CHECK-LABEL: test_sllq_1:
     66 ; CHECK:       # BB#0: # %entry
     67 ; CHECK-NEXT:    retq
     68 entry:
     69   %shl = shl <2 x i64> %InVec, <i64 0, i64 0>
     70   ret <2 x i64> %shl
     71 }
     72 
     73 define <2 x i64> @test_sllq_2(<2 x i64> %InVec) {
     74 ; CHECK-LABEL: test_sllq_2:
     75 ; CHECK:       # BB#0: # %entry
     76 ; CHECK-NEXT:    paddq %xmm0, %xmm0
     77 ; CHECK-NEXT:    retq
     78 entry:
     79   %shl = shl <2 x i64> %InVec, <i64 1, i64 1>
     80   ret <2 x i64> %shl
     81 }
     82 
     83 define <2 x i64> @test_sllq_3(<2 x i64> %InVec) {
     84 ; CHECK-LABEL: test_sllq_3:
     85 ; CHECK:       # BB#0: # %entry
     86 ; CHECK-NEXT:    psllq $63, %xmm0
     87 ; CHECK-NEXT:    retq
     88 entry:
     89   %shl = shl <2 x i64> %InVec, <i64 63, i64 63>
     90   ret <2 x i64> %shl
     91 }
     92 
     93 ; SSE2 Arithmetic Shift
     94 
     95 define <8 x i16> @test_sraw_1(<8 x i16> %InVec) {
     96 ; CHECK-LABEL: test_sraw_1:
     97 ; CHECK:       # BB#0: # %entry
     98 ; CHECK-NEXT:    retq
     99 entry:
    100   %shl = ashr <8 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
    101   ret <8 x i16> %shl
    102 }
    103 
    104 define <8 x i16> @test_sraw_2(<8 x i16> %InVec) {
    105 ; CHECK-LABEL: test_sraw_2:
    106 ; CHECK:       # BB#0: # %entry
    107 ; CHECK-NEXT:    psraw $1, %xmm0
    108 ; CHECK-NEXT:    retq
    109 entry:
    110   %shl = ashr <8 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    111   ret <8 x i16> %shl
    112 }
    113 
    114 define <8 x i16> @test_sraw_3(<8 x i16> %InVec) {
    115 ; CHECK-LABEL: test_sraw_3:
    116 ; CHECK:       # BB#0: # %entry
    117 ; CHECK-NEXT:    psraw $15, %xmm0
    118 ; CHECK-NEXT:    retq
    119 entry:
    120   %shl = ashr <8 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
    121   ret <8 x i16> %shl
    122 }
    123 
    124 define <4 x i32> @test_srad_1(<4 x i32> %InVec) {
    125 ; CHECK-LABEL: test_srad_1:
    126 ; CHECK:       # BB#0: # %entry
    127 ; CHECK-NEXT:    retq
    128 entry:
    129   %shl = ashr <4 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0>
    130   ret <4 x i32> %shl
    131 }
    132 
    133 define <4 x i32> @test_srad_2(<4 x i32> %InVec) {
    134 ; CHECK-LABEL: test_srad_2:
    135 ; CHECK:       # BB#0: # %entry
    136 ; CHECK-NEXT:    psrad $1, %xmm0
    137 ; CHECK-NEXT:    retq
    138 entry:
    139   %shl = ashr <4 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1>
    140   ret <4 x i32> %shl
    141 }
    142 
    143 define <4 x i32> @test_srad_3(<4 x i32> %InVec) {
    144 ; CHECK-LABEL: test_srad_3:
    145 ; CHECK:       # BB#0: # %entry
    146 ; CHECK-NEXT:    psrad $31, %xmm0
    147 ; CHECK-NEXT:    retq
    148 entry:
    149   %shl = ashr <4 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31>
    150   ret <4 x i32> %shl
    151 }
    152 
    153 ; SSE Logical Shift Right
    154 
    155 define <8 x i16> @test_srlw_1(<8 x i16> %InVec) {
    156 ; CHECK-LABEL: test_srlw_1:
    157 ; CHECK:       # BB#0: # %entry
    158 ; CHECK-NEXT:    retq
    159 entry:
    160   %shl = lshr <8 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
    161   ret <8 x i16> %shl
    162 }
    163 
    164 define <8 x i16> @test_srlw_2(<8 x i16> %InVec) {
    165 ; CHECK-LABEL: test_srlw_2:
    166 ; CHECK:       # BB#0: # %entry
    167 ; CHECK-NEXT:    psrlw $1, %xmm0
    168 ; CHECK-NEXT:    retq
    169 entry:
    170   %shl = lshr <8 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    171   ret <8 x i16> %shl
    172 }
    173 
    174 define <8 x i16> @test_srlw_3(<8 x i16> %InVec) {
    175 ; CHECK-LABEL: test_srlw_3:
    176 ; CHECK:       # BB#0: # %entry
    177 ; CHECK-NEXT:    psrlw $15, %xmm0
    178 ; CHECK-NEXT:    retq
    179 entry:
    180   %shl = lshr <8 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
    181   ret <8 x i16> %shl
    182 }
    183 
    184 define <4 x i32> @test_srld_1(<4 x i32> %InVec) {
    185 ; CHECK-LABEL: test_srld_1:
    186 ; CHECK:       # BB#0: # %entry
    187 ; CHECK-NEXT:    retq
    188 entry:
    189   %shl = lshr <4 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0>
    190   ret <4 x i32> %shl
    191 }
    192 
    193 define <4 x i32> @test_srld_2(<4 x i32> %InVec) {
    194 ; CHECK-LABEL: test_srld_2:
    195 ; CHECK:       # BB#0: # %entry
    196 ; CHECK-NEXT:    psrld $1, %xmm0
    197 ; CHECK-NEXT:    retq
    198 entry:
    199   %shl = lshr <4 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1>
    200   ret <4 x i32> %shl
    201 }
    202 
    203 define <4 x i32> @test_srld_3(<4 x i32> %InVec) {
    204 ; CHECK-LABEL: test_srld_3:
    205 ; CHECK:       # BB#0: # %entry
    206 ; CHECK-NEXT:    psrld $31, %xmm0
    207 ; CHECK-NEXT:    retq
    208 entry:
    209   %shl = lshr <4 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31>
    210   ret <4 x i32> %shl
    211 }
    212 
    213 define <2 x i64> @test_srlq_1(<2 x i64> %InVec) {
    214 ; CHECK-LABEL: test_srlq_1:
    215 ; CHECK:       # BB#0: # %entry
    216 ; CHECK-NEXT:    retq
    217 entry:
    218   %shl = lshr <2 x i64> %InVec, <i64 0, i64 0>
    219   ret <2 x i64> %shl
    220 }
    221 
    222 define <2 x i64> @test_srlq_2(<2 x i64> %InVec) {
    223 ; CHECK-LABEL: test_srlq_2:
    224 ; CHECK:       # BB#0: # %entry
    225 ; CHECK-NEXT:    psrlq $1, %xmm0
    226 ; CHECK-NEXT:    retq
    227 entry:
    228   %shl = lshr <2 x i64> %InVec, <i64 1, i64 1>
    229   ret <2 x i64> %shl
    230 }
    231 
    232 define <2 x i64> @test_srlq_3(<2 x i64> %InVec) {
    233 ; CHECK-LABEL: test_srlq_3:
    234 ; CHECK:       # BB#0: # %entry
    235 ; CHECK-NEXT:    psrlq $63, %xmm0
    236 ; CHECK-NEXT:    retq
    237 entry:
    238   %shl = lshr <2 x i64> %InVec, <i64 63, i64 63>
    239   ret <2 x i64> %shl
    240 }
    241 
    242 define <4 x i32> @sra_sra_v4i32(<4 x i32> %x) nounwind {
    243 ; CHECK-LABEL: sra_sra_v4i32:
    244 ; CHECK:       # BB#0:
    245 ; CHECK-NEXT:    psrad $6, %xmm0
    246 ; CHECK-NEXT:    retq
    247   %sra0 = ashr <4 x i32> %x, <i32 2, i32 2, i32 2, i32 2>
    248   %sra1 = ashr <4 x i32> %sra0, <i32 4, i32 4, i32 4, i32 4>
    249   ret <4 x i32> %sra1
    250 }
    251 
    252 define <4 x i32> @srl_srl_v4i32(<4 x i32> %x) nounwind {
    253 ; CHECK-LABEL: srl_srl_v4i32:
    254 ; CHECK:       # BB#0:
    255 ; CHECK-NEXT:    psrld $6, %xmm0
    256 ; CHECK-NEXT:    retq
    257   %srl0 = lshr <4 x i32> %x, <i32 2, i32 2, i32 2, i32 2>
    258   %srl1 = lshr <4 x i32> %srl0, <i32 4, i32 4, i32 4, i32 4>
    259   ret <4 x i32> %srl1
    260 }
    261 
    262 define <4 x i32> @srl_shl_v4i32(<4 x i32> %x) nounwind {
    263 ; CHECK-LABEL: srl_shl_v4i32:
    264 ; CHECK:       # BB#0:
    265 ; CHECK-NEXT:    andps {{.*}}(%rip), %xmm0
    266 ; CHECK-NEXT:    retq
    267   %srl0 = shl <4 x i32> %x, <i32 4, i32 4, i32 4, i32 4>
    268   %srl1 = lshr <4 x i32> %srl0, <i32 4, i32 4, i32 4, i32 4>
    269   ret <4 x i32> %srl1
    270 }
    271 
    272 define <4 x i32> @srl_sra_31_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
    273 ; CHECK-LABEL: srl_sra_31_v4i32:
    274 ; CHECK:       # BB#0:
    275 ; CHECK-NEXT:    psrld $31, %xmm0
    276 ; CHECK-NEXT:    retq
    277   %sra = ashr <4 x i32> %x, %y
    278   %srl1 = lshr <4 x i32> %sra, <i32 31, i32 31, i32 31, i32 31>
    279   ret <4 x i32> %srl1
    280 }
    281 
    282 define <4 x i32> @shl_shl_v4i32(<4 x i32> %x) nounwind {
    283 ; CHECK-LABEL: shl_shl_v4i32:
    284 ; CHECK:       # BB#0:
    285 ; CHECK-NEXT:    pslld $6, %xmm0
    286 ; CHECK-NEXT:    retq
    287   %shl0 = shl <4 x i32> %x, <i32 2, i32 2, i32 2, i32 2>
    288   %shl1 = shl <4 x i32> %shl0, <i32 4, i32 4, i32 4, i32 4>
    289   ret <4 x i32> %shl1
    290 }
    291 
    292 define <4 x i32> @shl_sra_v4i32(<4 x i32> %x) nounwind {
    293 ; CHECK-LABEL: shl_sra_v4i32:
    294 ; CHECK:       # BB#0:
    295 ; CHECK-NEXT:    andps {{.*}}(%rip), %xmm0
    296 ; CHECK-NEXT:    retq
    297   %shl0 = ashr <4 x i32> %x, <i32 4, i32 4, i32 4, i32 4>
    298   %shl1 = shl <4 x i32> %shl0, <i32 4, i32 4, i32 4, i32 4>
    299   ret <4 x i32> %shl1
    300 }
    301 
    302 define <4 x i32> @shl_srl_v4i32(<4 x i32> %x) nounwind {
    303 ; CHECK-LABEL: shl_srl_v4i32:
    304 ; CHECK:       # BB#0:
    305 ; CHECK-NEXT:    pslld $3, %xmm0
    306 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    307 ; CHECK-NEXT:    retq
    308   %shl0 = lshr <4 x i32> %x, <i32 2, i32 2, i32 2, i32 2>
    309   %shl1 = shl <4 x i32> %shl0, <i32 5, i32 5, i32 5, i32 5>
    310   ret <4 x i32> %shl1
    311 }
    312 
    313 define <4 x i32> @shl_zext_srl_v4i32(<4 x i16> %x) nounwind {
    314 ; CHECK-LABEL: shl_zext_srl_v4i32:
    315 ; CHECK:       # BB#0:
    316 ; CHECK-NEXT:    andps {{.*}}(%rip), %xmm0
    317 ; CHECK-NEXT:    andps {{.*}}(%rip), %xmm0
    318 ; CHECK-NEXT:    retq
    319   %srl = lshr <4 x i16> %x, <i16 2, i16 2, i16 2, i16 2>
    320   %zext = zext <4 x i16> %srl to <4 x i32>
    321   %shl = shl <4 x i32> %zext, <i32 2, i32 2, i32 2, i32 2>
    322   ret <4 x i32> %shl
    323 }
    324 
    325 define <4 x i16> @sra_trunc_srl_v4i32(<4 x i32> %x) nounwind {
    326 ; CHECK-LABEL: sra_trunc_srl_v4i32:
    327 ; CHECK:       # BB#0:
    328 ; CHECK-NEXT:    psrad $19, %xmm0
    329 ; CHECK-NEXT:    retq
    330   %srl = lshr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16>
    331   %trunc = trunc <4 x i32> %srl to <4 x i16>
    332   %sra = ashr <4 x i16> %trunc, <i16 3, i16 3, i16 3, i16 3>
    333   ret <4 x i16> %sra
    334 }
    335 
    336 define <4 x i32> @shl_zext_shl_v4i32(<4 x i16> %x) nounwind {
    337 ; CHECK-LABEL: shl_zext_shl_v4i32:
    338 ; CHECK:       # BB#0:
    339 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    340 ; CHECK-NEXT:    pslld $19, %xmm0
    341 ; CHECK-NEXT:    retq
    342   %shl0 = shl <4 x i16> %x, <i16 2, i16 2, i16 2, i16 2>
    343   %ext = zext <4 x i16> %shl0 to <4 x i32>
    344   %shl1 = shl <4 x i32> %ext, <i32 17, i32 17, i32 17, i32 17>
    345   ret <4 x i32> %shl1
    346 }
    347 
    348 define <4 x i32> @sra_v4i32(<4 x i32> %x) nounwind {
    349 ; CHECK-LABEL: sra_v4i32:
    350 ; CHECK:       # BB#0:
    351 ; CHECK-NEXT:    psrad $3, %xmm0
    352 ; CHECK-NEXT:    retq
    353   %sra = ashr <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3>
    354   ret <4 x i32> %sra
    355 }
    356 
    357 define <4 x i32> @srl_v4i32(<4 x i32> %x) nounwind {
    358 ; CHECK-LABEL: srl_v4i32:
    359 ; CHECK:       # BB#0:
    360 ; CHECK-NEXT:    psrld $3, %xmm0
    361 ; CHECK-NEXT:    retq
    362   %sra = lshr <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3>
    363   ret <4 x i32> %sra
    364 }
    365 
    366 define <4 x i32> @shl_v4i32(<4 x i32> %x) nounwind {
    367 ; CHECK-LABEL: shl_v4i32:
    368 ; CHECK:       # BB#0:
    369 ; CHECK-NEXT:    pslld $3, %xmm0
    370 ; CHECK-NEXT:    retq
    371   %sra = shl <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3>
    372   ret <4 x i32> %sra
    373 }
    374