[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp PPCISelLowering.h PPCInstrAltivec.td
Chris Lattner
lattner at cs.uiuc.edu
Fri Apr 7 23:47:06 PDT 2006
Changes in directory llvm/lib/Target/PowerPC:
PPCISelLowering.cpp updated: 1.138 -> 1.139
PPCISelLowering.h updated: 1.44 -> 1.45
PPCInstrAltivec.td updated: 1.46 -> 1.47
---
Log message:
Change the interface to the predicate that determines if vsplti* can be used.
No functionality changes.
---
Diffs of the changes: (+28 -32)
PPCISelLowering.cpp | 33 +++++++++++++++++----------------
PPCISelLowering.h | 9 +++++----
PPCInstrAltivec.td | 18 ++++++------------
3 files changed, 28 insertions(+), 32 deletions(-)
Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp
diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.138 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.139
--- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.138 Thu Apr 6 18:12:19 2006
+++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Sat Apr 8 01:46:53 2006
@@ -425,10 +425,11 @@
return cast<ConstantSDNode>(N->getOperand(0))->getValue() / EltSize;
}
-/// isVecSplatImm - Return true if this is a build_vector of constants which
-/// can be formed by using a vspltis[bhw] instruction. The ByteSize field
-/// indicates the number of bytes of each element [124] -> [bhw].
-bool PPC::isVecSplatImm(SDNode *N, unsigned ByteSize, char *Val) {
+/// get_VSPLI_elt - If this is a build_vector of constants which can be formed
+/// by using a vspltis[bhw] instruction of the specified element size, return
+/// the constant being splatted. The ByteSize field indicates the number of
+/// bytes of each element [124] -> [bhw].
+SDOperand PPC::get_VSPLI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG) {
SDOperand OpVal(0, 0);
// Check to see if this buildvec has a single non-undef value in its elements.
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
@@ -436,10 +437,10 @@
if (OpVal.Val == 0)
OpVal = N->getOperand(i);
else if (OpVal != N->getOperand(i))
- return false;
+ return SDOperand();
}
- if (OpVal.Val == 0) return false; // All UNDEF: use implicit def.
+ if (OpVal.Val == 0) return SDOperand(); // All UNDEF: use implicit def.
unsigned ValSizeInBytes = 0;
uint64_t Value = 0;
@@ -455,7 +456,7 @@
// If the splat value is larger than the element value, then we can never do
// this splat. The only case that we could fit the replicated bits into our
// immediate field for would be zero, and we prefer to use vxor for it.
- if (ValSizeInBytes < ByteSize) return false;
+ if (ValSizeInBytes < ByteSize) return SDOperand();
// If the element value is larger than the splat value, cut it in half and
// check to see if the two halves are equal. Continue doing this until we
@@ -466,7 +467,7 @@
// If the top half equals the bottom half, we're still ok.
if (((Value >> (ValSizeInBytes*8)) & ((1 << (8*ValSizeInBytes))-1)) !=
(Value & ((1 << (8*ValSizeInBytes))-1)))
- return false;
+ return SDOperand();
}
// Properly sign extend the value.
@@ -474,12 +475,12 @@
int MaskVal = ((int)Value << ShAmt) >> ShAmt;
// If this is zero, don't match, zero matches ISD::isBuildVectorAllZeros.
- if (MaskVal == 0) return false;
+ if (MaskVal == 0) return SDOperand();
- if (Val) *Val = MaskVal;
-
- // Finally, if this value fits in a 5 bit sext field, return true.
- return ((MaskVal << (32-5)) >> (32-5)) == MaskVal;
+ // Finally, if this value fits in a 5 bit sext field, return it
+ if (((MaskVal << (32-5)) >> (32-5)) == MaskVal)
+ return DAG.getTargetConstant(MaskVal, MVT::i32);
+ return SDOperand();
}
@@ -849,9 +850,9 @@
if (ISD::isBuildVectorAllZeros(Op.Val))
return Op;
- if (PPC::isVecSplatImm(Op.Val, 1) || // vspltisb
- PPC::isVecSplatImm(Op.Val, 2) || // vspltish
- PPC::isVecSplatImm(Op.Val, 4)) // vspltisw
+ if (PPC::get_VSPLI_elt(Op.Val, 1, DAG).Val || // vspltisb
+ PPC::get_VSPLI_elt(Op.Val, 2, DAG).Val || // vspltish
+ PPC::get_VSPLI_elt(Op.Val, 4, DAG).Val) // vspltisw
return Op;
return SDOperand();
Index: llvm/lib/Target/PowerPC/PPCISelLowering.h
diff -u llvm/lib/Target/PowerPC/PPCISelLowering.h:1.44 llvm/lib/Target/PowerPC/PPCISelLowering.h:1.45
--- llvm/lib/Target/PowerPC/PPCISelLowering.h:1.44 Thu Apr 6 17:28:36 2006
+++ llvm/lib/Target/PowerPC/PPCISelLowering.h Sat Apr 8 01:46:53 2006
@@ -131,10 +131,11 @@
/// specified isSplatShuffleMask VECTOR_SHUFFLE mask.
unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize);
- /// isVecSplatImm - Return true if this is a build_vector of constants which
- /// can be formed by using a vspltis[bhw] instruction. The ByteSize field
- /// indicates the number of bytes of each element [124] -> [bhw].
- bool isVecSplatImm(SDNode *N, unsigned ByteSize, char *Val = 0);
+ /// get_VSPLI_elt - If this is a build_vector of constants which can be
+ /// formed by using a vspltis[bhw] instruction of the specified element
+ /// size, return the constant being splatted. The ByteSize field indicates
+ /// the number of bytes of each element [124] -> [bhw].
+ SDOperand get_VSPLI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG);
}
class PPCTargetLowering : public TargetLowering {
Index: llvm/lib/Target/PowerPC/PPCInstrAltivec.td
diff -u llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.46 llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.47
--- llvm/lib/Target/PowerPC/PPCInstrAltivec.td:1.46 Thu Apr 6 17:28:36 2006
+++ llvm/lib/Target/PowerPC/PPCInstrAltivec.td Sat Apr 8 01:46:53 2006
@@ -111,32 +111,26 @@
// VSPLTISB_get_imm xform function: convert build_vector to VSPLTISB imm.
def VSPLTISB_get_imm : SDNodeXForm<build_vector, [{
- char Val;
- PPC::isVecSplatImm(N, 1, &Val);
- return getI32Imm(Val);
+ return PPC::get_VSPLI_elt(N, 1, *CurDAG);
}]>;
def vecspltisb : PatLeaf<(build_vector), [{
- return PPC::isVecSplatImm(N, 1);
+ return PPC::get_VSPLI_elt(N, 1, *CurDAG).Val != 0;
}], VSPLTISB_get_imm>;
// VSPLTISH_get_imm xform function: convert build_vector to VSPLTISH imm.
def VSPLTISH_get_imm : SDNodeXForm<build_vector, [{
- char Val;
- PPC::isVecSplatImm(N, 2, &Val);
- return getI32Imm(Val);
+ return PPC::get_VSPLI_elt(N, 2, *CurDAG);
}]>;
def vecspltish : PatLeaf<(build_vector), [{
- return PPC::isVecSplatImm(N, 2);
+ return PPC::get_VSPLI_elt(N, 2, *CurDAG).Val != 0;
}], VSPLTISH_get_imm>;
// VSPLTISW_get_imm xform function: convert build_vector to VSPLTISW imm.
def VSPLTISW_get_imm : SDNodeXForm<build_vector, [{
- char Val;
- PPC::isVecSplatImm(N, 4, &Val);
- return getI32Imm(Val);
+ return PPC::get_VSPLI_elt(N, 4, *CurDAG);
}]>;
def vecspltisw : PatLeaf<(build_vector), [{
- return PPC::isVecSplatImm(N, 4);
+ return PPC::get_VSPLI_elt(N, 4, *CurDAG).Val != 0;
}], VSPLTISW_get_imm>;
//===----------------------------------------------------------------------===//
More information about the llvm-commits
mailing list