Annotation of sys/lib/libkern/arch/sparc64/ffs.S, Revision 1.1.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 1998/11/26 19:32:10 eeh 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 "$NetBSD: ffs.S,v 1.2 1998/11/26 19:32:10 eeh 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(_C_LABEL(__ffstab), %o2, %o5)
65: #else
66: set _C_LABEL(__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: .globl _C_LABEL(__ffstab)
99: _C_LABEL(__ffstab):
100: .byte -24,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 00-0f */
101: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 10-1f */
102: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 20-2f */
103: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 30-3f */
104: .byte 7,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 40-4f */
105: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 50-5f */
106: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 60-6f */
107: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 70-7f */
108: .byte 8,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 80-8f */
109: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 10-9f */
110: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* a0-af */
111: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* b0-bf */
112: .byte 7,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* c0-cf */
113: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* d0-df */
114: .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* e0-ef */
115: .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* f0-ff */
CVSweb