1 #ifndef _ASM_WORD_AT_A_TIME_H 2 #define _ASM_WORD_AT_A_TIME_H 3 4 #include <asm/byteorder.h> 5 6 struct word_at_a_time { /* unused */ }; 7 #define WORD_AT_A_TIME_CONSTANTS {} 8 9 /* Generate 0x01 byte values for zero bytes using a SIMD instruction. */ has_zero(unsigned long val,unsigned long * data,const struct word_at_a_time * c)10static inline unsigned long has_zero(unsigned long val, unsigned long *data, 11 const struct word_at_a_time *c) 12 { 13 #ifdef __tilegx__ 14 unsigned long mask = __insn_v1cmpeqi(val, 0); 15 #else /* tilepro */ 16 unsigned long mask = __insn_seqib(val, 0); 17 #endif 18 *data = mask; 19 return mask; 20 } 21 22 /* These operations are both nops. */ 23 #define prep_zero_mask(val, data, c) (data) 24 #define create_zero_mask(data) (data) 25 26 /* And this operation just depends on endianness. */ find_zero(unsigned long mask)27static inline long find_zero(unsigned long mask) 28 { 29 #ifdef __BIG_ENDIAN 30 return __builtin_clzl(mask) >> 3; 31 #else 32 return __builtin_ctzl(mask) >> 3; 33 #endif 34 } 35 36 #ifdef __BIG_ENDIAN 37 #define zero_bytemask(mask) (~1ul << (63 - __builtin_clzl(mask))) 38 #else 39 #define zero_bytemask(mask) ((2ul << __builtin_ctzl(mask)) - 1) 40 #endif 41 42 #endif /* _ASM_WORD_AT_A_TIME_H */ 43