| Bill Allombert on Sun, 26 Mar 2006 13:54:14 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| m68k inline assembly kernel |
Hello PARI-dev,
I have just commited a inline level 0 assembly kernel for
Motorola 68k processors to PARI CVS.
For the nostalgic among you, I join the core of the files below.
I hope that, like me, you will feel much youger!
Cheers,
Bill.
#define LOCAL_HIREMAINDER register ulong hiremainder
#define LOCAL_OVERFLOW register ulong overflow
#define addll(a,b) \
({ ulong __value, __arg1 = (a), __arg2 = (b); \
__asm__ ("add.l %2,%0 ; addx.l %1,%1" \
: "=&d" (__value), "=d" (overflow) \
: "rm" (__arg1), "0" (__arg2), "1" (0UL) \
: "cc"); \
__value; \
})
#define addllx(a,b) \
({ ulong __value, __arg1 = (a), __arg2 = (b), __temp; \
__asm__ ("neg.l %2 ; addx.l %4,%0 ; addx.l %1,%1" \
: "=d" (__value), "=d" (overflow), "=d" (__temp) \
: "0" (__arg1), "d" (__arg2), "2" (overflow), "1" (0UL) \
: "cc"); \
__value; \
})
#define subll(a,b) \
({ ulong __value, __arg1 = (a), __arg2 = (b); \
__asm__ ("sub.l %3,%0 ; addx.l %1,%1" \
: "=&d" (__value), "=d" (overflow) \
: "0" (__arg1), "rm" (__arg2), "1" (0UL) \
: "cc"); \
__value; \
})
#define subllx(a,b) \
({ ulong __value, __arg1 = (a), __arg2 = (b), __temp; \
__asm__ ("neg.l %2 ; subx.l %4,%0 ; addx.l %1,%1" \
: "=d" (__value), "=d" (overflow), "=d" (__temp) \
: "0" (__arg1), "d" (__arg2), "2" (overflow), "1" (0UL) \
: "cc"); \
__value; \
})
#define mulll(a, b) \
({ \
ulong __arg1 = (a), __arg2 = (b), __value; \
__asm__ ("mulu.l %2, %0:%1" \
: "=d" (hiremainder), "=d" (__value) \
: "md" (__arg1) , "1" (__arg2) \
: "cc"); \
__value; \
})
#define addmul(a, b) \
({ \
ulong __arg1 = (a), __arg2 = (b), __value; \
__asm__ ("mulu.l %2, %0:%1; add.l %4,%1; addx.l %5,%0" \
: "=&d" (hiremainder), "=&d" (__value) \
: "md" (__arg1), "1" (__arg2), "d" (hiremainder), "d" (0UL) \
: "cc" ); \
__value; \
})
#define bfffo(a) \
({ \
ulong __arg1 = (a), __value; \
__asm__ ("bfffo %1{#0:#0}, %0" \
: "=d" (__value) \
: "md" (__arg1) \
: "cc" ); \
__value; \
})
#define divll(a, b) \
({ \
ulong __arg2 = (b), __value =(a); \
__asm__ ("divu.l %2, %0:%1" \
: "+d" (hiremainder), "+d" (__value) \
: "md" (__arg2) \
: "cc"); \
__value; \
})