From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S264896AbUEKQv7 (ORCPT ); Tue, 11 May 2004 12:51:59 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S264877AbUEKQux (ORCPT ); Tue, 11 May 2004 12:50:53 -0400 Received: from p060042.ppp.asahi-net.or.jp ([221.113.60.42]:61432 "EHLO mitou.ysato.dip.jp") by vger.kernel.org with ESMTP id S264873AbUEKQgS (ORCPT ); Tue, 11 May 2004 12:36:18 -0400 Date: Wed, 12 May 2004 01:36:15 +0900 Message-ID: From: Yoshinori Sato To: Linus Torvalds Cc: linux kernel Mailing List Subject: [PATCH] H8/300 update (1/9) bitops.h add find_next_bit User-Agent: Wanderlust/2.11.24 (Wonderwall) SEMI/1.14.6 (Maruoka) LIMIT/1.14.7 (Fujiidera) APEL/10.6 Emacs/21.3 (i386-pc-linux-gnu) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org - add find_next_bit -- Yoshinori Sato diff -Nru linux-2.6.6/include/asm-h8300/bitops.h linux-2.6.6-h8300/include/asm-h8300/bitops.h --- linux-2.6.6/include/asm-h8300/bitops.h 2004-05-11 14:30:27.000000000 +0900 +++ linux-2.6.6-h8300/include/asm-h8300/bitops.h 2004-05-11 21:28:11.000000000 +0900 @@ -181,6 +181,23 @@ #define find_first_zero_bit(addr, size) \ find_next_zero_bit((addr), (size), 0) +static __inline__ unsigned long __ffs(unsigned long word) +{ + unsigned long result; + + result = -1; + __asm__("1:\n\t" + "shlr.l %2\n\t" + "adds #1,%0\n\t" + "bcc 1b" + : "=r" (result) + : "0"(result),"r"(word)); + return result; +} + +#define ffs(x) generic_ffs(x) +#define fls(x) generic_fls(x) + static __inline__ int find_next_zero_bit (void * addr, int size, int offset) { unsigned long *p = (unsigned long *)(((unsigned long)addr + (offset >> 3)) & ~3); @@ -217,22 +234,44 @@ return result + ffz(tmp); } -static __inline__ unsigned long __ffs(unsigned long word) +static __inline__ unsigned long find_next_bit(const unsigned long *addr, + unsigned long size, unsigned long offset) { - unsigned long result; + unsigned long *p = (unsigned long *)(((unsigned long)addr + (offset >> 3)) & ~3); + unsigned int result = offset & ~31UL; + unsigned int tmp; - result = -1; - __asm__("1:\n\t" - "shlr.l %2\n\t" - "adds #1,%0\n\t" - "bcc 1b" - : "=r" (result) - : "0"(result),"r"(word)); - return result; -} + if (offset >= size) + return size; + size -= result; + offset &= 31UL; + if (offset) { + tmp = *(p++); + tmp &= ~0UL << offset; + if (size < 32) + goto found_first; + if (tmp) + goto found_middle; + size -= 32; + result += 32; + } + while (size >= 32) { + if ((tmp = *p++) != 0) + goto found_middle; + result += 32; + size -= 32; + } + if (!size) + return result; + tmp = *p; -#define ffs(x) generic_ffs(x) -#define fls(x) generic_fls(x) +found_first: + tmp &= ~0UL >> (32 - size); + if (tmp == 0UL) + return result + size; +found_middle: + return result + __ffs(tmp); +} /* * Every architecture must define this function. It's the fastest