AVX 中 STRLEN 函数的说明与 YMM 寄存器

Instructions for STRLEN function in AVX with YMM registers

我正在使用 AVX(不是 AVX2)创建 strlen 函数 ... 使用 AVX 可以访问 (YMM) 寄存器,但是有一个问题......我知道的关于 strlen 函数的指令是:

vmovdqu
vpcmpeqb
vpmovmskb

但这些说明仅适用于 AVX 中的 'XMM' ... 如果我想将它们与 (YMM) 一起使用,我需要有一个 AVX2-CPU ... 但我谈论 AVX ... 现在用 'AVX' 和 'YMM' 寄存器创建一个 strlen 函数,我必须使用什么指令?

没有 AVX2,就无法与 YMM 寄存器进行字节比较。 AVX1 中字面上没有字节元素 YMM 指令。

AVX1 仅适用于 256 位 浮点 向量,或复制/改组任意数据。大多数整数/位精确的东西在 AVX2 之前是不可能的;这就是 AVX2 存在的原因。

像使用 SSE2 strlen 一样使用 XMM 寄存器,AVX1 的唯一好处是节省 movdqa 寄存器复制指令。

假设您可以将字节解压缩为浮点数(慢慢地,使用 shuffles + vinsertf128),然后立即将 8 与 vcmpps 进行比较。但是您可以一次将 16 个字节与 vpcmpeqb xmm 进行比较,所以像普通人一样进行比较,每个向量完成的工作量是原来的两倍,同时仍然受益于 AVX 非破坏性 3 操作数指令编码。