diff options
Diffstat (limited to 'lib/Target/X86')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 32 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelLowering.h | 6 |
2 files changed, 38 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index b3ff4ee..20fe41d 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -14112,6 +14112,38 @@ void X86TargetLowering::computeMaskedBitsForTargetNode(const SDValue Op, } } +void X86TargetLowering::computeMaskedBitsForAnyExtend(const SDValue Op, + APInt &KnownZero, + APInt &KnownOne, + const SelectionDAG &DAG, + unsigned Depth) const { + unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits(); + if (Op.getOpcode() == ISD::ANY_EXTEND) { + // Implemented as a zero_extend except for i16 -> i32 + EVT InVT = Op.getOperand(0).getValueType(); + unsigned InBits = InVT.getScalarType().getSizeInBits(); + KnownZero = KnownZero.trunc(InBits); + KnownOne = KnownOne.trunc(InBits); + DAG.ComputeMaskedBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); + KnownZero = KnownZero.zext(BitWidth); + KnownOne = KnownOne.zext(BitWidth); + if (BitWidth != 32 || InBits != 16) { + APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits); + KnownZero |= NewBits; + } + return; + } else if (ISD::isEXTLoad(Op.getNode())) { + // Implemented as zextloads or implicitly zero-extended (i32 -> i64) + LoadSDNode *LD = cast<LoadSDNode>(Op); + EVT VT = LD->getMemoryVT(); + unsigned MemBits = VT.getScalarType().getSizeInBits(); + KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - MemBits); + return; + } + + assert(0 && "Expecting an ANY_EXTEND or extload!"); +} + unsigned X86TargetLowering::ComputeNumSignBitsForTargetNode(SDValue Op, unsigned Depth) const { // SETCC_CARRY sets the dest to ~0 for true or 0 for false. diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index e830c5f..099f1d8 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -558,6 +558,12 @@ namespace llvm { const SelectionDAG &DAG, unsigned Depth = 0) const; + virtual void computeMaskedBitsForAnyExtend(const SDValue Op, + APInt &KnownZero, + APInt &KnownOne, + const SelectionDAG &DAG, + unsigned Depth) const; + // ComputeNumSignBitsForTargetNode - Determine the number of bits in the // operation that are sign bits. virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, |