This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]