__insn_seqb() 和 __insn_ctz 是什么意思?
what does the __insn_seqb() and __insn_ctz mean?
我正在阅读 Linux/arch/tile/lib/strlen_32.c
以了解 strlen_32
的成就。但是我遇到了两个叫__insn_seqb
和__insn_ctz
的macro
,我不知道是什么意思。函数strlen_32
如下:
size_t strlen(const char*s)
{
const uintptr_t s_int = (uintptr_t)s;
const uint32_t *p = (const uint32_t*)(s_int&-4);
uint32_t v = *p | ((1<<(s_int<<3))-1);
uint32_t bits;
while((bits=__insn_seqb(v,0))==0)
v = *++p;
return ((const char*)p)+(__insn_ctz(bits)>>3)-s;
}
我在Google上搜索了一下,只找到了另外一个宏定义:
#define CFZ(x) __insn_ctz(x)
在 string_endian.h
glib-ports string-endian.h
谁能告诉我这两个宏的明确定义在哪里或者真正的含义和用法?
它们似乎是 Tilera processors 的指令内在函数。
我猜 __insn_ctz
是一条 "count trailing zeroes" 指令。
__insn_seqb
似乎在测试 4 字节字中的 0 字节。
Tilera 指令显然是 somewhat similar to MIPS。
我正在阅读 Linux/arch/tile/lib/strlen_32.c
以了解 strlen_32
的成就。但是我遇到了两个叫__insn_seqb
和__insn_ctz
的macro
,我不知道是什么意思。函数strlen_32
如下:
size_t strlen(const char*s)
{
const uintptr_t s_int = (uintptr_t)s;
const uint32_t *p = (const uint32_t*)(s_int&-4);
uint32_t v = *p | ((1<<(s_int<<3))-1);
uint32_t bits;
while((bits=__insn_seqb(v,0))==0)
v = *++p;
return ((const char*)p)+(__insn_ctz(bits)>>3)-s;
}
我在Google上搜索了一下,只找到了另外一个宏定义:
#define CFZ(x) __insn_ctz(x)
在 string_endian.h
glib-ports string-endian.h
谁能告诉我这两个宏的明确定义在哪里或者真正的含义和用法?
它们似乎是 Tilera processors 的指令内在函数。
我猜 __insn_ctz
是一条 "count trailing zeroes" 指令。
__insn_seqb
似乎在测试 4 字节字中的 0 字节。
Tilera 指令显然是 somewhat similar to MIPS。