add matches for SxADDL and company, as well as simplify the SxADDQ code

llvm-svn: 21281
This commit is contained in:
Andrew Lenharth 2005-04-13 05:19:55 +00:00
parent e69ad5fd12
commit c7287c8eda
1 changed files with 48 additions and 78 deletions

View File

@ -1490,47 +1490,43 @@ unsigned ISel::SelectExpr(SDOperand N) {
bool isAdd = N.getOperand(0).getOpcode() == ISD::ADD; bool isAdd = N.getOperand(0).getOpcode() == ISD::ADD;
bool isMul = N.getOperand(0).getOpcode() == ISD::MUL; bool isMul = N.getOperand(0).getOpcode() == ISD::MUL;
//FIXME: first check for Scaled Adds and Subs! //FIXME: first check for Scaled Adds and Subs!
if(N.getOperand(0).getOperand(1).getOpcode() == ISD::Constant && ConstantSDNode* CSD = NULL;
if(!isMul && N.getOperand(0).getOperand(0).getOpcode() == ISD::SHL &&
(CSD = dyn_cast<ConstantSDNode>(N.getOperand(0).getOperand(0).getOperand(1))) &&
(CSD->getValue() == 2 || CSD->getValue() == 3))
{
bool use4 = CSD->getValue() == 2;
Tmp1 = SelectExpr(N.getOperand(0).getOperand(0).getOperand(0));
Tmp2 = SelectExpr(N.getOperand(0).getOperand(1));
BuildMI(BB, isAdd?(use4?Alpha::S4ADDL:Alpha::S8ADDL):(use4?Alpha::S4SUBL:Alpha::S8SUBL),
2,Result).addReg(Tmp1).addReg(Tmp2);
}
else if(isAdd && N.getOperand(0).getOperand(1).getOpcode() == ISD::SHL &&
(CSD = dyn_cast<ConstantSDNode>(N.getOperand(0).getOperand(1).getOperand(1))) &&
(CSD->getValue() == 2 || CSD->getValue() == 3))
{
bool use4 = CSD->getValue() == 2;
Tmp1 = SelectExpr(N.getOperand(0).getOperand(1).getOperand(0));
Tmp2 = SelectExpr(N.getOperand(0).getOperand(0));
BuildMI(BB, use4?Alpha::S4ADDL:Alpha::S8ADDL, 2,Result).addReg(Tmp1).addReg(Tmp2);
}
else if(N.getOperand(0).getOperand(1).getOpcode() == ISD::Constant &&
cast<ConstantSDNode>(N.getOperand(0).getOperand(1))->getValue() <= 255) cast<ConstantSDNode>(N.getOperand(0).getOperand(1))->getValue() <= 255)
{ //Normal imm add/sub { //Normal imm add/sub
Opc = isAdd ? Alpha::ADDLi : (isMul ? Alpha::MULLi : Alpha::SUBLi); Opc = isAdd ? Alpha::ADDLi : (isMul ? Alpha::MULLi : Alpha::SUBLi);
//if the value was really originally a i32, skip the up conversion Tmp1 = SelectExpr(N.getOperand(0).getOperand(0));
if (N.getOperand(0).getOperand(0).getOpcode() == ISD::SIGN_EXTEND_INREG &&
dyn_cast<MVTSDNode>(N.getOperand(0).getOperand(0).Val)
->getExtraValueType() == MVT::i32)
Tmp1 = SelectExpr(N.getOperand(0).getOperand(0).getOperand(0));
else
Tmp1 = SelectExpr(N.getOperand(0).getOperand(0));
Tmp2 = cast<ConstantSDNode>(N.getOperand(0).getOperand(1))->getValue(); Tmp2 = cast<ConstantSDNode>(N.getOperand(0).getOperand(1))->getValue();
BuildMI(BB, Opc, 2, Result).addReg(Tmp1).addImm(Tmp2); BuildMI(BB, Opc, 2, Result).addReg(Tmp1).addImm(Tmp2);
} }
else else
{ //Normal add/sub { //Normal add/sub
Opc = isAdd ? Alpha::ADDL : (isMul ? Alpha::MULLi : Alpha::SUBL); Opc = isAdd ? Alpha::ADDL : (isMul ? Alpha::MULL : Alpha::SUBL);
//if the value was really originally a i32, skip the up conversion
if (N.getOperand(0).getOperand(0).getOpcode() == ISD::SIGN_EXTEND_INREG &&
dyn_cast<MVTSDNode>(N.getOperand(0).getOperand(0).Val)
->getExtraValueType() == MVT::i32)
Tmp1 = SelectExpr(N.getOperand(0).getOperand(0).getOperand(0));
else
Tmp1 = SelectExpr(N.getOperand(0).getOperand(0));
//if the value was really originally a i32, skip the up conversion
if (N.getOperand(0).getOperand(1).getOpcode() == ISD::SIGN_EXTEND_INREG &&
dyn_cast<MVTSDNode>(N.getOperand(0).getOperand(1).Val)
->getExtraValueType() == MVT::i32)
Tmp2 = SelectExpr(N.getOperand(0).getOperand(1).getOperand(0));
else
Tmp2 = SelectExpr(N.getOperand(0).getOperand(1));
Tmp1 = SelectExpr(N.getOperand(0).getOperand(0)); Tmp1 = SelectExpr(N.getOperand(0).getOperand(0));
Tmp2 = SelectExpr(N.getOperand(0).getOperand(1));
BuildMI(BB, Opc, 2, Result).addReg(Tmp1).addReg(Tmp2); BuildMI(BB, Opc, 2, Result).addReg(Tmp1).addReg(Tmp2);
} }
return Result; return Result;
} }
case ISD::SEXTLOAD:
//SelectionDag isn't deleting the signextend after sextloads
Reg = Result = SelectExpr(N.getOperand(0));
return Result;
default: break; //Fall Though; default: break; //Fall Though;
} }
} //Every thing else fall though too, including unhandled opcodes above } //Every thing else fall though too, including unhandled opcodes above
@ -1787,79 +1783,52 @@ unsigned ISel::SelectExpr(SDOperand N) {
//first check for Scaled Adds and Subs! //first check for Scaled Adds and Subs!
//Valid for add and sub //Valid for add and sub
ConstantSDNode* CSD = NULL;
if(N.getOperand(0).getOpcode() == ISD::SHL && if(N.getOperand(0).getOpcode() == ISD::SHL &&
N.getOperand(0).getOperand(1).getOpcode() == ISD::Constant && (CSD = dyn_cast<ConstantSDNode>(N.getOperand(0).getOperand(1))) &&
cast<ConstantSDNode>(N.getOperand(0).getOperand(1))->getValue() == 2) (CSD->getValue() == 2 || CSD->getValue() == 3))
{ {
bool use4 = CSD->getValue() == 2;
Tmp2 = SelectExpr(N.getOperand(0).getOperand(0)); Tmp2 = SelectExpr(N.getOperand(0).getOperand(0));
if (N.getOperand(1).getOpcode() == ISD::Constant && if ((CSD = dyn_cast<ConstantSDNode>(N.getOperand(1))) && CSD->getValue() <= 255)
cast<ConstantSDNode>(N.getOperand(1))->getValue() <= 255) BuildMI(BB, isAdd?(use4?Alpha::S4ADDQi:Alpha::S8ADDQi):(use4?Alpha::S4SUBQi:Alpha::S8SUBQi),
BuildMI(BB, isAdd?Alpha::S4ADDQi:Alpha::S4SUBQi, 2, Result).addReg(Tmp2) 2, Result).addReg(Tmp2).addImm(CSD->getValue());
.addImm(cast<ConstantSDNode>(N.getOperand(1))->getValue());
else { else {
Tmp1 = SelectExpr(N.getOperand(1)); Tmp1 = SelectExpr(N.getOperand(1));
BuildMI(BB, isAdd?Alpha::S4ADDQ:Alpha::S4SUBQ, 2, Result).addReg(Tmp2).addReg(Tmp1); BuildMI(BB, isAdd?(use4?Alpha::S4ADDQi:Alpha::S8ADDQi):(use4?Alpha::S4SUBQi:Alpha::S8SUBQi),
} 2, Result).addReg(Tmp2).addReg(Tmp1);
}
else if(N.getOperand(0).getOpcode() == ISD::SHL &&
N.getOperand(0).getOperand(1).getOpcode() == ISD::Constant &&
cast<ConstantSDNode>(N.getOperand(0).getOperand(1))->getValue() == 3)
{
Tmp2 = SelectExpr(N.getOperand(0).getOperand(0));
if (N.getOperand(1).getOpcode() == ISD::Constant &&
cast<ConstantSDNode>(N.getOperand(1))->getValue() <= 255)
BuildMI(BB, isAdd?Alpha::S8ADDQi:Alpha::S8SUBQi, 2, Result).addReg(Tmp2)
.addImm(cast<ConstantSDNode>(N.getOperand(1))->getValue());
else {
Tmp1 = SelectExpr(N.getOperand(1));
BuildMI(BB, isAdd?Alpha::S8ADDQ:Alpha::S8SUBQ, 2, Result).addReg(Tmp2).addReg(Tmp1);
} }
} }
//Position prevents subs //Position prevents subs
else if(N.getOperand(1).getOpcode() == ISD::SHL && isAdd &
N.getOperand(1).getOperand(1).getOpcode() == ISD::Constant &&
cast<ConstantSDNode>(N.getOperand(1).getOperand(1))->getValue() == 2)
{
Tmp2 = SelectExpr(N.getOperand(1).getOperand(0));
if (N.getOperand(0).getOpcode() == ISD::Constant &&
cast<ConstantSDNode>(N.getOperand(0))->getValue() <= 255)
BuildMI(BB, Alpha::S4ADDQi, 2, Result).addReg(Tmp2)
.addImm(cast<ConstantSDNode>(N.getOperand(0))->getValue());
else {
Tmp1 = SelectExpr(N.getOperand(0));
BuildMI(BB, Alpha::S4ADDQ, 2, Result).addReg(Tmp2).addReg(Tmp1);
}
}
else if(N.getOperand(1).getOpcode() == ISD::SHL && isAdd && else if(N.getOperand(1).getOpcode() == ISD::SHL && isAdd &&
N.getOperand(1).getOperand(1).getOpcode() == ISD::Constant && (CSD = dyn_cast<ConstantSDNode>(N.getOperand(1).getOperand(1))) &&
cast<ConstantSDNode>(N.getOperand(1).getOperand(1))->getValue() == 3) (CSD->getValue() == 2 || CSD->getValue() == 3))
{ {
bool use4 = CSD->getValue() == 2;
Tmp2 = SelectExpr(N.getOperand(1).getOperand(0)); Tmp2 = SelectExpr(N.getOperand(1).getOperand(0));
if (N.getOperand(0).getOpcode() == ISD::Constant && if ((CSD = dyn_cast<ConstantSDNode>(N.getOperand(0))) && CSD->getValue() <= 255)
cast<ConstantSDNode>(N.getOperand(0))->getValue() <= 255) BuildMI(BB, use4?Alpha::S4ADDQi:Alpha::S8ADDQi, 2, Result).addReg(Tmp2)
BuildMI(BB, Alpha::S8ADDQi, 2, Result).addReg(Tmp2) .addImm(CSD->getValue());
.addImm(cast<ConstantSDNode>(N.getOperand(0))->getValue());
else { else {
Tmp1 = SelectExpr(N.getOperand(0)); Tmp1 = SelectExpr(N.getOperand(0));
BuildMI(BB, Alpha::S8ADDQ, 2, Result).addReg(Tmp2).addReg(Tmp1); BuildMI(BB, use4?Alpha::S4ADDQ:Alpha::S8ADDQ, 2, Result).addReg(Tmp2).addReg(Tmp1);
} }
} }
//small addi //small addi
else if(N.getOperand(1).getOpcode() == ISD::Constant && else if((CSD = dyn_cast<ConstantSDNode>(N.getOperand(1))) &&
cast<ConstantSDNode>(N.getOperand(1))->getValue() <= 255) CSD->getValue() <= 255)
{ //Normal imm add/sub { //Normal imm add/sub
Opc = isAdd ? Alpha::ADDQi : Alpha::SUBQi; Opc = isAdd ? Alpha::ADDQi : Alpha::SUBQi;
Tmp1 = SelectExpr(N.getOperand(0)); Tmp1 = SelectExpr(N.getOperand(0));
Tmp2 = cast<ConstantSDNode>(N.getOperand(1))->getValue(); BuildMI(BB, Opc, 2, Result).addReg(Tmp1).addImm(CSD->getValue());
BuildMI(BB, Opc, 2, Result).addReg(Tmp1).addImm(Tmp2);
} }
//larger addi //larger addi
else if(N.getOperand(1).getOpcode() == ISD::Constant && else if((CSD = dyn_cast<ConstantSDNode>(N.getOperand(1))) &&
(cast<ConstantSDNode>(N.getOperand(1))->getValue() <= 32767 || CSD->getSignExtended() <= 32767 &&
(long)cast<ConstantSDNode>(N.getOperand(1))->getValue() >= -32767)) CSD->getSignExtended() >= -32767)
{ //LDA { //LDA
Tmp1 = SelectExpr(N.getOperand(0)); Tmp1 = SelectExpr(N.getOperand(0));
Tmp2 = (long)cast<ConstantSDNode>(N.getOperand(1))->getValue(); Tmp2 = (long)CSD->getSignExtended();
if (!isAdd) if (!isAdd)
Tmp2 = -Tmp2; Tmp2 = -Tmp2;
BuildMI(BB, Alpha::LDA, 2, Result).addImm(Tmp2).addReg(Tmp1); BuildMI(BB, Alpha::LDA, 2, Result).addImm(Tmp2).addReg(Tmp1);
@ -2270,3 +2239,4 @@ void ISel::Select(SDOperand N) {
FunctionPass *llvm::createAlphaPatternInstructionSelector(TargetMachine &TM) { FunctionPass *llvm::createAlphaPatternInstructionSelector(TargetMachine &TM) {
return new ISel(TM); return new ISel(TM);
} }