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