blob: 203092e88d31e424ceac21ce5518a202f3f608b2 [file] [log] [blame]
Simon Pilgrim5aa70e72017-07-17 10:09:48 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl | FileCheck %s --check-prefix=CHECK --check-prefix=KNL
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
4
5declare <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
6declare <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
7declare <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
8declare <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
9
Simon Pilgrimb6485252017-07-20 13:07:37 +000010declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
11declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
12
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000013; Tests showing replacement of variable rotates with immediate splat versions.
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000014
15define <16 x i32> @test_splat_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
16; KNL-LABEL: test_splat_rol_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000017; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000018; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000019; KNL-NEXT: vprold $5, %zmm0, %zmm1 {%k1}
20; KNL-NEXT: vprold $5, %zmm0, %zmm2 {%k1} {z}
21; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
22; KNL-NEXT: vprold $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000023; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000024; KNL-NEXT: retq
25;
26; SKX-LABEL: test_splat_rol_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000027; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000028; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000029; SKX-NEXT: vprold $5, %zmm0, %zmm1 {%k1}
30; SKX-NEXT: vprold $5, %zmm0, %zmm2 {%k1} {z}
31; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
32; SKX-NEXT: vprold $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000033; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000034; SKX-NEXT: retq
35 %res = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %x0, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>, <16 x i32> %x1, i16 %x2)
36 %res1 = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %x0, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>, <16 x i32> zeroinitializer, i16 %x2)
37 %res2 = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %x0, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>, <16 x i32> %x1, i16 -1)
38 %res3 = add <16 x i32> %res, %res1
39 %res4 = add <16 x i32> %res3, %res2
40 ret <16 x i32> %res4
41}
42
43define <8 x i64>@test_splat_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
44; KNL-LABEL: test_splat_rol_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000045; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000046; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000047; KNL-NEXT: vprolq $5, %zmm0, %zmm1 {%k1}
48; KNL-NEXT: vprolq $5, %zmm0, %zmm2 {%k1} {z}
49; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
50; KNL-NEXT: vprolq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000051; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000052; KNL-NEXT: retq
53;
54; SKX-LABEL: test_splat_rol_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000055; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000056; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000057; SKX-NEXT: vprolq $5, %zmm0, %zmm1 {%k1}
58; SKX-NEXT: vprolq $5, %zmm0, %zmm2 {%k1} {z}
59; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
60; SKX-NEXT: vprolq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000061; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000062; SKX-NEXT: retq
63 %res = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> %x0, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i64> %x1, i8 %x2)
64 %res1 = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> %x0, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i64> zeroinitializer, i8 %x2)
65 %res2 = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> %x0, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i64> %x1, i8 -1)
66 %res3 = add <8 x i64> %res, %res1
67 %res4 = add <8 x i64> %res3, %res2
68 ret <8 x i64> %res4
69}
70
71define <16 x i32> @test_splat_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
72; KNL-LABEL: test_splat_ror_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000073; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000074; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000075; KNL-NEXT: vprord $5, %zmm0, %zmm1 {%k1}
76; KNL-NEXT: vprord $5, %zmm0, %zmm2 {%k1} {z}
77; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
78; KNL-NEXT: vprord $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000079; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000080; KNL-NEXT: retq
81;
82; SKX-LABEL: test_splat_ror_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000083; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000084; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000085; SKX-NEXT: vprord $5, %zmm0, %zmm1 {%k1}
86; SKX-NEXT: vprord $5, %zmm0, %zmm2 {%k1} {z}
87; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
88; SKX-NEXT: vprord $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000089; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000090; SKX-NEXT: retq
91 %res = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %x0, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>, <16 x i32> %x1, i16 %x2)
92 %res1 = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %x0, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>, <16 x i32> zeroinitializer, i16 %x2)
93 %res2 = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %x0, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>, <16 x i32> %x1, i16 -1)
94 %res3 = add <16 x i32> %res, %res1
95 %res4 = add <16 x i32> %res3, %res2
96 ret <16 x i32> %res4
97}
98
99define <8 x i64>@test_splat_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
100; KNL-LABEL: test_splat_ror_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000101; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000102; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000103; KNL-NEXT: vprorq $5, %zmm0, %zmm1 {%k1}
104; KNL-NEXT: vprorq $5, %zmm0, %zmm2 {%k1} {z}
105; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
106; KNL-NEXT: vprorq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000107; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000108; KNL-NEXT: retq
109;
110; SKX-LABEL: test_splat_ror_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000111; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000112; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000113; SKX-NEXT: vprorq $5, %zmm0, %zmm1 {%k1}
114; SKX-NEXT: vprorq $5, %zmm0, %zmm2 {%k1} {z}
115; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
116; SKX-NEXT: vprorq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000117; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000118; SKX-NEXT: retq
119 %res = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %x0, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i64> %x1, i8 %x2)
120 %res1 = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %x0, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i64> zeroinitializer, i8 %x2)
121 %res2 = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %x0, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i64> %x1, i8 -1)
122 %res3 = add <8 x i64> %res, %res1
123 %res4 = add <8 x i64> %res3, %res2
124 ret <8 x i64> %res4
125}
126
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000127; Tests showing replacement of out-of-bounds variable rotates with in-bounds immediate splat versions.
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000128
129define <16 x i32> @test_splat_bounds_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
130; KNL-LABEL: test_splat_bounds_rol_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000131; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000132; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000133; KNL-NEXT: vprold $1, %zmm0, %zmm1 {%k1}
134; KNL-NEXT: vprold $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000135; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000136; KNL-NEXT: vprold $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000137; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
138; KNL-NEXT: retq
139;
140; SKX-LABEL: test_splat_bounds_rol_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000141; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000142; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000143; SKX-NEXT: vprold $1, %zmm0, %zmm1 {%k1}
144; SKX-NEXT: vprold $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000145; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000146; SKX-NEXT: vprold $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000147; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
148; SKX-NEXT: retq
149 %res = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %x0, <16 x i32> <i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33>, <16 x i32> %x1, i16 %x2)
150 %res1 = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %x0, <16 x i32> <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>, <16 x i32> zeroinitializer, i16 %x2)
151 %res2 = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %x0, <16 x i32> <i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534>, <16 x i32> %x1, i16 -1)
152 %res3 = add <16 x i32> %res, %res1
153 %res4 = add <16 x i32> %res3, %res2
154 ret <16 x i32> %res4
155}
156
157define <8 x i64>@test_splat_bounds_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
158; KNL-LABEL: test_splat_bounds_rol_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000159; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000160; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000161; KNL-NEXT: vprolq $62, %zmm0, %zmm1 {%k1}
162; KNL-NEXT: vprolq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000163; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000164; KNL-NEXT: vprolq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000165; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
166; KNL-NEXT: retq
167;
168; SKX-LABEL: test_splat_bounds_rol_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000169; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000170; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000171; SKX-NEXT: vprolq $62, %zmm0, %zmm1 {%k1}
172; SKX-NEXT: vprolq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000173; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000174; SKX-NEXT: vprolq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000175; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
176; SKX-NEXT: retq
177 %res = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> %x0, <8 x i64> <i64 65534, i64 65534, i64 65534, i64 65534, i64 65534, i64 65534, i64 65534, i64 65534>, <8 x i64> %x1, i8 %x2)
178 %res1 = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> %x0, <8 x i64> <i64 65, i64 65, i64 65, i64 65, i64 65, i64 65, i64 65, i64 65>, <8 x i64> zeroinitializer, i8 %x2)
179 %res2 = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> %x0, <8 x i64> <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>, <8 x i64> %x1, i8 -1)
180 %res3 = add <8 x i64> %res, %res1
181 %res4 = add <8 x i64> %res3, %res2
182 ret <8 x i64> %res4
183}
184
185define <16 x i32> @test_splat_bounds_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
186; KNL-LABEL: test_splat_bounds_ror_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000187; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000188; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000189; KNL-NEXT: vprord $1, %zmm0, %zmm1 {%k1}
190; KNL-NEXT: vprord $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000191; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000192; KNL-NEXT: vprord $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000193; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
194; KNL-NEXT: retq
195;
196; SKX-LABEL: test_splat_bounds_ror_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000197; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000198; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000199; SKX-NEXT: vprord $1, %zmm0, %zmm1 {%k1}
200; SKX-NEXT: vprord $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000201; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000202; SKX-NEXT: vprord $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000203; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
204; SKX-NEXT: retq
205 %res = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %x0, <16 x i32> <i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33, i32 33>, <16 x i32> %x1, i16 %x2)
206 %res1 = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %x0, <16 x i32> <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>, <16 x i32> zeroinitializer, i16 %x2)
207 %res2 = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %x0, <16 x i32> <i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534, i32 65534>, <16 x i32> %x1, i16 -1)
208 %res3 = add <16 x i32> %res, %res1
209 %res4 = add <16 x i32> %res3, %res2
210 ret <16 x i32> %res4
211}
212
213define <8 x i64>@test_splat_bounds_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
214; KNL-LABEL: test_splat_bounds_ror_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000215; KNL: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000216; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000217; KNL-NEXT: vprorq $62, %zmm0, %zmm1 {%k1}
218; KNL-NEXT: vprorq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000219; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000220; KNL-NEXT: vprorq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000221; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
222; KNL-NEXT: retq
223;
224; SKX-LABEL: test_splat_bounds_ror_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000225; SKX: # %bb.0:
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000226; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000227; SKX-NEXT: vprorq $62, %zmm0, %zmm1 {%k1}
228; SKX-NEXT: vprorq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000229; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000230; SKX-NEXT: vprorq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000231; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
232; SKX-NEXT: retq
233 %res = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %x0, <8 x i64> <i64 65534, i64 65534, i64 65534, i64 65534, i64 65534, i64 65534, i64 65534, i64 65534>, <8 x i64> %x1, i8 %x2)
234 %res1 = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %x0, <8 x i64> <i64 65, i64 65, i64 65, i64 65, i64 65, i64 65, i64 65, i64 65>, <8 x i64> zeroinitializer, i8 %x2)
235 %res2 = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %x0, <8 x i64> <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>, <8 x i64> %x1, i8 -1)
236 %res3 = add <8 x i64> %res, %res1
237 %res4 = add <8 x i64> %res3, %res2
238 ret <8 x i64> %res4
239}
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000240
241; Constant folding
Simon Pilgrimb6485252017-07-20 13:07:37 +0000242; We also test with a target shuffle so that this can't be constant folded upon creation, it must
243; wait until the target shuffle has been constant folded in combineX86ShufflesRecursively.
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000244
245define <8 x i64> @test_fold_rol_v8i64() {
246; CHECK-LABEL: test_fold_rol_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000247; CHECK: # %bb.0:
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000248; CHECK-NEXT: vmovaps {{.*#+}} zmm0 = [1,2,4,9223372036854775808,2,4611686018427387904,9223372036854775808,9223372036854775808]
249; CHECK-NEXT: retq
250 %res = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>, <8 x i64> <i64 0, i64 1, i64 2, i64 63, i64 65, i64 65534, i64 65535, i64 -1>, <8 x i64> zeroinitializer, i8 -1)
251 ret <8 x i64> %res
252}
253
Simon Pilgrimb6485252017-07-20 13:07:37 +0000254define <16 x i32> @test_fold_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1) {
255; CHECK-LABEL: test_fold_rol_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000256; CHECK: # %bb.0:
Simon Pilgrimb6485252017-07-20 13:07:37 +0000257; CHECK-NEXT: vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
258; CHECK-NEXT: vprolvd {{.*}}(%rip), %zmm0, %zmm0
259; CHECK-NEXT: retq
260 %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>, <16 x i32> <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>, <16 x i32> zeroinitializer, i16 -1)
261 %res1 = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %res0, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, <16 x i32> zeroinitializer, i16 -1)
262 ret <16 x i32> %res1
263}
264
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000265define <8 x i64> @test_fold_ror_v8i64() {
266; CHECK-LABEL: test_fold_ror_v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000267; CHECK: # %bb.0:
Simon Pilgrimb6485252017-07-20 13:07:37 +0000268; CHECK-NEXT: vpbroadcastq {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1]
269; CHECK-NEXT: vprorvq {{.*}}(%rip), %zmm0, %zmm0
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000270; CHECK-NEXT: retq
Simon Pilgrimb6485252017-07-20 13:07:37 +0000271 %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 undef, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>, <8 x i64> zeroinitializer, i8 -1)
272 %res1 = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %res0, <8 x i64> <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>, <8 x i64> zeroinitializer, i8 -1)
273 ret <8 x i64> %res1
274}
275
276define <16 x i32> @test_fold_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1) {
277; CHECK-LABEL: test_fold_ror_v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000278; CHECK: # %bb.0:
Simon Pilgrimb6485252017-07-20 13:07:37 +0000279; CHECK-NEXT: vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
280; CHECK-NEXT: vprorvd {{.*}}(%rip), %zmm0, %zmm0
281; CHECK-NEXT: retq
282 %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>, <16 x i32> <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>, <16 x i32> zeroinitializer, i16 -1)
283 %res1 = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %res0, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, <16 x i32> zeroinitializer, i16 -1)
284 ret <16 x i32> %res1
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000285}