aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k/include/asm/bitops_mm.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/m68k/include/asm/bitops_mm.h')
-rw-r--r--arch/m68k/include/asm/bitops_mm.h102
1 files changed, 51 insertions, 51 deletions
diff --git a/arch/m68k/include/asm/bitops_mm.h b/arch/m68k/include/asm/bitops_mm.h
index b4ecdaada520..9d69f6e62365 100644
--- a/arch/m68k/include/asm/bitops_mm.h
+++ b/arch/m68k/include/asm/bitops_mm.h
@@ -325,58 +325,45 @@ static inline int __fls(int x)
325#include <asm-generic/bitops/hweight.h> 325#include <asm-generic/bitops/hweight.h>
326#include <asm-generic/bitops/lock.h> 326#include <asm-generic/bitops/lock.h>
327 327
328/* Bitmap functions for the minix filesystem */ 328/* Bitmap functions for the little endian bitmap. */
329 329
330static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size) 330static inline void __set_bit_le(int nr, void *addr)
331{ 331{
332 const unsigned short *p = vaddr, *addr = vaddr; 332 __set_bit(nr ^ 24, addr);
333 int res; 333}
334 unsigned short num;
335
336 if (!size)
337 return 0;
338
339 size = (size >> 4) + ((size & 15) > 0);
340 while (*p++ == 0xffff)
341 {
342 if (--size == 0)
343 return (p - addr) << 4;
344 }
345 334
346 num = ~*--p; 335static inline void __clear_bit_le(int nr, void *addr)
347 __asm__ __volatile__ ("bfffo %1{#16,#16},%0" 336{
348 : "=d" (res) : "d" (num & -num)); 337 __clear_bit(nr ^ 24, addr);
349 return ((p - addr) << 4) + (res ^ 31);
350} 338}
351 339
352#define minix_test_and_set_bit(nr, addr) __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) 340static inline int __test_and_set_bit_le(int nr, void *addr)
353#define minix_set_bit(nr,addr) __set_bit((nr) ^ 16, (unsigned long *)(addr)) 341{
354#define minix_test_and_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) 342 return __test_and_set_bit(nr ^ 24, addr);
343}
355 344
356static inline int minix_test_bit(int nr, const void *vaddr) 345static inline int test_and_set_bit_le(int nr, void *addr)
357{ 346{
358 const unsigned short *p = vaddr; 347 return test_and_set_bit(nr ^ 24, addr);
359 return (p[nr >> 4] & (1U << (nr & 15))) != 0;
360} 348}
361 349
362/* Bitmap functions for the ext2 filesystem. */ 350static inline int __test_and_clear_bit_le(int nr, void *addr)
351{
352 return __test_and_clear_bit(nr ^ 24, addr);
353}
363 354
364#define ext2_set_bit(nr, addr) __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) 355static inline int test_and_clear_bit_le(int nr, void *addr)
365#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) 356{
366#define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) 357 return test_and_clear_bit(nr ^ 24, addr);
367#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) 358}
368#define ext2_find_next_zero_bit(addr, size, offset) \
369 generic_find_next_zero_le_bit((unsigned long *)addr, size, offset)
370#define ext2_find_next_bit(addr, size, offset) \
371 generic_find_next_le_bit((unsigned long *)addr, size, offset)
372 359
373static inline int ext2_test_bit(int nr, const void *vaddr) 360static inline int test_bit_le(int nr, const void *vaddr)
374{ 361{
375 const unsigned char *p = vaddr; 362 const unsigned char *p = vaddr;
376 return (p[nr >> 3] & (1U << (nr & 7))) != 0; 363 return (p[nr >> 3] & (1U << (nr & 7))) != 0;
377} 364}
378 365
379static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size) 366static inline int find_first_zero_bit_le(const void *vaddr, unsigned size)
380{ 367{
381 const unsigned long *p = vaddr, *addr = vaddr; 368 const unsigned long *p = vaddr, *addr = vaddr;
382 int res; 369 int res;
@@ -393,33 +380,36 @@ static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size)
393 380
394 --p; 381 --p;
395 for (res = 0; res < 32; res++) 382 for (res = 0; res < 32; res++)
396 if (!ext2_test_bit (res, p)) 383 if (!test_bit_le(res, p))
397 break; 384 break;
398 return (p - addr) * 32 + res; 385 return (p - addr) * 32 + res;
399} 386}
400 387
401static inline unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, 388static inline unsigned long find_next_zero_bit_le(const void *addr,
402 unsigned long size, unsigned long offset) 389 unsigned long size, unsigned long offset)
403{ 390{
404 const unsigned long *p = addr + (offset >> 5); 391 const unsigned long *p = addr;
405 int bit = offset & 31UL, res; 392 int bit = offset & 31UL, res;
406 393
407 if (offset >= size) 394 if (offset >= size)
408 return size; 395 return size;
409 396
397 p += offset >> 5;
398
410 if (bit) { 399 if (bit) {
400 offset -= bit;
411 /* Look for zero in first longword */ 401 /* Look for zero in first longword */
412 for (res = bit; res < 32; res++) 402 for (res = bit; res < 32; res++)
413 if (!ext2_test_bit (res, p)) 403 if (!test_bit_le(res, p))
414 return (p - addr) * 32 + res; 404 return offset + res;
415 p++; 405 p++;
406 offset += 32;
416 } 407 }
417 /* No zero yet, search remaining full bytes for a zero */ 408 /* No zero yet, search remaining full bytes for a zero */
418 res = ext2_find_first_zero_bit (p, size - 32 * (p - addr)); 409 return offset + find_first_zero_bit_le(p, size - offset);
419 return (p - addr) * 32 + res;
420} 410}
421 411
422static inline int ext2_find_first_bit(const void *vaddr, unsigned size) 412static inline int find_first_bit_le(const void *vaddr, unsigned size)
423{ 413{
424 const unsigned long *p = vaddr, *addr = vaddr; 414 const unsigned long *p = vaddr, *addr = vaddr;
425 int res; 415 int res;
@@ -435,32 +425,42 @@ static inline int ext2_find_first_bit(const void *vaddr, unsigned size)
435 425
436 --p; 426 --p;
437 for (res = 0; res < 32; res++) 427 for (res = 0; res < 32; res++)
438 if (ext2_test_bit(res, p)) 428 if (test_bit_le(res, p))
439 break; 429 break;
440 return (p - addr) * 32 + res; 430 return (p - addr) * 32 + res;
441} 431}
442 432
443static inline unsigned long generic_find_next_le_bit(const unsigned long *addr, 433static inline unsigned long find_next_bit_le(const void *addr,
444 unsigned long size, unsigned long offset) 434 unsigned long size, unsigned long offset)
445{ 435{
446 const unsigned long *p = addr + (offset >> 5); 436 const unsigned long *p = addr;
447 int bit = offset & 31UL, res; 437 int bit = offset & 31UL, res;
448 438
449 if (offset >= size) 439 if (offset >= size)
450 return size; 440 return size;
451 441
442 p += offset >> 5;
443
452 if (bit) { 444 if (bit) {
445 offset -= bit;
453 /* Look for one in first longword */ 446 /* Look for one in first longword */
454 for (res = bit; res < 32; res++) 447 for (res = bit; res < 32; res++)
455 if (ext2_test_bit(res, p)) 448 if (test_bit_le(res, p))
456 return (p - addr) * 32 + res; 449 return offset + res;
457 p++; 450 p++;
451 offset += 32;
458 } 452 }
459 /* No set bit yet, search remaining full bytes for a set bit */ 453 /* No set bit yet, search remaining full bytes for a set bit */
460 res = ext2_find_first_bit(p, size - 32 * (p - addr)); 454 return offset + find_first_bit_le(p, size - offset);
461 return (p - addr) * 32 + res;
462} 455}
463 456
457/* Bitmap functions for the ext2 filesystem. */
458
459#define ext2_set_bit_atomic(lock, nr, addr) \
460 test_and_set_bit_le(nr, addr)
461#define ext2_clear_bit_atomic(lock, nr, addr) \
462 test_and_clear_bit_le(nr, addr)
463
464#endif /* __KERNEL__ */ 464#endif /* __KERNEL__ */
465 465
466#endif /* _M68K_BITOPS_H */ 466#endif /* _M68K_BITOPS_H */