diff options
| author | Michael Liao <michael.liao@intel.com> | 2012-10-10 16:53:28 +0000 |
|---|---|---|
| committer | Michael Liao <michael.liao@intel.com> | 2012-10-10 16:53:28 +0000 |
| commit | e999b865dd0edf005973fa01c82427563fcb4989 (patch) | |
| tree | cc31c14a8bd4f1825a4059274d2a48483710cdee /llvm/test/CodeGen/X86/fp-trunc.ll | |
| parent | 71bf2995813ebde1127e7c4de2787038a82d0861 (diff) | |
| download | bcm5719-llvm-e999b865dd0edf005973fa01c82427563fcb4989.tar.gz bcm5719-llvm-e999b865dd0edf005973fa01c82427563fcb4989.zip | |
Add support for FP_ROUND from v2f64 to v2f32
- Due to the current matching vector elements constraints in
ISD::FP_ROUND, rounding from v2f64 to v4f32 (after legalization from
v2f32) is scalarized. Add a customized v2f32 widening to convert it
into a target-specific X86ISD::VFPROUND to work around this
constraints.
llvm-svn: 165631
Diffstat (limited to 'llvm/test/CodeGen/X86/fp-trunc.ll')
| -rw-r--r-- | llvm/test/CodeGen/X86/fp-trunc.ll | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/llvm/test/CodeGen/X86/fp-trunc.ll b/llvm/test/CodeGen/X86/fp-trunc.ll index 170637a40ee..544fa537cca 100644 --- a/llvm/test/CodeGen/X86/fp-trunc.ll +++ b/llvm/test/CodeGen/X86/fp-trunc.ll @@ -1,33 +1,56 @@ ; RUN: llc < %s -march=x86 -mattr=+sse2,-avx | FileCheck %s +; RUN: llc < %s -march=x86 -mattr=+avx | FileCheck %s --check-prefix=AVX define <1 x float> @test1(<1 x double> %x) nounwind { +; CHECK: test1 ; CHECK: cvtsd2ss ; CHECK: ret +; AVX: test1 +; AVX: vcvtsd2ss +; AVX: ret %y = fptrunc <1 x double> %x to <1 x float> ret <1 x float> %y } - define <2 x float> @test2(<2 x double> %x) nounwind { -; FIXME: It would be nice if this compiled down to a cvtpd2ps -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss +; CHECK: test2 +; CHECK: cvtpd2ps ; CHECK: ret +; AVX: test2 +; AVX-NOT: vcvtpd2psy +; AVX: vcvtpd2ps +; AVX: ret %y = fptrunc <2 x double> %x to <2 x float> ret <2 x float> %y } -define <8 x float> @test3(<8 x double> %x) nounwind { -; FIXME: It would be nice if this compiled down to a series of cvtpd2ps -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss -; CHECK: cvtsd2ss +define <4 x float> @test3(<4 x double> %x) nounwind { +; CHECK: test3 +; CHECK: cvtpd2ps +; CHECK: cvtpd2ps +; CHECK: movlhps +; CHECK: ret +; AVX: test3 +; AVX: vcvtpd2psy +; AVX: ret + %y = fptrunc <4 x double> %x to <4 x float> + ret <4 x float> %y +} + +define <8 x float> @test4(<8 x double> %x) nounwind { +; CHECK: test4 +; CHECK: cvtpd2ps +; CHECK: cvtpd2ps +; CHECK: movlhps +; CHECK: cvtpd2ps +; CHECK: cvtpd2ps +; CHECK: movlhps ; CHECK: ret +; AVX: test4 +; AVX: vcvtpd2psy +; AVX: vcvtpd2psy +; AVX: vinsertf128 +; AVX: ret %y = fptrunc <8 x double> %x to <8 x float> ret <8 x float> %y } |

