mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-18 10:24:45 +00:00
Tidied up the use of dyn_cast<ConstantSDNode> by using isIntImmediate more.
Patch by Jim Laskey. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22760 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -983,6 +983,7 @@ void ISel::MoveCRtoGPR(unsigned CCReg, ISD::CondCode CC, unsigned Result){
|
|||||||
bool ISel::SelectBitfieldInsert(SDOperand OR, unsigned Result) {
|
bool ISel::SelectBitfieldInsert(SDOperand OR, unsigned Result) {
|
||||||
bool IsRotate = false;
|
bool IsRotate = false;
|
||||||
unsigned TgtMask = 0xFFFFFFFF, InsMask = 0xFFFFFFFF, Amount = 0;
|
unsigned TgtMask = 0xFFFFFFFF, InsMask = 0xFFFFFFFF, Amount = 0;
|
||||||
|
unsigned Value;
|
||||||
|
|
||||||
SDOperand Op0 = OR.getOperand(0);
|
SDOperand Op0 = OR.getOperand(0);
|
||||||
SDOperand Op1 = OR.getOperand(1);
|
SDOperand Op1 = OR.getOperand(1);
|
||||||
@@ -997,34 +998,32 @@ bool ISel::SelectBitfieldInsert(SDOperand OR, unsigned Result) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Generate Mask value for Target
|
// Generate Mask value for Target
|
||||||
if (ConstantSDNode *CN =
|
if (isIntImmediate(Op0.getOperand(1), Value)) {
|
||||||
dyn_cast<ConstantSDNode>(Op0.getOperand(1).Val)) {
|
|
||||||
switch(Op0Opc) {
|
switch(Op0Opc) {
|
||||||
case ISD::SHL: TgtMask <<= (unsigned)CN->getValue(); break;
|
case ISD::SHL: TgtMask <<= Value; break;
|
||||||
case ISD::SRL: TgtMask >>= (unsigned)CN->getValue(); break;
|
case ISD::SRL: TgtMask >>= Value; break;
|
||||||
case ISD::AND: TgtMask &= (unsigned)CN->getValue(); break;
|
case ISD::AND: TgtMask &= Value; break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate Mask value for Insert
|
// Generate Mask value for Insert
|
||||||
if (ConstantSDNode *CN =
|
if (isIntImmediate(Op1.getOperand(1), Value)) {
|
||||||
dyn_cast<ConstantSDNode>(Op1.getOperand(1).Val)) {
|
|
||||||
switch(Op1Opc) {
|
switch(Op1Opc) {
|
||||||
case ISD::SHL:
|
case ISD::SHL:
|
||||||
Amount = CN->getValue();
|
Amount = Value;
|
||||||
InsMask <<= Amount;
|
InsMask <<= Amount;
|
||||||
if (Op0Opc == ISD::SRL) IsRotate = true;
|
if (Op0Opc == ISD::SRL) IsRotate = true;
|
||||||
break;
|
break;
|
||||||
case ISD::SRL:
|
case ISD::SRL:
|
||||||
Amount = CN->getValue();
|
Amount = Value;
|
||||||
InsMask >>= Amount;
|
InsMask >>= Amount;
|
||||||
Amount = 32-Amount;
|
Amount = 32-Amount;
|
||||||
if (Op0Opc == ISD::SHL) IsRotate = true;
|
if (Op0Opc == ISD::SHL) IsRotate = true;
|
||||||
break;
|
break;
|
||||||
case ISD::AND:
|
case ISD::AND:
|
||||||
InsMask &= (unsigned)CN->getValue();
|
InsMask &= Value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1039,20 +1038,18 @@ bool ISel::SelectBitfieldInsert(SDOperand OR, unsigned Result) {
|
|||||||
if (Op0Opc == ISD::AND && Op1Opc == ISD::AND) {
|
if (Op0Opc == ISD::AND && Op1Opc == ISD::AND) {
|
||||||
if (Op1.getOperand(0).getOpcode() == ISD::SHL ||
|
if (Op1.getOperand(0).getOpcode() == ISD::SHL ||
|
||||||
Op1.getOperand(0).getOpcode() == ISD::SRL) {
|
Op1.getOperand(0).getOpcode() == ISD::SRL) {
|
||||||
if (ConstantSDNode *CN =
|
if (isIntImmediate(Op1.getOperand(0).getOperand(1), Value)) {
|
||||||
dyn_cast<ConstantSDNode>(Op1.getOperand(0).getOperand(1).Val)) {
|
|
||||||
Amount = Op1.getOperand(0).getOpcode() == ISD::SHL ?
|
Amount = Op1.getOperand(0).getOpcode() == ISD::SHL ?
|
||||||
CN->getValue() : 32 - CN->getValue();
|
Value : 32 - Value;
|
||||||
Tmp3 = SelectExpr(Op1.getOperand(0).getOperand(0));
|
Tmp3 = SelectExpr(Op1.getOperand(0).getOperand(0));
|
||||||
}
|
}
|
||||||
} else if (Op0.getOperand(0).getOpcode() == ISD::SHL ||
|
} else if (Op0.getOperand(0).getOpcode() == ISD::SHL ||
|
||||||
Op0.getOperand(0).getOpcode() == ISD::SRL) {
|
Op0.getOperand(0).getOpcode() == ISD::SRL) {
|
||||||
if (ConstantSDNode *CN =
|
if (isIntImmediate(Op0.getOperand(0).getOperand(1), Value)) {
|
||||||
dyn_cast<ConstantSDNode>(Op0.getOperand(0).getOperand(1).Val)) {
|
|
||||||
std::swap(Op0, Op1);
|
std::swap(Op0, Op1);
|
||||||
std::swap(TgtMask, InsMask);
|
std::swap(TgtMask, InsMask);
|
||||||
Amount = Op1.getOperand(0).getOpcode() == ISD::SHL ?
|
Amount = Op1.getOperand(0).getOpcode() == ISD::SHL ?
|
||||||
CN->getValue() : 32 - CN->getValue();
|
Value : 32 - Value;
|
||||||
Tmp3 = SelectExpr(Op1.getOperand(0).getOperand(0));
|
Tmp3 = SelectExpr(Op1.getOperand(0).getOperand(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1584,8 +1581,8 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {
|
|||||||
|
|
||||||
case ISD::SHL:
|
case ISD::SHL:
|
||||||
Tmp1 = SelectExpr(N.getOperand(0));
|
Tmp1 = SelectExpr(N.getOperand(0));
|
||||||
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
|
if (isIntImmediate(N.getOperand(1), Tmp2)) {
|
||||||
Tmp2 = CN->getValue() & 0x1F;
|
Tmp2 &= 0x1F;
|
||||||
BuildMI(BB, PPC::RLWINM, 4, Result).addReg(Tmp1).addImm(Tmp2).addImm(0)
|
BuildMI(BB, PPC::RLWINM, 4, Result).addReg(Tmp1).addImm(Tmp2).addImm(0)
|
||||||
.addImm(31-Tmp2);
|
.addImm(31-Tmp2);
|
||||||
} else {
|
} else {
|
||||||
@@ -1596,8 +1593,8 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {
|
|||||||
|
|
||||||
case ISD::SRL:
|
case ISD::SRL:
|
||||||
Tmp1 = SelectExpr(N.getOperand(0));
|
Tmp1 = SelectExpr(N.getOperand(0));
|
||||||
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
|
if (isIntImmediate(N.getOperand(1), Tmp2)) {
|
||||||
Tmp2 = CN->getValue() & 0x1F;
|
Tmp2 &= 0x1F;
|
||||||
BuildMI(BB, PPC::RLWINM, 4, Result).addReg(Tmp1).addImm(32-Tmp2)
|
BuildMI(BB, PPC::RLWINM, 4, Result).addReg(Tmp1).addImm(32-Tmp2)
|
||||||
.addImm(Tmp2).addImm(31);
|
.addImm(Tmp2).addImm(31);
|
||||||
} else {
|
} else {
|
||||||
@@ -1608,8 +1605,8 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {
|
|||||||
|
|
||||||
case ISD::SRA:
|
case ISD::SRA:
|
||||||
Tmp1 = SelectExpr(N.getOperand(0));
|
Tmp1 = SelectExpr(N.getOperand(0));
|
||||||
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
|
if (isIntImmediate(N.getOperand(1), Tmp2)) {
|
||||||
Tmp2 = CN->getValue() & 0x1F;
|
Tmp2 &= 0x1F;
|
||||||
BuildMI(BB, PPC::SRAWI, 2, Result).addReg(Tmp1).addImm(Tmp2);
|
BuildMI(BB, PPC::SRAWI, 2, Result).addReg(Tmp1).addImm(Tmp2);
|
||||||
} else {
|
} else {
|
||||||
Tmp2 = FoldIfWideZeroExtend(N.getOperand(1));
|
Tmp2 = FoldIfWideZeroExtend(N.getOperand(1));
|
||||||
|
Reference in New Issue
Block a user