at v3.7-rc5 33 lines 1.2 kB view raw
1/* 2 * Copyright 2011 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