Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s
      2 
      3 ; AVX2 Logical Shift Left
      4 
      5 define <16 x i16> @test_sllw_1(<16 x i16> %InVec) {
      6 entry:
      7   %shl = shl <16 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
      8   ret <16 x i16> %shl
      9 }
     10 
     11 ; CHECK-LABEL: test_sllw_1:
     12 ; CHECK-NOT: vpsllw  $0, %ymm0, %ymm0
     13 ; CHECK: ret
     14 
     15 define <16 x i16> @test_sllw_2(<16 x i16> %InVec) {
     16 entry:
     17   %shl = shl <16 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
     18   ret <16 x i16> %shl
     19 }
     20 
     21 ; CHECK-LABEL: test_sllw_2:
     22 ; CHECK: vpaddw  %ymm0, %ymm0, %ymm0
     23 ; CHECK: ret
     24 
     25 define <16 x i16> @test_sllw_3(<16 x i16> %InVec) {
     26 entry:
     27   %shl = shl <16 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
     28   ret <16 x i16> %shl
     29 }
     30 
     31 ; CHECK-LABEL: test_sllw_3:
     32 ; CHECK: vpsllw $15, %ymm0, %ymm0
     33 ; CHECK: ret
     34 
     35 define <8 x i32> @test_slld_1(<8 x i32> %InVec) {
     36 entry:
     37   %shl = shl <8 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
     38   ret <8 x i32> %shl
     39 }
     40 
     41 ; CHECK-LABEL: test_slld_1:
     42 ; CHECK-NOT: vpslld  $0, %ymm0, %ymm0
     43 ; CHECK: ret
     44 
     45 define <8 x i32> @test_slld_2(<8 x i32> %InVec) {
     46 entry:
     47   %shl = shl <8 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
     48   ret <8 x i32> %shl
     49 }
     50 
     51 ; CHECK-LABEL: test_slld_2:
     52 ; CHECK: vpaddd  %ymm0, %ymm0, %ymm0
     53 ; CHECK: ret
     54 
     55 define <8 x i32> @test_vpslld_var(i32 %shift) {
     56   %amt = insertelement <8 x i32> undef, i32 %shift, i32 0
     57   %tmp = shl <8 x i32> <i32 192, i32 193, i32 194, i32 195, i32 196, i32 197, i32 198, i32 199>, %amt
     58   ret <8 x i32> %tmp
     59 }
     60 
     61 ; CHECK-LABEL: test_vpslld_var:
     62 ; CHECK: vpslld %xmm0, %ymm1, %ymm0
     63 ; CHECK: ret
     64 
     65 define <8 x i32> @test_slld_3(<8 x i32> %InVec) {
     66 entry:
     67   %shl = shl <8 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
     68   ret <8 x i32> %shl
     69 }
     70 
     71 ; CHECK-LABEL: test_slld_3:
     72 ; CHECK: vpslld $31, %ymm0, %ymm0
     73 ; CHECK: ret
     74 
     75 define <4 x i64> @test_sllq_1(<4 x i64> %InVec) {
     76 entry:
     77   %shl = shl <4 x i64> %InVec, <i64 0, i64 0, i64 0, i64 0>
     78   ret <4 x i64> %shl
     79 }
     80 
     81 ; CHECK-LABEL: test_sllq_1:
     82 ; CHECK-NOT: vpsllq  $0, %ymm0, %ymm0
     83 ; CHECK: ret
     84 
     85 define <4 x i64> @test_sllq_2(<4 x i64> %InVec) {
     86 entry:
     87   %shl = shl <4 x i64> %InVec, <i64 1, i64 1, i64 1, i64 1>
     88   ret <4 x i64> %shl
     89 }
     90 
     91 ; CHECK-LABEL: test_sllq_2:
     92 ; CHECK: vpaddq  %ymm0, %ymm0, %ymm0
     93 ; CHECK: ret
     94 
     95 define <4 x i64> @test_sllq_3(<4 x i64> %InVec) {
     96 entry:
     97   %shl = shl <4 x i64> %InVec, <i64 63, i64 63, i64 63, i64 63>
     98   ret <4 x i64> %shl
     99 }
    100 
    101 ; CHECK-LABEL: test_sllq_3:
    102 ; CHECK: vpsllq $63, %ymm0, %ymm0
    103 ; CHECK: ret
    104 
    105 ; AVX2 Arithmetic Shift
    106 
    107 define <16 x i16> @test_sraw_1(<16 x i16> %InVec) {
    108 entry:
    109   %shl = ashr <16 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
    110   ret <16 x i16> %shl
    111 }
    112 
    113 ; CHECK-LABEL: test_sraw_1:
    114 ; CHECK-NOT: vpsraw  $0, %ymm0, %ymm0
    115 ; CHECK: ret
    116 
    117 define <16 x i16> @test_sraw_2(<16 x i16> %InVec) {
    118 entry:
    119   %shl = ashr <16 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    120   ret <16 x i16> %shl
    121 }
    122 
    123 ; CHECK-LABEL: test_sraw_2:
    124 ; CHECK: vpsraw  $1, %ymm0, %ymm0
    125 ; CHECK: ret
    126 
    127 define <16 x i16> @test_sraw_3(<16 x i16> %InVec) {
    128 entry:
    129   %shl = ashr <16 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
    130   ret <16 x i16> %shl
    131 }
    132 
    133 ; CHECK-LABEL: test_sraw_3:
    134 ; CHECK: vpsraw  $15, %ymm0, %ymm0
    135 ; CHECK: ret
    136 
    137 define <8 x i32> @test_srad_1(<8 x i32> %InVec) {
    138 entry:
    139   %shl = ashr <8 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
    140   ret <8 x i32> %shl
    141 }
    142 
    143 ; CHECK-LABEL: test_srad_1:
    144 ; CHECK-NOT: vpsrad  $0, %ymm0, %ymm0
    145 ; CHECK: ret
    146 
    147 define <8 x i32> @test_srad_2(<8 x i32> %InVec) {
    148 entry:
    149   %shl = ashr <8 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
    150   ret <8 x i32> %shl
    151 }
    152 
    153 ; CHECK-LABEL: test_srad_2:
    154 ; CHECK: vpsrad  $1, %ymm0, %ymm0
    155 ; CHECK: ret
    156 
    157 define <8 x i32> @test_srad_3(<8 x i32> %InVec) {
    158 entry:
    159   %shl = ashr <8 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
    160   ret <8 x i32> %shl
    161 }
    162 
    163 ; CHECK-LABEL: test_srad_3:
    164 ; CHECK: vpsrad  $31, %ymm0, %ymm0
    165 ; CHECK: ret
    166 
    167 ; SSE Logical Shift Right
    168 
    169 define <16 x i16> @test_srlw_1(<16 x i16> %InVec) {
    170 entry:
    171   %shl = lshr <16 x i16> %InVec, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
    172   ret <16 x i16> %shl
    173 }
    174 
    175 ; CHECK-LABEL: test_srlw_1:
    176 ; CHECK-NOT: vpsrlw  $0, %ymm0, %ymm0
    177 ; CHECK: ret
    178 
    179 define <16 x i16> @test_srlw_2(<16 x i16> %InVec) {
    180 entry:
    181   %shl = lshr <16 x i16> %InVec, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
    182   ret <16 x i16> %shl
    183 }
    184 
    185 ; CHECK-LABEL: test_srlw_2:
    186 ; CHECK: vpsrlw  $1, %ymm0, %ymm0
    187 ; CHECK: ret
    188 
    189 define <16 x i16> @test_srlw_3(<16 x i16> %InVec) {
    190 entry:
    191   %shl = lshr <16 x i16> %InVec, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
    192   ret <16 x i16> %shl
    193 }
    194 
    195 ; CHECK-LABEL: test_srlw_3:
    196 ; CHECK: vpsrlw $15, %ymm0, %ymm0
    197 ; CHECK: ret
    198 
    199 define <8 x i32> @test_srld_1(<8 x i32> %InVec) {
    200 entry:
    201   %shl = lshr <8 x i32> %InVec, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
    202   ret <8 x i32> %shl
    203 }
    204 
    205 ; CHECK-LABEL: test_srld_1:
    206 ; CHECK-NOT: vpsrld  $0, %ymm0, %ymm0
    207 ; CHECK: ret
    208 
    209 define <8 x i32> @test_srld_2(<8 x i32> %InVec) {
    210 entry:
    211   %shl = lshr <8 x i32> %InVec, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
    212   ret <8 x i32> %shl
    213 }
    214 
    215 ; CHECK-LABEL: test_srld_2:
    216 ; CHECK: vpsrld  $1, %ymm0, %ymm0
    217 ; CHECK: ret
    218 
    219 define <8 x i32> @test_srld_3(<8 x i32> %InVec) {
    220 entry:
    221   %shl = lshr <8 x i32> %InVec, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
    222   ret <8 x i32> %shl
    223 }
    224 
    225 ; CHECK-LABEL: test_srld_3:
    226 ; CHECK: vpsrld $31, %ymm0, %ymm0
    227 ; CHECK: ret
    228 
    229 define <4 x i64> @test_srlq_1(<4 x i64> %InVec) {
    230 entry:
    231   %shl = lshr <4 x i64> %InVec, <i64 0, i64 0, i64 0, i64 0>
    232   ret <4 x i64> %shl
    233 }
    234 
    235 ; CHECK-LABEL: test_srlq_1:
    236 ; CHECK-NOT: vpsrlq  $0, %ymm0, %ymm0
    237 ; CHECK: ret
    238 
    239 define <4 x i64> @test_srlq_2(<4 x i64> %InVec) {
    240 entry:
    241   %shl = lshr <4 x i64> %InVec, <i64 1, i64 1, i64 1, i64 1>
    242   ret <4 x i64> %shl
    243 }
    244 
    245 ; CHECK-LABEL: test_srlq_2:
    246 ; CHECK: vpsrlq  $1, %ymm0, %ymm0
    247 ; CHECK: ret
    248 
    249 define <4 x i64> @test_srlq_3(<4 x i64> %InVec) {
    250 entry:
    251   %shl = lshr <4 x i64> %InVec, <i64 63, i64 63, i64 63, i64 63>
    252   ret <4 x i64> %shl
    253 }
    254 
    255 ; CHECK-LABEL: test_srlq_3:
    256 ; CHECK: vpsrlq $63, %ymm0, %ymm0
    257 ; CHECK: ret
    258 
    259 ; CHECK-LABEL: @srl_trunc_and_v4i64
    260 ; CHECK: vpand
    261 ; CHECK-NEXT: vpsrlvd
    262 ; CHECK: ret
    263 define <4 x i32> @srl_trunc_and_v4i64(<4 x i32> %x, <4 x i64> %y) nounwind {
    264   %and = and <4 x i64> %y, <i64 8, i64 8, i64 8, i64 8>
    265   %trunc = trunc <4 x i64> %and to <4 x i32>
    266   %sra = lshr <4 x i32> %x, %trunc
    267   ret <4 x i32> %sra
    268 }
    269