Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse2 < %s | FileCheck %s --check-prefix=SSE2
      3 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx < %s | FileCheck %s --check-prefix=AVX
      4 
      5 define <8 x i16> @test1(<8 x i16> %A, <8 x i16> %B) {
      6 ; SSE2-LABEL: test1:
      7 ; SSE2:       # BB#0: # %entry
      8 ; SSE2-NEXT:    movd %xmm1, %eax
      9 ; SSE2-NEXT:    movzwl %ax, %eax
     10 ; SSE2-NEXT:    movd %eax, %xmm1
     11 ; SSE2-NEXT:    psllw %xmm1, %xmm0
     12 ; SSE2-NEXT:    retq
     13 ;
     14 ; AVX-LABEL: test1:
     15 ; AVX:       # BB#0: # %entry
     16 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
     17 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
     18 ; AVX-NEXT:    vpsllw %xmm1, %xmm0, %xmm0
     19 ; AVX-NEXT:    retq
     20 entry:
     21   %vecinit14 = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer
     22   %shl = shl <8 x i16> %A, %vecinit14
     23   ret <8 x i16> %shl
     24 }
     25 
     26 define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) {
     27 ; SSE2-LABEL: test2:
     28 ; SSE2:       # BB#0: # %entry
     29 ; SSE2-NEXT:    xorps %xmm2, %xmm2
     30 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
     31 ; SSE2-NEXT:    pslld %xmm2, %xmm0
     32 ; SSE2-NEXT:    retq
     33 ;
     34 ; AVX-LABEL: test2:
     35 ; AVX:       # BB#0: # %entry
     36 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
     37 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
     38 ; AVX-NEXT:    vpslld %xmm1, %xmm0, %xmm0
     39 ; AVX-NEXT:    retq
     40 entry:
     41   %vecinit6 = shufflevector <4 x i32> %B, <4 x i32> undef, <4 x i32> zeroinitializer
     42   %shl = shl <4 x i32> %A, %vecinit6
     43   ret <4 x i32> %shl
     44 }
     45 
     46 define <2 x i64> @test3(<2 x i64> %A, <2 x i64> %B) {
     47 ; SSE2-LABEL: test3:
     48 ; SSE2:       # BB#0: # %entry
     49 ; SSE2-NEXT:    psllq %xmm1, %xmm0
     50 ; SSE2-NEXT:    retq
     51 ;
     52 ; AVX-LABEL: test3:
     53 ; AVX:       # BB#0: # %entry
     54 ; AVX-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
     55 ; AVX-NEXT:    retq
     56 entry:
     57   %vecinit2 = shufflevector <2 x i64> %B, <2 x i64> undef, <2 x i32> zeroinitializer
     58   %shl = shl <2 x i64> %A, %vecinit2
     59   ret <2 x i64> %shl
     60 }
     61 
     62 define <8 x i16> @test4(<8 x i16> %A, <8 x i16> %B) {
     63 ; SSE2-LABEL: test4:
     64 ; SSE2:       # BB#0: # %entry
     65 ; SSE2-NEXT:    movd %xmm1, %eax
     66 ; SSE2-NEXT:    movzwl %ax, %eax
     67 ; SSE2-NEXT:    movd %eax, %xmm1
     68 ; SSE2-NEXT:    psrlw %xmm1, %xmm0
     69 ; SSE2-NEXT:    retq
     70 ;
     71 ; AVX-LABEL: test4:
     72 ; AVX:       # BB#0: # %entry
     73 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
     74 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
     75 ; AVX-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
     76 ; AVX-NEXT:    retq
     77 entry:
     78   %vecinit14 = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer
     79   %shr = lshr <8 x i16> %A, %vecinit14
     80   ret <8 x i16> %shr
     81 }
     82 
     83 define <4 x i32> @test5(<4 x i32> %A, <4 x i32> %B) {
     84 ; SSE2-LABEL: test5:
     85 ; SSE2:       # BB#0: # %entry
     86 ; SSE2-NEXT:    xorps %xmm2, %xmm2
     87 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
     88 ; SSE2-NEXT:    psrld %xmm2, %xmm0
     89 ; SSE2-NEXT:    retq
     90 ;
     91 ; AVX-LABEL: test5:
     92 ; AVX:       # BB#0: # %entry
     93 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
     94 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
     95 ; AVX-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
     96 ; AVX-NEXT:    retq
     97 entry:
     98   %vecinit6 = shufflevector <4 x i32> %B, <4 x i32> undef, <4 x i32> zeroinitializer
     99   %shr = lshr <4 x i32> %A, %vecinit6
    100   ret <4 x i32> %shr
    101 }
    102 
    103 define <2 x i64> @test6(<2 x i64> %A, <2 x i64> %B) {
    104 ; SSE2-LABEL: test6:
    105 ; SSE2:       # BB#0: # %entry
    106 ; SSE2-NEXT:    psrlq %xmm1, %xmm0
    107 ; SSE2-NEXT:    retq
    108 ;
    109 ; AVX-LABEL: test6:
    110 ; AVX:       # BB#0: # %entry
    111 ; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
    112 ; AVX-NEXT:    retq
    113 entry:
    114   %vecinit2 = shufflevector <2 x i64> %B, <2 x i64> undef, <2 x i32> zeroinitializer
    115   %shr = lshr <2 x i64> %A, %vecinit2
    116   ret <2 x i64> %shr
    117 }
    118 
    119 define <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) {
    120 ; SSE2-LABEL: test7:
    121 ; SSE2:       # BB#0: # %entry
    122 ; SSE2-NEXT:    movd %xmm1, %eax
    123 ; SSE2-NEXT:    movzwl %ax, %eax
    124 ; SSE2-NEXT:    movd %eax, %xmm1
    125 ; SSE2-NEXT:    psraw %xmm1, %xmm0
    126 ; SSE2-NEXT:    retq
    127 ;
    128 ; AVX-LABEL: test7:
    129 ; AVX:       # BB#0: # %entry
    130 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    131 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
    132 ; AVX-NEXT:    vpsraw %xmm1, %xmm0, %xmm0
    133 ; AVX-NEXT:    retq
    134 entry:
    135   %vecinit14 = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer
    136   %shr = ashr <8 x i16> %A, %vecinit14
    137   ret <8 x i16> %shr
    138 }
    139 
    140 define <4 x i32> @test8(<4 x i32> %A, <4 x i32> %B) {
    141 ; SSE2-LABEL: test8:
    142 ; SSE2:       # BB#0: # %entry
    143 ; SSE2-NEXT:    xorps %xmm2, %xmm2
    144 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
    145 ; SSE2-NEXT:    psrad %xmm2, %xmm0
    146 ; SSE2-NEXT:    retq
    147 ;
    148 ; AVX-LABEL: test8:
    149 ; AVX:       # BB#0: # %entry
    150 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
    151 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
    152 ; AVX-NEXT:    vpsrad %xmm1, %xmm0, %xmm0
    153 ; AVX-NEXT:    retq
    154 entry:
    155   %vecinit6 = shufflevector <4 x i32> %B, <4 x i32> undef, <4 x i32> zeroinitializer
    156   %shr = ashr <4 x i32> %A, %vecinit6
    157   ret <4 x i32> %shr
    158 }
    159