llvm.org GIT mirror llvm / c28fd90
[X86][XOP] createVariablePermute - use VPPERM for v16i16 variable permutes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327218 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 2 years ago
2 changed file(s) with 25 addition(s) and 112 deletion(s). Raw diff Collapse all Expand all
80098009 case MVT::v16i16:
80108010 if (Subtarget.hasVLX() && Subtarget.hasBWI())
80118011 Opcode = X86ISD::VPERMV;
8012 else if (Subtarget.hasXOP()) {
8013 // Scale to v32i8 and perform as v32i8.
8014 IndicesVec = ScaleIndices(IndicesVec, 2);
8015 return DAG.getBitcast(
8016 VT, createVariablePermute(
8017 MVT::v32i8, DAG.getBitcast(MVT::v32i8, SrcVec),
8018 DAG.getBitcast(MVT::v32i8, IndicesVec), DL, DAG, Subtarget));
8019 }
80128020 break;
80138021 case MVT::v8f32:
80148022 case MVT::v8i32:
238238 define <16 x i16> @var_shuffle_v16i16(<16 x i16> %v, <16 x i16> %indices) nounwind {
239239 ; XOP-LABEL: var_shuffle_v16i16:
240240 ; XOP: # %bb.0:
241 ; XOP-NEXT: pushq %rbp
242 ; XOP-NEXT: movq %rsp, %rbp
243 ; XOP-NEXT: andq $-32, %rsp
244 ; XOP-NEXT: subq $64, %rsp
245 ; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2
246 ; XOP-NEXT: vmovd %xmm2, %eax
247 ; XOP-NEXT: vmovaps %ymm0, (%rsp)
248 ; XOP-NEXT: andl $15, %eax
249 ; XOP-NEXT: movzwl (%rsp,%rax,2), %eax
250 ; XOP-NEXT: vmovd %eax, %xmm0
251 ; XOP-NEXT: vpextrw $1, %xmm2, %eax
252 ; XOP-NEXT: andl $15, %eax
253 ; XOP-NEXT: vpinsrw $1, (%rsp,%rax,2), %xmm0, %xmm0
254 ; XOP-NEXT: vpextrw $2, %xmm2, %eax
255 ; XOP-NEXT: andl $15, %eax
256 ; XOP-NEXT: vpinsrw $2, (%rsp,%rax,2), %xmm0, %xmm0
257 ; XOP-NEXT: vpextrw $3, %xmm2, %eax
258 ; XOP-NEXT: andl $15, %eax
259 ; XOP-NEXT: vpinsrw $3, (%rsp,%rax,2), %xmm0, %xmm0
260 ; XOP-NEXT: vpextrw $4, %xmm2, %eax
261 ; XOP-NEXT: andl $15, %eax
262 ; XOP-NEXT: vpinsrw $4, (%rsp,%rax,2), %xmm0, %xmm0
263 ; XOP-NEXT: vpextrw $5, %xmm2, %eax
264 ; XOP-NEXT: andl $15, %eax
265 ; XOP-NEXT: vpinsrw $5, (%rsp,%rax,2), %xmm0, %xmm0
266 ; XOP-NEXT: vpextrw $6, %xmm2, %eax
267 ; XOP-NEXT: andl $15, %eax
268 ; XOP-NEXT: vpinsrw $6, (%rsp,%rax,2), %xmm0, %xmm0
269 ; XOP-NEXT: vpextrw $7, %xmm2, %eax
270 ; XOP-NEXT: andl $15, %eax
271 ; XOP-NEXT: vpinsrw $7, (%rsp,%rax,2), %xmm0, %xmm0
272 ; XOP-NEXT: vmovd %xmm1, %eax
273 ; XOP-NEXT: andl $15, %eax
274 ; XOP-NEXT: movzwl (%rsp,%rax,2), %eax
275 ; XOP-NEXT: vmovd %eax, %xmm2
276 ; XOP-NEXT: vpextrw $1, %xmm1, %eax
277 ; XOP-NEXT: andl $15, %eax
278 ; XOP-NEXT: vpinsrw $1, (%rsp,%rax,2), %xmm2, %xmm2
279 ; XOP-NEXT: vpextrw $2, %xmm1, %eax
280 ; XOP-NEXT: andl $15, %eax
281 ; XOP-NEXT: vpinsrw $2, (%rsp,%rax,2), %xmm2, %xmm2
282 ; XOP-NEXT: vpextrw $3, %xmm1, %eax
283 ; XOP-NEXT: andl $15, %eax
284 ; XOP-NEXT: vpinsrw $3, (%rsp,%rax,2), %xmm2, %xmm2
285 ; XOP-NEXT: vpextrw $4, %xmm1, %eax
286 ; XOP-NEXT: andl $15, %eax
287 ; XOP-NEXT: vpinsrw $4, (%rsp,%rax,2), %xmm2, %xmm2
288 ; XOP-NEXT: vpextrw $5, %xmm1, %eax
289 ; XOP-NEXT: andl $15, %eax
290 ; XOP-NEXT: vpinsrw $5, (%rsp,%rax,2), %xmm2, %xmm2
291 ; XOP-NEXT: vpextrw $6, %xmm1, %eax
292 ; XOP-NEXT: andl $15, %eax
293 ; XOP-NEXT: vpinsrw $6, (%rsp,%rax,2), %xmm2, %xmm2
294 ; XOP-NEXT: vpextrw $7, %xmm1, %eax
295 ; XOP-NEXT: andl $15, %eax
296 ; XOP-NEXT: vpinsrw $7, (%rsp,%rax,2), %xmm2, %xmm1
297 ; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
298 ; XOP-NEXT: movq %rbp, %rsp
299 ; XOP-NEXT: popq %rbp
241 ; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [256,256,256,256,256,256,256,256]
242 ; XOP-NEXT: vmovdqa {{.*#+}} xmm3 = [514,514,514,514,514,514,514,514]
243 ; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm4
244 ; XOP-NEXT: vextractf128 $1, %ymm1, %xmm1
245 ; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm1
246 ; XOP-NEXT: vextractf128 $1, %ymm0, %xmm2
247 ; XOP-NEXT: vpperm %xmm1, %xmm2, %xmm0, %xmm1
248 ; XOP-NEXT: vpperm %xmm4, %xmm2, %xmm0, %xmm0
249 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
300250 ; XOP-NEXT: retq
301251 ;
302252 ; AVX1-LABEL: var_shuffle_v16i16:
18571807 define <16 x i16> @var_shuffle_v16i16_from_v8i16(<8 x i16> %v, <16 x i16> %indices) nounwind {
18581808 ; XOP-LABEL: var_shuffle_v16i16_from_v8i16:
18591809 ; XOP: # %bb.0:
1860 ; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2
1861 ; XOP-NEXT: vmovd %xmm2, %eax
1862 ; XOP-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1863 ; XOP-NEXT: andl $7, %eax
1864 ; XOP-NEXT: movzwl -24(%rsp,%rax,2), %eax
1865 ; XOP-NEXT: vmovd %eax, %xmm0
1866 ; XOP-NEXT: vpextrw $1, %xmm2, %eax
1867 ; XOP-NEXT: andl $7, %eax
1868 ; XOP-NEXT: vpinsrw $1, -24(%rsp,%rax,2), %xmm0, %xmm0
1869 ; XOP-NEXT: vpextrw $2, %xmm2, %eax
1870 ; XOP-NEXT: andl $7, %eax
1871 ; XOP-NEXT: vpinsrw $2, -24(%rsp,%rax,2), %xmm0, %xmm0
1872 ; XOP-NEXT: vpextrw $3, %xmm2, %eax
1873 ; XOP-NEXT: andl $7, %eax
1874 ; XOP-NEXT: vpinsrw $3, -24(%rsp,%rax,2), %xmm0, %xmm0
1875 ; XOP-NEXT: vpextrw $4, %xmm2, %eax
1876 ; XOP-NEXT: andl $7, %eax
1877 ; XOP-NEXT: vpinsrw $4, -24(%rsp,%rax,2), %xmm0, %xmm0
1878 ; XOP-NEXT: vpextrw $5, %xmm2, %eax
1879 ; XOP-NEXT: andl $7, %eax
1880 ; XOP-NEXT: vpinsrw $5, -24(%rsp,%rax,2), %xmm0, %xmm0
1881 ; XOP-NEXT: vpextrw $6, %xmm2, %eax
1882 ; XOP-NEXT: andl $7, %eax
1883 ; XOP-NEXT: vpinsrw $6, -24(%rsp,%rax,2), %xmm0, %xmm0
1884 ; XOP-NEXT: vpextrw $7, %xmm2, %eax
1885 ; XOP-NEXT: andl $7, %eax
1886 ; XOP-NEXT: vpinsrw $7, -24(%rsp,%rax,2), %xmm0, %xmm0
1887 ; XOP-NEXT: vmovd %xmm1, %eax
1888 ; XOP-NEXT: andl $7, %eax
1889 ; XOP-NEXT: movzwl -24(%rsp,%rax,2), %eax
1890 ; XOP-NEXT: vmovd %eax, %xmm2
1891 ; XOP-NEXT: vpextrw $1, %xmm1, %eax
1892 ; XOP-NEXT: andl $7, %eax
1893 ; XOP-NEXT: vpinsrw $1, -24(%rsp,%rax,2), %xmm2, %xmm2
1894 ; XOP-NEXT: vpextrw $2, %xmm1, %eax
1895 ; XOP-NEXT: andl $7, %eax
1896 ; XOP-NEXT: vpinsrw $2, -24(%rsp,%rax,2), %xmm2, %xmm2
1897 ; XOP-NEXT: vpextrw $3, %xmm1, %eax
1898 ; XOP-NEXT: andl $7, %eax
1899 ; XOP-NEXT: vpinsrw $3, -24(%rsp,%rax,2), %xmm2, %xmm2
1900 ; XOP-NEXT: vpextrw $4, %xmm1, %eax
1901 ; XOP-NEXT: andl $7, %eax
1902 ; XOP-NEXT: vpinsrw $4, -24(%rsp,%rax,2), %xmm2, %xmm2
1903 ; XOP-NEXT: vpextrw $5, %xmm1, %eax
1904 ; XOP-NEXT: andl $7, %eax
1905 ; XOP-NEXT: vpinsrw $5, -24(%rsp,%rax,2), %xmm2, %xmm2
1906 ; XOP-NEXT: vpextrw $6, %xmm1, %eax
1907 ; XOP-NEXT: andl $7, %eax
1908 ; XOP-NEXT: vpinsrw $6, -24(%rsp,%rax,2), %xmm2, %xmm2
1909 ; XOP-NEXT: vpextrw $7, %xmm1, %eax
1910 ; XOP-NEXT: andl $7, %eax
1911 ; XOP-NEXT: vpinsrw $7, -24(%rsp,%rax,2), %xmm2, %xmm1
1912 ; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1810 ; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [256,256,256,256,256,256,256,256]
1811 ; XOP-NEXT: vmovdqa {{.*#+}} xmm3 = [514,514,514,514,514,514,514,514]
1812 ; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm4
1813 ; XOP-NEXT: vextractf128 $1, %ymm1, %xmm1
1814 ; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm1
1815 ; XOP-NEXT: vpperm %xmm1, %xmm0, %xmm0, %xmm1
1816 ; XOP-NEXT: vpperm %xmm4, %xmm0, %xmm0, %xmm0
1817 ; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
19131818 ; XOP-NEXT: retq
19141819 ;
19151820 ; AVX1-LABEL: var_shuffle_v16i16_from_v8i16: