ARM Cortex-A9 NEON 和 VFP

问题描述

我正在使用 ARM Cortex-A9 (zynq7000) 并且我想启用 neon SIMD 但将其用于浮点,除非指定。

由 arm-none-eabi-gcc 编译时使用以下 fpu 选项(单独):

  1. mfpu=vfpv3 -mfloat-abi=softfp,
  2. mfpu=neon-vfpv3 -mfloat-abi=softfp,
  3. mfpu=neon -mfloat-abi=softfp,

二进制文件 1 和 2 是不同的。但是 2&3 是相同的(未启用矢量化), 我正在使用 -Og 进行优化。 ( -Og 不启用矢量化选项)

当我使用选项 mfpu=neon-vfpv3 时,如何确保所有浮点都在 VFP 中完成,而不是在 NEON 中完成?

根据 ARM Architecture Reference Manual,NEON 和 VFP 支持类似的指令,这使得仅通过检查反汇编很难区分差异。

此外,我计划将 #pragma GCC ivdep 用于需要向量化的循环和函数,以及实现此目的的适当编译器标志是什么?

解决方法

除非通过内部函数启用或强制执行自动矢量化,否则编译器永远不会使用任何 neon 指令。

尽管 neonvfp 指令看起来很相似,但它们甚至以不同的模式运行。

vfpneonarmv7 上共享了一些指令(主要与内存相关),但它们不应该受到任何关注。

你为什么不发布反汇编?