为什么生成带有霓虹灯标志的 vdiv 指令?

why is a vdiv instruction generated with neon flags?

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

-mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize

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

对于Cortex-A9,the NEON FPU option also implements VFP;它是精简的 16 寄存器 VFP-only FPU 选项的超集。

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

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