linux/arch/sh/include/asm/word-at-a-time.h
<<
>>
Prefs
   1#ifndef __ASM_SH_WORD_AT_A_TIME_H
   2#define __ASM_SH_WORD_AT_A_TIME_H
   3
   4#ifdef CONFIG_CPU_BIG_ENDIAN
   5# include <asm-generic/word-at-a-time.h>
   6#else
   7/*
   8 * Little-endian version cribbed from x86.
   9 */
  10struct word_at_a_time {
  11        const unsigned long one_bits, high_bits;
  12};
  13
  14#define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) }
  15
  16/* Carl Chatfield / Jan Achrenius G+ version for 32-bit */
  17static inline long count_masked_bytes(long mask)
  18{
  19        /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */
  20        long a = (0x0ff0001+mask) >> 23;
  21        /* Fix the 1 for 00 case */
  22        return a & mask;
  23}
  24
  25/* Return nonzero if it has a zero */
  26static inline unsigned long has_zero(unsigned long a, unsigned long *bits, const struct word_at_a_time *c)
  27{
  28        unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits;
  29        *bits = mask;
  30        return mask;
  31}
  32
  33static inline unsigned long prep_zero_mask(unsigned long a, unsigned long bits, const struct word_at_a_time *c)
  34{
  35        return bits;
  36}
  37
  38static inline unsigned long create_zero_mask(unsigned long bits)
  39{
  40        bits = (bits - 1) & ~bits;
  41        return bits >> 7;
  42}
  43
  44/* The mask we created is directly usable as a bytemask */
  45#define zero_bytemask(mask) (mask)
  46
  47static inline unsigned long find_zero(unsigned long mask)
  48{
  49        return count_masked_bytes(mask);
  50}
  51#endif
  52
  53#endif
  54