This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Code representations
2008/4/28 Kai Tietz <Kai.Tietz@onevision.com>:
> gcc-owner@gcc.gnu.org wrote on 28.04.2008 13:11:39:
>
>
>
> > I am trying to look at assembler code, and representing it as C code.
> >
> > For ia32, x86 platforms,
> > assembler like the following
> >
> > ADD eax,ebx;
> > JO integer_overflow_detected;
> >
> > How would I represent this in C?
> >
> > Kind Regards
> >
> > James
>
> It would be something like this:
>
> #define MSB (type) ((1<<((sizeof(type)*8)-1))
> typedef unsigned int myscalar;
> ...
> {
> myscalar a,b,savea;
> ...
> savea = a;
> a+=b;
> if ( ((savea & MSB(myscalar)) & ((b & MSB(myscalar)) & ~(a &
> MSB(myscalar)))) ||
> ( ~(savea & MSB(myscalar)) & ~(b&MSB(myscalar)) & (a&MSB(myscalar))))
> /* overflow */
> ...
> }
>
> For signed integers you can ease this as follow
>
> savea = a;
> a+=b;
> if ( (savea<0 && b<0 && a>=0)) ||
> (savea>=0 && b>=0 && a<0))
> /* overflow */
>
I am taking a wild guess here, but can I assume that the above will
not compile back to something like:
ADD eax,ebx;
JO integer_overflow_detected;
I think I will have to have some macro/function in C that does the following:
add(int a,int b, int (&integer_overflow_detected));
This will add a and b, and jump to the overflow handler if there is an overflow.
I can then implement CPU specific implementations for each target
platform, and that would at least return to the same ASM code
generated at compile.
James