c - __insn_seqb() 和 __insn_ctz 是什么意思?

标签 c linux-kernel macros glibc

我正在阅读Linux/arch/tile/lib/strlen_32.c来了解strlen_32的成就。但是我遇到了两个名为 __insn_seqb__insn_ctz 的宏,我不知道其含义。函数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上搜索了它们,但只找到了另一个宏定义: string_endian.h 中的#define CFZ(x) __insn_ctz(x) glib-ports string-endian.h 谁能告诉我这两个宏的明确定义或者真正的含义和用法在哪里?

最佳答案

它们似乎是 Tilera processors 的指令内在函数.

我猜想 __insn_ctz 是一条“计数尾随零”指令。

__insn_seqb 似乎正在测试 4 字节字内的 0 字节。

Tilera 指令显然是 somewhat similar to MIPS .

关于c - __insn_seqb() 和 __insn_ctz 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990233/

相关文章:

c - 在共享内存中锁定互斥量

宏可以通过转换为 void 来模拟 void 返回函数吗?

c - lstat 返回 <0

C 字符串大小,包括空终止符

c - 用条件循环每个数字的最快方法

c - 每行中数组的唯一元素

c - Linux 中 fork() 调用的来源在哪里?

linux - 为什么要在保护模式下启用 A20 线?

c - Linux 内核编程 : “Unable to handle kernel NULL pointer dereference at virtual address [address]”

c - token 粘贴困惑