"James Courtier-Dutton" <[EMAIL PROTECTED]> wrote on 28.04.2008
15:28:56:
> 2008/4/28 Kai Tietz <[EMAIL PROTECTED]>:
> > [EMAIL PROTECTED] 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;
This is a matter of the optimization. But I guess that gcc won't optimize
this to the same instruction you wrote, too.
But you queried 'How would I represent this in C?' and the above code is
the c representation of your assembler, sure.
> 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.
May the better choice for your purpose.
Kai
| (\_/) This is Bunny. Copy and paste Bunny
| (='.'=) into your signature to help him gain
| (")_(") world domination.