1 #ifndef _ASM_WORD_AT_A_TIME_H
2 #define _ASM_WORD_AT_A_TIME_H
4 #include <asm/byteorder.h>
6 struct word_at_a_time
{ /* unused */ };
7 #define WORD_AT_A_TIME_CONSTANTS {}
9 /* Generate 0x01 byte values for zero bytes using a SIMD instruction. */
10 static inline unsigned long has_zero(unsigned long val
, unsigned long *data
,
11 const struct word_at_a_time
*c
)
14 unsigned long mask
= __insn_v1cmpeqi(val
, 0);
16 unsigned long mask
= __insn_seqib(val
, 0);
22 /* These operations are both nops. */
23 #define prep_zero_mask(val, data, c) (data)
24 #define create_zero_mask(data) (data)
26 /* And this operation just depends on endianness. */
27 static inline long find_zero(unsigned long mask
)
30 return __builtin_clzl(mask
) >> 3;
32 return __builtin_ctzl(mask
) >> 3;
37 #define zero_bytemask(mask) (~1ul << (63 - __builtin_clzl(mask)))
39 #define zero_bytemask(mask) ((2ul << __builtin_ctzl(mask)) - 1)
42 #endif /* _ASM_WORD_AT_A_TIME_H */