gpt4 book ai didi

assembly - 访问封装在 128 位寄存器中的任意 16 位元素

转载 作者:行者123 更新时间:2023-12-04 11:42:15 26 4
gpt4 key购买 nike

使用英特尔编译器内在函数,给定一个 128 位寄存器,打包 8 个 16 位元素,如何从寄存器中访问(廉价)任意元素,以供后续使用 _mm_cvtepi8_epi64 (符号扩展两个 8 位元素,打包在寄存器的低 16 位,到两个 64 位元素)?

我会解释为什么我问:

  • 输入:具有 k 个字节的内存缓冲区,每个字节为 0x0 或 0xff。
  • 期望输出:对于输入的每两个连续字节,一个寄存器用 0x0 打包两个四字(64 位)和 0xffff ffff ffff ffff , 分别。
  • 最终目标:将 k 个缓冲区加起来,根据输入缓冲区的条目进行屏蔽。

  • 注意:值 0x00xff输入缓冲区的大小可以更改为最有帮助的任何内容,前提是总和之前的屏蔽效果仍然存在。

    从我的问题中可以明显看出,我目前的计划如下,跨输入缓冲区流式传输:
  • 将输入掩码缓冲区从 8 位扩展到 64 位。
  • 用扩展掩码掩蔽 double 缓冲区。
  • 将蒙面 double 相加。

  • 谢谢,
    阿萨夫

    最佳答案

    而不是问题本身,而是在评论中填写一些信息,因为评论部分本身太小,无法容纳这个(原文如此!):

    至少gcc可以处理如下代码:

    #include <smmintrin.h>

    extern int fumble(__m128i x);

    int main(int argc, char **argv)
    {
    __m128i foo;
    __m128i* bar = (__m128i*)argv;

    foo = _mm_cvtepi8_epi64(*bar);

    return fumble(foo);
    }

    它将其转换为以下程序集:

    .text.startup 节的反汇编:

    0000000000000000 :
    0: 66 0f 38 22 06 pmovsxbq (%rsi),%xmm0
    5:e9 XX XX XX XX jmpq .....

    这意味着内在函数不需要以内存参数形式出现 - 编译器透明地处理取消引用 mem 参数,并在可能的情况下使用相应的 mem 操作数指令。 ICC 也是如此。我周围没有 Windows 机器/Visual C++ 来测试 MSVC 是否也这样做,但我希望它能。

    关于assembly - 访问封装在 128 位寄存器中的任意 16 位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963947/

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