Mail Archives: djgpp/1997/04/10/18:08:16
> long fixed_mul(long num1, long num2);
> #pragma aux fixed_mul = \
> "imul edx" \
> "add eax, 8000h" \
> "adc edx, 0" \
> "shrd eax, edx, 16" \
> parm caller [eax] [edx] \
> value [eax] \
> modify [eax edx];
I know nothing of watcom syntax (or GAS syntax really)
but it looks simple enough to take a guess at (if I'm wrong
somebody please correct me, this would be good to know)
The last three lines appear to be watcom specific commands that
specify that
1) num1 and num2 are passed in through eax and adx (not the case
in GCC)
2) The return value goes in eax
3) It uses eax and edx
The first instruction "imul edx" works as long as
your two values are already in EAX and EDX.
I remember reading a post from Robert H
about how to call through registers ( search the list) but
it would probably be easier to just mov the values off the
stack into eax and edx.
If you want to use GAS create a C program like this
long fixed_mul(long num1, long num2)
{ return (num1 * num2);
}
Compile with -S and then add in the code that checks and corrects
for overflow (the add 0x8000, add with carry, and shift). You also
probably want to delete the stack frame it creates as well since this is
for speed, right ( there is a command line option to kill this).
If you are using NASM (which may be easier) try this
fixed_mul.s
[BITS 32]
[GLOBAL _fixed_mul]
[SECTION .text]
_fixed_mul :
mov EAX, [ ESP + 4]
mov EDX, [ ESP + 8]
imul EDX
... (overflow code should work as is)
ret
> nasm -f coff fixed_mul.s -o fixed_mul.o
And then add fixed_mul.o to your link line.
I don't know gcc inline assembly well enough to help you out there,
but this should give a pretty fast function. Maybe the allegro
sources have a macro version of fixed routines (?)
Andrew
- Raw text -