【发布时间】:2021-03-21 00:50:26
【问题描述】:
我正在尝试使用 gcc 内联 asm 加载和存储 YMM 寄存器。我使用 vmovdqa 来执行此操作。
为了将 __m256i 存储到特定的 YMM 寄存器(比如 YMM10),我使用以下代码
__m256i addr;
//load value to addr
asm ("vmovdqa %0,%%ymm10\n\t"
:
: "x" (addr)
:);
为了将 YMM10 中的值加载到变量中,我使用以下代码
__m256i readbuff;
asm ("vmovdqa %%ymm10,%0\n\t"\
: "=x" (readbuff)\
:\
:);
我在这里面临的问题是,在我用一个值加载 YMM10 之后,我只使用了加载值的寄存器的一半。我的意思是只加载了 128 位,另一半全为零。
我做错了吗?我不确定要使用什么指令 - vmovdqa、vmovaps、vmovups。 请在这方面给我建议。
【问题讨论】:
-
这种内联汇编的用法是不正确的,不能期望工作。您不能假设您分配给随机寄存器的值仍然存在于下一个
asm语句中,并且您也不允许在不将寄存器放入 clobber 列表的情况下覆盖随机寄存器。如果您提供更多上下文,也许可以找到针对您的underlying problem 的更好解决方案。
标签: c gcc x86 inline-assembly avx2