diff options
-rw-r--r-- | llvm/test/CodeGen/X86/lower-bitcast.ll | 228 |
1 files changed, 110 insertions, 118 deletions
diff --git a/llvm/test/CodeGen/X86/lower-bitcast.ll b/llvm/test/CodeGen/X86/lower-bitcast.ll index edb8433ec30..426341dc90f 100644 --- a/llvm/test/CodeGen/X86/lower-bitcast.ll +++ b/llvm/test/CodeGen/X86/lower-bitcast.ll @@ -1,188 +1,180 @@ -; RUN: llc < %s -march=x86-64 -mcpu=core2 -mattr=+sse2 | FileCheck %s -; RUN: llc < %s -march=x86-64 -mcpu=core2 -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE +; 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 +; pshufd+paddq+pshufd. This is fixed with the widening legalization. define double @test1(double %A) { +; CHECK-LABEL: test1: +; CHECK: # BB#0: +; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] +; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 +; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] +; 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 ret double %2 } -; 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 -; pshufd+paddq+pshufd. This is fixed with the widening legalization. -; -; CHECK-LABEL: test1 -; CHECK-NOT: movsd -; CHECK: pshufd -; CHECK-NEXT: paddd -; CHECK-NEXT: pshufd -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test1 -; CHECK-WIDE-NOT: movsd -; CHECK-WIDE: paddd -; CHECK-WIDE-NEXT: ret - define double @test2(double %A, double %B) { +; CHECK-LABEL: test2: +; 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 %3 = bitcast <2 x i32> %add to double ret double %3 } -; CHECK-LABEL: test2 -; CHECK-NOT: movsd -; CHECK: paddd -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test2 -; CHECK-WIDE-NOT: movsd -; CHECK-WIDE: paddd -; CHECK-WIDE-NEXT: ret - define i64 @test3(i64 %A) { +; CHECK-LABEL: test3: +; CHECK: # BB#0: +; CHECK-NEXT: movd %rdi, %xmm0 +; CHECK-NEXT: addps {{.*}}(%rip), %xmm0 +; CHECK-NEXT: movd %xmm0, %rax +; CHECK-NEXT: retq +; +; CHECK-WIDE-LABEL: test3: +; CHECK-WIDE: # BB#0: +; CHECK-WIDE-NEXT: movd %rdi, %xmm0 +; CHECK-WIDE-NEXT: addps {{.*}}(%rip), %xmm0 +; CHECK-WIDE-NEXT: movd %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 ret i64 %2 } -; CHECK-LABEL: test3 -; CHECK-NOT: pshufd -; CHECK: addps -; CHECK-NOT: pshufd -; CHECK: ret -; -; CHECK-WIDE-LABEL: test3 -; CHECK-WIDE-NOT: pshufd -; CHECK-WIDE: addps -; CHECK-WIDE-NOT: pshufd -; CHECK-WIDE: ret +; FIXME: Ideally we should be able to fold the entire body of @test4 into a +; single paddd instruction. This is fixed with the widening legalization. define i64 @test4(i64 %A) { +; CHECK-LABEL: test4: +; CHECK: # BB#0: +; CHECK-NEXT: movd %rdi, %xmm0 +; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] +; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 +; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] +; CHECK-NEXT: movd %xmm0, %rax +; CHECK-NEXT: retq +; +; CHECK-WIDE-LABEL: test4: +; CHECK-WIDE: # BB#0: +; CHECK-WIDE-NEXT: movd %rdi, %xmm0 +; CHECK-WIDE-NEXT: paddd {{.*}}(%rip), %xmm0 +; CHECK-WIDE-NEXT: movd %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 ret i64 %2 } -; FIXME: At the moment we still produce the sequence pshufd+paddd+pshufd. -; Ideally, we should fold that sequence into a single paddd. This is fixed with -; the widening legalization. -; -; CHECK-LABEL: test4 -; CHECK: pshufd -; CHECK-NEXT: paddd -; CHECK-NEXT: pshufd -; CHECK: ret -; -; CHECK-WIDE-LABEL: test4 -; CHECK-WIDE: movd %{{rdi|rcx}}, -; CHECK-WIDE-NEXT: paddd -; CHECK-WIDE-NEXT: movd {{.*}}, %rax -; CHECK-WIDE: ret - define double @test5(double %A) { +; CHECK-LABEL: test5: +; 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 ret double %2 } -; CHECK-LABEL: test5 -; CHECK: addps -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test5 -; CHECK-WIDE: addps -; CHECK-WIDE-NEXT: ret +; FIXME: Ideally we should be able to fold the entire body of @test6 into a +; single paddw instruction. This is fixed with the widening legalization. define double @test6(double %A) { +; CHECK-LABEL: test6: +; CHECK: # BB#0: +; CHECK-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] +; CHECK-NEXT: paddw {{.*}}(%rip), %xmm0 +; CHECK-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] +; 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 ret double %2 } -; FIXME: Ideally we should be able to fold the entire body of @test6 into a -; single paddw instruction. This is fixed with the widening legalization. -; -; CHECK-LABEL: test6 -; CHECK-NOT: movsd -; CHECK: punpcklwd -; CHECK-NEXT: paddw -; CHECK-NEXT: pshufb -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test6 -; CHECK-WIDE-NOT: mov -; CHECK-WIDE-NOT: punpcklwd -; CHECK-WIDE: paddw -; CHECK-WIDE-NEXT: ret - define double @test7(double %A, double %B) { +; CHECK-LABEL: test7: +; 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 %3 = bitcast <4 x i16> %add to double ret double %3 } -; CHECK-LABEL: test7 -; CHECK-NOT: movsd -; CHECK-NOT: punpcklwd -; CHECK: paddw -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test7 -; CHECK-WIDE-NOT: movsd -; CHECK-WIDE-NOT: punpcklwd -; CHECK-WIDE: paddw -; CHECK-WIDE-NEXT: ret +; FIXME: Ideally we should be able to fold the entire body of @test8 into a +; single paddb instruction. At the moment we produce the sequence +; pshufd+paddw+pshufd. This is fixed with the widening legalization. define double @test8(double %A) { +; CHECK-LABEL: test8: +; CHECK: # BB#0: +; CHECK-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] +; CHECK-NEXT: paddb {{.*}}(%rip), %xmm0 +; CHECK-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] +; 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 ret double %2 } -; FIXME: Ideally we should be able to fold the entire body of @test8 into a -; single paddb instruction. At the moment we produce the sequence -; pshufd+paddw+pshufd. This is fixed with the widening legalization. -; -; CHECK-LABEL: test8 -; CHECK-NOT: movsd -; CHECK: punpcklbw -; CHECK-NEXT: paddb -; CHECK-NEXT: pshufb -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test8 -; CHECK-WIDE-NOT: movsd -; CHECK-WIDE-NOT: punpcklbw -; CHECK-WIDE: paddb -; CHECK-WIDE-NEXT: ret - define double @test9(double %A, double %B) { +; CHECK-LABEL: test9: +; 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 %3 = bitcast <8 x i8> %add to double ret double %3 } -; CHECK-LABEL: test9 -; CHECK-NOT: movsd -; CHECK-NOT: punpcklbw -; CHECK: paddb -; CHECK-NEXT: ret -; -; CHECK-WIDE-LABEL: test9 -; CHECK-WIDE-NOT: movsd -; CHECK-WIDE-NOT: punpcklbw -; CHECK-WIDE: paddb -; CHECK-WIDE-NEXT: ret - |