gpt4 book ai didi

assembly - 可以跳过每个第二个字节的SSE mov指令?

转载 作者:行者123 更新时间:2023-12-02 19:05:40 25 4
gpt4 key购买 nike

我需要将所有奇数字节从一个内存位置复制到另一个内存位置。即复制第一、第三、第五等。具体来说,我从包含 2000 个字符/属性词的文本区域 0xB8000 进行复制。我想跳过属性字节并仅以字符结束。下面的代码工作正常:

      mov eax, ecx                       ; eax = number of bytes (1 to 2000)
mov rsi, rdi ; rsi = source
mov rdi, CMD_BLOCK ; rdi = destination
@@: movsb ; copy 1 byte
inc rsi ; skip the next source byte
dec eax
jnz @b

要复制的数字或字符可以是 1 到 2000 之间的任何位置。我最近开始使用 sse2、sse3 sse4.2,但找不到可以减少循环的指令。理想情况下,我希望将循环从 2000 个减少到 250 个,如果有一条指令可以在一次加载 128 位后跳过每个第二个字节,那么这是可能的。

最佳答案

我会做这样的事情,将 32 个输入字节处理为 16 个输出字节循环迭代:

const __m128i vmask = _mm_set1_epi16(0x00ff);

for (i = 0; i < n; i += 16)
{
__m128i v0 = _mm_loadu_si128(&a[2 * i]); // load 2 x 16 input bytes (MOVDQU)
__m128i v1 = _mm_loadu_si128(&a[2 * i + 16]);
v0 = _mm_and_si128(v0, vmask); // mask unwanted bytes (PAND)
v1 = _mm_and_si128(v1, vmask);
__m128 v = _mm_packus_epi16(v0, v1); // pack low bytes (PACKUSWB)
_mm_storeu_si128(v, &b[i]; // store 16 output bytes (MOVDQU)
}

当然,这是具有内在函数的 C - 如果您确实想在汇编程序中执行此操作,那么您可以将上面的每个内在函数转换为其相应的指令。

关于assembly - 可以跳过每个第二个字节的SSE mov指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39559687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com