blob: 98fa67ad793d9d61883bd747bf5a021e3a7ab9a9 [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 Pilgrim1cbe8c22017-07-17 14:11:30 +000010; Tests showing replacement of variable rotates with immediate splat versions.
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000011
12define <16 x i32> @test_splat_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
13; KNL-LABEL: test_splat_rol_v16i32:
14; KNL: # BB#0:
15; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000016; KNL-NEXT: vprold $5, %zmm0, %zmm1 {%k1}
17; KNL-NEXT: vprold $5, %zmm0, %zmm2 {%k1} {z}
18; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
19; KNL-NEXT: vprold $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000020; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000021; KNL-NEXT: retq
22;
23; SKX-LABEL: test_splat_rol_v16i32:
24; SKX: # BB#0:
25; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000026; SKX-NEXT: vprold $5, %zmm0, %zmm1 {%k1}
27; SKX-NEXT: vprold $5, %zmm0, %zmm2 {%k1} {z}
28; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
29; SKX-NEXT: vprold $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000030; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000031; SKX-NEXT: retq
32 %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)
33 %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)
34 %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)
35 %res3 = add <16 x i32> %res, %res1
36 %res4 = add <16 x i32> %res3, %res2
37 ret <16 x i32> %res4
38}
39
40define <8 x i64>@test_splat_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
41; KNL-LABEL: test_splat_rol_v8i64:
42; KNL: # BB#0:
43; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000044; KNL-NEXT: vprolq $5, %zmm0, %zmm1 {%k1}
45; KNL-NEXT: vprolq $5, %zmm0, %zmm2 {%k1} {z}
46; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
47; KNL-NEXT: vprolq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000048; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000049; KNL-NEXT: retq
50;
51; SKX-LABEL: test_splat_rol_v8i64:
52; SKX: # BB#0:
53; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000054; SKX-NEXT: vprolq $5, %zmm0, %zmm1 {%k1}
55; SKX-NEXT: vprolq $5, %zmm0, %zmm2 {%k1} {z}
56; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
57; SKX-NEXT: vprolq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000058; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000059; SKX-NEXT: retq
60 %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)
61 %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)
62 %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)
63 %res3 = add <8 x i64> %res, %res1
64 %res4 = add <8 x i64> %res3, %res2
65 ret <8 x i64> %res4
66}
67
68define <16 x i32> @test_splat_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
69; KNL-LABEL: test_splat_ror_v16i32:
70; KNL: # BB#0:
71; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000072; KNL-NEXT: vprord $5, %zmm0, %zmm1 {%k1}
73; KNL-NEXT: vprord $5, %zmm0, %zmm2 {%k1} {z}
74; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
75; KNL-NEXT: vprord $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000076; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000077; KNL-NEXT: retq
78;
79; SKX-LABEL: test_splat_ror_v16i32:
80; SKX: # BB#0:
81; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +000082; SKX-NEXT: vprord $5, %zmm0, %zmm1 {%k1}
83; SKX-NEXT: vprord $5, %zmm0, %zmm2 {%k1} {z}
84; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
85; SKX-NEXT: vprord $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000086; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +000087; SKX-NEXT: retq
88 %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)
89 %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)
90 %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)
91 %res3 = add <16 x i32> %res, %res1
92 %res4 = add <16 x i32> %res3, %res2
93 ret <16 x i32> %res4
94}
95
96define <8 x i64>@test_splat_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
97; KNL-LABEL: test_splat_ror_v8i64:
98; KNL: # BB#0:
99; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000100; KNL-NEXT: vprorq $5, %zmm0, %zmm1 {%k1}
101; KNL-NEXT: vprorq $5, %zmm0, %zmm2 {%k1} {z}
102; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
103; KNL-NEXT: vprorq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000104; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000105; KNL-NEXT: retq
106;
107; SKX-LABEL: test_splat_ror_v8i64:
108; SKX: # BB#0:
109; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000110; SKX-NEXT: vprorq $5, %zmm0, %zmm1 {%k1}
111; SKX-NEXT: vprorq $5, %zmm0, %zmm2 {%k1} {z}
112; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
113; SKX-NEXT: vprorq $5, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000114; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000115; SKX-NEXT: retq
116 %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)
117 %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)
118 %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)
119 %res3 = add <8 x i64> %res, %res1
120 %res4 = add <8 x i64> %res3, %res2
121 ret <8 x i64> %res4
122}
123
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000124; Tests showing replacement of out-of-bounds variable rotates with in-bounds immediate splat versions.
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000125
126define <16 x i32> @test_splat_bounds_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
127; KNL-LABEL: test_splat_bounds_rol_v16i32:
128; KNL: # BB#0:
129; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000130; KNL-NEXT: vprold $1, %zmm0, %zmm1 {%k1}
131; KNL-NEXT: vprold $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000132; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000133; KNL-NEXT: vprold $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000134; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
135; KNL-NEXT: retq
136;
137; SKX-LABEL: test_splat_bounds_rol_v16i32:
138; SKX: # BB#0:
139; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000140; SKX-NEXT: vprold $1, %zmm0, %zmm1 {%k1}
141; SKX-NEXT: vprold $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000142; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000143; SKX-NEXT: vprold $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000144; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
145; SKX-NEXT: retq
146 %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)
147 %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)
148 %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)
149 %res3 = add <16 x i32> %res, %res1
150 %res4 = add <16 x i32> %res3, %res2
151 ret <16 x i32> %res4
152}
153
154define <8 x i64>@test_splat_bounds_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
155; KNL-LABEL: test_splat_bounds_rol_v8i64:
156; KNL: # BB#0:
157; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000158; KNL-NEXT: vprolq $62, %zmm0, %zmm1 {%k1}
159; KNL-NEXT: vprolq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000160; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000161; KNL-NEXT: vprolq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000162; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
163; KNL-NEXT: retq
164;
165; SKX-LABEL: test_splat_bounds_rol_v8i64:
166; SKX: # BB#0:
167; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000168; SKX-NEXT: vprolq $62, %zmm0, %zmm1 {%k1}
169; SKX-NEXT: vprolq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000170; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000171; SKX-NEXT: vprolq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000172; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
173; SKX-NEXT: retq
174 %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)
175 %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)
176 %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)
177 %res3 = add <8 x i64> %res, %res1
178 %res4 = add <8 x i64> %res3, %res2
179 ret <8 x i64> %res4
180}
181
182define <16 x i32> @test_splat_bounds_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
183; KNL-LABEL: test_splat_bounds_ror_v16i32:
184; KNL: # BB#0:
185; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000186; KNL-NEXT: vprord $1, %zmm0, %zmm1 {%k1}
187; KNL-NEXT: vprord $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000188; KNL-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000189; KNL-NEXT: vprord $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000190; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0
191; KNL-NEXT: retq
192;
193; SKX-LABEL: test_splat_bounds_ror_v16i32:
194; SKX: # BB#0:
195; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000196; SKX-NEXT: vprord $1, %zmm0, %zmm1 {%k1}
197; SKX-NEXT: vprord $31, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000198; SKX-NEXT: vpaddd %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000199; SKX-NEXT: vprord $30, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000200; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0
201; SKX-NEXT: retq
202 %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)
203 %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)
204 %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)
205 %res3 = add <16 x i32> %res, %res1
206 %res4 = add <16 x i32> %res3, %res2
207 ret <16 x i32> %res4
208}
209
210define <8 x i64>@test_splat_bounds_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
211; KNL-LABEL: test_splat_bounds_ror_v8i64:
212; KNL: # BB#0:
213; KNL-NEXT: kmovw %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000214; KNL-NEXT: vprorq $62, %zmm0, %zmm1 {%k1}
215; KNL-NEXT: vprorq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000216; KNL-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000217; KNL-NEXT: vprorq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000218; KNL-NEXT: vpaddq %zmm0, %zmm1, %zmm0
219; KNL-NEXT: retq
220;
221; SKX-LABEL: test_splat_bounds_ror_v8i64:
222; SKX: # BB#0:
223; SKX-NEXT: kmovd %edi, %k1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000224; SKX-NEXT: vprorq $62, %zmm0, %zmm1 {%k1}
225; SKX-NEXT: vprorq $1, %zmm0, %zmm2 {%k1} {z}
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000226; SKX-NEXT: vpaddq %zmm2, %zmm1, %zmm1
Simon Pilgrim1cbe8c22017-07-17 14:11:30 +0000227; SKX-NEXT: vprorq $63, %zmm0, %zmm0
Simon Pilgrim5aa70e72017-07-17 10:09:48 +0000228; SKX-NEXT: vpaddq %zmm0, %zmm1, %zmm0
229; SKX-NEXT: retq
230 %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)
231 %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)
232 %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)
233 %res3 = add <8 x i64> %res, %res1
234 %res4 = add <8 x i64> %res3, %res2
235 ret <8 x i64> %res4
236}
Simon Pilgrim0636fbd2017-07-18 11:18:38 +0000237
238; Constant folding
239
240define <8 x i64> @test_fold_rol_v8i64() {
241; CHECK-LABEL: test_fold_rol_v8i64:
242; CHECK: # BB#0:
243; CHECK-NEXT: vmovaps {{.*#+}} zmm0 = [1,2,4,9223372036854775808,2,4611686018427387904,9223372036854775808,9223372036854775808]
244; CHECK-NEXT: retq
245 %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)
246 ret <8 x i64> %res
247}
248
249define <8 x i64> @test_fold_ror_v8i64() {
250; CHECK-LABEL: test_fold_ror_v8i64:
251; CHECK: # BB#0:
252; CHECK-NEXT: vmovaps {{.*#+}} zmm0 = [1,9223372036854775808,4611686018427387904,2,9223372036854775808,4,2,2]
253; CHECK-NEXT: retq
254 %res = call <8 x i64> @llvm.x86.avx512.mask.prorv.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)
255 ret <8 x i64> %res
256}