Inace u fixed-u je predstavljen broj sa pokretnim zarezom.
Hvala
Code:
typedef long fixed;
#ifdef LINUX
/* PALM (m68) */
fixed asm m68_fixed_mul(fixed a : __D0, fixed b : __D1) : __D0
{
movem.l d2-d4, -(sp)
move.l d0, d2
mulu.w d1, d0
add.l #0x8000, d0
clr.w d0
swap d0 // d0=alo*blo>>16, d1=b, d2=a
move.l d1, d3
move.l d2, d4
swap d4
mulu.w d4, d3
add.l d3, d0 // d0=alo*blo>>16 + ahi*blo, d4=alo.ahi
move.l d1, d3
swap d3
mulu.w d2, d3 // d3= alo*bhi
add.l d3, d0 // d0=d0 + alo*bhi
move.l d1, d3
swap d3
mulu.w d4, d3 // d3 = ahi*bhi
swap d3
clr.w d3
add.l d3, d0 // d0 is now the unsigned product
// d1=b, d2=a, d3=??, d4=alo.ahi
swap d1
move.l d4, d3
ext.l d3
and.l d1, d3
clr.w d3
sub.l d3, d0
ext.l d1
and.l d4, d1
clr.w d1
sub.l d1, d0
movem.l (sp)+, d2-d4
rts
}
#else
/* LINUX (x86) */
inline fixed intel_fixed_mul(fixed a, fixed b)
{
fixed __s;
asm (
"imull %2 \n\t"
"add $0x8000,%%eax \n\t"
"adc $0,%%edx \n\t"
"shrd $16,%%edx,%%eax"
: "=a" (__s)
: "a" (a), "rm" (b)
: "%edx");
return __s;
}
#endif
typedef long fixed;
#ifdef LINUX
/* PALM (m68) */
fixed asm m68_fixed_mul(fixed a : __D0, fixed b : __D1) : __D0
{
movem.l d2-d4, -(sp)
move.l d0, d2
mulu.w d1, d0
add.l #0x8000, d0
clr.w d0
swap d0 // d0=alo*blo>>16, d1=b, d2=a
move.l d1, d3
move.l d2, d4
swap d4
mulu.w d4, d3
add.l d3, d0 // d0=alo*blo>>16 + ahi*blo, d4=alo.ahi
move.l d1, d3
swap d3
mulu.w d2, d3 // d3= alo*bhi
add.l d3, d0 // d0=d0 + alo*bhi
move.l d1, d3
swap d3
mulu.w d4, d3 // d3 = ahi*bhi
swap d3
clr.w d3
add.l d3, d0 // d0 is now the unsigned product
// d1=b, d2=a, d3=??, d4=alo.ahi
swap d1
move.l d4, d3
ext.l d3
and.l d1, d3
clr.w d3
sub.l d3, d0
ext.l d1
and.l d4, d1
clr.w d1
sub.l d1, d0
movem.l (sp)+, d2-d4
rts
}
#else
/* LINUX (x86) */
inline fixed intel_fixed_mul(fixed a, fixed b)
{
fixed __s;
asm (
"imull %2 \n\t"
"add $0x8000,%%eax \n\t"
"adc $0,%%edx \n\t"
"shrd $16,%%edx,%%eax"
: "=a" (__s)
: "a" (a), "rm" (b)
: "%edx");
return __s;
}
#endif