Arm 为什么使用霓虹灯标志生成vdiv指令?

Arm 为什么使用霓虹灯标志生成vdiv指令?,arm,neon,instruction-set,Arm,Neon,Instruction Set,我反汇编了一个以前用neon标志编译的arm二进制文件: -mcpu=cortex-a9-mfpu=neon-mfloat abi=softfp-ftree矢量化 转储显示编译器生成的vdiv.f64指令。根据armv7(cortex-a9)的arm手册,neon simd isa不支持vdiv指令,但浮点(vfp)引擎支持。为什么会生成此指令?那么它是一条将由vfp执行的浮点指令吗?neon和VFP都支持浮点的加法和乘法,因此如何将它们与eahc其他类型区分开来?对于Cortex-A9;它是精

我反汇编了一个以前用neon标志编译的arm二进制文件:

-mcpu=cortex-a9-mfpu=neon-mfloat abi=softfp-ftree矢量化

转储显示编译器生成的vdiv.f64指令。根据armv7(cortex-a9)的arm手册,neon simd isa不支持vdiv指令,但浮点(vfp)引擎支持。为什么会生成此指令?那么它是一条将由vfp执行的浮点指令吗?neon和VFP都支持浮点的加法和乘法,因此如何将它们与eahc其他类型区分开来?

对于Cortex-A9;它是精简16寄存器VFP only FPU选项的超集

更一般地说,该体系结构不允许在不实现至少单精度VFP的情况下实现浮点高级SIMD,因此GCC的
-mfpu=neon
也意味着VFPv3。允许在没有任何浮点功能的情况下实现仅限整数的高级SIMD,但我不确定GCC是否能够支持这一点(或者是否有人构建过这样的东西)


从语法上看,指令的实际VFP和高级SIMD变体是明确的——任何对双精度数据(即
.F64
)进行操作的指令都是VFP,因为高级SIMD不支持双精度。在32位
s
寄存器上操作的单精度操作(即
.F32
)是标量的,因此VFP;如果它们在较大的64位
d
或128位
q
寄存器上运行,则它们同时处理多个32位值,因此是矢量化高级SIMD指令。

是的,这是一条VFP指令。您可以很容易地看到这一点,因为AArch32 neon根本不适用于64位浮点。谢谢您的回答,但是如果我看到编译器生成的“vadd”,我如何知道它是neon指令还是VFP指令,因为这两个引擎都实现了该指令?我正在使用arm cortex-a9处理器和arm none linux gnueabi*工具链。neon使用寄存器名
D[n]
Q[n]
以及指令后缀
F32
(对于整数指令
I[n]
),VFP使用
S[n]
D[n]
和指令后缀
F64
F32
。事实证明,这个组合是明确的。你的解释很清楚,解决了我的问题。非常感谢你回答这个问题。