Hi, my target handles operands of multiplying instructions differently based on signedness. I wonder then how I would do instruction selection based on the operands signs? The mul instruction sets a nsw for signed, but when i try unsigned ops, there is no wrap flag at all. I'm not sure this is enough information to work with, or? Jonas -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110905/ab6e6632/attachment.html>
Hi Jonas,> my target handles operands of multiplying instructions differently based on > signedness.since the result of a multiply doesn't depend on the signedness, I find it strange that your target differentiates between them. What I'm saying is that if you have (say) two i32 numbers a and b and you do a signed multiply: c = a *s b and an unsigned multiply d = a *u b then c and d are the same number (exactly the same bits set).> > I wonder then how I would do instruction selection based on the operands signs? > > The mul instruction sets a nsw for signed,No it doesn't. nsw doesn't mean signed, it means that if the multiplication would overflow as a signed multiplication then the result is undefined which is completely different. but when i try unsigned ops, there is> no wrap flag at all. I'm not sure this is enough information to work with, or?No information is needed, see above. Ciao, Duncan.
On 5 sept. 2011, at 17:48, Duncan Sands wrote:> since the result of a multiply doesn't depend on the signedness, I find it > strange that your target differentiates between them. What I'm saying is > that if you have (say) two i32 numbers a and b and you do a signed multiply: > c = a *s b > and an unsigned multiply > d = a *u b > then c and d are the same number (exactly the same bits set).At least two architectures I know about have size-extending multiplication, for which your statement is not true: - Motorola MC68K has i16 x 16 -> i32 instructions in signed and unsigned forms - Itanium has signed and unsigned multiplications with i64 x i64 -> i64 where you can take the high or low part of the resulting i128. While xma.lu is a pseudo-op since it's the same as xma.lu, xma.hu and xma.h (unsigned and signed) are distinct. I'm pretty sure there are other similar architectures. Regards Christophe