diff options
author | Dan Gohman <gohman@apple.com> | 2007-07-24 22:55:08 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2007-07-24 22:55:08 +0000 |
commit | a394117bc0a7a94d99869e2e83ff0647d3aff9a6 (patch) | |
tree | 47600e6f84c3f8ebb1c7e0780be3a734933141e9 | |
parent | 4beedbd0063a8ba6f97db02c3c94707d8ab45b50 (diff) | |
download | external_llvm-a394117bc0a7a94d99869e2e83ff0647d3aff9a6.zip external_llvm-a394117bc0a7a94d99869e2e83ff0647d3aff9a6.tar.gz external_llvm-a394117bc0a7a94d99869e2e83ff0647d3aff9a6.tar.bz2 |
Use movaps to load a v4f32 build_vector of all-constant values into a
register instead of loading each element individually.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40478 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 9 | ||||
-rw-r--r-- | test/CodeGen/X86/v4f32-immediate.ll | 5 |
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index a25710b..23f9e95 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -2495,6 +2495,7 @@ X86TargetLowering::LowerBUILD_VECTOR(SDOperand Op, SelectionDAG &DAG) { unsigned NumZero = 0; unsigned NumNonZero = 0; unsigned NonZeros = 0; + unsigned NumNonZeroImms = 0; std::set<SDOperand> Values; for (unsigned i = 0; i < NumElems; ++i) { SDOperand Elt = Op.getOperand(i); @@ -2505,6 +2506,9 @@ X86TargetLowering::LowerBUILD_VECTOR(SDOperand Op, SelectionDAG &DAG) { else { NonZeros |= (1 << i); NumNonZero++; + if (Elt.getOpcode() == ISD::Constant || + Elt.getOpcode() == ISD::ConstantFP) + NumNonZeroImms++; } } } @@ -2548,6 +2552,11 @@ X86TargetLowering::LowerBUILD_VECTOR(SDOperand Op, SelectionDAG &DAG) { } } + // A vector full of immediates; various special cases are already + // handled, so this is best done with a single constant-pool load. + if (NumNonZero == NumNonZeroImms) + return SDOperand(); + // Let legalizer expand 2-wide build_vectors. if (EVTBits == 64) return SDOperand(); diff --git a/test/CodeGen/X86/v4f32-immediate.ll b/test/CodeGen/X86/v4f32-immediate.ll new file mode 100644 index 0000000..67b5e79 --- /dev/null +++ b/test/CodeGen/X86/v4f32-immediate.ll @@ -0,0 +1,5 @@ +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse | grep movaps + +define <4 x float> @foo() { + ret <4 x float> <float 3.223542354, float 2.3, float 1.2, float 0.1> +} |