[BACK]Return to level0.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / src / kernel / sparcv8

Annotation of OpenXM_contrib/pari/src/kernel/sparcv8/level0.h, Revision 1.1

1.1     ! maekawa     1: /* $Id: level0.h,v 1.1.1.1 1999/09/16 13:47:58 karim Exp $ */
        !             2:
        !             3: /* This file defines some "level 0" kernel functions for SPARC V8 */
        !             4: /* These functions can be inline, with gcc                        */
        !             5: /* If not gcc, they are defined externally with "level0.s"        */
        !             6: /* This file is common to SuperSparc and MicroSparc               */
        !             7: /*                                                                */
        !             8: /* These following symbols can be inlined                         */
        !             9: /* overflow hiremainder                                           */
        !            10: /* addll addllx subll subllx shiftl shiftlr mulll addmul          */
        !            11: /*                                                                */
        !            12: /* These functions are always in level0.s                         */
        !            13: /* The following symbols are always defined in this file :        */
        !            14: /* divll bfffo (& tabshi)                                         */
        !            15: /*   But divll have to use hiremainder, so it is different when   */
        !            16: /*   hiremainder is inline or not                                 */
        !            17: /*   If libpari.so is compiled with gcc, you should compile all   */
        !            18: /*   files with gcc                                               */
        !            19:
        !            20: #define LOCAL_OVERFLOW
        !            21: #define SAVE_OVERFLOW
        !            22: #define LOCAL_HIREMAINDER
        !            23: #define SAVE_HIREMAINDER
        !            24:
        !            25: BEGINEXTERN
        !            26: extern long divll(unsigned long x, unsigned long y);
        !            27: extern int  bfffo(unsigned long x);
        !            28: ENDEXTERN
        !            29:
        !            30: #ifndef ASMINLINE
        !            31: BEGINEXTERN
        !            32: extern unsigned long hiremainder, overflow;
        !            33: extern long addll(unsigned long a, unsigned long b);
        !            34: extern long addllx(unsigned long a, unsigned long b);
        !            35: extern long subll(unsigned long a, unsigned long b);
        !            36: extern long subllx(unsigned long a, unsigned long b);
        !            37: extern long shiftl(unsigned long x, unsigned long y);
        !            38: extern long shiftlr(unsigned long x, unsigned long y);
        !            39: extern long mulll(unsigned long x, unsigned long y);
        !            40: extern long addmul(unsigned long x, unsigned long y);
        !            41: ENDEXTERN
        !            42:
        !            43: #else /* ASMINLINE */
        !            44:
        !            45: register unsigned long hiremainder __asm__("%g5");
        !            46: register unsigned long overflow __asm__("%g6");
        !            47:
        !            48: #define addll(a,b) \
        !            49: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !            50:    __asm__ ( "addcc %2,%3,%0; \
        !            51:           addx  %%g0,%%g0,%1" \
        !            52:         : "=r" (__value), "=r" (overflow) \
        !            53:         : "r" (__arg1), "r" (__arg2) \
        !            54:          : "%g6","cc"); \
        !            55: __value; })
        !            56:
        !            57: #define addllx(a,b) \
        !            58: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !            59:    __asm__ ( "subcc %%g0,%%g6,%%g0; \
        !            60:           addxcc %2,%3,%0; \
        !            61:           addx  %%g0,%%g0,%1" \
        !            62:         : "=r" (__value), "=r" (overflow) \
        !            63:         : "r" (__arg1), "r" (__arg2) \
        !            64:          : "%g6","cc"); \
        !            65: __value; })
        !            66:
        !            67: #define subll(a,b) \
        !            68: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !            69:    __asm__ ( "subcc %2,%3,%0; \
        !            70:           addx  %%g0,%%g0,%1" \
        !            71:         : "=r" (__value), "=r" (overflow) \
        !            72:         : "r" (__arg1), "r" (__arg2) \
        !            73:          : "%g6","cc"); \
        !            74: __value; })
        !            75:
        !            76: #define subllx(a,b) \
        !            77: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !            78:    __asm__ ( "subcc %%g0,%%g6,%%g0; \
        !            79:           subxcc %2,%3,%0; \
        !            80:           addx  %%g0,%%g0,%1" \
        !            81:         : "=r" (__value), "=r" (overflow) \
        !            82:         : "r" (__arg1), "r" (__arg2) \
        !            83:          : "%g6","cc"); \
        !            84: __value; })
        !            85:
        !            86: #define shiftl(a,b) \
        !            87: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !            88:    __asm__ ( "neg %3,%%o4; \
        !            89:           srl %2,%%o4,%1; \
        !            90:           sll %2,%3,%0" \
        !            91:         : "=r" (__value), "=r" (hiremainder) \
        !            92:         : "r" (__arg1), "r" (__arg2) \
        !            93:          : "%o4","%g5"); \
        !            94: __value; })
        !            95:
        !            96: #define shiftl2(a,b,c) \
        !            97: ({ unsigned long __value, __arg1 = (a), __arg2 = (b), __arg3 = (c); \
        !            98:    __asm__ ( "srl %2,%4,%1; \
        !            99:           sll %2,%3,%0" \
        !           100:         : "=r" (__value), "=r" (hiremainder) \
        !           101:         : "r" (__arg1), "r" (__arg2), "r" (__arg3) \
        !           102:          : "%g5"); \
        !           103: __value; })
        !           104:
        !           105: #define shiftlr(a,b) \
        !           106: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !           107:    __asm__ ( "neg %3,%%o4; \
        !           108:           sll %2,%%o4,%1; \
        !           109:           srl %2,%3,%0" \
        !           110:         : "=r" (__value), "=r" (hiremainder) \
        !           111:         : "r" (__arg1), "r" (__arg2) \
        !           112:          : "%o4","%g5"); \
        !           113: __value; })
        !           114:
        !           115: #define shiftlr1(a) \
        !           116: ({ unsigned long __value, __arg1 = (a); \
        !           117:    __asm__ ( "sll %2,31,%1; \
        !           118:           srl %2,1,%0" \
        !           119:         : "=r" (__value), "=r" (hiremainder) \
        !           120:         : "r" (__arg1) \
        !           121:          : "%g5"); \
        !           122: __value; })
        !           123:
        !           124: #define shiftlr2(a,b,c) \
        !           125: ({ unsigned long __value, __arg1 = (a), __arg2 = (b), __arg3 = (c); \
        !           126:    __asm__ ( "sll %2,%4,%1; \
        !           127:           srl %2,%3,%0" \
        !           128:         : "=r" (__value), "=r" (hiremainder) \
        !           129:         : "r" (__arg1), "r" (__arg2), "r" (__arg3) \
        !           130:          : "%g5"); \
        !           131: __value; })
        !           132:
        !           133: #define mulll(a,b) \
        !           134: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !           135:    __asm__ ( "umul %2,%3,%0; \
        !           136:           rd  %%y,%1" \
        !           137:         : "=r" (__value), "=r" (hiremainder) \
        !           138:         : "r" (__arg1), "r" (__arg2) \
        !           139:          : "%g5");     \
        !           140: __value;})
        !           141:
        !           142: #define addmul(a,b) \
        !           143: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !           144:    __asm__ ( "umul %2,%3,%0; \
        !           145:           rd  %%y,%%o4; \
        !           146:           addcc %0,%%g5,%0; \
        !           147:           addx %%g0,%%o4,%1" \
        !           148:         : "=r" (__value), "=r" (hiremainder) \
        !           149:         : "r" (__arg1), "r" (__arg2) \
        !           150:          : "%o4","%g5","cc");  \
        !           151: __value;})
        !           152:
        !           153: #define divllasm(a,b) \
        !           154: ({ unsigned long __value, __arg1 = (a), __arg2 = (b); \
        !           155:    __asm__( "wr      %%g5,%%g0,%%y;\
        !           156:          mov     %2,%%o4;\
        !           157:         udivcc  %2,%3,%0;\
        !           158:          bvc     1f;\
        !           159:          umul    %0,%3,%%o5;\
        !           160:          mov     47,%%o0;\
        !           161:          call    err,1;\
        !           162:          nop         ;\
        !           163: 1:      sub     %%o4,%%o5,%1"\
        !           164:        : "=r" (__value), "=r" (hiremainder) \
        !           165:        : "r" (__arg1), "r" (__arg2) \
        !           166:         : "%o4","%o5","%g5","cc");     \
        !           167: __value;})
        !           168:
        !           169: #endif /* ASMINLINE */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>