xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx512-shift.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker;RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck --check-prefix=SKX %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: shift_16_i32
5*9880d681SAndroid Build Coastguard Worker;CHECK: vpsrld
6*9880d681SAndroid Build Coastguard Worker;CHECK: vpslld
7*9880d681SAndroid Build Coastguard Worker;CHECK: vpsrad
8*9880d681SAndroid Build Coastguard Worker;CHECK: ret
9*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @shift_16_i32(<16 x i32> %a) {
10*9880d681SAndroid Build Coastguard Worker   %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>
11*9880d681SAndroid Build Coastguard Worker   %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>
12*9880d681SAndroid Build Coastguard Worker   %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>
13*9880d681SAndroid Build Coastguard Worker   ret <16 x i32> %d;
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: shift_8_i64
17*9880d681SAndroid Build Coastguard Worker;CHECK: vpsrlq
18*9880d681SAndroid Build Coastguard Worker;CHECK: vpsllq
19*9880d681SAndroid Build Coastguard Worker;CHECK: vpsraq
20*9880d681SAndroid Build Coastguard Worker;CHECK: ret
21*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @shift_8_i64(<8 x i64> %a) {
22*9880d681SAndroid Build Coastguard Worker   %b = lshr <8 x i64> %a, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
23*9880d681SAndroid Build Coastguard Worker   %c = shl <8 x i64> %b,  <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12>
24*9880d681SAndroid Build Coastguard Worker   %d = ashr <8 x i64> %c, <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12>
25*9880d681SAndroid Build Coastguard Worker   ret <8 x i64> %d;
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker;SKX-LABEL: shift_4_i64
29*9880d681SAndroid Build Coastguard Worker;SKX: vpsrlq
30*9880d681SAndroid Build Coastguard Worker;SKX: vpsllq
31*9880d681SAndroid Build Coastguard Worker;SKX: vpsraq
32*9880d681SAndroid Build Coastguard Worker;SKX: ret
33*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @shift_4_i64(<4 x i64> %a) {
34*9880d681SAndroid Build Coastguard Worker   %b = lshr <4 x i64> %a, <i64 1, i64 1, i64 1, i64 1>
35*9880d681SAndroid Build Coastguard Worker   %c = shl <4 x i64> %b,  <i64 12, i64 12, i64 12, i64 12>
36*9880d681SAndroid Build Coastguard Worker   %d = ashr <4 x i64> %c, <i64 12, i64 12, i64 12, i64 12>
37*9880d681SAndroid Build Coastguard Worker   ret <4 x i64> %d;
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl4
41*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvq %zmm
42*9880d681SAndroid Build Coastguard Worker; CHECK: ret
43*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_shl4(<8 x i64> %x, <8 x i64> %y) {
44*9880d681SAndroid Build Coastguard Worker  %k = shl <8 x i64> %x, %y
45*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %k
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl5
49*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd %zmm
50*9880d681SAndroid Build Coastguard Worker; CHECK: ret
51*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_shl5(<16 x i32> %x, <16 x i32> %y) {
52*9880d681SAndroid Build Coastguard Worker  %k = shl <16 x i32> %x, %y
53*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %k
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_srl0
57*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd
58*9880d681SAndroid Build Coastguard Worker; CHECK: ret
59*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_srl0(<16 x i32> %x, <16 x i32> %y) {
60*9880d681SAndroid Build Coastguard Worker  %k = lshr <16 x i32> %x, %y
61*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %k
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_srl2
65*9880d681SAndroid Build Coastguard Worker; CHECK: psrlvq
66*9880d681SAndroid Build Coastguard Worker; CHECK: ret
67*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_srl2(<8 x i64> %x, <8 x i64> %y) {
68*9880d681SAndroid Build Coastguard Worker  %k = lshr <8 x i64> %x, %y
69*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %k
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_sra1
73*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd
74*9880d681SAndroid Build Coastguard Worker; CHECK: ret
75*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_sra1(<16 x i32> %x, <16 x i32> %y) {
76*9880d681SAndroid Build Coastguard Worker  %k = ashr <16 x i32> %x, %y
77*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %k
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_sra2
81*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravq %zmm
82*9880d681SAndroid Build Coastguard Worker; CHECK: ret
83*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_sra2(<8 x i64> %x, <8 x i64> %y) {
84*9880d681SAndroid Build Coastguard Worker  %k = ashr <8 x i64> %x, %y
85*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %k
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: variable_sra3
89*9880d681SAndroid Build Coastguard Worker; SKX: vpsravq %ymm
90*9880d681SAndroid Build Coastguard Worker; SKX: ret
91*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @variable_sra3(<4 x i64> %x, <4 x i64> %y) {
92*9880d681SAndroid Build Coastguard Worker  %k = ashr <4 x i64> %x, %y
93*9880d681SAndroid Build Coastguard Worker  ret <4 x i64> %k
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: variable_sra4
97*9880d681SAndroid Build Coastguard Worker; SKX: vpsravw %xmm
98*9880d681SAndroid Build Coastguard Worker; SKX: ret
99*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @variable_sra4(<8 x i16> %x, <8 x i16> %y) {
100*9880d681SAndroid Build Coastguard Worker  %k = ashr <8 x i16> %x, %y
101*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %k
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_sra01_load
105*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd (%
106*9880d681SAndroid Build Coastguard Worker; CHECK: ret
107*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_sra01_load(<16 x i32> %x, <16 x i32>* %y) {
108*9880d681SAndroid Build Coastguard Worker  %y1 = load <16 x i32>, <16 x i32>* %y
109*9880d681SAndroid Build Coastguard Worker  %k = ashr <16 x i32> %x, %y1
110*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %k
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl1_load
114*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd (%
115*9880d681SAndroid Build Coastguard Worker; CHECK: ret
116*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_shl1_load(<16 x i32> %x, <16 x i32>* %y) {
117*9880d681SAndroid Build Coastguard Worker  %y1 = load <16 x i32>, <16 x i32>* %y
118*9880d681SAndroid Build Coastguard Worker  %k = shl <16 x i32> %x, %y1
119*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %k
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl0_load
122*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd (%
123*9880d681SAndroid Build Coastguard Worker; CHECK: ret
124*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_srl0_load(<16 x i32> %x, <16 x i32>* %y) {
125*9880d681SAndroid Build Coastguard Worker  %y1 = load <16 x i32>, <16 x i32>* %y
126*9880d681SAndroid Build Coastguard Worker  %k = lshr <16 x i32> %x, %y1
127*9880d681SAndroid Build Coastguard Worker  ret <16 x i32> %k
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl3_load
131*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvq (%
132*9880d681SAndroid Build Coastguard Worker; CHECK: ret
133*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_srl3_load(<8 x i64> %x, <8 x i64>* %y) {
134*9880d681SAndroid Build Coastguard Worker  %y1 = load <8 x i64>, <8 x i64>* %y
135*9880d681SAndroid Build Coastguard Worker  %k = lshr <8 x i64> %x, %y1
136*9880d681SAndroid Build Coastguard Worker  ret <8 x i64> %k
137*9880d681SAndroid Build Coastguard Worker}
138