我拆解了之前用霓虹灯标志编译的arm二进制文件:
-mcpu = cortex-a9 -mfpu = neon -mfloat-abi = softfp -ftree-vectorize
转储显示编译器生成的vdiv.f64指令。根据armv7(cortex-a9)的arm手册,霓虹灯simd isa不支持vdiv指令,但浮点(vfp)引擎确实如此。为什么会生成此指令?那么它是一个由vfp执行的浮点指令吗?氖和VFP都支持浮点的加法和乘法,所以如何将它们与eahc其他区分开?
答案 0 :(得分:1)
对于Cortex-A9,{{3}};它是简化的16寄存器VFP-only FPU选项的超集。
更一般地说,该体系结构不允许实现浮点高级SIMD而不实现至少单精度VFP,因此GCC的-mfpu=neon
也暗示VFPv3。 允许实现只有整数的高级SIMD而没有任何浮点功能,但我不确定GCC是否可以支持(或者任何人都曾建立过这样的的东西)。
实际的VFP和高级SIMD指令变体与语法无关 - 任何在双精度数据上运行的东西(即<op>.F64
)显然都是VFP,因为高级SIMD不支持双精度。在32位<op>.F32
寄存器上运行的单精度运算(即s
)是标量的,因此是VFP;如果它们在更大的64位d
或128位q
寄存器上运行,那么它们一次处理多个32位值,因此是矢量化的高级SIMD指令。