diff options
author | Scott Michel <scottm@aero.org> | 2008-03-06 04:02:54 +0000 |
---|---|---|
committer | Scott Michel <scottm@aero.org> | 2008-03-06 04:02:54 +0000 |
commit | 4cb8bd8effdc999128d9ab82e1b2fe860b01c556 (patch) | |
tree | 602ae69ba58e2f122b124d866e1aa5df7c7901e0 /lib/Target/CellSPU | |
parent | 6ad150baac1f3afc2d8183ea20afb2b2ee55854c (diff) | |
download | external_llvm-4cb8bd8effdc999128d9ab82e1b2fe860b01c556.zip external_llvm-4cb8bd8effdc999128d9ab82e1b2fe860b01c556.tar.gz external_llvm-4cb8bd8effdc999128d9ab82e1b2fe860b01c556.tar.bz2 |
Refine Cell's i64 constant generation code to cover more constants where the
upper and lower 32-bits are the same (in addition to 0 and -1 previously.)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47985 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/CellSPU')
-rw-r--r-- | lib/Target/CellSPU/SPUISelLowering.cpp | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/lib/Target/CellSPU/SPUISelLowering.cpp b/lib/Target/CellSPU/SPUISelLowering.cpp index de1fff0..6d2a9f3 100644 --- a/lib/Target/CellSPU/SPUISelLowering.cpp +++ b/lib/Target/CellSPU/SPUISelLowering.cpp @@ -1354,6 +1354,14 @@ SDOperand SPU::get_vec_u18imm(SDNode *N, SelectionDAG &DAG, MVT::ValueType ValueType) { if (ConstantSDNode *CN = getVecImm(N)) { uint64_t Value = CN->getValue(); + if (ValueType == MVT::i64) { + uint64_t UValue = CN->getValue(); + uint32_t upper = uint32_t(UValue >> 32); + uint32_t lower = uint32_t(UValue); + if (upper != lower) + return SDOperand(); + Value = Value >> 32; + } if (Value <= 0x3ffff) return DAG.getConstant(Value, ValueType); } @@ -1368,6 +1376,14 @@ SDOperand SPU::get_vec_i16imm(SDNode *N, SelectionDAG &DAG, MVT::ValueType ValueType) { if (ConstantSDNode *CN = getVecImm(N)) { int64_t Value = CN->getSignExtended(); + if (ValueType == MVT::i64) { + uint64_t UValue = CN->getValue(); + uint32_t upper = uint32_t(UValue >> 32); + uint32_t lower = uint32_t(UValue); + if (upper != lower) + return SDOperand(); + Value = Value >> 32; + } if (Value >= -(1 << 15) && Value <= ((1 << 15) - 1)) { return DAG.getConstant(Value, ValueType); } @@ -1383,6 +1399,14 @@ SDOperand SPU::get_vec_i10imm(SDNode *N, SelectionDAG &DAG, MVT::ValueType ValueType) { if (ConstantSDNode *CN = getVecImm(N)) { int64_t Value = CN->getSignExtended(); + if (ValueType == MVT::i64) { + uint64_t UValue = CN->getValue(); + uint32_t upper = uint32_t(UValue >> 32); + uint32_t lower = uint32_t(UValue); + if (upper != lower) + return SDOperand(); + Value = Value >> 32; + } if (isS10Constant(Value)) return DAG.getConstant(Value, ValueType); } @@ -1626,13 +1650,10 @@ static SDOperand LowerBUILD_VECTOR(SDOperand Op, SelectionDAG &DAG) { uint32_t upper = uint32_t(val >> 32); uint32_t lower = uint32_t(val); - if (val == 0) { - SDOperand Zero = DAG.getTargetConstant(0, MVT::i64); - return DAG.getNode(ISD::BUILD_VECTOR, VT, Zero, Zero); - } else if (val == 0xffffffffffffffffULL) { - // For -1, this and has a chance of matching immAllOnesV. - SDOperand NegOne = DAG.getTargetConstant(-1, MVT::i64); - return DAG.getNode(ISD::BUILD_VECTOR, VT, NegOne, NegOne); + if (upper == lower) { + // Magic constant that can be matched by IL, ILA, et. al. + SDOperand Val = DAG.getTargetConstant(val, MVT::i64); + return DAG.getNode(ISD::BUILD_VECTOR, VT, Val, Val); } else { SDOperand LO32; SDOperand HI32; |