/* $Id: asmsparcv9.h,v 1.1.1.1 1999/09/16 13:47:58 karim Exp $ */
#ifndef __ASMSPARCV9_H__
#define __ASMSPARCV9_H__
register unsigned long hiremainder asm("%g5");
register unsigned long overflow asm("%g6");
#define addll(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "addcc %2,%3,%0; \
addc %%g0,%%g0,%1" \
: "=r" (__value), "=r" (overflow) \
: "r" (__arg1), "r" (__arg2) \
: "%g6","cc"); \
__value; })
#define subll(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "subcc %2,%3,%0; \
addc %%g0,%%g0,%1" \
: "=r" (__value), "=r" (overflow) \
: "r" (__arg1), "r" (__arg2) \
: "%g6","cc"); \
__value; })
#define addllx(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "subcc %%g0,%%g6,%%g0; \
addccc %2,%3,%0; \
addc %%g0,%%g0,%1" \
: "=r" (__value), "=r" (overflow) \
: "r" (__arg1), "r" (__arg2) \
: "%g6","cc"); \
__value; })
#define subllx(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "subcc %%g0,%%g6,%%g0; \
subccc %2,%3,%0; \
addc %%g0,%%g0,%1" \
: "=r" (__value), "=r" (overflow) \
: "r" (__arg1), "r" (__arg2) \
: "%g6","cc"); \
__value; })
#define shiftl(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "neg %3,%%o4; \
srl %2,%%o4,%1; \
sll %2,%3,%0" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2) \
: "%o4","%g5"); \
__value; })
#define shiftl2(a,b,c) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b), __arg3 = (c); \
asm ( "srl %2,%4,%1; \
sll %2,%3,%0" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2), "r" (__arg3) \
: "%g5"); \
__value; })
#define shiftlr(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "neg %3,%%o4; \
sll %2,%%o4,%1; \
srl %2,%3,%0" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2) \
: "%o4","%g5"); \
__value; })
#define shiftlr1(a) \
({ unsigned long __value, __arg1 = (a); \
asm ( "sll %2,31,%1; \
srl %2,1,%0" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1) \
: "%g5"); \
__value; })
#define shiftlr2(a,b,c) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b), __arg3 = (c); \
asm ( "sll %2,%4,%1; \
srl %2,%3,%0" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2), "r" (__arg3) \
: "%g5"); \
__value; })
#define mulll(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "umul %2,%3,%0; \
srlx %0,32,%1" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2) \
: "%g5"); \
__value;})
#define addmul(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm ( "umul %2,%3,%0; \
add %0,%%g5,%0; \
srlx %0,32,%1" \
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2) \
: "%g5"); \
__value;})
#define divll(a,b) \
({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
asm( "wr %%g5,%%g0,%%y;\
mov %2,%%o4;\
udivcc %2,%3,%0;\
bvc 1f;\
umul %0,%3,%%o5;\
mov 47,%%o0;\
call err,1;\
nop ;\
1: sub %%o4,%%o5,%1"\
: "=r" (__value), "=r" (hiremainder) \
: "r" (__arg1), "r" (__arg2) \
: "%o4","%o5","%g5","cc"); \
__value;})
#endif