I have a 64-bit double precision FPU working now. It seems to be a big improvement on my first version. The main work now is to complete the new library for GCC to make use of the FPU.
I have started to work on a set of wrapper functions which will override the existing soft-float routines.
The first routine overrides muldf3:
double __wrap___muldf3(double a, double b)
{
printf("\r\nmuldf3: start\r\n");
*fpu_ctl = MUL;
op_a.dbl = a;
op_b.dbl = b;
*opa = op_a.num;
*opb = op_b.num;
BIT_SET(*fpu_ctl, 0);
BIT_CLEAR(*fpu_ctl, 0);
while (!BIT_CHECK(*fpu_sts, 0) && !BIT_CHECK(*fpu_sts, 1))
{
}
resf.num = *fpu_res;
printf("\r\nmuldf3: stop\r\n");
return resf.dbl;
}
It uses a union to convert the double to IEEE754 double-precision int.
union FloatingPointIEEE754
{
struct
{
unsigned int sign : 1;
unsigned short int exponent : 11;
long long mantissa : 52;
} raw;
uint64_t num;
double dbl;
} ;
The make file has an additional parameter to override the specified function.
float-test.run: ieee754.c float-test.c
m68k-elf-gcc -Wall -m68000 -g -Os ieee754.c float-test.c
-Wl,--wrap=__muldf3 -o float-test.run ....
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.