[BACK]Return to copy_subr.S CVS log [TXT][DIR] Up to [local] / sys / lib / libkern / arch / m88k

Annotation of sys/lib/libkern/arch/m88k/copy_subr.S, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: copy_subr.S,v 1.1 2006/11/17 22:32:38 miod Exp $      */
        !             2: /*
        !             3:  * Mach Operating System
        !             4:  * Copyright (c) 1993-1992 Carnegie Mellon University
        !             5:  * Copyright (c) 1991 OMRON Corporation
        !             6:  * Copyright (c) 1996 Nivas Madhur
        !             7:  * Copyright (c) 1998 Steve Murphree, Jr.
        !             8:  * All Rights Reserved.
        !             9:  *
        !            10:  * Permission to use, copy, modify and distribute this software and its
        !            11:  * documentation is hereby granted, provided that both the copyright
        !            12:  * notice and this permission notice appear in all copies of the
        !            13:  * software, derivative works or modified versions, and any portions
        !            14:  * thereof, and that both notices appear in supporting documentation.
        !            15:  *
        !            16:  * CARNEGIE MELLON AND OMRON ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            17:  * CONDITION.  CARNEGIE MELLON AND OMRON DISCLAIM ANY LIABILITY OF ANY KIND
        !            18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            19:  *
        !            20:  * Carnegie Mellon requests users of this software to return to
        !            21:  *
        !            22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
        !            23:  *  School of Computer Science
        !            24:  *  Carnegie Mellon University
        !            25:  *  Pittsburgh PA 15213-3890
        !            26:  *
        !            27:  * any improvements or extensions that they make and grant Carnegie the
        !            28:  * rights to redistribute these changes.
        !            29:  */
        !            30:
        !            31: #include <machine/asm.h>
        !            32:
        !            33: /*
        !            34:  * copy count bytes of data from source to destination
        !            35:  * Don Harper (don@omron.co.jp), Omron Corporation.
        !            36:  */
        !            37:
        !            38: #if defined(MEMCPY) || defined(MEMMOVE)
        !            39: #define        SRC     r3
        !            40: #define        DST     r2
        !            41: #define        SAVE    r5
        !            42: #else
        !            43: #define        SRC     r2
        !            44: #define        DST     r3
        !            45: #endif
        !            46: #define        LEN     r4
        !            47:
        !            48: #ifdef MEMCPY
        !            49: ENTRY(memcpy)
        !            50: #endif
        !            51: #ifdef MEMMOVE
        !            52: ENTRY(memmove)
        !            53: #endif
        !            54: #ifdef BCOPY
        !            55: ENTRY(bcopy)
        !            56: #endif
        !            57: #ifdef OVBCOPY
        !            58: ENTRY(ovbcopy)
        !            59: #endif
        !            60:
        !            61: #if defined(MEMCPY) || defined(MEMMOVE)
        !            62:        or      SAVE, DST, r0
        !            63: #endif
        !            64:
        !            65:        bcnd    eq0,LEN,_ASM_LABEL(bcopy_out)   /* nothing to do if == 0 */
        !            66:
        !            67: /*
        !            68:  * check position of source and destination data
        !            69:  */
        !            70:        cmp     r9,SRC,DST      /* compare source address to destination */
        !            71:        bb1     eq,r9,_ASM_LABEL(bcopy_out)     /* nothing to do if equal */
        !            72: #if defined(MEMMOVE) || defined(OVBCOPY)
        !            73:        bb1     lo,r9,_ASM_LABEL(bcopy_reverse) /* reverse copy if src < dest */
        !            74: #endif
        !            75:
        !            76: /*
        !            77:  * source address is greater than destination address, or we do
        !            78:  * not have to care about overlapping areas: copy forward
        !            79:  */
        !            80:        cmp     r9,LEN,16       /* see if we have at least 16 bytes */
        !            81:        bb1     lt,r9,_ASM_LABEL(f_byte_copy)   /* copy bytes for small data length */
        !            82: /*
        !            83:  * determine copy strategy based on alignment of source and destination
        !            84:  */
        !            85:        mask    r6,SRC,3        /* get 2 low order bits of source address */
        !            86:        mask    r7,DST,3        /* get 2 low order bits of destintation addr */
        !            87:        mak     r6,r6,0<4>      /* convert source bits to table offset */
        !            88:        mak     r7,r7,0<2>      /* convert destination bits to table offset */
        !            89:        or.u    r12,r0,hi16(_ASM_LABEL(f_strat))
        !            90:        or      r12,r12,lo16(_ASM_LABEL(f_strat))
        !            91:        addu    r6,r6,r7        /* compute final table offset for strategy */
        !            92:        ld      r12,r12,r6      /* load the strategy routine */
        !            93:        jmp     r12             /* branch to strategy routine */
        !            94:
        !            95: /*
        !            96:  * Copy three bytes from src to destination then copy words
        !            97:  */
        !            98: ASLOCAL(f_3byte_word_copy)
        !            99:        ld.bu   r6,SRC,0        /* load byte from source */
        !           100:        ld.bu   r7,SRC,1        /* load byte from source */
        !           101:        ld.bu   r8,SRC,2        /* load byte from source */
        !           102:        st.b    r6,DST,0        /* store byte to destination */
        !           103:        st.b    r7,DST,1        /* store byte to destination */
        !           104:        st.b    r8,DST,2        /* store byte to destination */
        !           105:        addu    SRC,SRC,3       /* increment source pointer */
        !           106:        addu    DST,DST,3       /* increment destination pointer */
        !           107:        br.n    _ASM_LABEL(f_word_copy) /* copy full words */
        !           108:         subu   LEN,LEN,3       /* decrement length */
        !           109:
        !           110: /*
        !           111:  * Copy 1 halfword from src to destination then copy words
        !           112:  */
        !           113: ASLOCAL(f_1half_word_copy)
        !           114:        ld.hu   r6,SRC,0        /* load half-word from source */
        !           115:        st.h    r6,DST,0        /* store half-word to destination */
        !           116:        addu    SRC,SRC,2       /* increment source pointer */
        !           117:        addu    DST,DST,2       /* increment destination pointer */
        !           118:        br.n    _ASM_LABEL(f_word_copy) /* copy full words */
        !           119:         subu   LEN,LEN,2       /* decrement remaining length */
        !           120:
        !           121: /*
        !           122:  * Copy 1 byte from src to destination then copy words
        !           123:  */
        !           124: ASLOCAL(f_1byte_word_copy)
        !           125:        ld.bu   r6,SRC,0        /* load 1 byte from source */
        !           126:        st.b    r6,DST,0        /* store 1 byte to destination */
        !           127:        addu    SRC,SRC,1       /* increment source pointer */
        !           128:        addu    DST,DST,1       /* increment destination pointer */
        !           129:        subu    LEN,LEN,1       /* decrement remaining length */
        !           130:        /* FALLTHROUGH */
        !           131: /*
        !           132:  * Copy as many full words as possible, 4 words per loop
        !           133:  */
        !           134: ASLOCAL(f_word_copy)
        !           135:        cmp     r10,LEN,16      /* see if we have 16 bytes remaining */
        !           136:        bb1     lo,r10,_ASM_LABEL(f_byte_copy)  /* not enough left, copy bytes */
        !           137:        ld      r6,SRC,0        /* load first word */
        !           138:        ld      r7,SRC,4        /* load second word */
        !           139:        ld      r8,SRC,8        /* load third word */
        !           140:        ld      r9,SRC,12       /* load fourth word */
        !           141:        st      r6,DST,0        /* store first word */
        !           142:        st      r7,DST,4        /* store second word */
        !           143:        st      r8,DST,8        /* store third word */
        !           144:        st      r9,DST,12       /* store fourth word */
        !           145:        addu    SRC,SRC,16      /* increment source pointer */
        !           146:        addu    DST,DST,16      /* increment destination pointer */
        !           147:        br.n    _ASM_LABEL(f_word_copy) /* branch to copy another block */
        !           148:         subu   LEN,LEN,16      /* decrement remaining length */
        !           149:
        !           150: ASLOCAL(f_1byte_half_copy)
        !           151:        ld.bu   r6,SRC,0        /* load 1 byte from source */
        !           152:        st.b    r6,DST,0        /* store 1 byte to destination */
        !           153:        addu    SRC,SRC,1       /* increment source pointer */
        !           154:        addu    DST,DST,1       /* increment destination pointer */
        !           155:        subu    LEN,LEN,1       /* decrement remaining length */
        !           156:        /* FALLTHROUGH */
        !           157:
        !           158: ASLOCAL(f_half_copy)
        !           159:        cmp     r10,LEN,16      /* see if we have 16 bytes remaining */
        !           160:        bb1     lo,r10,_ASM_LABEL(f_byte_copy)  /* not enough left, copy bytes */
        !           161:        ld.hu   r6,SRC,0        /* load first half-word */
        !           162:        ld.hu   r7,SRC,2        /* load second half-word */
        !           163:        ld.hu   r8,SRC,4        /* load third half-word */
        !           164:        ld.hu   r9,SRC,6        /* load fourth half-word */
        !           165:        ld.hu   r10,SRC,8       /* load fifth half-word */
        !           166:        ld.hu   r11,SRC,10      /* load sixth half-word */
        !           167:        ld.hu   r12,SRC,12      /* load seventh half-word */
        !           168:        ld.hu   r13,SRC,14      /* load eighth half-word */
        !           169:        st.h    r6,DST,0        /* store first half-word */
        !           170:        st.h    r7,DST,2        /* store second half-word */
        !           171:        st.h    r8,DST,4        /* store third half-word */
        !           172:        st.h    r9,DST,6        /* store fourth half-word */
        !           173:        st.h    r10,DST,8       /* store fifth half-word */
        !           174:        st.h    r11,DST,10      /* store sixth half-word */
        !           175:        st.h    r12,DST,12      /* store seventh half-word */
        !           176:        st.h    r13,DST,14      /* store eighth half-word */
        !           177:        addu    SRC,SRC,16      /* increment source pointer */
        !           178:        addu    DST,DST,16      /* increment destination pointer */
        !           179:        br.n    _ASM_LABEL(f_half_copy) /* branch to copy another block */
        !           180:         subu   LEN,LEN,16      /* decrement remaining length */
        !           181:
        !           182: ASLOCAL(f_byte_copy)
        !           183:        bcnd    eq0,LEN,_ASM_LABEL(bcopy_out)   /* branch if nothing left to copy */
        !           184:        ld.bu   r6,SRC,0        /* load byte from source */
        !           185:        st.b    r6,DST,0        /* store byte in destination */
        !           186:        addu    SRC,SRC,1       /* increment source pointer */
        !           187:        addu    DST,DST,1       /* increment destination pointer */
        !           188:        br.n    _ASM_LABEL(f_byte_copy) /* branch for next byte */
        !           189:         subu   LEN,LEN,1       /* decrement remaining length */
        !           190:
        !           191: #if defined(MEMMOVE) || defined(OVBCOPY)
        !           192: /*
        !           193:  * source address is less than destination address, copy in reverse
        !           194:  */
        !           195: ASLOCAL(bcopy_reverse)
        !           196: /*
        !           197:  * start copy pointers at end of data
        !           198:  */
        !           199:        addu    SRC,SRC,LEN     /* start source at end of data */
        !           200:        addu    DST,DST,LEN     /* start destination at end of data */
        !           201: /*
        !           202:  * check for short data
        !           203:  */
        !           204:        cmp     r9,LEN,16       /* see if we have at least 16 bytes */
        !           205:        bb1     lt,r9,_ASM_LABEL(r_byte_copy)   /* copy bytes for small data length */
        !           206: /*
        !           207:  *     determine copy strategy based on alignment of source and destination
        !           208:  */
        !           209:        mask    r6,SRC,3        /* get 2 low order bits of source address */
        !           210:        mask    r7,DST,3        /* get 2 low order bits of destintation addr */
        !           211:        mak     r6,r6,0<4>      /* convert source bits to table offset */
        !           212:        mak     r7,r7,0<2>      /* convert destination bits to table offset */
        !           213:        or.u    r12,r0,hi16(_ASM_LABEL(r_strat))
        !           214:        or      r12,r12,lo16(_ASM_LABEL(r_strat))
        !           215:        addu    r6,r6,r7        /* compute final table offset for strategy */
        !           216:        ld      r12,r12,r6      /* load the strategy routine */
        !           217:        jmp     r12             /* branch to strategy routine */
        !           218:
        !           219: /*
        !           220:  * Copy three bytes from src to destination then copy words
        !           221:  */
        !           222: ASLOCAL(r_3byte_word_copy)
        !           223:        subu    SRC,SRC,3       /* decrement source pointer */
        !           224:        subu    DST,DST,3       /* decrement destination pointer */
        !           225:        ld.bu   r6,SRC,0        /* load byte from source */
        !           226:        ld.bu   r7,SRC,1        /* load byte from source */
        !           227:        ld.bu   r8,SRC,2        /* load byte from source */
        !           228:        st.b    r6,DST,0        /* store byte to destination */
        !           229:        st.b    r7,DST,1        /* store byte to destination */
        !           230:        st.b    r8,DST,2        /* store byte to destination */
        !           231:        br.n    _ASM_LABEL(r_word_copy) /* copy full words */
        !           232:         subu   LEN,LEN,3       /* decrement length */
        !           233:
        !           234: /*
        !           235:  * Copy 1 halfword from src to destination then copy words
        !           236:  */
        !           237: ASLOCAL(r_1half_word_copy)
        !           238:        subu    SRC,SRC,2       /* decrement source pointer */
        !           239:        subu    DST,DST,2       /* decrement destination pointer */
        !           240:        ld.hu   r6,SRC,0        /* load half-word from source */
        !           241:        st.h    r6,DST,0        /* store half-word to destination */
        !           242:        br.n    _ASM_LABEL(r_word_copy) /* copy full words */
        !           243:         subu   LEN,LEN,2       /* decrement remaining length */
        !           244:
        !           245: /*
        !           246:  * Copy 1 byte from src to destination then copy words
        !           247:  */
        !           248: ASLOCAL(r_1byte_word_copy)
        !           249:        subu    SRC,SRC,1       /* decrement source pointer */
        !           250:        subu    DST,DST,1       /* decrement destination pointer */
        !           251:        ld.bu   r6,SRC,0        /* load 1 byte from source */
        !           252:        st.b    r6,DST,0        /* store 1 byte to destination */
        !           253:        subu    LEN,LEN,1       /* decrement remaining length */
        !           254:        /* FALLTHROUGH */
        !           255: /*
        !           256:  * Copy as many full words as possible, 4 words per loop
        !           257:  */
        !           258: ASLOCAL(r_word_copy)
        !           259:        cmp     r10,LEN,16      /* see if we have 16 bytes remaining */
        !           260:        bb1     lo,r10,_ASM_LABEL(r_byte_copy)  /* not enough left, copy bytes */
        !           261:        subu    SRC,SRC,16      /* decrement source pointer */
        !           262:        subu    DST,DST,16      /* decrement destination pointer */
        !           263:        ld      r6,SRC,0        /* load first word */
        !           264:        ld      r7,SRC,4        /* load second word */
        !           265:        ld      r8,SRC,8        /* load third word */
        !           266:        ld      r9,SRC,12       /* load fourth word */
        !           267:        st      r6,DST,0        /* store first word */
        !           268:        st      r7,DST,4        /* store second word */
        !           269:        st      r8,DST,8        /* store third word */
        !           270:        st      r9,DST,12       /* store fourth word */
        !           271:        br.n    _ASM_LABEL(r_word_copy) /* branch to copy another block */
        !           272:         subu   LEN,LEN,16      /* decrement remaining length */
        !           273:
        !           274: ASLOCAL(r_1byte_half_copy)
        !           275:        subu    SRC,SRC,1       /* decrement source pointer */
        !           276:        subu    DST,DST,1       /* decrement destination pointer */
        !           277:        ld.bu   r6,SRC,0        /* load 1 byte from source */
        !           278:        st.b    r6,DST,0        /* store 1 byte to destination */
        !           279:        subu    LEN,LEN,1       /* decrement remaining length */
        !           280:        /* FALLTHROUGH */
        !           281:
        !           282: ASLOCAL(r_half_copy)
        !           283:        cmp     r10,LEN,16      /* see if we have 16 bytes remaining */
        !           284:        bb1     lo,r10,_ASM_LABEL(r_byte_copy)  /* not enough left, copy bytes */
        !           285:        subu    SRC,SRC,16      /* decrement source pointer */
        !           286:        subu    DST,DST,16      /* decrement destination pointer */
        !           287:        ld.hu   r6,SRC,0        /* load first half-word */
        !           288:        ld.hu   r7,SRC,2        /* load second half-word */
        !           289:        ld.hu   r8,SRC,4        /* load third half-word */
        !           290:        ld.hu   r9,SRC,6        /* load fourth half-word */
        !           291:        ld.hu   r10,SRC,8       /* load fifth half-word */
        !           292:        ld.hu   r11,SRC,10      /* load sixth half-word */
        !           293:        ld.hu   r12,SRC,12      /* load seventh half-word */
        !           294:        ld.hu   r13,SRC,14      /* load eighth half-word */
        !           295:        st.h    r6,DST,0        /* store first half-word */
        !           296:        st.h    r7,DST,2        /* store second half-word */
        !           297:        st.h    r8,DST,4        /* store third half-word */
        !           298:        st.h    r9,DST,6        /* store fourth half-word */
        !           299:        st.h    r10,DST,8       /* store fifth half-word */
        !           300:        st.h    r11,DST,10      /* store sixth half-word */
        !           301:        st.h    r12,DST,12      /* store seventh half-word */
        !           302:        st.h    r13,DST,14      /* store eighth half-word */
        !           303:        br.n    _ASM_LABEL(r_half_copy) /* branch to copy another block */
        !           304:         subu   LEN,LEN,16      /* decrement remaining length */
        !           305:
        !           306: ASLOCAL(r_byte_copy)
        !           307:        bcnd    eq0,LEN,_ASM_LABEL(bcopy_out)   /* branch if nothing left to copy */
        !           308:        subu    SRC,SRC,1               /* decrement source pointer */
        !           309:        subu    DST,DST,1               /* decrement destination pointer */
        !           310:        ld.bu   r6,SRC,0                /* load byte from source */
        !           311:        st.b    r6,DST,0                /* store byte in destination */
        !           312:        br.n    _ASM_LABEL(r_byte_copy) /* branch for next byte */
        !           313:         subu   LEN,LEN,1               /* decrement remaining length */
        !           314: #endif /* MEMMOVE || OVBCOPY */
        !           315:
        !           316: ASLOCAL(bcopy_out)
        !           317: #if defined(MEMCPY) || defined(MEMMOVE)
        !           318:        jmp.n   r1              /* all done, return to caller */
        !           319:         or     r2, SAVE, r0
        !           320: #else
        !           321:        jmp     r1              /* all done, return to caller */
        !           322: #endif
        !           323:
        !           324:        data
        !           325:        align   4
        !           326: ASLOCAL(f_strat)
        !           327:        word    _ASM_LABEL(f_word_copy)
        !           328:        word    _ASM_LABEL(f_byte_copy)
        !           329:        word    _ASM_LABEL(f_half_copy)
        !           330:        word    _ASM_LABEL(f_byte_copy)
        !           331:        word    _ASM_LABEL(f_byte_copy)
        !           332:        word    _ASM_LABEL(f_3byte_word_copy)
        !           333:        word    _ASM_LABEL(f_byte_copy)
        !           334:        word    _ASM_LABEL(f_1byte_half_copy)
        !           335:        word    _ASM_LABEL(f_half_copy)
        !           336:        word    _ASM_LABEL(f_byte_copy)
        !           337:        word    _ASM_LABEL(f_1half_word_copy)
        !           338:        word    _ASM_LABEL(f_byte_copy)
        !           339:        word    _ASM_LABEL(f_byte_copy)
        !           340:        word    _ASM_LABEL(f_1byte_half_copy)
        !           341:        word    _ASM_LABEL(f_byte_copy)
        !           342:        word    _ASM_LABEL(f_1byte_word_copy)
        !           343:
        !           344: #if defined(MEMMOVE) || defined(OVBCOPY)
        !           345: ASLOCAL(r_strat)
        !           346:        word    _ASM_LABEL(r_word_copy)
        !           347:        word    _ASM_LABEL(r_byte_copy)
        !           348:        word    _ASM_LABEL(r_half_copy)
        !           349:        word    _ASM_LABEL(r_byte_copy)
        !           350:        word    _ASM_LABEL(r_byte_copy)
        !           351:        word    _ASM_LABEL(r_1byte_word_copy)
        !           352:        word    _ASM_LABEL(r_byte_copy)
        !           353:        word    _ASM_LABEL(r_1byte_half_copy)
        !           354:        word    _ASM_LABEL(r_half_copy)
        !           355:        word    _ASM_LABEL(r_byte_copy)
        !           356:        word    _ASM_LABEL(r_1half_word_copy)
        !           357:        word    _ASM_LABEL(r_byte_copy)
        !           358:        word    _ASM_LABEL(r_byte_copy)
        !           359:        word    _ASM_LABEL(r_1byte_half_copy)
        !           360:        word    _ASM_LABEL(r_byte_copy)
        !           361:        word    _ASM_LABEL(r_3byte_word_copy)
        !           362: #endif

CVSweb