Annotation of sys/lib/libkern/arch/arm/memset.S, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: memset.S,v 1.2 2004/02/01 05:47:10 drahn Exp $ */
! 2: /* $NetBSD: memset.S,v 1.1 2000/12/29 20:51:57 bjh21 Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1995 Mark Brinicombe.
! 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 by Mark Brinicombe.
! 19: * 4. The name of the company nor the name of the author may be used to
! 20: * endorse or promote products derived from this software without specific
! 21: * prior written permission.
! 22: *
! 23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
! 24: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
! 25: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 26: * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
! 27: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 28: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 29: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 33: * SUCH DAMAGE.
! 34: */
! 35:
! 36: #include <machine/asm.h>
! 37:
! 38: /*
! 39: * Sets a block of memory to the specified value
! 40: *
! 41: * On entry:
! 42: * r0 - dest address
! 43: * r1 - byte to write
! 44: * r2 - number of bytes to write
! 45: *
! 46: * On exit:
! 47: * r0 - dest address
! 48: */
! 49:
! 50: ENTRY(memset)
! 51: stmfd sp!, {r0} /* Remember address for return value */
! 52: and r1, r1, #0x000000ff /* We write bytes */
! 53:
! 54: cmp r2, #0x00000004 /* Do we have less than 4 bytes */
! 55: blt Lmemset_lessthanfour
! 56:
! 57: /* Ok first we will word align the address */
! 58:
! 59: ands r3, r0, #0x00000003 /* Get the bottom two bits */
! 60: beq Lmemset_addraligned /* The address is word aligned */
! 61:
! 62: rsb r3, r3, #0x00000004
! 63: sub r2, r2, r3
! 64: cmp r3, #0x00000002
! 65: strb r1, [r0], #0x0001 /* Set 1 byte */
! 66: strgeb r1, [r0], #0x0001 /* Set another byte */
! 67: strgtb r1, [r0], #0x0001 /* and a third */
! 68:
! 69: cmp r2, #0x00000004
! 70: blt Lmemset_lessthanfour
! 71:
! 72: /* Now we must be word aligned */
! 73:
! 74: Lmemset_addraligned:
! 75:
! 76: orr r3, r1, r1, lsl #8 /* Repeat the byte into a word */
! 77: orr r3, r3, r3, lsl #16
! 78:
! 79: /* We know we have at least 4 bytes ... */
! 80:
! 81: cmp r2, #0x00000020 /* If less than 32 then use words */
! 82: blt Lmemset_lessthan32
! 83:
! 84: /* We have at least 32 so lets use quad words */
! 85:
! 86: stmfd sp!, {r4-r6} /* Store registers */
! 87: mov r4, r3 /* Duplicate data */
! 88: mov r5, r3
! 89: mov r6, r3
! 90:
! 91: Lmemset_loop16:
! 92: stmia r0!, {r3-r6} /* Store 16 bytes */
! 93: sub r2, r2, #0x00000010 /* Adjust count */
! 94: cmp r2, #0x00000010 /* Still got at least 16 bytes ? */
! 95: bgt Lmemset_loop16
! 96:
! 97: ldmfd sp!, {r4-r6} /* Restore registers */
! 98:
! 99: /* Do we need to set some words as well ? */
! 100:
! 101: cmp r2, #0x00000004
! 102: blt Lmemset_lessthanfour
! 103:
! 104: /* Have either less than 16 or less than 32 depending on route taken */
! 105:
! 106: Lmemset_lessthan32:
! 107:
! 108: /* We have at least 4 bytes so copy as words */
! 109:
! 110: Lmemset_loop4:
! 111: str r3, [r0], #0x0004
! 112: sub r2, r2, #0x0004
! 113: cmp r2, #0x00000004
! 114: bge Lmemset_loop4
! 115:
! 116: Lmemset_lessthanfour:
! 117: cmp r2, #0x00000000
! 118: ldmeqfd sp!, {r0}
! 119: #ifdef __APCS_26__
! 120: moveqs pc, lr /* Zero length so exit */
! 121: #else
! 122: moveq pc, lr /* Zero length so exit */
! 123: #endif
! 124:
! 125: cmp r2, #0x00000002
! 126: strb r1, [r0], #0x0001 /* Set 1 byte */
! 127: strgeb r1, [r0], #0x0001 /* Set another byte */
! 128: strgtb r1, [r0], #0x0001 /* and a third */
! 129:
! 130: ldmfd sp!, {r0}
! 131: #ifdef __APCS_26__
! 132: movs pc, lr /* Exit */
! 133: #else
! 134: mov pc, lr /* Exit */
! 135: #endif
CVSweb