Annotation of sys/lib/libkern/arch/sparc/ffs.S, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ffs.S,v 1.3 2003/06/02 23:28:09 millert Exp $ */
! 2: /* $NetBSD: ffs.S,v 1.2 1994/10/26 06:39:57 cgd Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1992, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: *
! 8: * This software was developed by the Computer Systems Engineering group
! 9: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
! 10: * contributed to Berkeley.
! 11: *
! 12: * Redistribution and use in source and binary forms, with or without
! 13: * modification, are permitted provided that the following conditions
! 14: * are met:
! 15: * 1. Redistributions of source code must retain the above copyright
! 16: * notice, this list of conditions and the following disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: * 3. Neither the name of the University nor the names of its contributors
! 21: * may be used to endorse or promote products derived from this software
! 22: * without specific prior written permission.
! 23: *
! 24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 34: * SUCH DAMAGE.
! 35: *
! 36: * Header: ffs.s,v 1.3 92/07/07 00:23:57 torek Exp
! 37: */
! 38:
! 39: #if defined(LIBC_SCCS) && !defined(lint)
! 40: #ifdef notdef
! 41: .asciz "@(#)ffs.s 8.1 (Berkeley) 6/4/93"
! 42: #endif
! 43: .asciz "$OpenBSD: ffs.S,v 1.3 2003/06/02 23:28:09 millert Exp $"
! 44: #endif /* LIBC_SCCS and not lint */
! 45:
! 46: #include "DEFS.h"
! 47:
! 48: /*
! 49: * ffs returns the number of the rightmost bit set in its argument,
! 50: * i.e., the lowest value such that (x & (ffs(x) - 1)) is nonzero.
! 51: * If no bits are set, ffs returns 0.
! 52: *
! 53: * We use a table lookup on each byte.
! 54: *
! 55: * In each section below, %o1 is the current byte (0, 1, 2, or 3).
! 56: * The last byte is handled specially: for the first three,
! 57: * if that byte is nonzero, we return the table value
! 58: * (plus 0, 8, or 16 for the byte number), but for the last
! 59: * one, we just return the table value plus 24. This means
! 60: * that ffstab[0] must be -24 so that ffs(0) will return 0.
! 61: */
! 62: ENTRY(ffs)
! 63: #ifdef PIC
! 64: PICCY_SET(ffstab, %o2, %o5)
! 65: #else
! 66: set ffstab, %o2
! 67: #endif
! 68: andcc %o0, 0xff, %o1 ! get low byte
! 69: be,a 1f ! try again if 0
! 70: srl %o0, 8, %o0 ! delay slot, get ready for next byte
! 71:
! 72: retl ! return ffstab[%o1]
! 73: ldsb [%o2 + %o1], %o0
! 74:
! 75: 1:
! 76: andcc %o0, 0xff, %o1 ! byte 1 like byte 0...
! 77: be,a 2f
! 78: srl %o0, 8, %o0 ! (use delay to prepare for byte 2)
! 79:
! 80: ldsb [%o2 + %o1], %o0
! 81: retl ! return ffstab[%o1] + 8
! 82: add %o0, 8, %o0
! 83:
! 84: 2:
! 85: andcc %o0, 0xff, %o1
! 86: be,a 3f
! 87: srl %o0, 8, %o0 ! (prepare for byte 3)
! 88:
! 89: ldsb [%o2 + %o1], %o0
! 90: retl ! return ffstab[%o1] + 16
! 91: add %o0, 16, %o0
! 92:
! 93: 3: ! just return ffstab[%o0] + 24
! 94: ldsb [%o2 + %o0], %o0
! 95: retl
! 96: add %o0, 24, %o0
! 97:
! 98: ffstab:
! 99: .byte -24,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 00-0f */
! 100: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 10-1f */
! 101: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 20-2f */
! 102: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 30-3f */
! 103: .byte 7,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 40-4f */
! 104: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 50-5f */
! 105: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 60-6f */
! 106: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 70-7f */
! 107: .byte 8,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 80-8f */
! 108: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 10-9f */
! 109: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* a0-af */
! 110: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* b0-bf */
! 111: .byte 7,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* c0-cf */
! 112: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* d0-df */
! 113: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* e0-ef */
! 114: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* f0-ff */
CVSweb