support multiplication by constant negative integers

this constmul code is still buggy though, so beware. mul by 7427 is currently
broken, for example. will fix it when I get a moment :)

llvm-svn: 21652
This commit is contained in:
Duraid Madina 2005-05-02 07:27:14 +00:00
parent 0e73188c10
commit 7acd5d5f06
1 changed files with 13 additions and 4 deletions

View File

@ -784,7 +784,7 @@ SDOperand ISel::BuildConstmulSequence(SDOperand N) {
bool flippedSign;
unsigned preliminaryShift=0;
assert(constant > 0 && "erk, don't multiply by zero or negative nums\n");
assert(constant != 0 && "erk, you're trying to multiply by constant zero\n");
// first, we make the constant to multiply by positive
if(constant<0) {
@ -832,13 +832,22 @@ SDOperand ISel::BuildConstmulSequence(SDOperand N) {
}
// don't forget flippedSign and preliminaryShift!
SDOperand finalresult;
SDOperand shiftedresult;
if(preliminaryShift) {
SDOperand finalshift = ISelDAG->getConstant(preliminaryShift, MVT::i64);
finalresult = ISelDAG->getNode(ISD::SHL, MVT::i64,
shiftedresult = ISelDAG->getNode(ISD::SHL, MVT::i64,
results[ops.size()-1], finalshift);
} else { // there was no preliminary divide-by-power-of-2 required
finalresult = results[ops.size()-1];
shiftedresult = results[ops.size()-1];
}
SDOperand finalresult;
if(flippedSign) { // if we were multiplying by a negative constant:
SDOperand zero = ISelDAG->getConstant(0, MVT::i64);
// subtract the result from 0 to flip its sign
finalresult = ISelDAG->getNode(ISD::SUB, MVT::i64, zero, shiftedresult);
} else { // there was no preliminary multiply by -1 required
finalresult = shiftedresult;
}
return finalresult;