diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-12-20 15:58:44 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-01-12 18:42:50 +0100 |
commit | baacf04799ace72a9c735dd9306a1ceaf305e7cf (patch) | |
tree | 5e6750afe4b31c4343f9dd4bc07827cbdcb51466 /bitops.c | |
parent | f157ebba2de4a6225679e13cc1ce01ff5d147c76 (diff) |
build: move libqemuutil.a components to util/
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'bitops.c')
-rw-r--r-- | bitops.c | 142 |
1 files changed, 0 insertions, 142 deletions
diff --git a/bitops.c b/bitops.c deleted file mode 100644 index 4c3a836a01..0000000000 --- a/bitops.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. - * Written by David Howells (dhowells@redhat.com) - * Copyright (C) 2008 IBM Corporation - * Written by Rusty Russell <rusty@rustcorp.com.au> - * (Inspired by David Howell's find_next_bit implementation) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - */ - -#include "qemu/bitops.h" - -#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) - -/* - * Find the next set bit in a memory region. - */ -unsigned long find_next_bit(const unsigned long *addr, unsigned long size, - unsigned long offset) -{ - const unsigned long *p = addr + BITOP_WORD(offset); - unsigned long result = offset & ~(BITS_PER_LONG-1); - unsigned long tmp; - - if (offset >= size) { - return size; - } - size -= result; - offset %= BITS_PER_LONG; - if (offset) { - tmp = *(p++); - tmp &= (~0UL << offset); - if (size < BITS_PER_LONG) { - goto found_first; - } - if (tmp) { - goto found_middle; - } - size -= BITS_PER_LONG; - result += BITS_PER_LONG; - } - while (size & ~(BITS_PER_LONG-1)) { - if ((tmp = *(p++))) { - goto found_middle; - } - result += BITS_PER_LONG; - size -= BITS_PER_LONG; - } - if (!size) { - return result; - } - tmp = *p; - -found_first: - tmp &= (~0UL >> (BITS_PER_LONG - size)); - if (tmp == 0UL) { /* Are any bits set? */ - return result + size; /* Nope. */ - } -found_middle: - return result + bitops_ffsl(tmp); -} - -/* - * This implementation of find_{first,next}_zero_bit was stolen from - * Linus' asm-alpha/bitops.h. - */ -unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, - unsigned long offset) -{ - const unsigned long *p = addr + BITOP_WORD(offset); - unsigned long result = offset & ~(BITS_PER_LONG-1); - unsigned long tmp; - - if (offset >= size) { - return size; - } - size -= result; - offset %= BITS_PER_LONG; - if (offset) { - tmp = *(p++); - tmp |= ~0UL >> (BITS_PER_LONG - offset); - if (size < BITS_PER_LONG) { - goto found_first; - } - if (~tmp) { - goto found_middle; - } - size -= BITS_PER_LONG; - result += BITS_PER_LONG; - } - while (size & ~(BITS_PER_LONG-1)) { - if (~(tmp = *(p++))) { - goto found_middle; - } - result += BITS_PER_LONG; - size -= BITS_PER_LONG; - } - if (!size) { - return result; - } - tmp = *p; - -found_first: - tmp |= ~0UL << size; - if (tmp == ~0UL) { /* Are any bits zero? */ - return result + size; /* Nope. */ - } -found_middle: - return result + ffz(tmp); -} - -unsigned long find_last_bit(const unsigned long *addr, unsigned long size) -{ - unsigned long words; - unsigned long tmp; - - /* Start at final word. */ - words = size / BITS_PER_LONG; - - /* Partial final word? */ - if (size & (BITS_PER_LONG-1)) { - tmp = (addr[words] & (~0UL >> (BITS_PER_LONG - - (size & (BITS_PER_LONG-1))))); - if (tmp) { - goto found; - } - } - - while (words) { - tmp = addr[--words]; - if (tmp) { - found: - return words * BITS_PER_LONG + bitops_flsl(tmp); - } - } - - /* Not found */ - return size; -} |