1/* 2 * Copyright 2013 Tilera Corporation. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation, version 2. 7 * 8 * This program is distributed in the hope that it will be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 11 * NON INFRINGEMENT. See the GNU General Public License for 12 * more details. 13 * 14 * Provide a mask based on the pointer alignment that 15 * sets up non-zero bytes before the beginning of the string. 16 * The MASK expression works because shift counts are taken mod 64. 17 * Also, specify how to count "first" and "last" bits 18 * when the bits have been read as a word. 19 */ 20 21#include <asm/byteorder.h> 22 23#ifdef __LITTLE_ENDIAN 24#define MASK(x) (__insn_shl(1ULL, (x << 3)) - 1) 25#define NULMASK(x) ((2ULL << x) - 1) 26#define CFZ(x) __insn_ctz(x) 27#define REVCZ(x) __insn_clz(x) 28#else 29#define MASK(x) (__insn_shl(-2LL, ((-x << 3) - 1))) 30#define NULMASK(x) (-2LL << (63 - x)) 31#define CFZ(x) __insn_clz(x) 32#define REVCZ(x) __insn_ctz(x) 33#endif 34 35/* 36 * Create eight copies of the byte in a uint64_t. Byte Shuffle uses 37 * the bytes of srcB as the index into the dest vector to select a 38 * byte. With all indices of zero, the first byte is copied into all 39 * the other bytes. 40 */ 41static inline uint64_t copy_byte(uint8_t byte) 42{ 43 return __insn_shufflebytes(byte, 0, 0); 44} 45