Do C++ signed types have modulo semantics?
Nathan Sidwell
nathan@codesourcery.com
Tue Jun 28 14:05:00 GMT 2005
Gabriel Dos Reis wrote:
> Nathan Sidwell <nathan@codesourcery.com> writes:
>
> | Gabriel Dos Reis wrote:
> | > Michael Veksler <VEKSLER@il.ibm.com> writes:
> | > [...]
> | > | The code is not very simple, and different codes will get optimized
> | > | differently.
> | > | The user will have to learn how to write this piece of code differently for
> | > | each
> | > | processor to have best results.
> | > | | int wrap_sum(int a, int b)
> | > | {
> | > | if ( (a<0) != (b<0))
> | > | return a+b; // Different sign, no overflow possible.
> | > | unsigned sum = (unsigned) a + b;
> | > | if (sum <= MAX_INT)
> | > | return sum;
> | > | sum -= MIN_INT;
> | > | if (sum > MAX_INT) // can be eliminated for 2's complement
> | > | abort(); // oops
> | > | return (int)sum + MIN_INT;
> | > | }
> | > | | It does not look too good optimization-wise.
> | > Thanks for providing this example. This is the sort of thing I
> | > faced. With pipeline process, it does harm.
> |
> | Please explain why
> | int wrap_sum (int a, int b)
> | {
> | return (int) ((unsigned)a + (unsigned)b));
> | }
> | is unacceptable
>
> Notice that in your rendition you're assuming that you can convert any
> unsigned value > INT_MAX to a int without invoking undefined behaviour.
>
> Thus the question is whether you're accepting that as documented
> behaviour of GCC, and if so, then I'm interested in which ways it
> would differs from saying that is_modulo is true. That is useful for
> improving over the current situation, may I point out.
I give up.
nathan
--
Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery LLC
nathan@codesourcery.com :: http://www.planetfall.pwp.blueyonder.co.uk
More information about the Gcc
mailing list