On Oct 19, 2007, at 1:31 AM, Duncan Sands wrote: > Hi Chris, > >> +void DAGTypeLegalizer:: >> +ExpandResult_SIGN_EXTEND_INREG(SDNode *N, SDOperand &Lo, >> SDOperand &Hi) { >> + GetExpandedOp(N->getOperand(0), Lo, Hi); >> + >> + // sext_inreg the low part if needed. >> + Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, Lo.getValueType(), Lo, >> + N->getOperand(1)); >> + >> + // The high part gets the sign extension from the lo-part. >> This handles >> + // things like sextinreg V:i64 from i8. >> + Hi = DAG.getNode(ISD::SRA, Hi.getValueType(), Lo, >> + DAG.getConstant(MVT::getSizeInBits >> (Hi.getValueType())-1, >> + TLI.getShiftAmountTy())); >> +} > > doesn't this assume that the type being extended is smaller than or > equal to > the type of Lo?
Yes, I think so. I just brought it over unmodified from legalizedag.cpp > For example, will this work for i64 from i63? Probably not, who does that stuff? :) Assuming an expansion from i64 to 2x i32, the code above will work for sextinreg amounts between 1 and 32. For greater amounts, the top part should get a sextinreg, and the bottom part should or togther the top and bottom shifted parts, similar to a expanded shift. -Chris _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits