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