xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/x86-shifts.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Splat patterns below
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @shl4(<4 x i32> %A) nounwind {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker; CHECK:      shl4
9*9880d681SAndroid Build Coastguard Worker; CHECK:      pslld
10*9880d681SAndroid Build Coastguard Worker; CHECK:      padd
11*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
12*9880d681SAndroid Build Coastguard Worker  %B = shl <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
13*9880d681SAndroid Build Coastguard Worker  %C = shl <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
14*9880d681SAndroid Build Coastguard Worker  %K = xor <4 x i32> %B, %C
15*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %K
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @shr4(<4 x i32> %A) nounwind {
19*9880d681SAndroid Build Coastguard Workerentry:
20*9880d681SAndroid Build Coastguard Worker; CHECK:      shr4
21*9880d681SAndroid Build Coastguard Worker; CHECK:      psrld
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrld
23*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
24*9880d681SAndroid Build Coastguard Worker  %B = lshr <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
25*9880d681SAndroid Build Coastguard Worker  %C = lshr <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
26*9880d681SAndroid Build Coastguard Worker  %K = xor <4 x i32> %B, %C
27*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %K
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @sra4(<4 x i32> %A) nounwind {
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker; CHECK:      sra4
33*9880d681SAndroid Build Coastguard Worker; CHECK:      psrad
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrad
35*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
36*9880d681SAndroid Build Coastguard Worker  %B = ashr <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
37*9880d681SAndroid Build Coastguard Worker  %C = ashr <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
38*9880d681SAndroid Build Coastguard Worker  %K = xor <4 x i32> %B, %C
39*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %K
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @shl2(<2 x i64> %A) nounwind {
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker; CHECK:      shl2
45*9880d681SAndroid Build Coastguard Worker; CHECK:      psllq
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psllq
47*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
48*9880d681SAndroid Build Coastguard Worker  %B = shl <2 x i64> %A,  < i64 2, i64 2>
49*9880d681SAndroid Build Coastguard Worker  %C = shl <2 x i64> %A,  < i64 9, i64 9>
50*9880d681SAndroid Build Coastguard Worker  %K = xor <2 x i64> %B, %C
51*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %K
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @shr2(<2 x i64> %A) nounwind {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker; CHECK:      shr2
57*9880d681SAndroid Build Coastguard Worker; CHECK:      psrlq
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq
59*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
60*9880d681SAndroid Build Coastguard Worker  %B = lshr <2 x i64> %A,  < i64 8, i64 8>
61*9880d681SAndroid Build Coastguard Worker  %C = lshr <2 x i64> %A,  < i64 1, i64 1>
62*9880d681SAndroid Build Coastguard Worker  %K = xor <2 x i64> %B, %C
63*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %K
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @shl8(<8 x i16> %A) nounwind {
68*9880d681SAndroid Build Coastguard Workerentry:
69*9880d681SAndroid Build Coastguard Worker; CHECK:      shl8
70*9880d681SAndroid Build Coastguard Worker; CHECK:      psllw
71*9880d681SAndroid Build Coastguard Worker; CHECK:      padd
72*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
73*9880d681SAndroid Build Coastguard Worker  %B = shl <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
74*9880d681SAndroid Build Coastguard Worker  %C = shl <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
75*9880d681SAndroid Build Coastguard Worker  %K = xor <8 x i16> %B, %C
76*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %K
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @shr8(<8 x i16> %A) nounwind {
80*9880d681SAndroid Build Coastguard Workerentry:
81*9880d681SAndroid Build Coastguard Worker; CHECK:      shr8
82*9880d681SAndroid Build Coastguard Worker; CHECK:      psrlw
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlw
84*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
85*9880d681SAndroid Build Coastguard Worker  %B = lshr <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
86*9880d681SAndroid Build Coastguard Worker  %C = lshr <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
87*9880d681SAndroid Build Coastguard Worker  %K = xor <8 x i16> %B, %C
88*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %K
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @sra8(<8 x i16> %A) nounwind {
92*9880d681SAndroid Build Coastguard Workerentry:
93*9880d681SAndroid Build Coastguard Worker; CHECK:      sra8
94*9880d681SAndroid Build Coastguard Worker; CHECK:      psraw
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psraw
96*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
97*9880d681SAndroid Build Coastguard Worker  %B = ashr <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
98*9880d681SAndroid Build Coastguard Worker  %C = ashr <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
99*9880d681SAndroid Build Coastguard Worker  %K = xor <8 x i16> %B, %C
100*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %K
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; non-splat test
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind {
107*9880d681SAndroid Build Coastguard Workerentry:
108*9880d681SAndroid Build Coastguard Worker; CHECK: sll8_nosplat
109*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: psll
110*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: psll
111*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
112*9880d681SAndroid Build Coastguard Worker  %B = shl <8 x i16> %A,  < i16 1, i16 2, i16 3, i16 6, i16 2, i16 2, i16 2, i16 2>
113*9880d681SAndroid Build Coastguard Worker  %C = shl <8 x i16> %A,  < i16 9, i16 7, i16 5, i16 1, i16 4, i16 1, i16 1, i16 1>
114*9880d681SAndroid Build Coastguard Worker  %K = xor <8 x i16> %B, %C
115*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %K
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind {
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr2_nosplat
122*9880d681SAndroid Build Coastguard Worker; CHECK:       movdqa %xmm0, %xmm1
123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  psrlq  $1, %xmm1
124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  movdqa %xmm0, %xmm2
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  psrlq  $8, %xmm2
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  movsd  {{.*#+}} xmm0 = xmm1[0],xmm0[1]
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  movsd  {{.*#+}} xmm1 = xmm2[0],xmm1[1]
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  xorpd  %xmm0, %xmm1
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  movapd %xmm1, %xmm0
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret
131*9880d681SAndroid Build Coastguard Worker  %B = lshr <2 x i64> %A,  < i64 8, i64 1>
132*9880d681SAndroid Build Coastguard Worker  %C = lshr <2 x i64> %A,  < i64 1, i64 0>
133*9880d681SAndroid Build Coastguard Worker  %K = xor <2 x i64> %B, %C
134*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %K
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; Other shifts
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @shl2_other(<2 x i32> %A) nounwind {
141*9880d681SAndroid Build Coastguard Workerentry:
142*9880d681SAndroid Build Coastguard Worker; CHECK: shl2_other
143*9880d681SAndroid Build Coastguard Worker; CHECK: psllq
144*9880d681SAndroid Build Coastguard Worker; CHECK: ret
145*9880d681SAndroid Build Coastguard Worker  %B = shl <2 x i32> %A,  < i32 2, i32 2>
146*9880d681SAndroid Build Coastguard Worker  %C = shl <2 x i32> %A,  < i32 9, i32 9>
147*9880d681SAndroid Build Coastguard Worker  %K = xor <2 x i32> %B, %C
148*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %K
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @shr2_other(<2 x i32> %A) nounwind {
152*9880d681SAndroid Build Coastguard Workerentry:
153*9880d681SAndroid Build Coastguard Worker; CHECK: shr2_other
154*9880d681SAndroid Build Coastguard Worker; CHECK: psrlq
155*9880d681SAndroid Build Coastguard Worker; CHECK: ret
156*9880d681SAndroid Build Coastguard Worker  %B = lshr <2 x i32> %A,  < i32 8, i32 8>
157*9880d681SAndroid Build Coastguard Worker  %C = lshr <2 x i32> %A,  < i32 1, i32 1>
158*9880d681SAndroid Build Coastguard Worker  %K = xor <2 x i32> %B, %C
159*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %K
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @shl9(<16 x i8> %A) nounwind {
163*9880d681SAndroid Build Coastguard Worker  %B = shl <16 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
164*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %B
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl9:
166*9880d681SAndroid Build Coastguard Worker; CHECK: psllw $3
167*9880d681SAndroid Build Coastguard Worker; CHECK: pand
168*9880d681SAndroid Build Coastguard Worker; CHECK: ret
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @shr9(<16 x i8> %A) nounwind {
172*9880d681SAndroid Build Coastguard Worker  %B = lshr <16 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
173*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %B
174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr9:
175*9880d681SAndroid Build Coastguard Worker; CHECK: psrlw $3
176*9880d681SAndroid Build Coastguard Worker; CHECK: pand
177*9880d681SAndroid Build Coastguard Worker; CHECK: ret
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @sra_v16i8_7(<16 x i8> %A) nounwind {
181*9880d681SAndroid Build Coastguard Worker  %B = ashr <16 x i8> %A, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
182*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %B
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sra_v16i8_7:
184*9880d681SAndroid Build Coastguard Worker; CHECK: pxor
185*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtb
186*9880d681SAndroid Build Coastguard Worker; CHECK: ret
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @sra_v16i8(<16 x i8> %A) nounwind {
190*9880d681SAndroid Build Coastguard Worker  %B = ashr <16 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
191*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %B
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sra_v16i8:
193*9880d681SAndroid Build Coastguard Worker; CHECK: psrlw $3
194*9880d681SAndroid Build Coastguard Worker; CHECK: pand
195*9880d681SAndroid Build Coastguard Worker; CHECK: pxor
196*9880d681SAndroid Build Coastguard Worker; CHECK: psubb
197*9880d681SAndroid Build Coastguard Worker; CHECK: ret
198*9880d681SAndroid Build Coastguard Worker}
199