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