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; 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