[BACK]Return to macros.h CVS log [TXT][DIR] Up to [local] / sys / arch / vax / include

Annotation of sys/arch/vax/include/macros.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: macros.h,v 1.14 2006/11/06 21:31:36 miod Exp $ */
        !             2: /*     $NetBSD: macros.h,v 1.20 2000/07/19 01:02:52 matt Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1994, 1998, 2000 Ludd, University of Lule}, Sweden.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms, with or without
        !             9:  * modification, are permitted provided that the following conditions
        !            10:  * are met:
        !            11:  * 1. Redistributions of source code must retain the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer.
        !            13:  * 2. Redistributions in binary form must reproduce the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer in the
        !            15:  *    documentation and/or other materials provided with the distribution.
        !            16:  * 3. All advertising materials mentioning features or use of this software
        !            17:  *    must display the following acknowledgement:
        !            18:  *     This product includes software developed at Ludd, University of Lule}.
        !            19:  * 4. The name of the author may not be used to endorse or promote products
        !            20:  *    derived from this software without specific prior written permission
        !            21:  *
        !            22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            32:  */
        !            33:
        !            34:  /* All bugs are subject to removal without further notice */
        !            35:
        !            36: #if !defined(_VAX_MACROS_H_) && !defined(lint)
        !            37: #define _VAX_MACROS_H_
        !            38:
        !            39: /* Here general macros are supposed to be stored */
        !            40:
        !            41: static __inline__ int
        !            42: ffs(int reg)
        !            43: {
        !            44:        register int val;
        !            45:
        !            46:        __asm__ __volatile ("ffs        $0,$32,%1,%0
        !            47:                        bneq    1f
        !            48:                        mnegl   $1,%0
        !            49:                1:      incl    %0"
        !            50:                        : "=&r" (val)
        !            51:                        : "r" (reg) );
        !            52:        return  val;
        !            53: }
        !            54:
        !            55: static __inline__ void *
        !            56: memcpy(void *toe, const void *from, size_t len)
        !            57: {
        !            58:        __asm__ __volatile ("movc3 %0,(%1),(%2)"
        !            59:                        :
        !            60:                        : "r" (len),"r" (from),"r"(toe)
        !            61:                        :"r0","r1","r2","r3","r4","r5","memory","cc");
        !            62:        return toe;
        !            63: }
        !            64: static __inline__ void *
        !            65: memmove(void *toe, const void *from, size_t len)
        !            66: {
        !            67:        __asm__ __volatile ("movc3 %0,(%1),(%2)"
        !            68:                        :
        !            69:                        : "r" (len),"r" (from),"r"(toe)
        !            70:                        :"r0","r1","r2","r3","r4","r5","memory","cc");
        !            71:        return toe;
        !            72: }
        !            73:
        !            74: #ifdef notnow
        !            75: static __inline__ void
        !            76: bcopy(const void *from, void *toe, size_t len)
        !            77: {
        !            78:        __asm__ __volatile ("movc3 %0,(%1),(%2)"
        !            79:                        :
        !            80:                        : "r" (len),"r" (from),"r"(toe)
        !            81:                        :"r0","r1","r2","r3","r4","r5","memory","cc");
        !            82: }
        !            83: #endif
        !            84:
        !            85: void   blkfill(void *, int, size_t);
        !            86:
        !            87: static __inline__ void *
        !            88: memset(void *block, int c, size_t len)
        !            89: {
        !            90:        if (len > 65535)
        !            91:                blkfill(block, c, len);
        !            92:        else {
        !            93:                __asm__ __volatile ("movc5 $0,(%0),%2,%1,(%0)"
        !            94:                        :
        !            95:                        : "r" (block), "r" (len), "r"(c)
        !            96:                        :"r0","r1","r2","r3","r4","r5","memory","cc");
        !            97:        }
        !            98:        return block;
        !            99: }
        !           100:
        !           101: static __inline__ void
        !           102: bzero(void *block, size_t len)
        !           103: {
        !           104:        if (len > 65535)
        !           105:                blkfill(block, 0, len);
        !           106:        else {
        !           107:                __asm__ __volatile ("movc5 $0,(%0),$0,%1,(%0)"
        !           108:                        :
        !           109:                        : "r" (block), "r" (len)
        !           110:                        :"r0","r1","r2","r3","r4","r5","memory","cc");
        !           111:        }
        !           112: }
        !           113:
        !           114: /* XXX - the return syntax of memcmp is wrong */
        !           115: static __inline__ int
        !           116: memcmp(const void *b1, const void *b2, size_t len)
        !           117: {
        !           118:        register int ret;
        !           119:
        !           120:        __asm__ __volatile("cmpc3 %3,(%1),(%2);movl r0,%0"
        !           121:                        : "=r" (ret)
        !           122:                        : "r" (b1), "r" (b2), "r" (len)
        !           123:                        : "r0","r1","r2","r3" );
        !           124:        return ret;
        !           125: }
        !           126:
        !           127: static __inline__ int
        !           128: bcmp(const void *b1, const void *b2, size_t len)
        !           129: {
        !           130:        register int ret;
        !           131:
        !           132:        __asm__ __volatile("cmpc3 %3,(%1),(%2);movl r0,%0"
        !           133:                        : "=r" (ret)
        !           134:                        : "r" (b1), "r" (b2), "r" (len)
        !           135:                        : "r0","r1","r2","r3" );
        !           136:        return ret;
        !           137: }
        !           138:
        !           139: /* Begin nya */
        !           140: static __inline__ size_t
        !           141: strlen(const char *cp)
        !           142: {
        !           143:         register size_t ret;
        !           144:
        !           145:         __asm__ __volatile("locc $0,$65535,(%1);subl3 r0,$65535,%0"
        !           146:                         : "=r" (ret)
        !           147:                         : "r" (cp)
        !           148:                         : "r0","r1","cc" );
        !           149:         return  ret;
        !           150: }
        !           151:
        !           152: static __inline__ char *
        !           153: strncat(char *cp, const char *c2, size_t count)
        !           154: {
        !           155:         __asm__ __volatile("locc $0,%2,(%1);subl3 r0,%2,r2;
        !           156:                             locc $0,$65535,(%0);movc3 r2,(%1),(r1);movb $0,(r3)"
        !           157:                         :
        !           158:                         : "r" (cp), "r" (c2), "g"(count)
        !           159:                         : "r0","r1","r2","r3","r4","r5","memory","cc");
        !           160:         return  cp;
        !           161: }
        !           162:
        !           163: static __inline__ char *
        !           164: strncpy(char *cp, const char *c2, size_t len)
        !           165: {
        !           166:         __asm__ __volatile("movl %2,r2;locc $0,r2,(%1);beql 1f;subl3 r0,%2,r2;
        !           167:                             clrb (%0)[r2];1:;movc3 r2,(%1),(%0)"
        !           168:                         :
        !           169:                         : "r" (cp), "r" (c2), "g"(len)
        !           170:                         : "r0","r1","r2","r3","r4","r5","memory","cc");
        !           171:         return  cp;
        !           172: }
        !           173:
        !           174: static __inline__ void *
        !           175: memchr(const void *cp, int c, size_t len)
        !           176: {
        !           177:         void *ret;
        !           178:         __asm__ __volatile("locc %2,%3,(%1);bneq 1f;clrl r1;1:movl r1,%0"
        !           179:                         : "=g"(ret)
        !           180:                         : "r" (cp), "r" (c), "g"(len)
        !           181:                         : "r0","r1","cc");
        !           182:         return  ret;
        !           183: }
        !           184:
        !           185: static __inline__ int
        !           186: strcmp(const char *cp, const char *c2)
        !           187: {
        !           188:         register int ret;
        !           189:         __asm__ __volatile("locc $0,$65535,(%1);subl3 r0,$65535,r0;incl r0;
        !           190:                             cmpc3 r0,(%1),(%2);beql 1f;movl $1,r2;
        !           191:                             cmpb (r1),(r3);bcc 1f;movl $-1,r2;1:movl r2,%0"
        !           192:                         : "=g"(ret)
        !           193:                         : "r" (cp), "r" (c2)
        !           194:                         : "r0","r1","r2","r3","cc");
        !           195:         return  ret;
        !           196: }
        !           197: /* End nya */
        !           198:
        !           199: #if 0 /* unused, but no point in deleting it since it _is_ an instruction */
        !           200: static __inline__ int locc(int mask, char *cp, size_t size){
        !           201:        register ret;
        !           202:
        !           203:        __asm__ __volatile("locc %1,%2,(%3);movl r0,%0"
        !           204:                        : "=r" (ret)
        !           205:                        : "r" (mask),"r"(size),"r"(cp)
        !           206:                        : "r0","r1" );
        !           207:        return  ret;
        !           208: }
        !           209: #endif
        !           210:
        !           211: static __inline__ int
        !           212: scanc(u_int size, const u_char *cp, const u_char *table, int mask)
        !           213: {
        !           214:        register int ret;
        !           215:
        !           216:        __asm__ __volatile("scanc       %1,(%2),(%3),%4;movl r0,%0"
        !           217:                        : "=g"(ret)
        !           218:                        : "r"(size),"r"(cp),"r"(table),"r"(mask)
        !           219:                        : "r0","r1","r2","r3" );
        !           220:        return ret;
        !           221: }
        !           222:
        !           223: static __inline__ int
        !           224: skpc(int mask, size_t size, u_char *cp)
        !           225: {
        !           226:        register int ret;
        !           227:
        !           228:        __asm__ __volatile("skpc %1,%2,(%3);movl r0,%0"
        !           229:                        : "=g"(ret)
        !           230:                        : "r"(mask),"r"(size),"r"(cp)
        !           231:                        : "r0","r1" );
        !           232:        return  ret;
        !           233: }
        !           234:
        !           235: #define setrunqueue(p) \
        !           236:        __asm__ __volatile("movl %0,r0;jsb Setrq":: "g"(p):"r0","r1","r2");
        !           237:
        !           238: #define remrunqueue(p) \
        !           239:        __asm__ __volatile("movl %0,r0;jsb Remrq":: "g"(p):"r0","r1","r2");
        !           240:
        !           241: #define cpu_switch(p) \
        !           242:        __asm__ __volatile("movl %0,r0;movpsl -(sp);jsb Swtch" \
        !           243:            ::"g"(p):"r0","r1","r2","r3");
        !           244:
        !           245: /*
        !           246:  * Interlock instructions. Used both in multiprocessor environments to
        !           247:  * lock between CPUs and in uniprocessor systems when locking is required
        !           248:  * between I/O devices and the master CPU.
        !           249:  */
        !           250: /*
        !           251:  * Insqti() locks and inserts an element into the end of a queue.
        !           252:  * Returns -1 if interlock failed, 1 if inserted OK and 0 if first in queue.
        !           253:  */
        !           254: static __inline__ int
        !           255: insqti(void *entry, void *header) {
        !           256:        register int ret;
        !           257:
        !           258:        __asm__ __volatile("
        !           259:                        mnegl $1,%0;
        !           260:                        insqti (%1),(%2);
        !           261:                        bcs 1f;                 # failed insert
        !           262:                        beql 2f;                # jump if first entry
        !           263:                        movl $1,%0;
        !           264:                        brb 1f;
        !           265:                2:      clrl %0;
        !           266:                        1:;"
        !           267:                        : "=&g"(ret)
        !           268:                        : "r"(entry), "r"(header)
        !           269:                        : "memory");
        !           270:
        !           271:        return ret;
        !           272: }
        !           273:
        !           274: /*
        !           275:  * Remqhi() removes an element from the head of the queue.
        !           276:  * Returns -1 if interlock failed, 0 if queue empty, address of the
        !           277:  * removed element otherwise.
        !           278:  */
        !           279: static __inline__ void *
        !           280: remqhi(void *header) {
        !           281:        register void *ret;
        !           282:
        !           283:        __asm__ __volatile("
        !           284:                        remqhi (%1),%0;
        !           285:                        bcs 1f;                 # failed interlock
        !           286:                        bvs 2f;                 # nothing was removed
        !           287:                        brb 3f;
        !           288:                1:      mnegl $1,%0;
        !           289:                        brb 3f;
        !           290:                2:      clrl %0;
        !           291:                        3:;"
        !           292:                        : "=&g"(ret)
        !           293:                        : "r"(header)
        !           294:                        : "memory");
        !           295:
        !           296:        return ret;
        !           297: }
        !           298: #define        ILCK_FAILED     -1      /* Interlock failed */
        !           299: #define        Q_EMPTY         0       /* Queue is/was empty */
        !           300: #define        Q_OK            1       /* Inserted OK */
        !           301:
        !           302: #endif /* _VAX_MACROS_H_ */

CVSweb