mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
Fix bug in function IsShiftedMask. Remove parameter SizeInBits, which is not
needed for Mips32. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138132 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2c3f70e5d4
commit
854a7db117
@ -37,17 +37,13 @@ using namespace llvm;
|
||||
|
||||
// If I is a shifted mask, set the size (Size) and the first bit of the
|
||||
// mask (Pos), and return true.
|
||||
static bool IsShiftedMask(uint64_t I, unsigned SizeInBits, uint64_t &Pos,
|
||||
uint64_t &Size) {
|
||||
assert(SizeInBits == 32 || SizeInBits == 64);
|
||||
bool Is32Bits = (SizeInBits == 32);
|
||||
// For example, if I is 0x003ff800, (Pos, Size) = (11, 11).
|
||||
static bool IsShiftedMask(uint64_t I, uint64_t &Pos, uint64_t &Size) {
|
||||
if (!isUInt<32>(I) || !isShiftedMask_32(I))
|
||||
return false;
|
||||
|
||||
if ((Is32Bits == 32 && !isShiftedMask_32(I)) ||
|
||||
(!Is32Bits && !isShiftedMask_64(I)))
|
||||
return false;
|
||||
|
||||
Size = Is32Bits ? CountPopulation_32(I) : CountPopulation_64(I);
|
||||
Pos = Is32Bits ? CountTrailingZeros_32(I) : CountTrailingZeros_64(I);
|
||||
Size = CountPopulation_32(I);
|
||||
Pos = CountTrailingZeros_32(I);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -546,7 +542,7 @@ static SDValue PerformANDCombine(SDNode *N, SelectionDAG& DAG,
|
||||
uint64_t SMPos, SMSize;
|
||||
// Op's second operand must be a shifted mask.
|
||||
if (!(CN = dyn_cast<ConstantSDNode>(Mask)) ||
|
||||
!IsShiftedMask(CN->getZExtValue(), 32, SMPos, SMSize))
|
||||
!IsShiftedMask(CN->getZExtValue(), SMPos, SMSize))
|
||||
return SDValue();
|
||||
|
||||
// Return if the shifted mask does not start at bit 0 or the sum of its size
|
||||
@ -579,7 +575,7 @@ static SDValue PerformORCombine(SDNode *N, SelectionDAG& DAG,
|
||||
return SDValue();
|
||||
|
||||
if (!(CN = dyn_cast<ConstantSDNode>(And0.getOperand(1))) ||
|
||||
!IsShiftedMask(~CN->getZExtValue(), 32, SMPos0, SMSize0))
|
||||
!IsShiftedMask(~CN->getSExtValue(), SMPos0, SMSize0))
|
||||
return SDValue();
|
||||
|
||||
// See if Op's second operand matches (and (shl $src, pos), mask1).
|
||||
@ -587,8 +583,7 @@ static SDValue PerformORCombine(SDNode *N, SelectionDAG& DAG,
|
||||
return SDValue();
|
||||
|
||||
if (!(CN = dyn_cast<ConstantSDNode>(And1.getOperand(1))) ||
|
||||
!IsShiftedMask(CN->getZExtValue(), CN->getValueSizeInBits(0), SMPos1,
|
||||
SMSize1))
|
||||
!IsShiftedMask(CN->getZExtValue(), SMPos1, SMSize1))
|
||||
return SDValue();
|
||||
|
||||
// The shift masks must have the same position and size.
|
||||
|
Loading…
Reference in New Issue
Block a user