xref: /openbsd-src/sys/lib/libkern/arch/sh/ffs.S (revision d874cce4b1d9fe6b41c9e4f2117a77d8a4a37b92)
1*b12d7c48Smickey/*	$NetBSD: ffs.S,v 1.1 2005/12/20 19:28:50 christos Exp $	*/
2*b12d7c48Smickey
3*b12d7c48Smickey/*-
4*b12d7c48Smickey * Copyright (c) 2002 The NetBSD Foundation, Inc.
5*b12d7c48Smickey * All rights reserved.
6*b12d7c48Smickey *
7*b12d7c48Smickey * This code is derived from software contributed to The NetBSD Foundation
8*b12d7c48Smickey * by ITOH Yasufumi.
9*b12d7c48Smickey *
10*b12d7c48Smickey * Redistribution and use in source and binary forms, with or without
11*b12d7c48Smickey * modification, are permitted provided that the following conditions
12*b12d7c48Smickey * are met:
13*b12d7c48Smickey * 1. Redistributions of source code must retain the above copyright
14*b12d7c48Smickey *    notice, this list of conditions and the following disclaimer.
15*b12d7c48Smickey * 2. Redistributions in binary form must reproduce the above copyright
16*b12d7c48Smickey *    notice, this list of conditions and the following disclaimer in the
17*b12d7c48Smickey *    documentation and/or other materials provided with the distribution.
18*b12d7c48Smickey *
19*b12d7c48Smickey * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*b12d7c48Smickey * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*b12d7c48Smickey * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*b12d7c48Smickey * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*b12d7c48Smickey * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*b12d7c48Smickey * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*b12d7c48Smickey * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*b12d7c48Smickey * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*b12d7c48Smickey * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*b12d7c48Smickey * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*b12d7c48Smickey * POSSIBILITY OF SUCH DAMAGE.
30*b12d7c48Smickey */
31*b12d7c48Smickey
32*b12d7c48Smickey#include <machine/asm.h>
33*b12d7c48Smickey
34*b12d7c48Smickey/*
35*b12d7c48Smickey * ffs - find first bit set
36*b12d7c48Smickey *
37*b12d7c48Smickey * This code makes use of ``test 8bit'' and ``shift 8bit'' instructions.
38*b12d7c48Smickey * The remaining 8bit is tested in every 2bit.
39*b12d7c48Smickey */
40*b12d7c48Smickey
41*b12d7c48SmickeyENTRY(ffs)
42*b12d7c48Smickey	mov	r4,r0		! using r0 specific instructions
43*b12d7c48Smickey	tst	#0xff,r0
44*b12d7c48Smickey	bf/s	L8bit
45*b12d7c48Smickey	mov	#0+1,r1		! ret = 1..8
46*b12d7c48Smickey
47*b12d7c48Smickey	tst	r0,r0		! ffs(0) is 0
48*b12d7c48Smickey	bt	Lzero		! testing here to accelerate ret=1..8 cases
49*b12d7c48Smickey
50*b12d7c48Smickey	shlr8	r0
51*b12d7c48Smickey	tst	#0xff,r0
52*b12d7c48Smickey	bf/s	L8bit
53*b12d7c48Smickey	mov	#8+1,r1		! ret = 9..16
54*b12d7c48Smickey
55*b12d7c48Smickey	shlr8	r0
56*b12d7c48Smickey	tst	#0xff,r0
57*b12d7c48Smickey	bf/s	L8bit
58*b12d7c48Smickey	mov	#16+1,r1	! ret = 17..24
59*b12d7c48Smickey
60*b12d7c48Smickey	shlr8	r0
61*b12d7c48Smickey	mov	#24+1,r1	! ret = 25..32
62*b12d7c48Smickey
63*b12d7c48SmickeyL8bit:
64*b12d7c48Smickey	tst	#0x0f,r0
65*b12d7c48Smickey	bt	4f
66*b12d7c48Smickey
67*b12d7c48Smickey	tst	#0x03,r0
68*b12d7c48Smickey	bt	2f
69*b12d7c48Smickey	tst	#0x01,r0	! not bit 0 -> T
70*b12d7c48Smickey	mov	#0,r0
71*b12d7c48Smickey	rts
72*b12d7c48Smickey	 addc	r1,r0		! 0 + r1 + T -> r0
73*b12d7c48Smickey
74*b12d7c48Smickey2:	tst	#0x04,r0
75*b12d7c48Smickey	mov	#2,r0
76*b12d7c48Smickey	rts
77*b12d7c48Smickey	 addc	r1,r0
78*b12d7c48Smickey
79*b12d7c48Smickey4:	tst	#0x30,r0
80*b12d7c48Smickey	bt	6f
81*b12d7c48Smickey	tst	#0x10,r0
82*b12d7c48Smickey	mov	#4,r0
83*b12d7c48Smickey	rts
84*b12d7c48Smickey	 addc	r1,r0
85*b12d7c48Smickey
86*b12d7c48Smickey6:	tst	#0x40,r0
87*b12d7c48Smickey	mov	#6,r0
88*b12d7c48Smickey	rts
89*b12d7c48Smickey	 addc	r1,r0
90*b12d7c48Smickey
91*b12d7c48SmickeyLzero:	rts
92*b12d7c48Smickey	 nop
93