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 -mcpu=knl | FileCheck %s --check-prefix=CHECK --check-prefix=KNL
      3 ;RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
      4 
      5 define <16 x i32> @shift_16_i32(<16 x i32> %a) {
      6 ; CHECK-LABEL: shift_16_i32:
      7 ; CHECK:       # %bb.0:
      8 ; CHECK-NEXT:    vpsrld $1, %zmm0, %zmm0
      9 ; CHECK-NEXT:    vpslld $12, %zmm0, %zmm0
     10 ; CHECK-NEXT:    vpsrad $12, %zmm0, %zmm0
     11 ; CHECK-NEXT:    retq
     12    %b = lshr <16 x i32> %a, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
     13    %c = shl <16 x i32> %b, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
     14    %d = ashr <16 x i32> %c, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
     15    ret <16 x i32> %d;
     16 }
     17 
     18 define <8 x i64> @shift_8_i64(<8 x i64> %a) {
     19 ; CHECK-LABEL: shift_8_i64:
     20 ; CHECK:       # %bb.0:
     21 ; CHECK-NEXT:    vpsrlq $1, %zmm0, %zmm0
     22 ; CHECK-NEXT:    vpsllq $12, %zmm0, %zmm0
     23 ; CHECK-NEXT:    vpsraq $12, %zmm0, %zmm0
     24 ; CHECK-NEXT:    retq
     25    %b = lshr <8 x i64> %a, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
     26    %c = shl <8 x i64> %b,  <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12>
     27    %d = ashr <8 x i64> %c, <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12>
     28    ret <8 x i64> %d;
     29 }
     30 
     31 define <4 x i64> @shift_4_i64(<4 x i64> %a) {
     32 ; KNL-LABEL: shift_4_i64:
     33 ; KNL:       # %bb.0:
     34 ; KNL-NEXT:    vpsrlq $1, %ymm0, %ymm0
     35 ; KNL-NEXT:    vpsllq $12, %ymm0, %ymm0
     36 ; KNL-NEXT:    vpsraq $12, %zmm0, %zmm0
     37 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
     38 ; KNL-NEXT:    retq
     39 ;
     40 ; SKX-LABEL: shift_4_i64:
     41 ; SKX:       # %bb.0:
     42 ; SKX-NEXT:    vpsrlq $1, %ymm0, %ymm0
     43 ; SKX-NEXT:    vpsllq $12, %ymm0, %ymm0
     44 ; SKX-NEXT:    vpsraq $12, %ymm0, %ymm0
     45 ; SKX-NEXT:    retq
     46    %b = lshr <4 x i64> %a, <i64 1, i64 1, i64 1, i64 1>
     47    %c = shl <4 x i64> %b,  <i64 12, i64 12, i64 12, i64 12>
     48    %d = ashr <4 x i64> %c, <i64 12, i64 12, i64 12, i64 12>
     49    ret <4 x i64> %d;
     50 }
     51 
     52 define <8 x i64> @variable_shl4(<8 x i64> %x, <8 x i64> %y) {
     53 ; CHECK-LABEL: variable_shl4:
     54 ; CHECK:       # %bb.0:
     55 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0
     56 ; CHECK-NEXT:    retq
     57   %k = shl <8 x i64> %x, %y
     58   ret <8 x i64> %k
     59 }
     60 
     61 define <16 x i32> @variable_shl5(<16 x i32> %x, <16 x i32> %y) {
     62 ; CHECK-LABEL: variable_shl5:
     63 ; CHECK:       # %bb.0:
     64 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
     65 ; CHECK-NEXT:    retq
     66   %k = shl <16 x i32> %x, %y
     67   ret <16 x i32> %k
     68 }
     69 
     70 define <16 x i32> @variable_srl0(<16 x i32> %x, <16 x i32> %y) {
     71 ; CHECK-LABEL: variable_srl0:
     72 ; CHECK:       # %bb.0:
     73 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
     74 ; CHECK-NEXT:    retq
     75   %k = lshr <16 x i32> %x, %y
     76   ret <16 x i32> %k
     77 }
     78 
     79 define <8 x i64> @variable_srl2(<8 x i64> %x, <8 x i64> %y) {
     80 ; CHECK-LABEL: variable_srl2:
     81 ; CHECK:       # %bb.0:
     82 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm0
     83 ; CHECK-NEXT:    retq
     84   %k = lshr <8 x i64> %x, %y
     85   ret <8 x i64> %k
     86 }
     87 
     88 define <16 x i32> @variable_sra1(<16 x i32> %x, <16 x i32> %y) {
     89 ; CHECK-LABEL: variable_sra1:
     90 ; CHECK:       # %bb.0:
     91 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
     92 ; CHECK-NEXT:    retq
     93   %k = ashr <16 x i32> %x, %y
     94   ret <16 x i32> %k
     95 }
     96 
     97 define <8 x i64> @variable_sra2(<8 x i64> %x, <8 x i64> %y) {
     98 ; CHECK-LABEL: variable_sra2:
     99 ; CHECK:       # %bb.0:
    100 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
    101 ; CHECK-NEXT:    retq
    102   %k = ashr <8 x i64> %x, %y
    103   ret <8 x i64> %k
    104 }
    105 
    106 define <4 x i64> @variable_sra3(<4 x i64> %x, <4 x i64> %y) {
    107 ; KNL-LABEL: variable_sra3:
    108 ; KNL:       # %bb.0:
    109 ; KNL-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
    110 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    111 ; KNL-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
    112 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
    113 ; KNL-NEXT:    retq
    114 ;
    115 ; SKX-LABEL: variable_sra3:
    116 ; SKX:       # %bb.0:
    117 ; SKX-NEXT:    vpsravq %ymm1, %ymm0, %ymm0
    118 ; SKX-NEXT:    retq
    119   %k = ashr <4 x i64> %x, %y
    120   ret <4 x i64> %k
    121 }
    122 
    123 define <8 x i16> @variable_sra4(<8 x i16> %x, <8 x i16> %y) {
    124 ; KNL-LABEL: variable_sra4:
    125 ; KNL:       # %bb.0:
    126 ; KNL-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
    127 ; KNL-NEXT:    vpmovsxwd %xmm0, %ymm0
    128 ; KNL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0
    129 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
    130 ; KNL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    131 ; KNL-NEXT:    retq
    132 ;
    133 ; SKX-LABEL: variable_sra4:
    134 ; SKX:       # %bb.0:
    135 ; SKX-NEXT:    vpsravw %xmm1, %xmm0, %xmm0
    136 ; SKX-NEXT:    retq
    137   %k = ashr <8 x i16> %x, %y
    138   ret <8 x i16> %k
    139 }
    140 
    141 define <16 x i32> @variable_sra01_load(<16 x i32> %x, <16 x i32>* %y) {
    142 ; CHECK-LABEL: variable_sra01_load:
    143 ; CHECK:       # %bb.0:
    144 ; CHECK-NEXT:    vpsravd (%rdi), %zmm0, %zmm0
    145 ; CHECK-NEXT:    retq
    146   %y1 = load <16 x i32>, <16 x i32>* %y
    147   %k = ashr <16 x i32> %x, %y1
    148   ret <16 x i32> %k
    149 }
    150 
    151 define <16 x i32> @variable_shl1_load(<16 x i32> %x, <16 x i32>* %y) {
    152 ; CHECK-LABEL: variable_shl1_load:
    153 ; CHECK:       # %bb.0:
    154 ; CHECK-NEXT:    vpsllvd (%rdi), %zmm0, %zmm0
    155 ; CHECK-NEXT:    retq
    156   %y1 = load <16 x i32>, <16 x i32>* %y
    157   %k = shl <16 x i32> %x, %y1
    158   ret <16 x i32> %k
    159 }
    160 
    161 define <16 x i32> @variable_srl0_load(<16 x i32> %x, <16 x i32>* %y) {
    162 ; CHECK-LABEL: variable_srl0_load:
    163 ; CHECK:       # %bb.0:
    164 ; CHECK-NEXT:    vpsrlvd (%rdi), %zmm0, %zmm0
    165 ; CHECK-NEXT:    retq
    166   %y1 = load <16 x i32>, <16 x i32>* %y
    167   %k = lshr <16 x i32> %x, %y1
    168   ret <16 x i32> %k
    169 }
    170 
    171 define <8 x i64> @variable_srl3_load(<8 x i64> %x, <8 x i64>* %y) {
    172 ; CHECK-LABEL: variable_srl3_load:
    173 ; CHECK:       # %bb.0:
    174 ; CHECK-NEXT:    vpsrlvq (%rdi), %zmm0, %zmm0
    175 ; CHECK-NEXT:    retq
    176   %y1 = load <8 x i64>, <8 x i64>* %y
    177   %k = lshr <8 x i64> %x, %y1
    178   ret <8 x i64> %k
    179 }
    180