x86 asm 约束“x”(256 位向量操作数)的 ARM 等效项

ARM equivalent for x86 asm constraint "x" (256-bit vector operand)

提问人:terdev 提问时间:3/22/2022 最后编辑:Peter Cordesterdev 更新时间:3/22/2022 访问量:291

问:

我想使用 在 C++ 中执行汇编程序指令。 我需要将以下函数映射到特定于 ARM 的指令(使用 ),因为给定的代码库是在 x86-64 上使用 ARM64 开发的。vrhadd__asm__vrhadd

__asm__("vpavgb %[a], %[b], %[c]" : [c] "=x" (res) : [a] "x" (a), [b] "x" (b));

其中 a、b 和 c 是 256 位 SIMD 寄存器。在我的系统上执行此行会抛出:

error: couldn't allocate output register for constraint 'x',因为(我猜)作为输入操作数的约束,代表 AVX 寄存器 (x86) 中的 256 位向量操作数。在 ARM 上,它分别表示 s0-s15、d0-d7 或 q0-q3 范围内的 32、64 或 128 位浮点/SIMD 寄存器。x

由于我找不到一个,我想知道是否有 ARM64 的 x86 约束的直接等效项?x

C++ ARM SIMD 内联汇编 neon

评论

0赞 Peter Cordes 3/22/2022
在 x86 上,约束为 XMM(128 位)、YMM(256 位)或 ZMM(512 位),具体取决于与其一起使用的变量的类型。gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html。或者从 在 GNU C 内联 asm 中,单个操作数的 xmm/ymm/zmm 的大小覆盖修饰符是什么? - clang习惯于(?)只接受128位向量的向量?不确定何时需要等等。无论如何,我不认为 ARM 会是一样的。x"x""Yt"
0赞 Peter Cordes 3/22/2022
也许 GCC 使用 ARM VFP 指令操作的正确内联汇编约束是什么?我认为 gcc arm 内联汇编器 %e0 和 %f0 操作数修饰符用于 16 字节 NEON 操作数? 显示了一个工作示例。
0赞 Nate Eldredge 3/22/2022
呃......您是否意识到 NEON 矢量单元只有 128 位宽?因此,对 256 位向量没有任何约束是有道理的——没有寄存器可以容纳它,机器也无法处理它。您必须将 256 位向量拆分为两个 128 位块,并分别对它们进行操作。(或者您关于 128 位向量的适当约束是最接近的“等价物”的问题吗?
5赞 Nate Eldredge 3/22/2022
另一方面,为什么要在这里使用内联 asm?ARM/ARM64 SIMD 具有非常好的内部函数;这将避免整个问题,并实现更好的优化。指向 DontUseInlineAsm 的强制性链接
0赞 Jake 'Alquimista' LEE 3/26/2022
@NateEldredge呃......对不起,我不同意。我可以向你展示许多例子来证明相反的情况。特别是用于在执行排列(、、和)时生成 FUBAR 机器代码的编译器。但另一方面,你是对的:内联装配只适用于短内联功能。aarch32vtrnvzipvuzp

答: 暂无答案