xref: /llvm-project/llvm/test/Transforms/InstCombine/X86/x86-vpermi2.ll (revision d1f3fecf11a1013dcea12c93a3aaf9e4b6164f92)
1babd6209SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2babd6209SSimon Pilgrim; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s
3babd6209SSimon Pilgrim
4babd6209SSimon Pilgrim;
5babd6209SSimon Pilgrim; vXi64
6babd6209SSimon Pilgrim;
7babd6209SSimon Pilgrim
8babd6209SSimon Pilgrimdefine <2 x i64> @shuffle_vpermv3_v2i64(<2 x i64> %x0, <2 x i64> %x1) {
9babd6209SSimon Pilgrim; CHECK-LABEL: define <2 x i64> @shuffle_vpermv3_v2i64(
10babd6209SSimon Pilgrim; CHECK-SAME: <2 x i64> [[X0:%.*]], <2 x i64> [[X1:%.*]]) {
1180368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <2 x i64> [[X0]], <2 x i64> [[X1]], <2 x i32> <i32 2, i32 0>
12babd6209SSimon Pilgrim; CHECK-NEXT:    ret <2 x i64> [[R]]
13babd6209SSimon Pilgrim;
14babd6209SSimon Pilgrim  %r = call <2 x i64> @llvm.x86.avx512.vpermi2var.q.128(<2 x i64> %x0, <2 x i64> <i64 2, i64 0>, <2 x i64> %x1)
15babd6209SSimon Pilgrim  ret <2 x i64> %r
16babd6209SSimon Pilgrim}
17babd6209SSimon Pilgrim
18babd6209SSimon Pilgrimdefine <2 x i64> @shuffle_vpermv3_v2i64_unary(<2 x i64> %x0) {
19babd6209SSimon Pilgrim; CHECK-LABEL: define <2 x i64> @shuffle_vpermv3_v2i64_unary(
20babd6209SSimon Pilgrim; CHECK-SAME: <2 x i64> [[X0:%.*]]) {
2180368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <2 x i64> [[X0]], <2 x i64> poison, <2 x i32> zeroinitializer
22babd6209SSimon Pilgrim; CHECK-NEXT:    ret <2 x i64> [[R]]
23babd6209SSimon Pilgrim;
24babd6209SSimon Pilgrim  %r = call <2 x i64> @llvm.x86.avx512.vpermi2var.q.128(<2 x i64> %x0, <2 x i64> <i64 2, i64 0>, <2 x i64> %x0)
25babd6209SSimon Pilgrim  ret <2 x i64> %r
26babd6209SSimon Pilgrim}
27babd6209SSimon Pilgrim
28d01e0f7fSSimon Pilgrimdefine <2 x i64> @shuffle_vpermv3_v2i64_demandedbits(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %m) {
29d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <2 x i64> @shuffle_vpermv3_v2i64_demandedbits(
30d01e0f7fSSimon Pilgrim; CHECK-SAME: <2 x i64> [[X0:%.*]], <2 x i64> [[X1:%.*]], <2 x i64> [[M:%.*]]) {
31*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <2 x i64> @llvm.x86.avx512.vpermi2var.q.128(<2 x i64> [[X0]], <2 x i64> [[M]], <2 x i64> [[X1]])
32d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <2 x i64> [[R]]
33d01e0f7fSSimon Pilgrim;
34d01e0f7fSSimon Pilgrim  %t = or <2 x i64> %m, <i64 0, i64 4>
35d01e0f7fSSimon Pilgrim  %r = call <2 x i64> @llvm.x86.avx512.vpermi2var.q.128(<2 x i64> %x0, <2 x i64> %t, <2 x i64> %x1)
36d01e0f7fSSimon Pilgrim  ret <2 x i64> %r
37d01e0f7fSSimon Pilgrim}
38d01e0f7fSSimon Pilgrim
39d01e0f7fSSimon Pilgrimdefine <2 x i64> @shuffle_vpermv3_v2i64_demandedbits_negative(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %m) {
40d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <2 x i64> @shuffle_vpermv3_v2i64_demandedbits_negative(
41d01e0f7fSSimon Pilgrim; CHECK-SAME: <2 x i64> [[X0:%.*]], <2 x i64> [[X1:%.*]], <2 x i64> [[M:%.*]]) {
42d01e0f7fSSimon Pilgrim; CHECK-NEXT:    [[T:%.*]] = or <2 x i64> [[M]], <i64 0, i64 2>
43d01e0f7fSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <2 x i64> @llvm.x86.avx512.vpermi2var.q.128(<2 x i64> [[X0]], <2 x i64> [[T]], <2 x i64> [[X1]])
44d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <2 x i64> [[R]]
45d01e0f7fSSimon Pilgrim;
46d01e0f7fSSimon Pilgrim  %t = or <2 x i64> %m, <i64 0, i64 2>
47d01e0f7fSSimon Pilgrim  %r = call <2 x i64> @llvm.x86.avx512.vpermi2var.q.128(<2 x i64> %x0, <2 x i64> %t, <2 x i64> %x1)
48d01e0f7fSSimon Pilgrim  ret <2 x i64> %r
49d01e0f7fSSimon Pilgrim}
50d01e0f7fSSimon Pilgrim
51babd6209SSimon Pilgrimdefine <4 x i64> @shuffle_vpermv3_v4i64(<4 x i64> %x0, <4 x i64> %x1) {
52babd6209SSimon Pilgrim; CHECK-LABEL: define <4 x i64> @shuffle_vpermv3_v4i64(
53babd6209SSimon Pilgrim; CHECK-SAME: <4 x i64> [[X0:%.*]], <4 x i64> [[X1:%.*]]) {
5480368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <4 x i64> [[X0]], <4 x i64> [[X1]], <4 x i32> <i32 7, i32 2, i32 6, i32 0>
55babd6209SSimon Pilgrim; CHECK-NEXT:    ret <4 x i64> [[R]]
56babd6209SSimon Pilgrim;
57babd6209SSimon Pilgrim  %r = call <4 x i64> @llvm.x86.avx512.vpermi2var.q.256(<4 x i64> %x0, <4 x i64> <i64 7, i64 2, i64 6, i64 0>, <4 x i64> %x1)
58babd6209SSimon Pilgrim  ret <4 x i64> %r
59babd6209SSimon Pilgrim}
60babd6209SSimon Pilgrim
61babd6209SSimon Pilgrimdefine <4 x i64> @shuffle_vpermv3_v4i64_unary(<4 x i64> %x0) {
62babd6209SSimon Pilgrim; CHECK-LABEL: define <4 x i64> @shuffle_vpermv3_v4i64_unary(
63babd6209SSimon Pilgrim; CHECK-SAME: <4 x i64> [[X0:%.*]]) {
6480368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <4 x i64> [[X0]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 2, i32 0>
65babd6209SSimon Pilgrim; CHECK-NEXT:    ret <4 x i64> [[R]]
66babd6209SSimon Pilgrim;
67babd6209SSimon Pilgrim  %r = call <4 x i64> @llvm.x86.avx512.vpermi2var.q.256(<4 x i64> %x0, <4 x i64> <i64 7, i64 2, i64 6, i64 0>, <4 x i64> %x0)
68babd6209SSimon Pilgrim  ret <4 x i64> %r
69babd6209SSimon Pilgrim}
70babd6209SSimon Pilgrim
71d01e0f7fSSimon Pilgrimdefine <4 x i64> @shuffle_vpermv3_v4i64_demandedbits(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %m) {
72d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <4 x i64> @shuffle_vpermv3_v4i64_demandedbits(
73d01e0f7fSSimon Pilgrim; CHECK-SAME: <4 x i64> [[X0:%.*]], <4 x i64> [[X1:%.*]], <4 x i64> [[M:%.*]]) {
74*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <4 x i64> @llvm.x86.avx512.vpermi2var.q.256(<4 x i64> [[X0]], <4 x i64> [[M]], <4 x i64> [[X1]])
75d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <4 x i64> [[R]]
76d01e0f7fSSimon Pilgrim;
77d01e0f7fSSimon Pilgrim  %t = or <4 x i64> %m, <i64 0, i64 8, i64 16, i64 32>
78d01e0f7fSSimon Pilgrim  %r = call <4 x i64> @llvm.x86.avx512.vpermi2var.q.256(<4 x i64> %x0, <4 x i64> %t, <4 x i64> %x1)
79d01e0f7fSSimon Pilgrim  ret <4 x i64> %r
80d01e0f7fSSimon Pilgrim}
81d01e0f7fSSimon Pilgrim
82babd6209SSimon Pilgrimdefine <8 x i64> @shuffle_vpermv3_v8i64(<8 x i64> %x0, <8 x i64> %x1) {
83babd6209SSimon Pilgrim; CHECK-LABEL: define <8 x i64> @shuffle_vpermv3_v8i64(
84babd6209SSimon Pilgrim; CHECK-SAME: <8 x i64> [[X0:%.*]], <8 x i64> [[X1:%.*]]) {
8580368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <8 x i64> [[X0]], <8 x i64> [[X1]], <8 x i32> <i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>
86babd6209SSimon Pilgrim; CHECK-NEXT:    ret <8 x i64> [[R]]
87babd6209SSimon Pilgrim;
88babd6209SSimon Pilgrim  %r = call <8 x i64> @llvm.x86.avx512.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> <i64 8, i64 6, i64 10, i64 4, i64 12, i64 2, i64 14, i64 0>, <8 x i64> %x1)
89babd6209SSimon Pilgrim  ret <8 x i64> %r
90babd6209SSimon Pilgrim}
91babd6209SSimon Pilgrim
92babd6209SSimon Pilgrimdefine <8 x i64> @shuffle_vpermv3_v8i64_unary(<8 x i64> %x0) {
93babd6209SSimon Pilgrim; CHECK-LABEL: define <8 x i64> @shuffle_vpermv3_v8i64_unary(
94babd6209SSimon Pilgrim; CHECK-SAME: <8 x i64> [[X0:%.*]]) {
9580368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <8 x i64> [[X0]], <8 x i64> poison, <8 x i32> <i32 0, i32 6, i32 2, i32 4, i32 4, i32 2, i32 6, i32 0>
96babd6209SSimon Pilgrim; CHECK-NEXT:    ret <8 x i64> [[R]]
97babd6209SSimon Pilgrim;
98babd6209SSimon Pilgrim  %r = call <8 x i64> @llvm.x86.avx512.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> <i64 8, i64 6, i64 10, i64 4, i64 12, i64 2, i64 14, i64 0>, <8 x i64> %x0)
99babd6209SSimon Pilgrim  ret <8 x i64> %r
100babd6209SSimon Pilgrim}
101babd6209SSimon Pilgrim
102d01e0f7fSSimon Pilgrimdefine <8 x i64> @shuffle_vpermv3_v8i64_demandedbits(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %m) {
103d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <8 x i64> @shuffle_vpermv3_v8i64_demandedbits(
104d01e0f7fSSimon Pilgrim; CHECK-SAME: <8 x i64> [[X0:%.*]], <8 x i64> [[X1:%.*]], <8 x i64> [[M:%.*]]) {
105*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <8 x i64> @llvm.x86.avx512.vpermi2var.q.512(<8 x i64> [[X0]], <8 x i64> [[M]], <8 x i64> [[X1]])
106d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <8 x i64> [[R]]
107d01e0f7fSSimon Pilgrim;
108d01e0f7fSSimon Pilgrim  %t = or <8 x i64> %m, <i64 0, i64 16, i64 32, i64 64, i64 256, i64 512, i64 1024, i64 -16>
109d01e0f7fSSimon Pilgrim  %r = call <8 x i64> @llvm.x86.avx512.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> %t, <8 x i64> %x1)
110d01e0f7fSSimon Pilgrim  ret <8 x i64> %r
111d01e0f7fSSimon Pilgrim}
112d01e0f7fSSimon Pilgrim
113babd6209SSimon Pilgrim;
114babd6209SSimon Pilgrim; vXi32
115babd6209SSimon Pilgrim;
116babd6209SSimon Pilgrim
117babd6209SSimon Pilgrimdefine <4 x i32> @shuffle_vpermv3_v4i32(<4 x i32> %x0, <4 x i32> %x1) {
118babd6209SSimon Pilgrim; CHECK-LABEL: define <4 x i32> @shuffle_vpermv3_v4i32(
119babd6209SSimon Pilgrim; CHECK-SAME: <4 x i32> [[X0:%.*]], <4 x i32> [[X1:%.*]]) {
12080368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <4 x i32> [[X0]], <4 x i32> [[X1]], <4 x i32> <i32 7, i32 2, i32 6, i32 0>
121babd6209SSimon Pilgrim; CHECK-NEXT:    ret <4 x i32> [[R]]
122babd6209SSimon Pilgrim;
123babd6209SSimon Pilgrim  %r = call <4 x i32> @llvm.x86.avx512.vpermi2var.d.128(<4 x i32> %x0, <4 x i32> <i32 7, i32 2, i32 6, i32 0>, <4 x i32> %x1)
124babd6209SSimon Pilgrim  ret <4 x i32> %r
125babd6209SSimon Pilgrim}
126babd6209SSimon Pilgrim
127babd6209SSimon Pilgrimdefine <4 x i32> @shuffle_vpermv3_v4i32_unary(<4 x i32> %x0) {
128babd6209SSimon Pilgrim; CHECK-LABEL: define <4 x i32> @shuffle_vpermv3_v4i32_unary(
129babd6209SSimon Pilgrim; CHECK-SAME: <4 x i32> [[X0:%.*]]) {
13080368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <4 x i32> [[X0]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 2, i32 0>
131babd6209SSimon Pilgrim; CHECK-NEXT:    ret <4 x i32> [[R]]
132babd6209SSimon Pilgrim;
133babd6209SSimon Pilgrim  %r = call <4 x i32> @llvm.x86.avx512.vpermi2var.d.128(<4 x i32> %x0, <4 x i32> <i32 7, i32 2, i32 6, i32 0>, <4 x i32> %x0)
134babd6209SSimon Pilgrim  ret <4 x i32> %r
135babd6209SSimon Pilgrim}
136babd6209SSimon Pilgrim
137d01e0f7fSSimon Pilgrimdefine <4 x i32> @shuffle_vpermv3_v4i32_demandedbits(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %m) {
138d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <4 x i32> @shuffle_vpermv3_v4i32_demandedbits(
139d01e0f7fSSimon Pilgrim; CHECK-SAME: <4 x i32> [[X0:%.*]], <4 x i32> [[X1:%.*]], <4 x i32> [[M:%.*]]) {
140*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <4 x i32> @llvm.x86.avx512.vpermi2var.d.128(<4 x i32> [[X0]], <4 x i32> [[M]], <4 x i32> [[X1]])
141d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <4 x i32> [[R]]
142d01e0f7fSSimon Pilgrim;
143d01e0f7fSSimon Pilgrim  %t = or <4 x i32> %m, <i32 0, i32 8, i32 16, i32 32>
144d01e0f7fSSimon Pilgrim  %r = call <4 x i32> @llvm.x86.avx512.vpermi2var.d.128(<4 x i32> %x0, <4 x i32> %t, <4 x i32> %x1)
145d01e0f7fSSimon Pilgrim  ret <4 x i32> %r
146d01e0f7fSSimon Pilgrim}
147d01e0f7fSSimon Pilgrim
148babd6209SSimon Pilgrimdefine <8 x i32> @shuffle_vpermv3_v8i32(<8 x i32> %x0, <8 x i32> %x1) {
149babd6209SSimon Pilgrim; CHECK-LABEL: define <8 x i32> @shuffle_vpermv3_v8i32(
150babd6209SSimon Pilgrim; CHECK-SAME: <8 x i32> [[X0:%.*]], <8 x i32> [[X1:%.*]]) {
15180368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <8 x i32> [[X0]], <8 x i32> [[X1]], <8 x i32> <i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>
152babd6209SSimon Pilgrim; CHECK-NEXT:    ret <8 x i32> [[R]]
153babd6209SSimon Pilgrim;
154babd6209SSimon Pilgrim  %r = call <8 x i32> @llvm.x86.avx512.vpermi2var.d.256(<8 x i32> %x0, <8 x i32> <i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>, <8 x i32> %x1)
155babd6209SSimon Pilgrim  ret <8 x i32> %r
156babd6209SSimon Pilgrim}
157babd6209SSimon Pilgrim
158babd6209SSimon Pilgrimdefine <8 x i32> @shuffle_vpermv3_v8i32_unary(<8 x i32> %x0) {
159babd6209SSimon Pilgrim; CHECK-LABEL: define <8 x i32> @shuffle_vpermv3_v8i32_unary(
160babd6209SSimon Pilgrim; CHECK-SAME: <8 x i32> [[X0:%.*]]) {
16180368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <8 x i32> [[X0]], <8 x i32> poison, <8 x i32> <i32 0, i32 6, i32 2, i32 4, i32 4, i32 2, i32 6, i32 0>
162babd6209SSimon Pilgrim; CHECK-NEXT:    ret <8 x i32> [[R]]
163babd6209SSimon Pilgrim;
164babd6209SSimon Pilgrim  %r = call <8 x i32> @llvm.x86.avx512.vpermi2var.d.256(<8 x i32> %x0, <8 x i32> <i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>, <8 x i32> %x0)
165babd6209SSimon Pilgrim  ret <8 x i32> %r
166babd6209SSimon Pilgrim}
167babd6209SSimon Pilgrim
168d01e0f7fSSimon Pilgrimdefine <8 x i32> @shuffle_vpermv3_v8i32_demandedbits(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %m) {
169d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <8 x i32> @shuffle_vpermv3_v8i32_demandedbits(
170d01e0f7fSSimon Pilgrim; CHECK-SAME: <8 x i32> [[X0:%.*]], <8 x i32> [[X1:%.*]], <8 x i32> [[M:%.*]]) {
171*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <8 x i32> @llvm.x86.avx512.vpermi2var.d.256(<8 x i32> [[X0]], <8 x i32> [[M]], <8 x i32> [[X1]])
172d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <8 x i32> [[R]]
173d01e0f7fSSimon Pilgrim;
174d01e0f7fSSimon Pilgrim  %t = or <8 x i32> %m, <i32 0, i32 16, i32 32, i32 64, i32 256, i32 512, i32 -16, i32 -32>
175d01e0f7fSSimon Pilgrim  %r = call <8 x i32> @llvm.x86.avx512.vpermi2var.d.256(<8 x i32> %x0, <8 x i32> %t, <8 x i32> %x1)
176d01e0f7fSSimon Pilgrim  ret <8 x i32> %r
177d01e0f7fSSimon Pilgrim}
178d01e0f7fSSimon Pilgrim
179babd6209SSimon Pilgrimdefine <16 x i32> @shuffle_vpermv3_v16i32(<16 x i32> %x0, <16 x i32> %x1) {
180babd6209SSimon Pilgrim; CHECK-LABEL: define <16 x i32> @shuffle_vpermv3_v16i32(
181babd6209SSimon Pilgrim; CHECK-SAME: <16 x i32> [[X0:%.*]], <16 x i32> [[X1:%.*]]) {
18280368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <16 x i32> [[X0]], <16 x i32> [[X1]], <16 x i32> <i32 16, i32 14, i32 18, i32 12, i32 20, i32 10, i32 22, i32 8, i32 24, i32 6, i32 26, i32 4, i32 28, i32 2, i32 30, i32 0>
183babd6209SSimon Pilgrim; CHECK-NEXT:    ret <16 x i32> [[R]]
184babd6209SSimon Pilgrim;
185babd6209SSimon Pilgrim  %r = call <16 x i32> @llvm.x86.avx512.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> <i32 16, i32 14, i32 18, i32 12, i32 20, i32 10, i32 22, i32 8, i32 24, i32 6, i32 26, i32 4, i32 28, i32 2, i32 30, i32 0>, <16 x i32> %x1)
186babd6209SSimon Pilgrim  ret <16 x i32> %r
187babd6209SSimon Pilgrim}
188babd6209SSimon Pilgrim
189babd6209SSimon Pilgrimdefine <16 x i32> @shuffle_vpermv3_v16i32_unary(<16 x i32> %x0) {
190babd6209SSimon Pilgrim; CHECK-LABEL: define <16 x i32> @shuffle_vpermv3_v16i32_unary(
191babd6209SSimon Pilgrim; CHECK-SAME: <16 x i32> [[X0:%.*]]) {
19280368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <16 x i32> [[X0]], <16 x i32> poison, <16 x i32> <i32 0, i32 14, i32 2, i32 12, i32 4, i32 10, i32 6, i32 8, i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>
193babd6209SSimon Pilgrim; CHECK-NEXT:    ret <16 x i32> [[R]]
194babd6209SSimon Pilgrim;
195babd6209SSimon Pilgrim  %r = call <16 x i32> @llvm.x86.avx512.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> <i32 16, i32 14, i32 18, i32 12, i32 20, i32 10, i32 22, i32 8, i32 24, i32 6, i32 26, i32 4, i32 28, i32 2, i32 30, i32 0>, <16 x i32> %x0)
196babd6209SSimon Pilgrim  ret <16 x i32> %r
197babd6209SSimon Pilgrim}
198babd6209SSimon Pilgrim
199d01e0f7fSSimon Pilgrimdefine <16 x i32> @shuffle_vpermv3_v16i32_demandedbits(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %m) {
200d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <16 x i32> @shuffle_vpermv3_v16i32_demandedbits(
201d01e0f7fSSimon Pilgrim; CHECK-SAME: <16 x i32> [[X0:%.*]], <16 x i32> [[X1:%.*]], <16 x i32> [[M:%.*]]) {
202*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <16 x i32> @llvm.x86.avx512.vpermi2var.d.512(<16 x i32> [[X0]], <16 x i32> [[M]], <16 x i32> [[X1]])
203d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <16 x i32> [[R]]
204d01e0f7fSSimon Pilgrim;
205d01e0f7fSSimon Pilgrim  %t = or <16 x i32> %m, <i32 0, i32 32, i32 64, i32 256, i32 512, i32 1024, i32 2048, i32 4096, i32 8192, i32 -32, i32 -64, i32 -128, i32 -256, i32 -512, i32 -1024, i32 -2048>
206d01e0f7fSSimon Pilgrim  %r = call <16 x i32> @llvm.x86.avx512.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> %t, <16 x i32> %x1)
207d01e0f7fSSimon Pilgrim  ret <16 x i32> %r
208d01e0f7fSSimon Pilgrim}
209d01e0f7fSSimon Pilgrim
210babd6209SSimon Pilgrim;
211babd6209SSimon Pilgrim; vXi16
212babd6209SSimon Pilgrim;
213babd6209SSimon Pilgrim
214babd6209SSimon Pilgrimdefine <8 x i16> @shuffle_vpermv3_v8i16(<8 x i16> %x0, <8 x i16> %x1) {
215babd6209SSimon Pilgrim; CHECK-LABEL: define <8 x i16> @shuffle_vpermv3_v8i16(
216babd6209SSimon Pilgrim; CHECK-SAME: <8 x i16> [[X0:%.*]], <8 x i16> [[X1:%.*]]) {
21780368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <8 x i16> [[X0]], <8 x i16> [[X1]], <8 x i32> <i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>
218babd6209SSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> [[R]]
219babd6209SSimon Pilgrim;
220babd6209SSimon Pilgrim  %r = call <8 x i16> @llvm.x86.avx512.vpermi2var.hi.128(<8 x i16> %x0, <8 x i16> <i16 8, i16 6, i16 10, i16 4, i16 12, i16 2, i16 14, i16 0>, <8 x i16> %x1)
221babd6209SSimon Pilgrim  ret <8 x i16> %r
222babd6209SSimon Pilgrim}
223babd6209SSimon Pilgrim
224babd6209SSimon Pilgrimdefine <8 x i16> @shuffle_vpermv3_v8i16_unary(<8 x i16> %x0) {
225babd6209SSimon Pilgrim; CHECK-LABEL: define <8 x i16> @shuffle_vpermv3_v8i16_unary(
226babd6209SSimon Pilgrim; CHECK-SAME: <8 x i16> [[X0:%.*]]) {
22780368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <8 x i16> [[X0]], <8 x i16> poison, <8 x i32> <i32 0, i32 6, i32 2, i32 4, i32 4, i32 2, i32 6, i32 0>
228babd6209SSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> [[R]]
229babd6209SSimon Pilgrim;
230babd6209SSimon Pilgrim  %r = call <8 x i16> @llvm.x86.avx512.vpermi2var.hi.128(<8 x i16> %x0, <8 x i16> <i16 8, i16 6, i16 10, i16 4, i16 12, i16 2, i16 14, i16 0>, <8 x i16> %x0)
231babd6209SSimon Pilgrim  ret <8 x i16> %r
232babd6209SSimon Pilgrim}
233babd6209SSimon Pilgrim
234d01e0f7fSSimon Pilgrimdefine <8 x i16> @shuffle_vpermv3_v8i16_demandedbits(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %m) {
235d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <8 x i16> @shuffle_vpermv3_v8i16_demandedbits(
236d01e0f7fSSimon Pilgrim; CHECK-SAME: <8 x i16> [[X0:%.*]], <8 x i16> [[X1:%.*]], <8 x i16> [[M:%.*]]) {
237*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <8 x i16> @llvm.x86.avx512.vpermi2var.hi.128(<8 x i16> [[X0]], <8 x i16> [[M]], <8 x i16> [[X1]])
238d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> [[R]]
239d01e0f7fSSimon Pilgrim;
240d01e0f7fSSimon Pilgrim  %t = or <8 x i16> %m, <i16 0, i16 16, i16 32, i16 64, i16 256, i16 512, i16 -16, i16 -32>
241d01e0f7fSSimon Pilgrim  %r = call <8 x i16> @llvm.x86.avx512.vpermi2var.hi.128(<8 x i16> %x0, <8 x i16> %t, <8 x i16> %x1)
242d01e0f7fSSimon Pilgrim  ret <8 x i16> %r
243d01e0f7fSSimon Pilgrim}
244d01e0f7fSSimon Pilgrim
245babd6209SSimon Pilgrimdefine <16 x i16> @shuffle_vpermv3_v16i16(<16 x i16> %x0, <16 x i16> %x1) {
246babd6209SSimon Pilgrim; CHECK-LABEL: define <16 x i16> @shuffle_vpermv3_v16i16(
247babd6209SSimon Pilgrim; CHECK-SAME: <16 x i16> [[X0:%.*]], <16 x i16> [[X1:%.*]]) {
24880368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <16 x i16> [[X0]], <16 x i16> [[X1]], <16 x i32> <i32 16, i32 14, i32 18, i32 12, i32 20, i32 10, i32 22, i32 8, i32 24, i32 6, i32 26, i32 4, i32 28, i32 2, i32 30, i32 0>
249babd6209SSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> [[R]]
250babd6209SSimon Pilgrim;
251babd6209SSimon Pilgrim  %r = call <16 x i16> @llvm.x86.avx512.vpermi2var.hi.256(<16 x i16> %x0, <16 x i16> <i16 16, i16 14, i16 18, i16 12, i16 20, i16 10, i16 22, i16 8, i16 24, i16 6, i16 26, i16 4, i16 28, i16 2, i16 30, i16 0>, <16 x i16> %x1)
252babd6209SSimon Pilgrim  ret <16 x i16> %r
253babd6209SSimon Pilgrim}
254babd6209SSimon Pilgrim
255babd6209SSimon Pilgrimdefine <16 x i16> @shuffle_vpermv3_v16i16_unary(<16 x i16> %x0) {
256babd6209SSimon Pilgrim; CHECK-LABEL: define <16 x i16> @shuffle_vpermv3_v16i16_unary(
257babd6209SSimon Pilgrim; CHECK-SAME: <16 x i16> [[X0:%.*]]) {
25880368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <16 x i16> [[X0]], <16 x i16> poison, <16 x i32> <i32 0, i32 14, i32 2, i32 12, i32 4, i32 10, i32 6, i32 8, i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>
259babd6209SSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> [[R]]
260babd6209SSimon Pilgrim;
261babd6209SSimon Pilgrim  %r = call <16 x i16> @llvm.x86.avx512.vpermi2var.hi.256(<16 x i16> %x0, <16 x i16> <i16 16, i16 14, i16 18, i16 12, i16 20, i16 10, i16 22, i16 8, i16 24, i16 6, i16 26, i16 4, i16 28, i16 2, i16 30, i16 0>, <16 x i16> %x0)
262babd6209SSimon Pilgrim  ret <16 x i16> %r
263babd6209SSimon Pilgrim}
264babd6209SSimon Pilgrim
265d01e0f7fSSimon Pilgrimdefine <16 x i16> @shuffle_vpermv3_v16i16_demandedbits(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %m) {
266d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <16 x i16> @shuffle_vpermv3_v16i16_demandedbits(
267d01e0f7fSSimon Pilgrim; CHECK-SAME: <16 x i16> [[X0:%.*]], <16 x i16> [[X1:%.*]], <16 x i16> [[M:%.*]]) {
268*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <16 x i16> @llvm.x86.avx512.vpermi2var.hi.256(<16 x i16> [[X0]], <16 x i16> [[M]], <16 x i16> [[X1]])
269d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> [[R]]
270d01e0f7fSSimon Pilgrim;
271d01e0f7fSSimon Pilgrim  %t = or <16 x i16> %m, <i16 0, i16 32, i16 64, i16 256, i16 512, i16 1024, i16 2048, i16 4096, i16 -32, i16 -64, i16 -128, i16 -256, i16 -512, i16 -1024, i16 -2048, i16 -4096>
272d01e0f7fSSimon Pilgrim  %r = call <16 x i16> @llvm.x86.avx512.vpermi2var.hi.256(<16 x i16> %x0, <16 x i16> %t, <16 x i16> %x1)
273d01e0f7fSSimon Pilgrim  ret <16 x i16> %r
274d01e0f7fSSimon Pilgrim}
275d01e0f7fSSimon Pilgrim
276babd6209SSimon Pilgrimdefine <32 x i16> @shuffle_vpermv3_v32i16(<32 x i16> %x0, <32 x i16> %x1) {
277babd6209SSimon Pilgrim; CHECK-LABEL: define <32 x i16> @shuffle_vpermv3_v32i16(
278babd6209SSimon Pilgrim; CHECK-SAME: <32 x i16> [[X0:%.*]], <32 x i16> [[X1:%.*]]) {
27980368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <32 x i16> [[X0]], <32 x i16> [[X1]], <32 x i32> <i32 33, i32 17, i32 35, i32 19, i32 37, i32 21, i32 39, i32 23, i32 41, i32 25, i32 43, i32 27, i32 45, i32 29, i32 47, i32 31, i32 49, i32 14, i32 51, i32 12, i32 53, i32 10, i32 55, i32 8, i32 57, i32 6, i32 59, i32 4, i32 61, i32 2, i32 63, i32 0>
280babd6209SSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> [[R]]
281babd6209SSimon Pilgrim;
282babd6209SSimon Pilgrim  %r = call <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16> %x0, <32 x i16> <i16 33, i16 17, i16 35, i16 19, i16 37, i16 21, i16 39, i16 23, i16 41, i16 25, i16 43, i16 27, i16 45, i16 29, i16 47, i16 31, i16 49, i16 14, i16 51, i16 12, i16 53, i16 10, i16 55, i16 8, i16 57, i16 6, i16 59, i16 4, i16 61, i16 2, i16 63, i16 0>, <32 x i16> %x1)
283babd6209SSimon Pilgrim  ret <32 x i16> %r
284babd6209SSimon Pilgrim}
285babd6209SSimon Pilgrim
286babd6209SSimon Pilgrimdefine <32 x i16> @shuffle_vpermv3_v32i16_unary(<32 x i16> %x0) {
287babd6209SSimon Pilgrim; CHECK-LABEL: define <32 x i16> @shuffle_vpermv3_v32i16_unary(
288babd6209SSimon Pilgrim; CHECK-SAME: <32 x i16> [[X0:%.*]]) {
28980368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <32 x i16> [[X0]], <32 x i16> poison, <32 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31, i32 17, i32 14, i32 19, i32 12, i32 21, i32 10, i32 23, i32 8, i32 25, i32 6, i32 27, i32 4, i32 29, i32 2, i32 31, i32 0>
290babd6209SSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> [[R]]
291babd6209SSimon Pilgrim;
292babd6209SSimon Pilgrim  %r = call <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16> %x0, <32 x i16> <i16 33, i16 17, i16 35, i16 19, i16 37, i16 21, i16 39, i16 23, i16 41, i16 25, i16 43, i16 27, i16 45, i16 29, i16 47, i16 31, i16 49, i16 14, i16 51, i16 12, i16 53, i16 10, i16 55, i16 8, i16 57, i16 6, i16 59, i16 4, i16 61, i16 2, i16 63, i16 0>, <32 x i16> %x0)
293babd6209SSimon Pilgrim  ret <32 x i16> %r
294babd6209SSimon Pilgrim}
295babd6209SSimon Pilgrim
296d01e0f7fSSimon Pilgrimdefine <32 x i16> @shuffle_vpermv3_v32i16_demandedbits(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %m) {
297d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <32 x i16> @shuffle_vpermv3_v32i16_demandedbits(
298d01e0f7fSSimon Pilgrim; CHECK-SAME: <32 x i16> [[X0:%.*]], <32 x i16> [[X1:%.*]], <32 x i16> [[M:%.*]]) {
299*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16> [[X0]], <32 x i16> [[M]], <32 x i16> [[X1]])
300d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> [[R]]
301d01e0f7fSSimon Pilgrim;
302d01e0f7fSSimon Pilgrim  %t = or <32 x i16> %m, <i16 0, i16 64, i16 128, i16 256, i16 512, i16 1024, i16 2048, i16 4096, i16 0, i16 -64, i16 -128, i16 -256, i16 -512, i16 -1024, i16 -2048, i16 -4096, i16 0, i16 64, i16 128, i16 256, i16 512, i16 1024, i16 2048, i16 4096, i16 0, i16 -64, i16 -128, i16 -256, i16 -512, i16 -1024, i16 -2048, i16 -4096>
303d01e0f7fSSimon Pilgrim  %r = call <32 x i16> @llvm.x86.avx512.vpermi2var.hi.512(<32 x i16> %x0, <32 x i16> %t, <32 x i16> %x1)
304d01e0f7fSSimon Pilgrim  ret <32 x i16> %r
305d01e0f7fSSimon Pilgrim}
306d01e0f7fSSimon Pilgrim
307babd6209SSimon Pilgrim;
308babd6209SSimon Pilgrim; vXi8
309babd6209SSimon Pilgrim;
310babd6209SSimon Pilgrim
311babd6209SSimon Pilgrimdefine <16 x i8> @shuffle_vpermv3_v16i8(<16 x i8> %x0, <16 x i8> %x1) {
312babd6209SSimon Pilgrim; CHECK-LABEL: define <16 x i8> @shuffle_vpermv3_v16i8(
313babd6209SSimon Pilgrim; CHECK-SAME: <16 x i8> [[X0:%.*]], <16 x i8> [[X1:%.*]]) {
31480368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <16 x i8> [[X0]], <16 x i8> [[X1]], <16 x i32> <i32 16, i32 14, i32 18, i32 12, i32 20, i32 10, i32 22, i32 8, i32 24, i32 6, i32 26, i32 4, i32 28, i32 2, i32 30, i32 0>
315babd6209SSimon Pilgrim; CHECK-NEXT:    ret <16 x i8> [[R]]
316babd6209SSimon Pilgrim;
317babd6209SSimon Pilgrim  %r = call <16 x i8> @llvm.x86.avx512.vpermi2var.qi.128(<16 x i8> %x0, <16 x i8> <i8 16, i8 14, i8 18, i8 12, i8 20, i8 10, i8 22, i8 8, i8 24, i8 6, i8 26, i8 4, i8 28, i8 2, i8 30, i8 0>, <16 x i8> %x1)
318babd6209SSimon Pilgrim  ret <16 x i8> %r
319babd6209SSimon Pilgrim}
320babd6209SSimon Pilgrim
321babd6209SSimon Pilgrimdefine <16 x i8> @shuffle_vpermv3_v16i8_unary(<16 x i8> %x0) {
322babd6209SSimon Pilgrim; CHECK-LABEL: define <16 x i8> @shuffle_vpermv3_v16i8_unary(
323babd6209SSimon Pilgrim; CHECK-SAME: <16 x i8> [[X0:%.*]]) {
32480368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <16 x i8> [[X0]], <16 x i8> poison, <16 x i32> <i32 0, i32 14, i32 2, i32 12, i32 4, i32 10, i32 6, i32 8, i32 8, i32 6, i32 10, i32 4, i32 12, i32 2, i32 14, i32 0>
325babd6209SSimon Pilgrim; CHECK-NEXT:    ret <16 x i8> [[R]]
326babd6209SSimon Pilgrim;
327babd6209SSimon Pilgrim  %r = call <16 x i8> @llvm.x86.avx512.vpermi2var.qi.128(<16 x i8> %x0, <16 x i8> <i8 16, i8 14, i8 18, i8 12, i8 20, i8 10, i8 22, i8 8, i8 24, i8 6, i8 26, i8 4, i8 28, i8 2, i8 30, i8 0>, <16 x i8> %x0)
328babd6209SSimon Pilgrim  ret <16 x i8> %r
329babd6209SSimon Pilgrim}
330babd6209SSimon Pilgrim
331d01e0f7fSSimon Pilgrimdefine <16 x i8> @shuffle_vpermv3_v16i8_demandedbits(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %m) {
332d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <16 x i8> @shuffle_vpermv3_v16i8_demandedbits(
333d01e0f7fSSimon Pilgrim; CHECK-SAME: <16 x i8> [[X0:%.*]], <16 x i8> [[X1:%.*]], <16 x i8> [[M:%.*]]) {
334*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <16 x i8> @llvm.x86.avx512.vpermi2var.qi.128(<16 x i8> [[X0]], <16 x i8> [[M]], <16 x i8> [[X1]])
335d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <16 x i8> [[R]]
336d01e0f7fSSimon Pilgrim;
337d01e0f7fSSimon Pilgrim  %t = or <16 x i8> %m, <i8 0, i8 32, i8 64, i8 128, i8 0, i8 -32, i8 -64, i8 -128, i8 0, i8 32, i8 64, i8 128, i8 0, i8 -32, i8 -64, i8 -128>
338d01e0f7fSSimon Pilgrim  %r = call <16 x i8> @llvm.x86.avx512.vpermi2var.qi.128(<16 x i8> %x0, <16 x i8> %t, <16 x i8> %x1)
339d01e0f7fSSimon Pilgrim  ret <16 x i8> %r
340d01e0f7fSSimon Pilgrim}
341d01e0f7fSSimon Pilgrim
342babd6209SSimon Pilgrimdefine <32 x i8> @shuffle_vpermv3_v32i8(<32 x i8> %x0, <32 x i8> %x1) {
343babd6209SSimon Pilgrim; CHECK-LABEL: define <32 x i8> @shuffle_vpermv3_v32i8(
344babd6209SSimon Pilgrim; CHECK-SAME: <32 x i8> [[X0:%.*]], <32 x i8> [[X1:%.*]]) {
34580368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <32 x i8> [[X0]], <32 x i8> [[X1]], <32 x i32> <i32 33, i32 17, i32 35, i32 19, i32 37, i32 21, i32 39, i32 23, i32 41, i32 25, i32 43, i32 27, i32 45, i32 29, i32 47, i32 31, i32 49, i32 14, i32 51, i32 12, i32 53, i32 10, i32 55, i32 8, i32 57, i32 6, i32 59, i32 4, i32 61, i32 2, i32 63, i32 0>
346babd6209SSimon Pilgrim; CHECK-NEXT:    ret <32 x i8> [[R]]
347babd6209SSimon Pilgrim;
348babd6209SSimon Pilgrim  %r = call <32 x i8> @llvm.x86.avx512.vpermi2var.qi.256(<32 x i8> %x0, <32 x i8> <i8 33, i8 17, i8 35, i8 19, i8 37, i8 21, i8 39, i8 23, i8 41, i8 25, i8 43, i8 27, i8 45, i8 29, i8 47, i8 31, i8 49, i8 14, i8 51, i8 12, i8 53, i8 10, i8 55, i8 8, i8 57, i8 6, i8 59, i8 4, i8 61, i8 2, i8 63, i8 0>, <32 x i8> %x1)
349babd6209SSimon Pilgrim  ret <32 x i8> %r
350babd6209SSimon Pilgrim}
351babd6209SSimon Pilgrim
352babd6209SSimon Pilgrimdefine <32 x i8> @shuffle_vpermv3_v32i8_unary(<32 x i8> %x0) {
353babd6209SSimon Pilgrim; CHECK-LABEL: define <32 x i8> @shuffle_vpermv3_v32i8_unary(
354babd6209SSimon Pilgrim; CHECK-SAME: <32 x i8> [[X0:%.*]]) {
35580368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <32 x i8> [[X0]], <32 x i8> poison, <32 x i32> <i32 1, i32 17, i32 3, i32 19, i32 5, i32 21, i32 7, i32 23, i32 9, i32 25, i32 11, i32 27, i32 13, i32 29, i32 15, i32 31, i32 17, i32 14, i32 19, i32 12, i32 21, i32 10, i32 23, i32 8, i32 25, i32 6, i32 27, i32 4, i32 29, i32 2, i32 31, i32 0>
356babd6209SSimon Pilgrim; CHECK-NEXT:    ret <32 x i8> [[R]]
357babd6209SSimon Pilgrim;
358babd6209SSimon Pilgrim  %r = call <32 x i8> @llvm.x86.avx512.vpermi2var.qi.256(<32 x i8> %x0, <32 x i8> <i8 33, i8 17, i8 35, i8 19, i8 37, i8 21, i8 39, i8 23, i8 41, i8 25, i8 43, i8 27, i8 45, i8 29, i8 47, i8 31, i8 49, i8 14, i8 51, i8 12, i8 53, i8 10, i8 55, i8 8, i8 57, i8 6, i8 59, i8 4, i8 61, i8 2, i8 63, i8 0>, <32 x i8> %x0)
359babd6209SSimon Pilgrim  ret <32 x i8> %r
360babd6209SSimon Pilgrim}
361babd6209SSimon Pilgrim
362d01e0f7fSSimon Pilgrimdefine <32 x i8> @shuffle_vpermv3_v32i8_demandedbits(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %m) {
363d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <32 x i8> @shuffle_vpermv3_v32i8_demandedbits(
364d01e0f7fSSimon Pilgrim; CHECK-SAME: <32 x i8> [[X0:%.*]], <32 x i8> [[X1:%.*]], <32 x i8> [[M:%.*]]) {
365*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <32 x i8> @llvm.x86.avx512.vpermi2var.qi.256(<32 x i8> [[X0]], <32 x i8> [[M]], <32 x i8> [[X1]])
366d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <32 x i8> [[R]]
367d01e0f7fSSimon Pilgrim;
368d01e0f7fSSimon Pilgrim  %t = or <32 x i8> %m, <i8 0, i8 0, i8 64, i8 128, i8 0, i8 0, i8 -64, i8 -128, i8 0, i8 0, i8 64, i8 128, i8 0, i8 0, i8 -64, i8 -128, i8 0, i8 0, i8 64, i8 128, i8 0, i8 0, i8 -64, i8 -128, i8 0, i8 0, i8 64, i8 128, i8 0, i8 0, i8 -64, i8 -128>
369d01e0f7fSSimon Pilgrim  %r = call <32 x i8> @llvm.x86.avx512.vpermi2var.qi.256(<32 x i8> %x0, <32 x i8> %t, <32 x i8> %x1)
370d01e0f7fSSimon Pilgrim  ret <32 x i8> %r
371d01e0f7fSSimon Pilgrim}
372d01e0f7fSSimon Pilgrim
373babd6209SSimon Pilgrimdefine <64 x i8> @shuffle_vpermv3_v64i8(<64 x i8> %x0, <64 x i8> %x1) {
374babd6209SSimon Pilgrim; CHECK-LABEL: define <64 x i8> @shuffle_vpermv3_v64i8(
375babd6209SSimon Pilgrim; CHECK-SAME: <64 x i8> [[X0:%.*]], <64 x i8> [[X1:%.*]]) {
37680368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <64 x i8> [[X0]], <64 x i8> [[X1]], <64 x i32> <i32 0, i32 127, i32 126, i32 125, i32 124, i32 123, i32 122, i32 121, i32 120, i32 119, i32 118, i32 115, i32 51, i32 50, i32 49, i32 48, i32 47, i32 46, i32 45, i32 44, i32 43, i32 42, i32 41, i32 40, i32 39, i32 38, i32 37, i32 36, i32 35, i32 34, i32 33, i32 32, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
377babd6209SSimon Pilgrim; CHECK-NEXT:    ret <64 x i8> [[R]]
378babd6209SSimon Pilgrim;
379babd6209SSimon Pilgrim  %r = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x0, <64 x i8> <i8 128, i8 127, i8 126, i8 125, i8 124, i8 123, i8 122, i8 121, i8 120, i8 119, i8 118, i8 115, i8 51, i8 50, i8 49, i8 48, i8 47, i8 46, i8 45, i8 44, i8 43, i8 42, i8 41, i8 40, i8 39, i8 38, i8 37, i8 36, i8 35, i8 34, i8 33, i8 32, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>, <64 x i8> %x1)
380babd6209SSimon Pilgrim  ret <64 x i8> %r
381babd6209SSimon Pilgrim}
382babd6209SSimon Pilgrim
383babd6209SSimon Pilgrimdefine <64 x i8> @shuffle_vpermv3_v64i8_unary(<64 x i8> %x0) {
384babd6209SSimon Pilgrim; CHECK-LABEL: define <64 x i8> @shuffle_vpermv3_v64i8_unary(
385babd6209SSimon Pilgrim; CHECK-SAME: <64 x i8> [[X0:%.*]]) {
38680368786SSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = shufflevector <64 x i8> [[X0]], <64 x i8> poison, <64 x i32> <i32 0, i32 63, i32 62, i32 61, i32 60, i32 59, i32 58, i32 57, i32 56, i32 55, i32 54, i32 51, i32 51, i32 50, i32 49, i32 48, i32 47, i32 46, i32 45, i32 44, i32 43, i32 42, i32 41, i32 40, i32 39, i32 38, i32 37, i32 36, i32 35, i32 34, i32 33, i32 32, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
387babd6209SSimon Pilgrim; CHECK-NEXT:    ret <64 x i8> [[R]]
388babd6209SSimon Pilgrim;
389babd6209SSimon Pilgrim  %r = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x0, <64 x i8> <i8 128, i8 127, i8 126, i8 125, i8 124, i8 123, i8 122, i8 121, i8 120, i8 119, i8 118, i8 115, i8 51, i8 50, i8 49, i8 48, i8 47, i8 46, i8 45, i8 44, i8 43, i8 42, i8 41, i8 40, i8 39, i8 38, i8 37, i8 36, i8 35, i8 34, i8 33, i8 32, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>, <64 x i8> %x0)
390babd6209SSimon Pilgrim  ret <64 x i8> %r
391babd6209SSimon Pilgrim}
392d01e0f7fSSimon Pilgrim
393d01e0f7fSSimon Pilgrimdefine <64 x i8> @shuffle_vpermv3_v64i8_demandedbits(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %m) {
394d01e0f7fSSimon Pilgrim; CHECK-LABEL: define <64 x i8> @shuffle_vpermv3_v64i8_demandedbits(
395d01e0f7fSSimon Pilgrim; CHECK-SAME: <64 x i8> [[X0:%.*]], <64 x i8> [[X1:%.*]], <64 x i8> [[M:%.*]]) {
396*d1f3fecfSSimon Pilgrim; CHECK-NEXT:    [[R:%.*]] = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> [[X0]], <64 x i8> [[M]], <64 x i8> [[X1]])
397d01e0f7fSSimon Pilgrim; CHECK-NEXT:    ret <64 x i8> [[R]]
398d01e0f7fSSimon Pilgrim;
399d01e0f7fSSimon Pilgrim  %t = or <64 x i8> %m, <i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128, i8 0, i8 128, i8 0, i8 -128>
400d01e0f7fSSimon Pilgrim  %r = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x0, <64 x i8> %t, <64 x i8> %x1)
401d01e0f7fSSimon Pilgrim  ret <64 x i8> %r
402d01e0f7fSSimon Pilgrim}
403