summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2014-03-27 22:22:48 +0000
committerHal Finkel <hfinkel@anl.gov>2014-03-27 22:22:48 +0000
commit6bdc4ebedd16bc2102edc4bfbc63c76c7c130ef0 (patch)
treee8331809bc0c239253703bf7abe9a722d5ab82eb
parent72f0f26d3b595d76d86f886d01caf8d9cad13bd4 (diff)
downloadllvm-6bdc4ebedd16bc2102edc4bfbc63c76c7c130ef0.tar.gz
llvm-6bdc4ebedd16bc2102edc4bfbc63c76c7c130ef0.tar.bz2
llvm-6bdc4ebedd16bc2102edc4bfbc63c76c7c130ef0.tar.xz
[PowerPC] Fix v2f64 vector extract and related patterns
First, v2f64 vector extract had not been declared legal (and so the existing patterns were not being used). Second, the patterns for that, and for scalar_to_vector, should really be a regclass copy, not a subregister operation, because the VSX registers directly hold both the vector and scalar data. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204971 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/PowerPC/PPCISelLowering.cpp1
-rw-r--r--lib/Target/PowerPC/PPCInstrVSX.td7
-rw-r--r--test/CodeGen/PowerPC/vsx.ll18
3 files changed, 22 insertions, 4 deletions
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp
index 16ff0eb7d7..1c19160c9c 100644
--- a/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -535,6 +535,7 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
if (Subtarget->hasVSX()) {
setOperationAction(ISD::SCALAR_TO_VECTOR, MVT::v2f64, Legal);
+ setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2f64, Legal);
setOperationAction(ISD::FFLOOR, MVT::v2f64, Legal);
setOperationAction(ISD::FCEIL, MVT::v2f64, Legal);
diff --git a/lib/Target/PowerPC/PPCInstrVSX.td b/lib/Target/PowerPC/PPCInstrVSX.td
index 643ba1fbb0..1ece55977a 100644
--- a/lib/Target/PowerPC/PPCInstrVSX.td
+++ b/lib/Target/PowerPC/PPCInstrVSX.td
@@ -724,13 +724,12 @@ def : InstAlias<"xxswapd $XT, $XB",
let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
def : Pat<(v2f64 (scalar_to_vector f64:$A)),
- (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), $A, sub_64)>;
+ (v2f64 (COPY_TO_REGCLASS $A, VSRC))>;
def : Pat<(f64 (vector_extract v2f64:$S, 0)),
- (EXTRACT_SUBREG (v2f64 (COPY_TO_REGCLASS $S, VSLRC)), sub_64)>;
+ (f64 (COPY_TO_REGCLASS $S, VSRC))>;
def : Pat<(f64 (vector_extract v2f64:$S, 1)),
- (EXTRACT_SUBREG (v2f64 (COPY_TO_REGCLASS (XXPERMDI $S, $S, 3),
- VSLRC)), sub_64)>;
+ (f64 (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSRC))>;
// Additional fnmsub patterns: -a*c + b == -(a*c - b)
def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
diff --git a/test/CodeGen/PowerPC/vsx.ll b/test/CodeGen/PowerPC/vsx.ll
index 89499560b3..4f4f816d72 100644
--- a/test/CodeGen/PowerPC/vsx.ll
+++ b/test/CodeGen/PowerPC/vsx.ll
@@ -529,3 +529,21 @@ define <2 x i64> @test62(<2 x i64> %a, <2 x i64> %b) {
; CHECK: blr
}
+define double @test63(<2 x double> %a) {
+ %v = extractelement <2 x double> %a, i32 0
+ ret double %v
+
+; CHECK-LABEL: @test63
+; CHECK: xxlor 1, 34, 34
+; CHECK: blr
+}
+
+define double @test64(<2 x double> %a) {
+ %v = extractelement <2 x double> %a, i32 1
+ ret double %v
+
+; CHECK-LABEL: @test64
+; CHECK: xxpermdi 1, 34, 34, 2
+; CHECK: blr
+}
+