As a little learning exercise for D I’m writing a fixed point library. Part of this is checking standard integer operations for overflows.

This is the code for adding 2 longs:

int64 add64ov(int64 a, int64 b) {
        int64 res;
         asm {
                mov EAX,a    ;
                mov EDX,a+4  ;
                add EAX,b    ;
                adc EDX,b+4  ;
                jo  overflow ;
mov res,EAX ; // Not optimal: cannot do a ret here because of stack frame previously not correctly set
                mov res+4,EDX;
        }
        return res;
        overflow:
        throw new OverflowException("Overflow in 64 bit addition");
}

The detour via the res variable is costly; the standard epilogue
(I probably need a frame pointer for the exception throw to work):
  mov ESP, EBP
  pop EBP
  ret

creates an access violation.

Ideas, anyone?

Reply via email to