88 lines
3.0 KiB
C
88 lines
3.0 KiB
C
#ifndef _COMMON_H_
|
|
#define _COMMON_H_
|
|
|
|
#include <exec/types.h>
|
|
#undef FLOAT
|
|
|
|
#include "types.h"
|
|
#define FLOAT SFVALUE
|
|
|
|
#define lowpart(a) ((unsigned short)a)
|
|
#define highpart(a) ((unsigned short)((a)>>16))
|
|
|
|
#ifdef mc68000
|
|
static inline unsigned long
|
|
mulu (unsigned long U, unsigned long V)
|
|
{
|
|
register unsigned long result asm("d0");
|
|
|
|
asm volatile (" \n\
|
|
movel %1,d0 \n\
|
|
movel %2,d1 \n\
|
|
movel d0,d2 \n\
|
|
movel d1,d3 \n\
|
|
swap d2 \n\
|
|
swap d3 \n\
|
|
mulu d1,d2 \n\
|
|
mulu d0,d3 \n\
|
|
mulu d1,d0 \n\
|
|
addw d3,d2 \n\
|
|
swap d2 \n\
|
|
clrw d2 \n\
|
|
addl d2,d0"
|
|
: "=r" (result)
|
|
: "g" (U), "g" (V)
|
|
: "d0", "d1", "d2", "d3");
|
|
return result;
|
|
}
|
|
|
|
#define divmodu(q, r, n, d) \
|
|
({ register unsigned long rq asm("d0"), rr asm("d1"); \
|
|
\
|
|
asm volatile (" \
|
|
movel %2,d0; \
|
|
movel %3,d1; \
|
|
cmpl #0xffff,d1; \
|
|
bhi 2f; \
|
|
movel d1,d3; \
|
|
swap d0; \
|
|
movew d0,d3; \
|
|
beq 1f; \
|
|
divu d1,d3; \
|
|
movew d3,d0; \
|
|
1: \
|
|
swap d0; \
|
|
movew d0,d3; \
|
|
divu d1,d3; \
|
|
movew d3,d0; \
|
|
swap d3; \
|
|
movew d3,d1; \
|
|
bra 5f; \
|
|
\
|
|
2: \
|
|
movel d1,d3; \
|
|
movel d0,d1; \
|
|
clrw d1; \
|
|
swap d1; \
|
|
swap d0; \
|
|
clrw d0; \
|
|
moveq #15,d2; \
|
|
3: \
|
|
addl d0,d0; \
|
|
addxl d1,d1; \
|
|
cmpl d1,d3; \
|
|
bhi 4f; \
|
|
subl d3,d1; \
|
|
addqw #1,d0; \
|
|
4: \
|
|
dbra d2,3b; \
|
|
\
|
|
5:" \
|
|
: "=r" (rq), "=r" (rr) \
|
|
: "g" (n), "g" (d) \
|
|
: "d0", "d1", "d2", "d3"); \
|
|
q = rq; r = rr;})
|
|
|
|
#endif
|
|
#endif
|