Gcc AARC64高级SIMD程序集:操作数2应为SIMD向量寄存器

Gcc AARC64高级SIMD程序集:操作数2应为SIMD向量寄存器,gcc,arm,simd,neon,arm64,Gcc,Arm,Simd,Neon,Arm64,我想将两个64位操作数相乘,然后简单地将结果放入汇编中的128位SIMD向量中。我的操作数存储在两个128位向量(v0和v4)中,我想将v4的最低有效一半与“v0”的上半部分相乘,并将结果放入v12。为此,我提出了以下语法: umull v12.2D, D1, D4 基于ARM,我可以使用高级SIMD中的D寄存器组映射向量的最低有效值和上半部分。但汇编程序给了我这个错误: Error: operand 2 should be a SIMD vector register 我还尝试使用向量索

我想将两个64位操作数相乘,然后简单地将结果放入汇编中的128位SIMD向量中。我的操作数存储在两个128位向量(
v0
v4
)中,我想将
v4
的最低有效一半与“v0”的上半部分相乘,并将结果放入
v12
。为此,我提出了以下语法:

umull v12.2D, D1, D4
基于ARM,我可以使用高级SIMD中的D寄存器组映射向量的最低有效值和上半部分。但汇编程序给了我这个错误:

Error: operand 2 should be a SIMD vector register 
我还尝试使用向量索引,如下所示:

umull v12.2D, v1.2s[1], v4.2s[0]

但是我收到了同样的错误信息

“D”是寄存器下半部分的标量浮点“双”视图,所以,是的,它不是SIMD向量——应该是这样。无论哪种方式都没有64x64→128个运算(因为没有128位类型),所以这个问题的整个前提似乎都是无效的。@难道AArch64中没有64x64乘法吗?这意味着如果我想乘以两个64位操作数,我应该使用四个32x32乘法?那么AArch64和AArch32之间有什么区别呢?@不像从ARM v8指令集概述文档中我们可以编写
umull Vd.,Vn.,Vm.
,其中/可以是2D/2S。这不是64x64乘法吗?源类型是2S,目标类型是2D,所以不是,它是32x32→64乘法。碰巧,@A23149577:AArch64中有64x64乘法,但SIMD寄存器上没有;它在GPRs上运行(注意,x86_64上的情况完全相同;SSE/AVX寄存器上没有64位乘法)。好的,“D”是寄存器下半部分的标量浮点“双”视图,所以是的,它不是SIMD向量-应该是这样。无论哪种方式都没有64x64→128个运算(因为没有128位类型),所以这个问题的整个前提似乎都是无效的。@难道AArch64中没有64x64乘法吗?这意味着如果我想乘以两个64位操作数,我应该使用四个32x32乘法?那么AArch64和AArch32之间有什么区别呢?@不像从ARM v8指令集概述文档中我们可以编写
umull Vd.,Vn.,Vm.
,其中/可以是2D/2S。这不是64x64乘法吗?源类型是2S,目标类型是2D,所以不是,它是32x32→64乘法。碰巧,@A23149577:AArch64中有64x64乘法,但SIMD寄存器上没有;它在GPRs上运行(注意,x86_64上的情况完全相同;SSE/AVX寄存器上没有64位乘法)。