xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/lower-vec-shift.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7-avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core-avx2 | FileCheck %s --check-prefix=CHECK --check-prefix=AVX2
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Verify that the following shifts are lowered into a sequence of two shifts plus
7*9880d681SAndroid Build Coastguard Worker; a blend. On pre-avx2 targets, instead of scalarizing logical and arithmetic
8*9880d681SAndroid Build Coastguard Worker; packed shift right by a constant build_vector the backend should always try to
9*9880d681SAndroid Build Coastguard Worker; emit a simpler sequence of two shifts + blend when possible.
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test1(<8 x i16> %a) {
12*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %a, <i16 3, i16 3, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
13*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %lshr
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1
16*9880d681SAndroid Build Coastguard Worker; SSE: psrlw
17*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrlw
18*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movss
19*9880d681SAndroid Build Coastguard Worker; AVX: vpsrlw
20*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrlw
21*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss
22*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlw
23*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpsrlw
24*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovss
25*9880d681SAndroid Build Coastguard Worker; CHECK: ret
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test2(<8 x i16> %a) {
29*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 2, i16 2, i16 2, i16 2>
30*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %lshr
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2
33*9880d681SAndroid Build Coastguard Worker; SSE: psrlw
34*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrlw
35*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd
36*9880d681SAndroid Build Coastguard Worker; AVX: vpsrlw
37*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrlw
38*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd
39*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlw
40*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpsrlw
41*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovsd
42*9880d681SAndroid Build Coastguard Worker; CHECK: ret
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test3(<4 x i32> %a) {
46*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <4 x i32> %a, <i32 3, i32 2, i32 2, i32 2>
47*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %lshr
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3
50*9880d681SAndroid Build Coastguard Worker; SSE: psrld
51*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrld
52*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movss
53*9880d681SAndroid Build Coastguard Worker; AVX: vpsrld
54*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrld
55*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss
56*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlvd
57*9880d681SAndroid Build Coastguard Worker; CHECK: ret
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %a) {
61*9880d681SAndroid Build Coastguard Worker  %lshr = lshr <4 x i32> %a, <i32 3, i32 3, i32 2, i32 2>
62*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %lshr
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4
65*9880d681SAndroid Build Coastguard Worker; SSE: psrld
66*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrld
67*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd
68*9880d681SAndroid Build Coastguard Worker; AVX: vpsrld
69*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrld
70*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd
71*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlvd
72*9880d681SAndroid Build Coastguard Worker; CHECK: ret
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test5(<8 x i16> %a) {
76*9880d681SAndroid Build Coastguard Worker  %lshr = ashr <8 x i16> %a, <i16 3, i16 3, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
77*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %lshr
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test6(<8 x i16> %a) {
81*9880d681SAndroid Build Coastguard Worker  %lshr = ashr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 2, i16 2, i16 2, i16 2>
82*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %lshr
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6
85*9880d681SAndroid Build Coastguard Worker; SSE: psraw
86*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psraw
87*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd
88*9880d681SAndroid Build Coastguard Worker; AVX: vpsraw
89*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsraw
90*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd
91*9880d681SAndroid Build Coastguard Worker; AVX2: vpsraw
92*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpsraw
93*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovsd
94*9880d681SAndroid Build Coastguard Worker; CHECK: ret
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test7(<4 x i32> %a) {
98*9880d681SAndroid Build Coastguard Worker  %lshr = ashr <4 x i32> %a, <i32 3, i32 2, i32 2, i32 2>
99*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %lshr
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7
102*9880d681SAndroid Build Coastguard Worker; SSE: psrad
103*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrad
104*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movss
105*9880d681SAndroid Build Coastguard Worker; AVX: vpsrad
106*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrad
107*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss
108*9880d681SAndroid Build Coastguard Worker; AVX2: vpsravd
109*9880d681SAndroid Build Coastguard Worker; CHECK: ret
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test8(<4 x i32> %a) {
113*9880d681SAndroid Build Coastguard Worker  %lshr = ashr <4 x i32> %a, <i32 3, i32 3, i32 2, i32 2>
114*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %lshr
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8
117*9880d681SAndroid Build Coastguard Worker; SSE: psrad
118*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrad
119*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd
120*9880d681SAndroid Build Coastguard Worker; AVX: vpsrad
121*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrad
122*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd
123*9880d681SAndroid Build Coastguard Worker; AVX2: vpsravd
124*9880d681SAndroid Build Coastguard Worker; CHECK: ret
125*9880d681SAndroid Build Coastguard Worker
126