mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
Recommit r368079 "[X86] Remove uses of the -x86-experimental-vector-widening-legalization flag from test/CodeGen/X86/"
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368184 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx -x86-experimental-vector-widening-legalization | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
|
||||
|
||||
; Check that we perform a scalar XOR on i32.
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,6 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefix=CHECK-ALL --check-prefix=CHECK-SSE --check-prefix=CHECK-NOSSSE3
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+ssse3 | FileCheck %s --check-prefix=CHECK-ALL --check-prefix=CHECK-SSE --check-prefix=CHECK-SSSE3
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 | FileCheck %s --check-prefix=CHECK-ALL --check-prefix=CHECK-AVX --check-prefix=CHECK-AVX2
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-ALL --check-prefix=CHECK-WIDE-AVX --check-prefix=CHECK-WIDE-AVX2
|
||||
|
||||
declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)
|
||||
declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)
|
||||
@@ -31,11 +30,6 @@ define <8 x i16> @test1(<8 x i16> %v) {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test1:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %v)
|
||||
ret <8 x i16> %r
|
||||
@@ -64,11 +58,6 @@ define <4 x i32> @test2(<4 x i32> %v) {
|
||||
; CHECK-AVX: # %bb.0:
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test2:
|
||||
; CHECK-WIDE-AVX: # %bb.0:
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
%r = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %v)
|
||||
ret <4 x i32> %r
|
||||
}
|
||||
@@ -99,12 +88,6 @@ define <4 x i32> @or_bswap(<4 x i32> %x, <4 x i32> %y, <4 x i32>* %p1, <4 x i32>
|
||||
; CHECK-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: or_bswap:
|
||||
; CHECK-WIDE-AVX: # %bb.0:
|
||||
; CHECK-WIDE-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
%xt = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %x)
|
||||
%yt = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %y)
|
||||
%r = or <4 x i32> %xt, %yt
|
||||
@@ -136,11 +119,6 @@ define <2 x i64> @test3(<2 x i64> %v) {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test3:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %v)
|
||||
ret <2 x i64> %r
|
||||
@@ -183,11 +161,6 @@ define <16 x i16> @test4(<16 x i16> %v) {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test4:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %v)
|
||||
ret <16 x i16> %r
|
||||
@@ -226,11 +199,6 @@ define <8 x i32> @test5(<8 x i32> %v) {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test5:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %v)
|
||||
ret <8 x i32> %r
|
||||
@@ -273,11 +241,6 @@ define <4 x i64> @test6(<4 x i64> %v) {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test6:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %v)
|
||||
ret <4 x i64> %r
|
||||
@@ -308,11 +271,6 @@ define <4 x i16> @test7(<4 x i16> %v) {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: test7:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <4 x i16> @llvm.bswap.v4i16(<4 x i16> %v)
|
||||
ret <4 x i16> %r
|
||||
@@ -406,11 +364,6 @@ define <8 x i16> @fold_v8i16() {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,256,65535,512,65023,1024,64511,1536]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: fold_v8i16:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,256,65535,512,65023,1024,64511,1536]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> <i16 0, i16 1, i16 -1, i16 2, i16 -3, i16 4, i16 -5, i16 6>)
|
||||
ret <8 x i16> %r
|
||||
@@ -426,11 +379,6 @@ define <4 x i32> @fold_v4i32() {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,4294967295,33554432,4261412863]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: fold_v4i32:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,4294967295,33554432,4261412863]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> <i32 0, i32 -1, i32 2, i32 -3>)
|
||||
ret <4 x i32> %r
|
||||
@@ -446,11 +394,6 @@ define <2 x i64> @fold_v2i64() {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vmovaps {{.*#+}} xmm0 = [18374686479671623680,18446744073709551615]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: fold_v2i64:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vmovaps {{.*#+}} xmm0 = [18374686479671623680,18446744073709551615]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> <i64 255, i64 -1>)
|
||||
ret <2 x i64> %r
|
||||
@@ -467,11 +410,6 @@ define <16 x i16> @fold_v16i16() {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,256,65535,512,65023,1024,64511,1536,63999,2048,63487,2560,62975,3072,62463,3584]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: fold_v16i16:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,256,65535,512,65023,1024,64511,1536,63999,2048,63487,2560,62975,3072,62463,3584]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> <i16 0, i16 1, i16 -1, i16 2, i16 -3, i16 4, i16 -5, i16 6, i16 -7, i16 8, i16 -9, i16 10, i16 -11, i16 12, i16 -13, i16 14>)
|
||||
ret <16 x i16> %r
|
||||
@@ -488,11 +426,6 @@ define <8 x i32> @fold_v8i32() {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,16777216,4294967295,33554432,4261412863,67108864,4227858431,100663296]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: fold_v8i32:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,16777216,4294967295,33554432,4261412863,67108864,4227858431,100663296]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> <i32 0, i32 1, i32 -1, i32 2, i32 -3, i32 4, i32 -5, i32 6>)
|
||||
ret <8 x i32> %r
|
||||
@@ -509,11 +442,6 @@ define <4 x i64> @fold_v4i64() {
|
||||
; CHECK-AVX: # %bb.0: # %entry
|
||||
; CHECK-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [18374686479671623680,18446744073709551615,18446462598732840960,72056494526300160]
|
||||
; CHECK-AVX-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-AVX-LABEL: fold_v4i64:
|
||||
; CHECK-WIDE-AVX: # %bb.0: # %entry
|
||||
; CHECK-WIDE-AVX-NEXT: vmovaps {{.*#+}} ymm0 = [18374686479671623680,18446744073709551615,18446462598732840960,72056494526300160]
|
||||
; CHECK-WIDE-AVX-NEXT: retq
|
||||
entry:
|
||||
%r = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> <i64 255, i64 -1, i64 65535, i64 16776960>)
|
||||
ret <4 x i64> %r
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=core2 -mattr=+sse2 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=core2 -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE
|
||||
|
||||
; FIXME: Ideally we should be able to fold the entire body of @test1 into a
|
||||
; single paddd instruction. At the moment we produce the sequence
|
||||
@@ -11,11 +10,6 @@ define double @test1(double %A) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test1:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: paddd {{.*}}(%rip), %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <2 x i32>
|
||||
%add = add <2 x i32> %1, <i32 3, i32 5>
|
||||
%2 = bitcast <2 x i32> %add to double
|
||||
@@ -27,11 +21,6 @@ define double @test2(double %A, double %B) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: paddd %xmm1, %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test2:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: paddd %xmm1, %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <2 x i32>
|
||||
%2 = bitcast double %B to <2 x i32>
|
||||
%add = add <2 x i32> %1, %2
|
||||
@@ -46,13 +35,6 @@ define i64 @test3(i64 %A) {
|
||||
; CHECK-NEXT: addps {{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: movq %xmm0, %rax
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test3:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: movq %rdi, %xmm0
|
||||
; CHECK-WIDE-NEXT: addps {{.*}}(%rip), %xmm0
|
||||
; CHECK-WIDE-NEXT: movq %xmm0, %rax
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast i64 %A to <2 x float>
|
||||
%add = fadd <2 x float> %1, <float 3.0, float 5.0>
|
||||
%2 = bitcast <2 x float> %add to i64
|
||||
@@ -69,13 +51,6 @@ define i64 @test4(i64 %A) {
|
||||
; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: movq %xmm0, %rax
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test4:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: movq %rdi, %xmm0
|
||||
; CHECK-WIDE-NEXT: paddd {{.*}}(%rip), %xmm0
|
||||
; CHECK-WIDE-NEXT: movq %xmm0, %rax
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast i64 %A to <2 x i32>
|
||||
%add = add <2 x i32> %1, <i32 3, i32 5>
|
||||
%2 = bitcast <2 x i32> %add to i64
|
||||
@@ -87,11 +62,6 @@ define double @test5(double %A) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: addps {{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test5:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: addps {{.*}}(%rip), %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <2 x float>
|
||||
%add = fadd <2 x float> %1, <float 3.0, float 5.0>
|
||||
%2 = bitcast <2 x float> %add to double
|
||||
@@ -106,11 +76,6 @@ define double @test6(double %A) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: paddw {{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test6:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: paddw {{.*}}(%rip), %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <4 x i16>
|
||||
%add = add <4 x i16> %1, <i16 3, i16 4, i16 5, i16 6>
|
||||
%2 = bitcast <4 x i16> %add to double
|
||||
@@ -122,11 +87,6 @@ define double @test7(double %A, double %B) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: paddw %xmm1, %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test7:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: paddw %xmm1, %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <4 x i16>
|
||||
%2 = bitcast double %B to <4 x i16>
|
||||
%add = add <4 x i16> %1, %2
|
||||
@@ -143,11 +103,6 @@ define double @test8(double %A) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: paddb {{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test8:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: paddb {{.*}}(%rip), %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <8 x i8>
|
||||
%add = add <8 x i8> %1, <i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10>
|
||||
%2 = bitcast <8 x i8> %add to double
|
||||
@@ -159,11 +114,6 @@ define double @test9(double %A, double %B) {
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: paddb %xmm1, %xmm0
|
||||
; CHECK-NEXT: retq
|
||||
;
|
||||
; CHECK-WIDE-LABEL: test9:
|
||||
; CHECK-WIDE: # %bb.0:
|
||||
; CHECK-WIDE-NEXT: paddb %xmm1, %xmm0
|
||||
; CHECK-WIDE-NEXT: retq
|
||||
%1 = bitcast double %A to <8 x i8>
|
||||
%2 = bitcast double %B to <8 x i8>
|
||||
%add = add <8 x i8> %1, %2
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq -x86-experimental-vector-widening-legalization < %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIDEN --check-prefix=WIDEN_SKX
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f -x86-experimental-vector-widening-legalization < %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIDEN --check-prefix=WIDEN_KNL
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq < %s | FileCheck %s --check-prefix=CHECK --check-prefix=PROMOTE --check-prefix=PROMOTE_SKX
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefix=CHECK --check-prefix=PROMOTE --check-prefix=PROMOTE_KNL
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake -x86-experimental-vector-widening-legalization < %s | FileCheck %s --check-prefix=WIDEN_AVX2
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake < %s | FileCheck %s --check-prefix=PROMOTE_AVX2
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512vl -mattr=+avx512dq < %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIDEN --check-prefix=WIDEN_SKX
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIDEN --check-prefix=WIDEN_KNL
|
||||
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake < %s | FileCheck %s --check-prefix=WIDEN_AVX2
|
||||
|
||||
define <2 x double> @test_gather_v2i32_index(double* %base, <2 x i32> %ind, <2 x i1> %mask, <2 x double> %src0) {
|
||||
; WIDEN_SKX-LABEL: test_gather_v2i32_index:
|
||||
@@ -28,40 +25,12 @@ define <2 x double> @test_gather_v2i32_index(double* %base, <2 x i32> %ind, <2 x
|
||||
; WIDEN_KNL-NEXT: vzeroupper
|
||||
; WIDEN_KNL-NEXT: retq
|
||||
;
|
||||
; PROMOTE_SKX-LABEL: test_gather_v2i32_index:
|
||||
; PROMOTE_SKX: # %bb.0:
|
||||
; PROMOTE_SKX-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_SKX-NEXT: vpmovq2m %xmm1, %k1
|
||||
; PROMOTE_SKX-NEXT: vgatherdpd (%rdi,%xmm0,8), %xmm2 {%k1}
|
||||
; PROMOTE_SKX-NEXT: vmovapd %xmm2, %xmm0
|
||||
; PROMOTE_SKX-NEXT: retq
|
||||
;
|
||||
; PROMOTE_KNL-LABEL: test_gather_v2i32_index:
|
||||
; PROMOTE_KNL: # %bb.0:
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
|
||||
; PROMOTE_KNL-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_KNL-NEXT: vptestmq %zmm1, %zmm1, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftlw $14, %k0, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftrw $14, %k0, %k1
|
||||
; PROMOTE_KNL-NEXT: vgatherdpd (%rdi,%ymm0,8), %zmm2 {%k1}
|
||||
; PROMOTE_KNL-NEXT: vmovapd %xmm2, %xmm0
|
||||
; PROMOTE_KNL-NEXT: vzeroupper
|
||||
; PROMOTE_KNL-NEXT: retq
|
||||
;
|
||||
; WIDEN_AVX2-LABEL: test_gather_v2i32_index:
|
||||
; WIDEN_AVX2: # %bb.0:
|
||||
; WIDEN_AVX2-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; WIDEN_AVX2-NEXT: vgatherdpd %xmm1, (%rdi,%xmm0,8), %xmm2
|
||||
; WIDEN_AVX2-NEXT: vmovapd %xmm2, %xmm0
|
||||
; WIDEN_AVX2-NEXT: retq
|
||||
;
|
||||
; PROMOTE_AVX2-LABEL: test_gather_v2i32_index:
|
||||
; PROMOTE_AVX2: # %bb.0:
|
||||
; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vgatherdpd %xmm1, (%rdi,%xmm0,8), %xmm2
|
||||
; PROMOTE_AVX2-NEXT: vmovapd %xmm2, %xmm0
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
%gep.random = getelementptr double, double* %base, <2 x i32> %ind
|
||||
%res = call <2 x double> @llvm.masked.gather.v2f64.v2p0f64(<2 x double*> %gep.random, i32 4, <2 x i1> %mask, <2 x double> %src0)
|
||||
ret <2 x double> %res
|
||||
@@ -87,25 +56,6 @@ define void @test_scatter_v2i32_index(<2 x double> %a1, double* %base, <2 x i32>
|
||||
; WIDEN_KNL-NEXT: vzeroupper
|
||||
; WIDEN_KNL-NEXT: retq
|
||||
;
|
||||
; PROMOTE_SKX-LABEL: test_scatter_v2i32_index:
|
||||
; PROMOTE_SKX: # %bb.0:
|
||||
; PROMOTE_SKX-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_SKX-NEXT: vpmovq2m %xmm2, %k1
|
||||
; PROMOTE_SKX-NEXT: vscatterdpd %xmm0, (%rdi,%xmm1,8) {%k1}
|
||||
; PROMOTE_SKX-NEXT: retq
|
||||
;
|
||||
; PROMOTE_KNL-LABEL: test_scatter_v2i32_index:
|
||||
; PROMOTE_KNL: # %bb.0:
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm1
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
|
||||
; PROMOTE_KNL-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_KNL-NEXT: vptestmq %zmm2, %zmm2, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftlw $14, %k0, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftrw $14, %k0, %k1
|
||||
; PROMOTE_KNL-NEXT: vscatterdpd %zmm0, (%rdi,%ymm1,8) {%k1}
|
||||
; PROMOTE_KNL-NEXT: vzeroupper
|
||||
; PROMOTE_KNL-NEXT: retq
|
||||
;
|
||||
; WIDEN_AVX2-LABEL: test_scatter_v2i32_index:
|
||||
; WIDEN_AVX2: # %bb.0:
|
||||
; WIDEN_AVX2-NEXT: vpmovsxdq %xmm1, %xmm1
|
||||
@@ -131,32 +81,6 @@ define void @test_scatter_v2i32_index(<2 x double> %a1, double* %base, <2 x i32>
|
||||
; WIDEN_AVX2-NEXT: vpextrq $1, %xmm1, %rax
|
||||
; WIDEN_AVX2-NEXT: vmovhps %xmm0, (%rax)
|
||||
; WIDEN_AVX2-NEXT: retq
|
||||
;
|
||||
; PROMOTE_AVX2-LABEL: test_scatter_v2i32_index:
|
||||
; PROMOTE_AVX2: # %bb.0:
|
||||
; PROMOTE_AVX2-NEXT: vpmovsxdq %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vpsllq $3, %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vmovq %rdi, %xmm3
|
||||
; PROMOTE_AVX2-NEXT: vpbroadcastq %xmm3, %xmm3
|
||||
; PROMOTE_AVX2-NEXT: vpaddq %xmm1, %xmm3, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_AVX2-NEXT: vmovmskpd %xmm2, %eax
|
||||
; PROMOTE_AVX2-NEXT: testb $1, %al
|
||||
; PROMOTE_AVX2-NEXT: jne .LBB1_1
|
||||
; PROMOTE_AVX2-NEXT: # %bb.2: # %else
|
||||
; PROMOTE_AVX2-NEXT: testb $2, %al
|
||||
; PROMOTE_AVX2-NEXT: jne .LBB1_3
|
||||
; PROMOTE_AVX2-NEXT: .LBB1_4: # %else2
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
; PROMOTE_AVX2-NEXT: .LBB1_1: # %cond.store
|
||||
; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rcx
|
||||
; PROMOTE_AVX2-NEXT: vmovlps %xmm0, (%rcx)
|
||||
; PROMOTE_AVX2-NEXT: testb $2, %al
|
||||
; PROMOTE_AVX2-NEXT: je .LBB1_4
|
||||
; PROMOTE_AVX2-NEXT: .LBB1_3: # %cond.store1
|
||||
; PROMOTE_AVX2-NEXT: vpextrq $1, %xmm1, %rax
|
||||
; PROMOTE_AVX2-NEXT: vmovhps %xmm0, (%rax)
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
%gep = getelementptr double, double *%base, <2 x i32> %ind
|
||||
call void @llvm.masked.scatter.v2f64.v2p0f64(<2 x double> %a1, <2 x double*> %gep, i32 4, <2 x i1> %mask)
|
||||
ret void
|
||||
@@ -184,27 +108,6 @@ define <2 x i32> @test_gather_v2i32_data(<2 x i32*> %ptr, <2 x i1> %mask, <2 x i
|
||||
; WIDEN_KNL-NEXT: vzeroupper
|
||||
; WIDEN_KNL-NEXT: retq
|
||||
;
|
||||
; PROMOTE_SKX-LABEL: test_gather_v2i32_data:
|
||||
; PROMOTE_SKX: # %bb.0:
|
||||
; PROMOTE_SKX-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_SKX-NEXT: vpmovq2m %xmm1, %k1
|
||||
; PROMOTE_SKX-NEXT: vpgatherqd (,%xmm0), %xmm2 {%k1}
|
||||
; PROMOTE_SKX-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; PROMOTE_SKX-NEXT: retq
|
||||
;
|
||||
; PROMOTE_KNL-LABEL: test_gather_v2i32_data:
|
||||
; PROMOTE_KNL: # %bb.0:
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
|
||||
; PROMOTE_KNL-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_KNL-NEXT: vptestmq %zmm1, %zmm1, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftlw $14, %k0, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftrw $14, %k0, %k1
|
||||
; PROMOTE_KNL-NEXT: vpgatherqd (,%zmm0), %ymm2 {%k1}
|
||||
; PROMOTE_KNL-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; PROMOTE_KNL-NEXT: vzeroupper
|
||||
; PROMOTE_KNL-NEXT: retq
|
||||
;
|
||||
; WIDEN_AVX2-LABEL: test_gather_v2i32_data:
|
||||
; WIDEN_AVX2: # %bb.0:
|
||||
; WIDEN_AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
|
||||
@@ -212,14 +115,6 @@ define <2 x i32> @test_gather_v2i32_data(<2 x i32*> %ptr, <2 x i1> %mask, <2 x i
|
||||
; WIDEN_AVX2-NEXT: vpgatherqd %xmm1, (,%xmm0), %xmm2
|
||||
; WIDEN_AVX2-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; WIDEN_AVX2-NEXT: retq
|
||||
;
|
||||
; PROMOTE_AVX2-LABEL: test_gather_v2i32_data:
|
||||
; PROMOTE_AVX2: # %bb.0:
|
||||
; PROMOTE_AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
|
||||
; PROMOTE_AVX2-NEXT: vpslld $31, %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vpgatherqd %xmm1, (,%xmm0), %xmm2
|
||||
; PROMOTE_AVX2-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
%res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0i32(<2 x i32*> %ptr, i32 4, <2 x i1> %mask, <2 x i32> %src0)
|
||||
ret <2 x i32>%res
|
||||
}
|
||||
@@ -244,25 +139,6 @@ define void @test_scatter_v2i32_data(<2 x i32>%a1, <2 x i32*> %ptr, <2 x i1>%mas
|
||||
; WIDEN_KNL-NEXT: vzeroupper
|
||||
; WIDEN_KNL-NEXT: retq
|
||||
;
|
||||
; PROMOTE_SKX-LABEL: test_scatter_v2i32_data:
|
||||
; PROMOTE_SKX: # %bb.0:
|
||||
; PROMOTE_SKX-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_SKX-NEXT: vpmovq2m %xmm2, %k1
|
||||
; PROMOTE_SKX-NEXT: vpscatterqd %xmm0, (,%xmm1) {%k1}
|
||||
; PROMOTE_SKX-NEXT: retq
|
||||
;
|
||||
; PROMOTE_KNL-LABEL: test_scatter_v2i32_data:
|
||||
; PROMOTE_KNL: # %bb.0:
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
|
||||
; PROMOTE_KNL-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_KNL-NEXT: vptestmq %zmm2, %zmm2, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftlw $14, %k0, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftrw $14, %k0, %k1
|
||||
; PROMOTE_KNL-NEXT: vpscatterqd %ymm0, (,%zmm1) {%k1}
|
||||
; PROMOTE_KNL-NEXT: vzeroupper
|
||||
; PROMOTE_KNL-NEXT: retq
|
||||
;
|
||||
; WIDEN_AVX2-LABEL: test_scatter_v2i32_data:
|
||||
; WIDEN_AVX2: # %bb.0:
|
||||
; WIDEN_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
@@ -283,27 +159,6 @@ define void @test_scatter_v2i32_data(<2 x i32>%a1, <2 x i32*> %ptr, <2 x i1>%mas
|
||||
; WIDEN_AVX2-NEXT: vpextrq $1, %xmm1, %rax
|
||||
; WIDEN_AVX2-NEXT: vextractps $1, %xmm0, (%rax)
|
||||
; WIDEN_AVX2-NEXT: retq
|
||||
;
|
||||
; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data:
|
||||
; PROMOTE_AVX2: # %bb.0:
|
||||
; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_AVX2-NEXT: vmovmskpd %xmm2, %eax
|
||||
; PROMOTE_AVX2-NEXT: testb $1, %al
|
||||
; PROMOTE_AVX2-NEXT: jne .LBB3_1
|
||||
; PROMOTE_AVX2-NEXT: # %bb.2: # %else
|
||||
; PROMOTE_AVX2-NEXT: testb $2, %al
|
||||
; PROMOTE_AVX2-NEXT: jne .LBB3_3
|
||||
; PROMOTE_AVX2-NEXT: .LBB3_4: # %else2
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
; PROMOTE_AVX2-NEXT: .LBB3_1: # %cond.store
|
||||
; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rcx
|
||||
; PROMOTE_AVX2-NEXT: vmovss %xmm0, (%rcx)
|
||||
; PROMOTE_AVX2-NEXT: testb $2, %al
|
||||
; PROMOTE_AVX2-NEXT: je .LBB3_4
|
||||
; PROMOTE_AVX2-NEXT: .LBB3_3: # %cond.store1
|
||||
; PROMOTE_AVX2-NEXT: vpextrq $1, %xmm1, %rax
|
||||
; PROMOTE_AVX2-NEXT: vextractps $1, %xmm0, (%rax)
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %ptr, i32 4, <2 x i1> %mask)
|
||||
ret void
|
||||
}
|
||||
@@ -330,27 +185,6 @@ define <2 x i32> @test_gather_v2i32_data_index(i32* %base, <2 x i32> %ind, <2 x
|
||||
; WIDEN_KNL-NEXT: vzeroupper
|
||||
; WIDEN_KNL-NEXT: retq
|
||||
;
|
||||
; PROMOTE_SKX-LABEL: test_gather_v2i32_data_index:
|
||||
; PROMOTE_SKX: # %bb.0:
|
||||
; PROMOTE_SKX-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_SKX-NEXT: vpmovq2m %xmm1, %k1
|
||||
; PROMOTE_SKX-NEXT: vpgatherdd (%rdi,%xmm0,4), %xmm2 {%k1}
|
||||
; PROMOTE_SKX-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; PROMOTE_SKX-NEXT: retq
|
||||
;
|
||||
; PROMOTE_KNL-LABEL: test_gather_v2i32_data_index:
|
||||
; PROMOTE_KNL: # %bb.0:
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
|
||||
; PROMOTE_KNL-NEXT: vpsllq $63, %xmm1, %xmm1
|
||||
; PROMOTE_KNL-NEXT: vptestmq %zmm1, %zmm1, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftlw $14, %k0, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftrw $14, %k0, %k1
|
||||
; PROMOTE_KNL-NEXT: vpgatherdd (%rdi,%zmm0,4), %zmm2 {%k1}
|
||||
; PROMOTE_KNL-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; PROMOTE_KNL-NEXT: vzeroupper
|
||||
; PROMOTE_KNL-NEXT: retq
|
||||
;
|
||||
; WIDEN_AVX2-LABEL: test_gather_v2i32_data_index:
|
||||
; WIDEN_AVX2: # %bb.0:
|
||||
; WIDEN_AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
|
||||
@@ -358,14 +192,6 @@ define <2 x i32> @test_gather_v2i32_data_index(i32* %base, <2 x i32> %ind, <2 x
|
||||
; WIDEN_AVX2-NEXT: vpgatherdd %xmm1, (%rdi,%xmm0,4), %xmm2
|
||||
; WIDEN_AVX2-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; WIDEN_AVX2-NEXT: retq
|
||||
;
|
||||
; PROMOTE_AVX2-LABEL: test_gather_v2i32_data_index:
|
||||
; PROMOTE_AVX2: # %bb.0:
|
||||
; PROMOTE_AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
|
||||
; PROMOTE_AVX2-NEXT: vpslld $31, %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vpgatherdd %xmm1, (%rdi,%xmm0,4), %xmm2
|
||||
; PROMOTE_AVX2-NEXT: vmovdqa %xmm2, %xmm0
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
%gep.random = getelementptr i32, i32* %base, <2 x i32> %ind
|
||||
%res = call <2 x i32> @llvm.masked.gather.v2i32.v2p0i32(<2 x i32*> %gep.random, i32 4, <2 x i1> %mask, <2 x i32> %src0)
|
||||
ret <2 x i32> %res
|
||||
@@ -391,25 +217,6 @@ define void @test_scatter_v2i32_data_index(<2 x i32> %a1, i32* %base, <2 x i32>
|
||||
; WIDEN_KNL-NEXT: vzeroupper
|
||||
; WIDEN_KNL-NEXT: retq
|
||||
;
|
||||
; PROMOTE_SKX-LABEL: test_scatter_v2i32_data_index:
|
||||
; PROMOTE_SKX: # %bb.0:
|
||||
; PROMOTE_SKX-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_SKX-NEXT: vpmovq2m %xmm2, %k1
|
||||
; PROMOTE_SKX-NEXT: vpscatterdd %xmm0, (%rdi,%xmm1,4) {%k1}
|
||||
; PROMOTE_SKX-NEXT: retq
|
||||
;
|
||||
; PROMOTE_KNL-LABEL: test_scatter_v2i32_data_index:
|
||||
; PROMOTE_KNL: # %bb.0:
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
|
||||
; PROMOTE_KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
|
||||
; PROMOTE_KNL-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_KNL-NEXT: vptestmq %zmm2, %zmm2, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftlw $14, %k0, %k0
|
||||
; PROMOTE_KNL-NEXT: kshiftrw $14, %k0, %k1
|
||||
; PROMOTE_KNL-NEXT: vpscatterdd %zmm0, (%rdi,%zmm1,4) {%k1}
|
||||
; PROMOTE_KNL-NEXT: vzeroupper
|
||||
; PROMOTE_KNL-NEXT: retq
|
||||
;
|
||||
; WIDEN_AVX2-LABEL: test_scatter_v2i32_data_index:
|
||||
; WIDEN_AVX2: # %bb.0:
|
||||
; WIDEN_AVX2-NEXT: vpmovsxdq %xmm1, %xmm1
|
||||
@@ -435,32 +242,6 @@ define void @test_scatter_v2i32_data_index(<2 x i32> %a1, i32* %base, <2 x i32>
|
||||
; WIDEN_AVX2-NEXT: vpextrq $1, %xmm1, %rax
|
||||
; WIDEN_AVX2-NEXT: vextractps $1, %xmm0, (%rax)
|
||||
; WIDEN_AVX2-NEXT: retq
|
||||
;
|
||||
; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data_index:
|
||||
; PROMOTE_AVX2: # %bb.0:
|
||||
; PROMOTE_AVX2-NEXT: vpmovsxdq %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vpsllq $2, %xmm1, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vmovq %rdi, %xmm3
|
||||
; PROMOTE_AVX2-NEXT: vpbroadcastq %xmm3, %xmm3
|
||||
; PROMOTE_AVX2-NEXT: vpaddq %xmm1, %xmm3, %xmm1
|
||||
; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2
|
||||
; PROMOTE_AVX2-NEXT: vmovmskpd %xmm2, %eax
|
||||
; PROMOTE_AVX2-NEXT: testb $1, %al
|
||||
; PROMOTE_AVX2-NEXT: jne .LBB5_1
|
||||
; PROMOTE_AVX2-NEXT: # %bb.2: # %else
|
||||
; PROMOTE_AVX2-NEXT: testb $2, %al
|
||||
; PROMOTE_AVX2-NEXT: jne .LBB5_3
|
||||
; PROMOTE_AVX2-NEXT: .LBB5_4: # %else2
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
; PROMOTE_AVX2-NEXT: .LBB5_1: # %cond.store
|
||||
; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rcx
|
||||
; PROMOTE_AVX2-NEXT: vmovss %xmm0, (%rcx)
|
||||
; PROMOTE_AVX2-NEXT: testb $2, %al
|
||||
; PROMOTE_AVX2-NEXT: je .LBB5_4
|
||||
; PROMOTE_AVX2-NEXT: .LBB5_3: # %cond.store1
|
||||
; PROMOTE_AVX2-NEXT: vpextrq $1, %xmm1, %rax
|
||||
; PROMOTE_AVX2-NEXT: vextractps $1, %xmm0, (%rax)
|
||||
; PROMOTE_AVX2-NEXT: retq
|
||||
%gep = getelementptr i32, i32 *%base, <2 x i32> %ind
|
||||
call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %gep, i32 4, <2 x i1> %mask)
|
||||
ret void
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 --check-prefix=SSE2-PROMOTE
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 --check-prefix=SSE2-WIDEN
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 --check-prefix=SSE41-PROMOTE
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 --check-prefix=SSE41-WIDEN
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,574 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-SLOW
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-FAST
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
|
||||
|
||||
; PR31551
|
||||
; Pairs of shufflevector:trunc functions with functional equivalence.
|
||||
; Ideally, the shuffles should be lowered to code with the same quality as the truncates.
|
||||
|
||||
define void @shuffle_v16i8_to_v8i8(<16 x i8>* %L, <8 x i8>* %S) nounwind {
|
||||
; SSE2-LABEL: shuffle_v16i8_to_v8i8:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: shuffle_v16i8_to_v8i8:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; SSE42-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: shuffle_v16i8_to_v8i8:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; AVX-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512-LABEL: shuffle_v16i8_to_v8i8:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <16 x i8>, <16 x i8>* %L
|
||||
%strided.vec = shufflevector <16 x i8> %vec, <16 x i8> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
|
||||
store <8 x i8> %strided.vec, <8 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v8i16_to_v8i8(<16 x i8>* %L, <8 x i8>* %S) nounwind {
|
||||
; SSE2-LABEL: trunc_v8i16_to_v8i8:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: trunc_v8i16_to_v8i8:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; SSE42-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: trunc_v8i16_to_v8i8:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; AVX-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: trunc_v8i16_to_v8i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512F-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v8i16_to_v8i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512VL-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v8i16_to_v8i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512BW-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v8i16_to_v8i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpmovwb %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <16 x i8>, <16 x i8>* %L
|
||||
%bc = bitcast <16 x i8> %vec to <8 x i16>
|
||||
%strided.vec = trunc <8 x i16> %bc to <8 x i8>
|
||||
store <8 x i8> %strided.vec, <8 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v8i16_to_v4i16(<8 x i16>* %L, <4 x i16>* %S) nounwind {
|
||||
; SSE2-LABEL: shuffle_v8i16_to_v4i16:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,2,2,3,4,5,6,7]
|
||||
; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
|
||||
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
|
||||
; SSE2-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: shuffle_v8i16_to_v4i16:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; SSE42-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: shuffle_v8i16_to_v4i16:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; AVX-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512-LABEL: shuffle_v8i16_to_v4i16:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; AVX512-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <8 x i16>, <8 x i16>* %L
|
||||
%strided.vec = shufflevector <8 x i16> %vec, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
|
||||
store <4 x i16> %strided.vec, <4 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v4i32_to_v4i16(<8 x i16>* %L, <4 x i16>* %S) nounwind {
|
||||
; SSE2-LABEL: trunc_v4i32_to_v4i16:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,2,2,3,4,5,6,7]
|
||||
; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
|
||||
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
|
||||
; SSE2-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: trunc_v4i32_to_v4i16:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; SSE42-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: trunc_v4i32_to_v4i16:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; AVX-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: trunc_v4i32_to_v4i16:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; AVX512F-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v4i32_to_v4i16:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpmovdw %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v4i32_to_v4i16:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; AVX512BW-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v4i32_to_v4i16:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpmovdw %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <8 x i16>, <8 x i16>* %L
|
||||
%bc = bitcast <8 x i16> %vec to <4 x i32>
|
||||
%strided.vec = trunc <4 x i32> %bc to <4 x i16>
|
||||
store <4 x i16> %strided.vec, <4 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v4i32_to_v2i32(<4 x i32>* %L, <2 x i32>* %S) nounwind {
|
||||
; SSE-LABEL: shuffle_v4i32_to_v2i32:
|
||||
; SSE: # %bb.0:
|
||||
; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; SSE-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: shuffle_v4i32_to_v2i32:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX-NEXT: vmovlps %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512-LABEL: shuffle_v4i32_to_v2i32:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX512-NEXT: vmovlps %xmm0, (%rsi)
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <4 x i32>, <4 x i32>* %L
|
||||
%strided.vec = shufflevector <4 x i32> %vec, <4 x i32> undef, <2 x i32> <i32 0, i32 2>
|
||||
store <2 x i32> %strided.vec, <2 x i32>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v2i64_to_v2i32(<4 x i32>* %L, <2 x i32>* %S) nounwind {
|
||||
; SSE-LABEL: trunc_v2i64_to_v2i32:
|
||||
; SSE: # %bb.0:
|
||||
; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; SSE-NEXT: movq %xmm0, (%rsi)
|
||||
; SSE-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: trunc_v2i64_to_v2i32:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX-NEXT: vmovlps %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: trunc_v2i64_to_v2i32:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vmovlps %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v2i64_to_v2i32:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpmovqd %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v2i64_to_v2i32:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX512BW-NEXT: vmovlps %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v2i64_to_v2i32:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpmovqd %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <4 x i32>, <4 x i32>* %L
|
||||
%bc = bitcast <4 x i32> %vec to <2 x i64>
|
||||
%strided.vec = trunc <2 x i64> %bc to <2 x i32>
|
||||
store <2 x i32> %strided.vec, <2 x i32>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v16i8_to_v4i8(<16 x i8>* %L, <4 x i8>* %S) nounwind {
|
||||
; SSE2-LABEL: shuffle_v16i8_to_v4i8:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: movd %xmm0, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: shuffle_v16i8_to_v4i8:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; SSE42-NEXT: movd %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: shuffle_v16i8_to_v4i8:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512-LABEL: shuffle_v16i8_to_v4i8:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX512-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <16 x i8>, <16 x i8>* %L
|
||||
%strided.vec = shufflevector <16 x i8> %vec, <16 x i8> undef, <4 x i32> <i32 0, i32 4, i32 8, i32 12>
|
||||
store <4 x i8> %strided.vec, <4 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v4i32_to_v4i8(<16 x i8>* %L, <4 x i8>* %S) nounwind {
|
||||
; SSE2-LABEL: trunc_v4i32_to_v4i8:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: movd %xmm0, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: trunc_v4i32_to_v4i8:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; SSE42-NEXT: movd %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: trunc_v4i32_to_v4i8:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: trunc_v4i32_to_v4i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX512F-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v4i32_to_v4i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpmovdb %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v4i32_to_v4i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX512BW-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v4i32_to_v4i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpmovdb %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <16 x i8>, <16 x i8>* %L
|
||||
%bc = bitcast <16 x i8> %vec to <4 x i32>
|
||||
%strided.vec = trunc <4 x i32> %bc to <4 x i8>
|
||||
store <4 x i8> %strided.vec, <4 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v8i16_to_v2i16(<8 x i16>* %L, <2 x i16>* %S) nounwind {
|
||||
; SSE-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; SSE: # %bb.0:
|
||||
; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; SSE-NEXT: movd %xmm0, (%rsi)
|
||||
; SSE-NEXT: retq
|
||||
;
|
||||
; AVX1-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX1: # %bb.0:
|
||||
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; AVX1-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX1-NEXT: retq
|
||||
;
|
||||
; AVX2-SLOW-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX2-SLOW: # %bb.0:
|
||||
; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; AVX2-SLOW-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX2-SLOW-NEXT: retq
|
||||
;
|
||||
; AVX2-FAST-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX2-FAST: # %bb.0:
|
||||
; AVX2-FAST-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX2-FAST-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX2-FAST-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; AVX512F-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512VL-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512BW-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v8i16_to_v2i16:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512BWVL-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <8 x i16>, <8 x i16>* %L
|
||||
%strided.vec = shufflevector <8 x i16> %vec, <8 x i16> undef, <2 x i32> <i32 0, i32 4>
|
||||
store <2 x i16> %strided.vec, <2 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v2i64_to_v2i16(<8 x i16>* %L, <2 x i16>* %S) nounwind {
|
||||
; SSE-LABEL: trunc_v2i64_to_v2i16:
|
||||
; SSE: # %bb.0:
|
||||
; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; SSE-NEXT: movd %xmm0, (%rsi)
|
||||
; SSE-NEXT: retq
|
||||
;
|
||||
; AVX1-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX1: # %bb.0:
|
||||
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; AVX1-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX1-NEXT: retq
|
||||
;
|
||||
; AVX2-SLOW-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX2-SLOW: # %bb.0:
|
||||
; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; AVX2-SLOW-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX2-SLOW-NEXT: retq
|
||||
;
|
||||
; AVX2-FAST-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX2-FAST: # %bb.0:
|
||||
; AVX2-FAST-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX2-FAST-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX2-FAST-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; AVX512F-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpmovqw %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512BW-NEXT: vmovd %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v2i64_to_v2i16:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpmovqw %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <8 x i16>, <8 x i16>* %L
|
||||
%bc = bitcast <8 x i16> %vec to <2 x i64>
|
||||
%strided.vec = trunc <2 x i64> %bc to <2 x i16>
|
||||
store <2 x i16> %strided.vec, <2 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v16i8_to_v2i8(<16 x i8>* %L, <2 x i8>* %S) nounwind {
|
||||
; SSE2-LABEL: shuffle_v16i8_to_v2i8:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: movd %xmm0, %eax
|
||||
; SSE2-NEXT: movw %ax, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: shuffle_v16i8_to_v2i8:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; SSE42-NEXT: pextrw $0, %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: shuffle_v16i8_to_v2i8:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX-NEXT: vpextrw $0, %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512-LABEL: shuffle_v16i8_to_v2i8:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX512-NEXT: vpextrw $0, %xmm0, (%rsi)
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <16 x i8>, <16 x i8>* %L
|
||||
%strided.vec = shufflevector <16 x i8> %vec, <16 x i8> undef, <2 x i32> <i32 0, i32 8>
|
||||
store <2 x i8> %strided.vec, <2 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v2i64_to_v2i8(<16 x i8>* %L, <2 x i8>* %S) nounwind {
|
||||
; SSE2-LABEL: trunc_v2i64_to_v2i8:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: packuswb %xmm0, %xmm0
|
||||
; SSE2-NEXT: movd %xmm0, %eax
|
||||
; SSE2-NEXT: movw %ax, (%rsi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSE42-LABEL: trunc_v2i64_to_v2i8:
|
||||
; SSE42: # %bb.0:
|
||||
; SSE42-NEXT: movdqa (%rdi), %xmm0
|
||||
; SSE42-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; SSE42-NEXT: pextrw $0, %xmm0, (%rsi)
|
||||
; SSE42-NEXT: retq
|
||||
;
|
||||
; AVX-LABEL: trunc_v2i64_to_v2i8:
|
||||
; AVX: # %bb.0:
|
||||
; AVX-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX-NEXT: vpextrw $0, %xmm0, (%rsi)
|
||||
; AVX-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: trunc_v2i64_to_v2i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX512F-NEXT: vpextrw $0, %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v2i64_to_v2i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vpmovqb %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v2i64_to_v2i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v2i64_to_v2i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vpmovqb %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%vec = load <16 x i8>, <16 x i8>* %L
|
||||
%bc = bitcast <16 x i8> %vec to <2 x i64>
|
||||
%strided.vec = trunc <2 x i64> %bc to <2 x i8>
|
||||
store <2 x i8> %strided.vec, <2 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,903 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VBMI
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VBMIVL
|
||||
|
||||
; PR31551
|
||||
; Pairs of shufflevector:trunc functions with functional equivalence.
|
||||
; Ideally, the shuffles should be lowered to code with the same quality as the truncates.
|
||||
|
||||
define void @shuffle_v64i8_to_v32i8(<64 x i8>* %L, <32 x i8>* %S) nounwind {
|
||||
; AVX512F-LABEL: shuffle_v64i8_to_v32i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[u,u,u,u,u,u,u,u,0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30]
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30,u,u,u,u,u,u,u,u]
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
|
||||
; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512F-NEXT: vmovdqa %ymm0, (%rsi)
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v64i8_to_v32i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512VL-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[u,u,u,u,u,u,u,u,0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30]
|
||||
; AVX512VL-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30,u,u,u,u,u,u,u,u]
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,5,7]
|
||||
; AVX512VL-NEXT: vpermi2q %ymm1, %ymm0, %ymm2
|
||||
; AVX512VL-NEXT: vmovdqa %ymm2, (%rsi)
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v64i8_to_v32i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512BW-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[u,u,u,u,u,u,u,u,0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30]
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30,u,u,u,u,u,u,u,u]
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
|
||||
; AVX512BW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512BW-NEXT: vmovdqa %ymm0, (%rsi)
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v64i8_to_v32i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512BWVL-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512BWVL-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[u,u,u,u,u,u,u,u,0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30]
|
||||
; AVX512BWVL-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30,u,u,u,u,u,u,u,u]
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,5,7]
|
||||
; AVX512BWVL-NEXT: vpermi2q %ymm1, %ymm0, %ymm2
|
||||
; AVX512BWVL-NEXT: vmovdqa %ymm2, (%rsi)
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: shuffle_v64i8_to_v32i8:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VBMI-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512VBMI-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[u,u,u,u,u,u,u,u,0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30]
|
||||
; AVX512VBMI-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u,16,18,20,22,24,26,28,30,u,u,u,u,u,u,u,u]
|
||||
; AVX512VBMI-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
|
||||
; AVX512VBMI-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512VBMI-NEXT: vmovdqa %ymm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: vzeroupper
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: shuffle_v64i8_to_v32i8:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62]
|
||||
; AVX512VBMIVL-NEXT: vpermi2b 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vmovdqa %ymm1, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <64 x i8>, <64 x i8>* %L
|
||||
%strided.vec = shufflevector <64 x i8> %vec, <64 x i8> undef, <32 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30, i32 32, i32 34, i32 36, i32 38, i32 40, i32 42, i32 44, i32 46, i32 48, i32 50, i32 52, i32 54, i32 56, i32 58, i32 60, i32 62>
|
||||
store <32 x i8> %strided.vec, <32 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v32i16_to_v32i8(<64 x i8>* %L, <32 x i8>* %S) nounwind {
|
||||
; AVX512F-LABEL: trunc_v32i16_to_v32i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
|
||||
; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
|
||||
; AVX512F-NEXT: vpmovdb %zmm1, 16(%rsi)
|
||||
; AVX512F-NEXT: vpmovdb %zmm0, (%rsi)
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_v32i16_to_v32i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
|
||||
; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
|
||||
; AVX512VL-NEXT: vpmovdb %zmm1, 16(%rsi)
|
||||
; AVX512VL-NEXT: vpmovdb %zmm0, (%rsi)
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_v32i16_to_v32i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512BW-NEXT: vpmovwb %zmm0, (%rsi)
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_v32i16_to_v32i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512BWVL-NEXT: vpmovwb %zmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: trunc_v32i16_to_v32i8:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512VBMI-NEXT: vpmovwb %zmm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: vzeroupper
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: trunc_v32i16_to_v32i8:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512VBMIVL-NEXT: vpmovwb %zmm0, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <64 x i8>, <64 x i8>* %L
|
||||
%bc = bitcast <64 x i8> %vec to <32 x i16>
|
||||
%strided.vec = trunc <32 x i16> %bc to <32 x i8>
|
||||
store <32 x i8> %strided.vec, <32 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v32i16_to_v16i16(<32 x i16>* %L, <16 x i16>* %S) nounwind {
|
||||
; AVX512F-LABEL: shuffle_v32i16_to_v16i16:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} ymm0 = mem[0,2,2,3,4,5,6,7,8,10,10,11,12,13,14,15]
|
||||
; AVX512F-NEXT: vpshufhw {{.*#+}} ymm0 = ymm0[0,1,2,3,4,6,6,7,8,9,10,11,12,14,14,15]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} ymm1 = mem[0,2,2,3,4,5,6,7,8,10,10,11,12,13,14,15]
|
||||
; AVX512F-NEXT: vpshufhw {{.*#+}} ymm1 = ymm1[0,1,2,3,4,6,6,7,8,9,10,11,12,14,14,15]
|
||||
; AVX512F-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
|
||||
; AVX512F-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512F-NEXT: vmovaps %ymm0, (%rsi)
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v32i16_to_v16i16:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,4,5,6,7,8,9,12,13,12,13,14,15,16,17,20,21,20,21,22,23,24,25,28,29,28,29,30,31]
|
||||
; AVX512VL-NEXT: vpshufb %ymm2, %ymm1, %ymm1
|
||||
; AVX512VL-NEXT: vpshufb %ymm2, %ymm0, %ymm0
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,8,10,12,14]
|
||||
; AVX512VL-NEXT: vpermi2d %ymm1, %ymm0, %ymm2
|
||||
; AVX512VL-NEXT: vmovdqa %ymm2, (%rsi)
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v32i16_to_v16i16:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512BW-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,4,5,6,7,8,9,12,13,12,13,14,15,16,17,20,21,20,21,22,23,24,25,28,29,28,29,30,31]
|
||||
; AVX512BW-NEXT: vpshufb %ymm2, %ymm1, %ymm1
|
||||
; AVX512BW-NEXT: vpshufb %ymm2, %ymm0, %ymm0
|
||||
; AVX512BW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
|
||||
; AVX512BW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512BW-NEXT: vmovaps %ymm0, (%rsi)
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v32i16_to_v16i16:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
|
||||
; AVX512BWVL-NEXT: vpermi2w 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512BWVL-NEXT: vmovdqa %ymm1, (%rsi)
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: shuffle_v32i16_to_v16i16:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VBMI-NEXT: vmovdqa 32(%rdi), %ymm1
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,4,5,6,7,8,9,12,13,12,13,14,15,16,17,20,21,20,21,22,23,24,25,28,29,28,29,30,31]
|
||||
; AVX512VBMI-NEXT: vpshufb %ymm2, %ymm1, %ymm1
|
||||
; AVX512VBMI-NEXT: vpshufb %ymm2, %ymm0, %ymm0
|
||||
; AVX512VBMI-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
|
||||
; AVX512VBMI-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512VBMI-NEXT: vmovaps %ymm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: vzeroupper
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: shuffle_v32i16_to_v16i16:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
|
||||
; AVX512VBMIVL-NEXT: vpermi2w 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vmovdqa %ymm1, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <32 x i16>, <32 x i16>* %L
|
||||
%strided.vec = shufflevector <32 x i16> %vec, <32 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
|
||||
store <16 x i16> %strided.vec, <16 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v16i32_to_v16i16(<32 x i16>* %L, <16 x i16>* %S) nounwind {
|
||||
; AVX512-LABEL: trunc_v16i32_to_v16i16:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512-NEXT: vpmovdw %zmm0, (%rsi)
|
||||
; AVX512-NEXT: vzeroupper
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <32 x i16>, <32 x i16>* %L
|
||||
%bc = bitcast <32 x i16> %vec to <16 x i32>
|
||||
%strided.vec = trunc <16 x i32> %bc to <16 x i16>
|
||||
store <16 x i16> %strided.vec, <16 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v16i32_to_v8i32(<16 x i32>* %L, <8 x i32>* %S) nounwind {
|
||||
; AVX512F-LABEL: shuffle_v16i32_to_v8i32:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovaps (%rdi), %ymm0
|
||||
; AVX512F-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],mem[0,2],ymm0[4,6],mem[4,6]
|
||||
; AVX512F-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512F-NEXT: vmovaps %ymm0, (%rsi)
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v16i32_to_v8i32:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,8,10,12,14]
|
||||
; AVX512VL-NEXT: vpermi2d 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VL-NEXT: vmovdqa %ymm1, (%rsi)
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v16i32_to_v8i32:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovaps (%rdi), %ymm0
|
||||
; AVX512BW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],mem[0,2],ymm0[4,6],mem[4,6]
|
||||
; AVX512BW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512BW-NEXT: vmovaps %ymm0, (%rsi)
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v16i32_to_v8i32:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,8,10,12,14]
|
||||
; AVX512BWVL-NEXT: vpermi2d 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512BWVL-NEXT: vmovdqa %ymm1, (%rsi)
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: shuffle_v16i32_to_v8i32:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovaps (%rdi), %ymm0
|
||||
; AVX512VBMI-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],mem[0,2],ymm0[4,6],mem[4,6]
|
||||
; AVX512VBMI-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
|
||||
; AVX512VBMI-NEXT: vmovaps %ymm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: vzeroupper
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: shuffle_v16i32_to_v8i32:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,8,10,12,14]
|
||||
; AVX512VBMIVL-NEXT: vpermi2d 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vmovdqa %ymm1, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <16 x i32>, <16 x i32>* %L
|
||||
%strided.vec = shufflevector <16 x i32> %vec, <16 x i32> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
|
||||
store <8 x i32> %strided.vec, <8 x i32>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v8i64_to_v8i32(<16 x i32>* %L, <8 x i32>* %S) nounwind {
|
||||
; AVX512-LABEL: trunc_v8i64_to_v8i32:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512-NEXT: vpmovqd %zmm0, (%rsi)
|
||||
; AVX512-NEXT: vzeroupper
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <16 x i32>, <16 x i32>* %L
|
||||
%bc = bitcast <16 x i32> %vec to <8 x i64>
|
||||
%strided.vec = trunc <8 x i64> %bc to <8 x i32>
|
||||
store <8 x i32> %strided.vec, <8 x i32>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v64i8_to_v16i8(<64 x i8>* %L, <16 x i8>* %S) nounwind {
|
||||
; AVX512F-LABEL: shuffle_v64i8_to_v16i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512F-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512F-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512F-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512F-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v64i8_to_v16i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512VL-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512VL-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512VL-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512VL-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v64i8_to_v16i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512BW-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512BW-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512BW-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512BW-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v64i8_to_v16i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512BWVL-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512BWVL-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512BWVL-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BWVL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512BWVL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512BWVL-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: shuffle_v64i8_to_v16i8:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VBMI-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512VBMI-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512VBMI-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512VBMI-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: shuffle_v64i8_to_v16i8:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} xmm0 = [0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60]
|
||||
; AVX512VBMIVL-NEXT: vmovdqa (%rdi), %ymm1
|
||||
; AVX512VBMIVL-NEXT: vpermt2b 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vmovdqa %xmm1, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <64 x i8>, <64 x i8>* %L
|
||||
%strided.vec = shufflevector <64 x i8> %vec, <64 x i8> undef, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28, i32 32, i32 36, i32 40, i32 44, i32 48, i32 52, i32 56, i32 60>
|
||||
store <16 x i8> %strided.vec, <16 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v16i32_to_v16i8(<64 x i8>* %L, <16 x i8>* %S) nounwind {
|
||||
; AVX512-LABEL: trunc_v16i32_to_v16i8:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512-NEXT: vpmovdb %zmm0, (%rsi)
|
||||
; AVX512-NEXT: vzeroupper
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <64 x i8>, <64 x i8>* %L
|
||||
%bc = bitcast <64 x i8> %vec to <16 x i32>
|
||||
%strided.vec = trunc <16 x i32> %bc to <16 x i8>
|
||||
store <16 x i8> %strided.vec, <16 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v32i16_to_v8i16(<32 x i16>* %L, <8 x i16>* %S) nounwind {
|
||||
; AVX512F-LABEL: shuffle_v32i16_to_v8i16:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
|
||||
; AVX512F-NEXT: vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7]
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
|
||||
; AVX512F-NEXT: vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
|
||||
; AVX512F-NEXT: vpshufd {{.*#+}} xmm2 = mem[0,2,2,3]
|
||||
; AVX512F-NEXT: vpshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
|
||||
; AVX512F-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v32i16_to_v8i16:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512VL-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512VL-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,0,1,8,9,8,9,10,11,12,13,14,15]
|
||||
; AVX512VL-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512VL-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512VL-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v32i16_to_v8i16:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512BW-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512BW-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,0,1,8,9,8,9,10,11,12,13,14,15]
|
||||
; AVX512BW-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512BW-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512BW-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v32i16_to_v8i16:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm0 = [0,4,8,12,16,20,24,28]
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %ymm1
|
||||
; AVX512BWVL-NEXT: vpermt2w 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512BWVL-NEXT: vmovdqa %xmm1, (%rsi)
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: shuffle_v32i16_to_v8i16:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VBMI-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512VBMI-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512VBMI-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,2,3,0,1,8,9,8,9,10,11,12,13,14,15]
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VBMI-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
|
||||
; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]
|
||||
; AVX512VBMI-NEXT: vmovdqa %xmm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: shuffle_v32i16_to_v8i16:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} xmm0 = [0,4,8,12,16,20,24,28]
|
||||
; AVX512VBMIVL-NEXT: vmovdqa (%rdi), %ymm1
|
||||
; AVX512VBMIVL-NEXT: vpermt2w 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vmovdqa %xmm1, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <32 x i16>, <32 x i16>* %L
|
||||
%strided.vec = shufflevector <32 x i16> %vec, <32 x i16> undef, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28>
|
||||
store <8 x i16> %strided.vec, <8 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v8i64_to_v8i16(<32 x i16>* %L, <8 x i16>* %S) nounwind {
|
||||
; AVX512-LABEL: trunc_v8i64_to_v8i16:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512-NEXT: vpmovqw %zmm0, (%rsi)
|
||||
; AVX512-NEXT: vzeroupper
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <32 x i16>, <32 x i16>* %L
|
||||
%bc = bitcast <32 x i16> %vec to <8 x i64>
|
||||
%strided.vec = trunc <8 x i64> %bc to <8 x i16>
|
||||
store <8 x i16> %strided.vec, <8 x i16>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @shuffle_v64i8_to_v8i8(<64 x i8>* %L, <8 x i8>* %S) nounwind {
|
||||
; AVX512F-LABEL: shuffle_v64i8_to_v8i8:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512F-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512F-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512F-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512F-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512F-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3]
|
||||
; AVX512F-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: shuffle_v64i8_to_v8i8:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512VL-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512VL-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512VL-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512VL-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
|
||||
; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3]
|
||||
; AVX512VL-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: shuffle_v64i8_to_v8i8:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512BW-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512BW-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512BW-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512BW-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BW-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3]
|
||||
; AVX512BW-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: shuffle_v64i8_to_v8i8:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512BWVL-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512BWVL-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512BWVL-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512BWVL-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BWVL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
|
||||
; AVX512BWVL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3]
|
||||
; AVX512BWVL-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: shuffle_v64i8_to_v8i8:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa (%rdi), %xmm0
|
||||
; AVX512VBMI-NEXT: vmovdqa 16(%rdi), %xmm1
|
||||
; AVX512VBMI-NEXT: vmovdqa 32(%rdi), %xmm2
|
||||
; AVX512VBMI-NEXT: vmovdqa 48(%rdi), %xmm3
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm4 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm4, %xmm3, %xmm3
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm4, %xmm2, %xmm2
|
||||
; AVX512VBMI-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VBMI-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VBMI-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
|
||||
; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2,3]
|
||||
; AVX512VBMI-NEXT: vmovq %xmm0, (%rsi)
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: shuffle_v64i8_to_v8i8:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa (%rdi), %ymm0
|
||||
; AVX512VBMIVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4048780183313844224,4048780183313844224,4048780183313844224,4048780183313844224]
|
||||
; AVX512VBMIVL-NEXT: vpermi2b 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vmovq %xmm1, (%rsi)
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%vec = load <64 x i8>, <64 x i8>* %L
|
||||
%strided.vec = shufflevector <64 x i8> %vec, <64 x i8> undef, <8 x i32> <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 48, i32 56>
|
||||
store <8 x i8> %strided.vec, <8 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @trunc_v8i64_to_v8i8(<64 x i8>* %L, <8 x i8>* %S) nounwind {
|
||||
; AVX512-LABEL: trunc_v8i64_to_v8i8:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
|
||||
; AVX512-NEXT: vpmovqb %zmm0, (%rsi)
|
||||
; AVX512-NEXT: vzeroupper
|
||||
; AVX512-NEXT: retq
|
||||
%vec = load <64 x i8>, <64 x i8>* %L
|
||||
%bc = bitcast <64 x i8> %vec to <8 x i64>
|
||||
%strided.vec = trunc <8 x i64> %bc to <8 x i8>
|
||||
store <8 x i8> %strided.vec, <8 x i8>* %S
|
||||
ret void
|
||||
}
|
||||
|
||||
define <16 x i8> @trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61(<64 x i8> %x) {
|
||||
; AVX512F-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = <u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
|
||||
; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vextracti128 $1, %ymm1, %xmm2
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = <u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
|
||||
; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
|
||||
; AVX512BW-NEXT: vextracti128 $1, %ymm1, %xmm2
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm3 = <u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
|
||||
; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm3 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512BW-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
|
||||
; AVX512BWVL-NEXT: vextracti128 $1, %ymm1, %xmm2
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm3 = <u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX512BWVL-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
|
||||
; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm3 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512BWVL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512BWVL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm1 = [1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61]
|
||||
; AVX512VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm0
|
||||
; AVX512VBMI-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
|
||||
; AVX512VBMI-NEXT: vzeroupper
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_61:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} xmm1 = [1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61]
|
||||
; AVX512VBMIVL-NEXT: vextracti64x4 $1, %zmm0, %ymm2
|
||||
; AVX512VBMIVL-NEXT: vpermt2b %ymm2, %ymm1, %ymm0
|
||||
; AVX512VBMIVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%res = shufflevector <64 x i8> %x, <64 x i8> %x, <16 x i32> <i32 1, i32 5, i32 9, i32 13, i32 17, i32 21, i32 25, i32 29, i32 33, i32 37, i32 41, i32 45, i32 49, i32 53, i32 57, i32 61>
|
||||
ret <16 x i8> %res
|
||||
}
|
||||
|
||||
define <16 x i8> @trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62(<64 x i8> %x) {
|
||||
; AVX512F-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512F-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,1,5,9,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512F-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u]
|
||||
; AVX512F-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX512VL-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512VL-NEXT: vextracti128 $1, %ymm1, %xmm2
|
||||
; AVX512VL-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,1,5,9,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512VL-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u]
|
||||
; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
|
||||
; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
|
||||
; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BW-NEXT: vpshufb %xmm2, %xmm1, %xmm1
|
||||
; AVX512BW-NEXT: vpshufb %xmm2, %xmm0, %xmm2
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm0
|
||||
; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,1,5,9,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u]
|
||||
; AVX512BW-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm1
|
||||
; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm2, %xmm1, %xmm1
|
||||
; AVX512BWVL-NEXT: vpshufb %xmm2, %xmm0, %xmm2
|
||||
; AVX512BWVL-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; AVX512BWVL-NEXT: vextracti64x4 $1, %zmm0, %ymm0
|
||||
; AVX512BWVL-NEXT: vextracti128 $1, %ymm0, %xmm2
|
||||
; AVX512BWVL-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[u,u,u,u,1,5,9,14,u,u,u,u,u,u,u,u]
|
||||
; AVX512BWVL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,1,5,9,13,u,u,u,u,u,u,u,u]
|
||||
; AVX512BWVL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
|
||||
; AVX512BWVL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqa {{.*#+}} xmm1 = [1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,62]
|
||||
; AVX512VBMI-NEXT: vpermb %zmm0, %zmm1, %zmm0
|
||||
; AVX512VBMI-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
|
||||
; AVX512VBMI-NEXT: vzeroupper
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: trunc_shuffle_v64i8_01_05_09_13_17_21_25_29_33_37_41_45_49_53_57_62:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqa {{.*#+}} xmm1 = [1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,62]
|
||||
; AVX512VBMIVL-NEXT: vextracti64x4 $1, %zmm0, %ymm2
|
||||
; AVX512VBMIVL-NEXT: vpermt2b %ymm2, %ymm1, %ymm0
|
||||
; AVX512VBMIVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
|
||||
; AVX512VBMIVL-NEXT: vzeroupper
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%res = shufflevector <64 x i8> %x, <64 x i8> %x, <16 x i32> <i32 1, i32 5, i32 9, i32 13, i32 17, i32 21, i32 25, i32 29, i32 33, i32 37, i32 41, i32 45, i32 49, i32 53, i32 57, i32 62>
|
||||
ret <16 x i8> %res
|
||||
}
|
||||
|
||||
define <4 x double> @PR34175(<32 x i16>* %p) {
|
||||
; AVX512F-LABEL: PR34175:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: vmovdqu (%rdi), %xmm0
|
||||
; AVX512F-NEXT: vmovdqu 32(%rdi), %xmm1
|
||||
; AVX512F-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
|
||||
; AVX512F-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
|
||||
; AVX512F-NEXT: vpbroadcastd %xmm1, %xmm1
|
||||
; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
|
||||
; AVX512F-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; AVX512F-NEXT: vcvtdq2pd %xmm0, %ymm0
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: PR34175:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: vmovdqu (%rdi), %xmm0
|
||||
; AVX512VL-NEXT: vmovdqu 32(%rdi), %xmm1
|
||||
; AVX512VL-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
|
||||
; AVX512VL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
|
||||
; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm2 = [0,4,2,3]
|
||||
; AVX512VL-NEXT: vpermi2d %xmm1, %xmm0, %xmm2
|
||||
; AVX512VL-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
|
||||
; AVX512VL-NEXT: vcvtdq2pd %xmm0, %ymm0
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: PR34175:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: vmovdqu (%rdi), %xmm0
|
||||
; AVX512BW-NEXT: vmovdqu 32(%rdi), %xmm1
|
||||
; AVX512BW-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
|
||||
; AVX512BW-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
|
||||
; AVX512BW-NEXT: vpbroadcastd %xmm1, %xmm1
|
||||
; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
|
||||
; AVX512BW-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; AVX512BW-NEXT: vcvtdq2pd %xmm0, %ymm0
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: PR34175:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: vmovdqu (%rdi), %ymm0
|
||||
; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6755468161056768,6755468161056768,6755468161056768,6755468161056768]
|
||||
; AVX512BWVL-NEXT: vpermi2w 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512BWVL-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
|
||||
; AVX512BWVL-NEXT: vcvtdq2pd %xmm0, %ymm0
|
||||
; AVX512BWVL-NEXT: retq
|
||||
;
|
||||
; AVX512VBMI-LABEL: PR34175:
|
||||
; AVX512VBMI: # %bb.0:
|
||||
; AVX512VBMI-NEXT: vmovdqu (%rdi), %xmm0
|
||||
; AVX512VBMI-NEXT: vmovdqu 32(%rdi), %xmm1
|
||||
; AVX512VBMI-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
|
||||
; AVX512VBMI-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
|
||||
; AVX512VBMI-NEXT: vpbroadcastd %xmm1, %xmm1
|
||||
; AVX512VBMI-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
|
||||
; AVX512VBMI-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; AVX512VBMI-NEXT: vcvtdq2pd %xmm0, %ymm0
|
||||
; AVX512VBMI-NEXT: retq
|
||||
;
|
||||
; AVX512VBMIVL-LABEL: PR34175:
|
||||
; AVX512VBMIVL: # %bb.0:
|
||||
; AVX512VBMIVL-NEXT: vmovdqu (%rdi), %ymm0
|
||||
; AVX512VBMIVL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6755468161056768,6755468161056768,6755468161056768,6755468161056768]
|
||||
; AVX512VBMIVL-NEXT: vpermi2w 32(%rdi), %ymm0, %ymm1
|
||||
; AVX512VBMIVL-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
|
||||
; AVX512VBMIVL-NEXT: vcvtdq2pd %xmm0, %ymm0
|
||||
; AVX512VBMIVL-NEXT: retq
|
||||
%v = load <32 x i16>, <32 x i16>* %p, align 2
|
||||
%shuf = shufflevector <32 x i16> %v, <32 x i16> undef, <4 x i32> <i32 0, i32 8, i32 16, i32 24>
|
||||
%tofp = uitofp <4 x i16> %shuf to <4 x double>
|
||||
ret <4 x double> %tofp
|
||||
}
|
||||
|
||||
define <16 x i8> @trunc_v8i64_to_v8i8_return_v16i8(<8 x i64> %vec) nounwind {
|
||||
; AVX512-LABEL: trunc_v8i64_to_v8i8_return_v16i8:
|
||||
; AVX512: # %bb.0:
|
||||
; AVX512-NEXT: vpmovqb %zmm0, %xmm0
|
||||
; AVX512-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero
|
||||
; AVX512-NEXT: vzeroupper
|
||||
; AVX512-NEXT: retq
|
||||
%truncated = trunc <8 x i64> %vec to <8 x i8>
|
||||
%result = shufflevector <8 x i8> %truncated, <8 x i8> zeroinitializer, <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>
|
||||
ret <16 x i8> %result
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=i386-apple-darwin10 -mattr=+avx | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=i386-apple-darwin10 -mattr=+avx -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE
|
||||
|
||||
define <8 x float> @cvt_v8i8_v8f32(<8 x i8> %src) {
|
||||
; CHECK-LABEL: cvt_v8i8_v8f32:
|
||||
@@ -11,15 +10,6 @@ define <8 x float> @cvt_v8i8_v8f32(<8 x i8> %src) {
|
||||
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
||||
; CHECK-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8i8_v8f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovsxbd %xmm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
|
||||
; CHECK-WIDE-NEXT: vpmovsxbd %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <8 x i8> %src to <8 x float>
|
||||
ret <8 x float> %res
|
||||
}
|
||||
@@ -33,15 +23,6 @@ define <8 x float> @cvt_v8i16_v8f32(<8 x i16> %src) {
|
||||
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
||||
; CHECK-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8i16_v8f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovsxwd %xmm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
|
||||
; CHECK-WIDE-NEXT: vpmovsxwd %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <8 x i16> %src to <8 x float>
|
||||
ret <8 x float> %res
|
||||
}
|
||||
@@ -52,12 +33,6 @@ define <4 x float> @cvt_v4i8_v4f32(<4 x i8> %src) {
|
||||
; CHECK-NEXT: vpmovsxbd %xmm0, %xmm0
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4i8_v4f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovsxbd %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <4 x i8> %src to <4 x float>
|
||||
ret <4 x float> %res
|
||||
}
|
||||
@@ -68,12 +43,6 @@ define <4 x float> @cvt_v4i16_v4f32(<4 x i16> %src) {
|
||||
; CHECK-NEXT: vpmovsxwd %xmm0, %xmm0
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4i16_v4f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovsxwd %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <4 x i16> %src to <4 x float>
|
||||
ret <4 x float> %res
|
||||
}
|
||||
@@ -87,15 +56,6 @@ define <8 x float> @cvt_v8u8_v8f32(<8 x i8> %src) {
|
||||
; CHECK-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
||||
; CHECK-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8u8_v8f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
|
||||
; CHECK-WIDE-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
|
||||
; CHECK-WIDE-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
|
||||
; CHECK-WIDE-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <8 x i8> %src to <8 x float>
|
||||
ret <8 x float> %res
|
||||
}
|
||||
@@ -109,15 +69,6 @@ define <8 x float> @cvt_v8u16_v8f32(<8 x i16> %src) {
|
||||
; CHECK-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
|
||||
; CHECK-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8u16_v8f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpxor %xmm1, %xmm1, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
|
||||
; CHECK-WIDE-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; CHECK-WIDE-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <8 x i16> %src to <8 x float>
|
||||
ret <8 x float> %res
|
||||
}
|
||||
@@ -128,12 +79,6 @@ define <4 x float> @cvt_v4u8_v4f32(<4 x i8> %src) {
|
||||
; CHECK-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4u8_v4f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <4 x i8> %src to <4 x float>
|
||||
ret <4 x float> %res
|
||||
}
|
||||
@@ -144,12 +89,6 @@ define <4 x float> @cvt_v4u16_v4f32(<4 x i16> %src) {
|
||||
; CHECK-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4u16_v4f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <4 x i16> %src to <4 x float>
|
||||
ret <4 x float> %res
|
||||
}
|
||||
@@ -163,15 +102,6 @@ define <8 x i8> @cvt_v8f32_v8i8(<8 x float> %src) {
|
||||
; CHECK-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
|
||||
; CHECK-NEXT: vzeroupper
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8f32_v8i8:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: vextractf128 $1, %ymm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vzeroupper
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <8 x float> %src to <8 x i8>
|
||||
ret <8 x i8> %res
|
||||
}
|
||||
@@ -184,14 +114,6 @@ define <8 x i16> @cvt_v8f32_v8i16(<8 x float> %src) {
|
||||
; CHECK-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
|
||||
; CHECK-NEXT: vzeroupper
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8f32_v8i16:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: vextractf128 $1, %ymm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vzeroupper
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <8 x float> %src to <8 x i16>
|
||||
ret <8 x i16> %res
|
||||
}
|
||||
@@ -202,12 +124,6 @@ define <4 x i8> @cvt_v4f32_v4i8(<4 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4f32_v4i8:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <4 x float> %src to <4 x i8>
|
||||
ret <4 x i8> %res
|
||||
}
|
||||
@@ -218,12 +134,6 @@ define <4 x i16> @cvt_v4f32_v4i16(<4 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4f32_v4i16:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <4 x float> %src to <4 x i16>
|
||||
ret <4 x i16> %res
|
||||
}
|
||||
@@ -237,15 +147,6 @@ define <8 x i8> @cvt_v8f32_v8u8(<8 x float> %src) {
|
||||
; CHECK-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
|
||||
; CHECK-NEXT: vzeroupper
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8f32_v8u8:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: vextractf128 $1, %ymm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vzeroupper
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <8 x float> %src to <8 x i8>
|
||||
ret <8 x i8> %res
|
||||
}
|
||||
@@ -258,14 +159,6 @@ define <8 x i16> @cvt_v8f32_v8u16(<8 x float> %src) {
|
||||
; CHECK-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
|
||||
; CHECK-NEXT: vzeroupper
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v8f32_v8u16:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: vextractf128 $1, %ymm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vzeroupper
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <8 x float> %src to <8 x i16>
|
||||
ret <8 x i16> %res
|
||||
}
|
||||
@@ -276,12 +169,6 @@ define <4 x i8> @cvt_v4f32_v4u8(<4 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4f32_v4u8:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <4 x float> %src to <4 x i8>
|
||||
ret <4 x i8> %res
|
||||
}
|
||||
@@ -292,12 +179,6 @@ define <4 x i16> @cvt_v4f32_v4u16(<4 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v4f32_v4u16:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <4 x float> %src to <4 x i16>
|
||||
ret <4 x i16> %res
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=i386-apple-darwin10 -mattr=+avx | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=i386-apple-darwin10 -mattr=+avx -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE
|
||||
|
||||
define <2 x float> @cvt_v2i8_v2f32(<2 x i8> %src) {
|
||||
; CHECK-LABEL: cvt_v2i8_v2f32:
|
||||
@@ -8,12 +7,6 @@ define <2 x float> @cvt_v2i8_v2f32(<2 x i8> %src) {
|
||||
; CHECK-NEXT: vpmovsxbd %xmm0, %xmm0
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2i8_v2f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovsxbd %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <2 x i8> %src to <2 x float>
|
||||
ret <2 x float> %res
|
||||
}
|
||||
@@ -24,12 +17,6 @@ define <2 x float> @cvt_v2i16_v2f32(<2 x i16> %src) {
|
||||
; CHECK-NEXT: vpmovsxwd %xmm0, %xmm0
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2i16_v2f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovsxwd %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <2 x i16> %src to <2 x float>
|
||||
ret <2 x float> %res
|
||||
}
|
||||
@@ -39,11 +26,6 @@ define <2 x float> @cvt_v2i32_v2f32(<2 x i32> %src) {
|
||||
; CHECK: ## %bb.0:
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2i32_v2f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = sitofp <2 x i32> %src to <2 x float>
|
||||
ret <2 x float> %res
|
||||
}
|
||||
@@ -54,12 +36,6 @@ define <2 x float> @cvt_v2u8_v2f32(<2 x i8> %src) {
|
||||
; CHECK-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2u8_v2f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <2 x i8> %src to <2 x float>
|
||||
ret <2 x float> %res
|
||||
}
|
||||
@@ -70,12 +46,6 @@ define <2 x float> @cvt_v2u16_v2f32(<2 x i16> %src) {
|
||||
; CHECK-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; CHECK-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2u16_v2f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
|
||||
; CHECK-WIDE-NEXT: vcvtdq2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <2 x i16> %src to <2 x float>
|
||||
ret <2 x float> %res
|
||||
}
|
||||
@@ -89,15 +59,6 @@ define <2 x float> @cvt_v2u32_v2f32(<2 x i32> %src) {
|
||||
; CHECK-NEXT: vsubpd %xmm1, %xmm0, %xmm0
|
||||
; CHECK-NEXT: vcvtpd2ps %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2u32_v2f32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
|
||||
; CHECK-WIDE-NEXT: vmovdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
|
||||
; CHECK-WIDE-NEXT: vpor %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vsubpd %xmm1, %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vcvtpd2ps %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = uitofp <2 x i32> %src to <2 x float>
|
||||
ret <2 x float> %res
|
||||
}
|
||||
@@ -108,12 +69,6 @@ define <2 x i8> @cvt_v2f32_v2i8(<2 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2f32_v2i8:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <2 x float> %src to <2 x i8>
|
||||
ret <2 x i8> %res
|
||||
}
|
||||
@@ -124,12 +79,6 @@ define <2 x i16> @cvt_v2f32_v2i16(<2 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2f32_v2i16:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <2 x float> %src to <2 x i16>
|
||||
ret <2 x i16> %res
|
||||
}
|
||||
@@ -139,11 +88,6 @@ define <2 x i32> @cvt_v2f32_v2i32(<2 x float> %src) {
|
||||
; CHECK: ## %bb.0:
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2f32_v2i32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptosi <2 x float> %src to <2 x i32>
|
||||
ret <2 x i32> %res
|
||||
}
|
||||
@@ -154,12 +98,6 @@ define <2 x i8> @cvt_v2f32_v2u8(<2 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2f32_v2u8:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <2 x float> %src to <2 x i8>
|
||||
ret <2 x i8> %res
|
||||
}
|
||||
@@ -170,12 +108,6 @@ define <2 x i16> @cvt_v2f32_v2u16(<2 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2f32_v2u16:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <2 x float> %src to <2 x i16>
|
||||
ret <2 x i16> %res
|
||||
}
|
||||
@@ -191,17 +123,6 @@ define <2 x i32> @cvt_v2f32_v2u32(<2 x float> %src) {
|
||||
; CHECK-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: cvt_v2f32_v2u32:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vmovaps {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
|
||||
; CHECK-WIDE-NEXT: vcmpltps %xmm1, %xmm0, %xmm2
|
||||
; CHECK-WIDE-NEXT: vsubps %xmm1, %xmm0, %xmm1
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm1, %xmm1
|
||||
; CHECK-WIDE-NEXT: vxorps LCPI11_1, %xmm1, %xmm1
|
||||
; CHECK-WIDE-NEXT: vcvttps2dq %xmm0, %xmm0
|
||||
; CHECK-WIDE-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%res = fptoui <2 x float> %src to <2 x i32>
|
||||
ret <2 x i32> %res
|
||||
}
|
||||
@@ -214,14 +135,6 @@ define <32 x i8> @PR40146(<4 x i64> %x) {
|
||||
; CHECK-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
|
||||
; CHECK-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
|
||||
; CHECK-NEXT: retl
|
||||
;
|
||||
; CHECK-WIDE-LABEL: PR40146:
|
||||
; CHECK-WIDE: ## %bb.0:
|
||||
; CHECK-WIDE-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
|
||||
; CHECK-WIDE-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
|
||||
; CHECK-WIDE-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
|
||||
; CHECK-WIDE-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
|
||||
; CHECK-WIDE-NEXT: retl
|
||||
%perm = shufflevector <4 x i64> %x, <4 x i64> undef, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
|
||||
%t1 = bitcast <4 x i64> %perm to <32 x i8>
|
||||
%t2 = shufflevector <32 x i8> %t1, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 32, i32 1, i32 32, i32 2, i32 32, i32 3, i32 32, i32 4, i32 32, i32 5, i32 32, i32 6, i32 32, i32 7, i32 32, i32 16, i32 48, i32 17, i32 48, i32 18, i32 48, i32 19, i32 48, i32 20, i32 48, i32 21, i32 48, i32 22, i32 48, i32 23, i32 48>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64
|
||||
; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=X64_WIDEN
|
||||
; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=X86_WIDEN
|
||||
|
||||
define void @test_udiv7_v2i32(<2 x i32>* %x, <2 x i32>* %y) nounwind {
|
||||
; X64-LABEL: test_udiv7_v2i32:
|
||||
@@ -43,45 +41,6 @@ define void @test_udiv7_v2i32(<2 x i32>* %x, <2 x i32>* %y) nounwind {
|
||||
; X86-NEXT: psrld $2, %xmm0
|
||||
; X86-NEXT: movq %xmm0, (%eax)
|
||||
; X86-NEXT: retl
|
||||
;
|
||||
; X64_WIDEN-LABEL: test_udiv7_v2i32:
|
||||
; X64_WIDEN: # %bb.0:
|
||||
; X64_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X64_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
|
||||
; X64_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; X64_WIDEN-NEXT: psubd %xmm2, %xmm0
|
||||
; X64_WIDEN-NEXT: psrld $1, %xmm0
|
||||
; X64_WIDEN-NEXT: paddd %xmm2, %xmm0
|
||||
; X64_WIDEN-NEXT: psrld $2, %xmm0
|
||||
; X64_WIDEN-NEXT: movq %xmm0, (%rsi)
|
||||
; X64_WIDEN-NEXT: retq
|
||||
;
|
||||
; X86_WIDEN-LABEL: test_udiv7_v2i32:
|
||||
; X86_WIDEN: # %bb.0:
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
||||
; X86_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X86_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3]
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; X86_WIDEN-NEXT: psubd %xmm2, %xmm0
|
||||
; X86_WIDEN-NEXT: psrld $1, %xmm0
|
||||
; X86_WIDEN-NEXT: paddd %xmm2, %xmm0
|
||||
; X86_WIDEN-NEXT: psrld $2, %xmm0
|
||||
; X86_WIDEN-NEXT: movq %xmm0, (%eax)
|
||||
; X86_WIDEN-NEXT: retl
|
||||
%a = load <2 x i32>, <2 x i32>* %x
|
||||
%b = udiv <2 x i32> %a, <i32 7, i32 7>
|
||||
store <2 x i32> %b, <2 x i32>* %y
|
||||
@@ -137,55 +96,6 @@ define void @test_urem7_v2i32(<2 x i32>* %x, <2 x i32>* %y) nounwind {
|
||||
; X86-NEXT: paddd %xmm0, %xmm1
|
||||
; X86-NEXT: movq %xmm1, (%eax)
|
||||
; X86-NEXT: retl
|
||||
;
|
||||
; X64_WIDEN-LABEL: test_urem7_v2i32:
|
||||
; X64_WIDEN: # %bb.0:
|
||||
; X64_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X64_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
|
||||
; X64_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; X64_WIDEN-NEXT: movdqa %xmm0, %xmm1
|
||||
; X64_WIDEN-NEXT: psubd %xmm2, %xmm1
|
||||
; X64_WIDEN-NEXT: psrld $1, %xmm1
|
||||
; X64_WIDEN-NEXT: paddd %xmm2, %xmm1
|
||||
; X64_WIDEN-NEXT: psrld $2, %xmm1
|
||||
; X64_WIDEN-NEXT: movdqa %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: pslld $3, %xmm2
|
||||
; X64_WIDEN-NEXT: psubd %xmm2, %xmm1
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm1
|
||||
; X64_WIDEN-NEXT: movq %xmm1, (%rsi)
|
||||
; X64_WIDEN-NEXT: retq
|
||||
;
|
||||
; X86_WIDEN-LABEL: test_urem7_v2i32:
|
||||
; X86_WIDEN: # %bb.0:
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
||||
; X86_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X86_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3]
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm1
|
||||
; X86_WIDEN-NEXT: psubd %xmm2, %xmm1
|
||||
; X86_WIDEN-NEXT: psrld $1, %xmm1
|
||||
; X86_WIDEN-NEXT: paddd %xmm2, %xmm1
|
||||
; X86_WIDEN-NEXT: psrld $2, %xmm1
|
||||
; X86_WIDEN-NEXT: movdqa %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: pslld $3, %xmm2
|
||||
; X86_WIDEN-NEXT: psubd %xmm2, %xmm1
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm1
|
||||
; X86_WIDEN-NEXT: movq %xmm1, (%eax)
|
||||
; X86_WIDEN-NEXT: retl
|
||||
%a = load <2 x i32>, <2 x i32>* %x
|
||||
%b = urem <2 x i32> %a, <i32 7, i32 7>
|
||||
store <2 x i32> %b, <2 x i32>* %y
|
||||
@@ -243,57 +153,6 @@ define void @test_sdiv7_v2i32(<2 x i32>* %x, <2 x i32>* %y) nounwind {
|
||||
; X86-NEXT: paddd %xmm0, %xmm2
|
||||
; X86-NEXT: movq %xmm2, (%eax)
|
||||
; X86-NEXT: retl
|
||||
;
|
||||
; X64_WIDEN-LABEL: test_sdiv7_v2i32:
|
||||
; X64_WIDEN: # %bb.0:
|
||||
; X64_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X64_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
|
||||
; X64_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; X64_WIDEN-NEXT: pxor %xmm3, %xmm3
|
||||
; X64_WIDEN-NEXT: pcmpgtd %xmm0, %xmm3
|
||||
; X64_WIDEN-NEXT: pand %xmm1, %xmm3
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm3
|
||||
; X64_WIDEN-NEXT: psubd %xmm3, %xmm2
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: movdqa %xmm2, %xmm0
|
||||
; X64_WIDEN-NEXT: psrld $31, %xmm0
|
||||
; X64_WIDEN-NEXT: psrad $2, %xmm2
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: movq %xmm2, (%rsi)
|
||||
; X64_WIDEN-NEXT: retq
|
||||
;
|
||||
; X86_WIDEN-LABEL: test_sdiv7_v2i32:
|
||||
; X86_WIDEN: # %bb.0:
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
||||
; X86_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X86_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3]
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; X86_WIDEN-NEXT: pxor %xmm3, %xmm3
|
||||
; X86_WIDEN-NEXT: pcmpgtd %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: pand %xmm1, %xmm3
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: psubd %xmm3, %xmm2
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: movdqa %xmm2, %xmm0
|
||||
; X86_WIDEN-NEXT: psrld $31, %xmm0
|
||||
; X86_WIDEN-NEXT: psrad $2, %xmm2
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: movq %xmm2, (%eax)
|
||||
; X86_WIDEN-NEXT: retl
|
||||
%a = load <2 x i32>, <2 x i32>* %x
|
||||
%b = sdiv <2 x i32> %a, <i32 7, i32 7>
|
||||
store <2 x i32> %b, <2 x i32>* %y
|
||||
@@ -359,65 +218,6 @@ define void @test_srem7_v2i32(<2 x i32>* %x, <2 x i32>* %y) nounwind {
|
||||
; X86-NEXT: paddd %xmm0, %xmm2
|
||||
; X86-NEXT: movq %xmm2, (%eax)
|
||||
; X86-NEXT: retl
|
||||
;
|
||||
; X64_WIDEN-LABEL: test_srem7_v2i32:
|
||||
; X64_WIDEN: # %bb.0:
|
||||
; X64_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X64_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
|
||||
; X64_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
|
||||
; X64_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X64_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
|
||||
; X64_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; X64_WIDEN-NEXT: pxor %xmm3, %xmm3
|
||||
; X64_WIDEN-NEXT: pcmpgtd %xmm0, %xmm3
|
||||
; X64_WIDEN-NEXT: pand %xmm1, %xmm3
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm3
|
||||
; X64_WIDEN-NEXT: psubd %xmm3, %xmm2
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: movdqa %xmm2, %xmm1
|
||||
; X64_WIDEN-NEXT: psrld $31, %xmm1
|
||||
; X64_WIDEN-NEXT: psrad $2, %xmm2
|
||||
; X64_WIDEN-NEXT: paddd %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: movdqa %xmm2, %xmm1
|
||||
; X64_WIDEN-NEXT: pslld $3, %xmm1
|
||||
; X64_WIDEN-NEXT: psubd %xmm1, %xmm2
|
||||
; X64_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X64_WIDEN-NEXT: movq %xmm2, (%rsi)
|
||||
; X64_WIDEN-NEXT: retq
|
||||
;
|
||||
; X86_WIDEN-LABEL: test_srem7_v2i32:
|
||||
; X86_WIDEN: # %bb.0:
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
||||
; X86_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X86_WIDEN-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: movdqa %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3]
|
||||
; X86_WIDEN-NEXT: pmuludq %xmm1, %xmm3
|
||||
; X86_WIDEN-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
|
||||
; X86_WIDEN-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
|
||||
; X86_WIDEN-NEXT: pxor %xmm3, %xmm3
|
||||
; X86_WIDEN-NEXT: pcmpgtd %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: pand %xmm1, %xmm3
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm3
|
||||
; X86_WIDEN-NEXT: psubd %xmm3, %xmm2
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: movdqa %xmm2, %xmm1
|
||||
; X86_WIDEN-NEXT: psrld $31, %xmm1
|
||||
; X86_WIDEN-NEXT: psrad $2, %xmm2
|
||||
; X86_WIDEN-NEXT: paddd %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: movdqa %xmm2, %xmm1
|
||||
; X86_WIDEN-NEXT: pslld $3, %xmm1
|
||||
; X86_WIDEN-NEXT: psubd %xmm1, %xmm2
|
||||
; X86_WIDEN-NEXT: paddd %xmm0, %xmm2
|
||||
; X86_WIDEN-NEXT: movq %xmm2, (%eax)
|
||||
; X86_WIDEN-NEXT: retl
|
||||
%a = load <2 x i32>, <2 x i32>* %x
|
||||
%b = srem <2 x i32> %a, <i32 7, i32 7>
|
||||
store <2 x i32> %b, <2 x i32>* %y
|
||||
@@ -440,22 +240,6 @@ define void @test_udiv_pow2_v2i32(<2 x i32>* %x, <2 x i32>* %y) nounwind {
|
||||
; X86-NEXT: psrld $3, %xmm0
|
||||
; X86-NEXT: movq %xmm0, (%eax)
|
||||
; X86-NEXT: retl
|
||||
;
|
||||
; X64_WIDEN-LABEL: test_udiv_pow2_v2i32:
|
||||
; X64_WIDEN: # %bb.0:
|
||||
; X64_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X64_WIDEN-NEXT: psrld $3, %xmm0
|
||||
; X64_WIDEN-NEXT: movq %xmm0, (%rsi)
|
||||
; X64_WIDEN-NEXT: retq
|
||||
;
|
||||
; X86_WIDEN-LABEL: test_udiv_pow2_v2i32:
|
||||
; X86_WIDEN: # %bb.0:
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %eax
|
||||
; X86_WIDEN-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
||||
; X86_WIDEN-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
||||
; X86_WIDEN-NEXT: psrld $3, %xmm0
|
||||
; X86_WIDEN-NEXT: movq %xmm0, (%eax)
|
||||
; X86_WIDEN-NEXT: retl
|
||||
%a = load <2 x i32>, <2 x i32>* %x
|
||||
%b = udiv <2 x i32> %a, <i32 8, i32 8>
|
||||
store <2 x i32> %b, <2 x i32>* %y
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -x86-experimental-vector-widening-legalization | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
|
||||
|
||||
declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1 immarg)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1998,3 +1998,129 @@ define void @PR34773(i16* %a0, i8* %a1) {
|
||||
store <16 x i8> %12, <16 x i8>* %6, align 1
|
||||
ret void
|
||||
}
|
||||
|
||||
; Store merging must not infinitely fight store splitting.
|
||||
|
||||
define void @store_merge_split(<8 x i32> %w1, <8 x i32> %w2, i64 %idx, <8 x i16>* %p) align 2 {
|
||||
; SSE2-LABEL: store_merge_split:
|
||||
; SSE2: # %bb.0:
|
||||
; SSE2-NEXT: pslld $16, %xmm1
|
||||
; SSE2-NEXT: psrad $16, %xmm1
|
||||
; SSE2-NEXT: pslld $16, %xmm0
|
||||
; SSE2-NEXT: psrad $16, %xmm0
|
||||
; SSE2-NEXT: packssdw %xmm1, %xmm0
|
||||
; SSE2-NEXT: pslld $16, %xmm3
|
||||
; SSE2-NEXT: psrad $16, %xmm3
|
||||
; SSE2-NEXT: pslld $16, %xmm2
|
||||
; SSE2-NEXT: psrad $16, %xmm2
|
||||
; SSE2-NEXT: packssdw %xmm3, %xmm2
|
||||
; SSE2-NEXT: shlq $4, %rdi
|
||||
; SSE2-NEXT: movdqu %xmm0, (%rsi,%rdi)
|
||||
; SSE2-NEXT: movdqu %xmm2, 16(%rsi,%rdi)
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSSE3-LABEL: store_merge_split:
|
||||
; SSSE3: # %bb.0:
|
||||
; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; SSSE3-NEXT: pshufb %xmm4, %xmm1
|
||||
; SSSE3-NEXT: pshufb %xmm4, %xmm0
|
||||
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
|
||||
; SSSE3-NEXT: pshufb %xmm4, %xmm3
|
||||
; SSSE3-NEXT: pshufb %xmm4, %xmm2
|
||||
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
|
||||
; SSSE3-NEXT: shlq $4, %rdi
|
||||
; SSSE3-NEXT: movdqu %xmm0, (%rsi,%rdi)
|
||||
; SSSE3-NEXT: movdqu %xmm2, 16(%rsi,%rdi)
|
||||
; SSSE3-NEXT: retq
|
||||
;
|
||||
; SSE41-LABEL: store_merge_split:
|
||||
; SSE41: # %bb.0:
|
||||
; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; SSE41-NEXT: pshufb %xmm4, %xmm1
|
||||
; SSE41-NEXT: pshufb %xmm4, %xmm0
|
||||
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
|
||||
; SSE41-NEXT: pshufb %xmm4, %xmm3
|
||||
; SSE41-NEXT: pshufb %xmm4, %xmm2
|
||||
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
|
||||
; SSE41-NEXT: shlq $4, %rdi
|
||||
; SSE41-NEXT: movdqu %xmm0, (%rsi,%rdi)
|
||||
; SSE41-NEXT: movdqu %xmm2, 16(%rsi,%rdi)
|
||||
; SSE41-NEXT: retq
|
||||
;
|
||||
; AVX1-LABEL: store_merge_split:
|
||||
; AVX1: # %bb.0:
|
||||
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
|
||||
; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
|
||||
; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0
|
||||
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
|
||||
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
|
||||
; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2
|
||||
; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1
|
||||
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
|
||||
; AVX1-NEXT: shlq $4, %rdi
|
||||
; AVX1-NEXT: vmovdqu %xmm0, (%rsi,%rdi)
|
||||
; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)
|
||||
; AVX1-NEXT: vzeroupper
|
||||
; AVX1-NEXT: retq
|
||||
;
|
||||
; AVX2-LABEL: store_merge_split:
|
||||
; AVX2: # %bb.0:
|
||||
; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
|
||||
; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0
|
||||
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
|
||||
; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1
|
||||
; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
|
||||
; AVX2-NEXT: shlq $4, %rdi
|
||||
; AVX2-NEXT: vmovdqu %xmm0, (%rsi,%rdi)
|
||||
; AVX2-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)
|
||||
; AVX2-NEXT: vzeroupper
|
||||
; AVX2-NEXT: retq
|
||||
;
|
||||
; AVX512F-LABEL: store_merge_split:
|
||||
; AVX512F: # %bb.0:
|
||||
; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
|
||||
; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
|
||||
; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
|
||||
; AVX512F-NEXT: vpmovdw %zmm1, %ymm1
|
||||
; AVX512F-NEXT: shlq $4, %rdi
|
||||
; AVX512F-NEXT: vmovdqu %xmm0, (%rsi,%rdi)
|
||||
; AVX512F-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)
|
||||
; AVX512F-NEXT: vzeroupper
|
||||
; AVX512F-NEXT: retq
|
||||
;
|
||||
; AVX512VL-LABEL: store_merge_split:
|
||||
; AVX512VL: # %bb.0:
|
||||
; AVX512VL-NEXT: shlq $4, %rdi
|
||||
; AVX512VL-NEXT: vpmovdw %ymm0, (%rsi,%rdi)
|
||||
; AVX512VL-NEXT: vpmovdw %ymm1, 16(%rsi,%rdi)
|
||||
; AVX512VL-NEXT: vzeroupper
|
||||
; AVX512VL-NEXT: retq
|
||||
;
|
||||
; AVX512BW-LABEL: store_merge_split:
|
||||
; AVX512BW: # %bb.0:
|
||||
; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
|
||||
; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
|
||||
; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
|
||||
; AVX512BW-NEXT: vpmovdw %zmm1, %ymm1
|
||||
; AVX512BW-NEXT: shlq $4, %rdi
|
||||
; AVX512BW-NEXT: vmovdqu %xmm0, (%rsi,%rdi)
|
||||
; AVX512BW-NEXT: vmovdqu %xmm1, 16(%rsi,%rdi)
|
||||
; AVX512BW-NEXT: vzeroupper
|
||||
; AVX512BW-NEXT: retq
|
||||
;
|
||||
; AVX512BWVL-LABEL: store_merge_split:
|
||||
; AVX512BWVL: # %bb.0:
|
||||
; AVX512BWVL-NEXT: shlq $4, %rdi
|
||||
; AVX512BWVL-NEXT: vpmovdw %ymm0, (%rsi,%rdi)
|
||||
; AVX512BWVL-NEXT: vpmovdw %ymm1, 16(%rsi,%rdi)
|
||||
; AVX512BWVL-NEXT: vzeroupper
|
||||
; AVX512BWVL-NEXT: retq
|
||||
%t1 = trunc <8 x i32> %w1 to <8 x i16>
|
||||
%t2 = trunc <8 x i32> %w2 to <8 x i16>
|
||||
%g1 = getelementptr inbounds <8 x i16>, <8 x i16>* %p, i64 %idx
|
||||
%g2 = getelementptr inbounds <8 x i16>, <8 x i16>* %g1, i64 1
|
||||
store <8 x i16> %t1, <8 x i16>* %g1, align 2
|
||||
store <8 x i16> %t2, <8 x i16>* %g2, align 2
|
||||
ret void
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,45 +1,9 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=NARROW
|
||||
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=WIDE
|
||||
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=WIDE
|
||||
|
||||
; FIXME: We shouldn't require both a movd and an insert in the wide version.
|
||||
|
||||
define void @update(i64* %dst_i, i64* %src_i, i32 %n) nounwind {
|
||||
; NARROW-LABEL: update:
|
||||
; NARROW: # %bb.0: # %entry
|
||||
; NARROW-NEXT: subl $12, %esp
|
||||
; NARROW-NEXT: movl $0, (%esp)
|
||||
; NARROW-NEXT: pcmpeqd %xmm0, %xmm0
|
||||
; NARROW-NEXT: movdqa {{.*#+}} xmm1 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
|
||||
; NARROW-NEXT: movdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
|
||||
; NARROW-NEXT: .p2align 4, 0x90
|
||||
; NARROW-NEXT: .LBB0_1: # %forcond
|
||||
; NARROW-NEXT: # =>This Inner Loop Header: Depth=1
|
||||
; NARROW-NEXT: movl (%esp), %eax
|
||||
; NARROW-NEXT: cmpl {{[0-9]+}}(%esp), %eax
|
||||
; NARROW-NEXT: jge .LBB0_3
|
||||
; NARROW-NEXT: # %bb.2: # %forbody
|
||||
; NARROW-NEXT: # in Loop: Header=BB0_1 Depth=1
|
||||
; NARROW-NEXT: movl (%esp), %eax
|
||||
; NARROW-NEXT: leal (,%eax,8), %ecx
|
||||
; NARROW-NEXT: movl {{[0-9]+}}(%esp), %edx
|
||||
; NARROW-NEXT: addl %ecx, %edx
|
||||
; NARROW-NEXT: movl %edx, {{[0-9]+}}(%esp)
|
||||
; NARROW-NEXT: addl {{[0-9]+}}(%esp), %ecx
|
||||
; NARROW-NEXT: movl %ecx, {{[0-9]+}}(%esp)
|
||||
; NARROW-NEXT: movq {{.*#+}} xmm3 = mem[0],zero
|
||||
; NARROW-NEXT: psubb %xmm0, %xmm3
|
||||
; NARROW-NEXT: psrlw $2, %xmm3
|
||||
; NARROW-NEXT: pand %xmm1, %xmm3
|
||||
; NARROW-NEXT: pxor %xmm2, %xmm3
|
||||
; NARROW-NEXT: psubb %xmm2, %xmm3
|
||||
; NARROW-NEXT: movq %xmm3, (%edx,%eax,8)
|
||||
; NARROW-NEXT: incl (%esp)
|
||||
; NARROW-NEXT: jmp .LBB0_1
|
||||
; NARROW-NEXT: .LBB0_3: # %afterfor
|
||||
; NARROW-NEXT: addl $12, %esp
|
||||
; NARROW-NEXT: retl
|
||||
;
|
||||
; WIDE-LABEL: update:
|
||||
; WIDE: # %bb.0: # %entry
|
||||
; WIDE-NEXT: subl $12, %esp
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=X86
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=X64
|
||||
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64
|
||||
|
||||
define <4 x i32> @zext_v4i8_to_v4i32(<4 x i8>* %ptr) {
|
||||
; X86-LABEL: zext_v4i8_to_v4i32:
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
|
||||
; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
|
||||
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
|
||||
|
||||
; Test multiplies of various narrow types.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user