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