@@ -1823,3 +1823,70 @@ define <4 x i64> @shift32_v4i64(<4 x i64> %a) nounwind {
18231823 %shift = shl <4 x i64 > %a , <i64 32 , i64 32 , i64 32 , i64 32 >
18241824 ret <4 x i64 > %shift
18251825}
1826+
1827+ define <4 x i64 > @shift32_v4i64_concat (<2 x i64 > %lo , <2 x i64 > %hi ) nounwind {
1828+ ; AVX1-LABEL: shift32_v4i64_concat:
1829+ ; AVX1: # %bb.0:
1830+ ; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1831+ ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1832+ ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1833+ ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
1834+ ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
1835+ ; AVX1-NEXT: retq
1836+ ;
1837+ ; AVX2-LABEL: shift32_v4i64_concat:
1838+ ; AVX2: # %bb.0:
1839+ ; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1840+ ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1841+ ; AVX2-NEXT: vpsllq $32, %ymm0, %ymm0
1842+ ; AVX2-NEXT: retq
1843+ ;
1844+ ; XOPAVX1-LABEL: shift32_v4i64_concat:
1845+ ; XOPAVX1: # %bb.0:
1846+ ; XOPAVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1847+ ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1848+ ; XOPAVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1849+ ; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
1850+ ; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
1851+ ; XOPAVX1-NEXT: retq
1852+ ;
1853+ ; XOPAVX2-LABEL: shift32_v4i64_concat:
1854+ ; XOPAVX2: # %bb.0:
1855+ ; XOPAVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1856+ ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1857+ ; XOPAVX2-NEXT: vpsllq $32, %ymm0, %ymm0
1858+ ; XOPAVX2-NEXT: retq
1859+ ;
1860+ ; AVX512-LABEL: shift32_v4i64_concat:
1861+ ; AVX512: # %bb.0:
1862+ ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1863+ ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1864+ ; AVX512-NEXT: vpsllq $32, %ymm0, %ymm0
1865+ ; AVX512-NEXT: retq
1866+ ;
1867+ ; AVX512VL-LABEL: shift32_v4i64_concat:
1868+ ; AVX512VL: # %bb.0:
1869+ ; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1870+ ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1871+ ; AVX512VL-NEXT: vpsllq $32, %ymm0, %ymm0
1872+ ; AVX512VL-NEXT: retq
1873+ ;
1874+ ; X86-AVX1-LABEL: shift32_v4i64_concat:
1875+ ; X86-AVX1: # %bb.0:
1876+ ; X86-AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1877+ ; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1878+ ; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1879+ ; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
1880+ ; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
1881+ ; X86-AVX1-NEXT: retl
1882+ ;
1883+ ; X86-AVX2-LABEL: shift32_v4i64_concat:
1884+ ; X86-AVX2: # %bb.0:
1885+ ; X86-AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1886+ ; X86-AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1887+ ; X86-AVX2-NEXT: vpsllq $32, %ymm0, %ymm0
1888+ ; X86-AVX2-NEXT: retl
1889+ %a = shufflevector <2 x i64 > %lo , <2 x i64 > %hi , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
1890+ %shift = shl <4 x i64 > %a , <i64 32 , i64 32 , i64 32 , i64 32 >
1891+ ret <4 x i64 > %shift
1892+ }
0 commit comments