【问题标题】:How to enable Aarch32 instruction set on ARMv8-a?如何在 ARMv8-a 上启用 Aarch32 指令集?
【发布时间】:2016-12-02 13:14:06
【问题描述】:

Raspberry Pi 3 uses a Broadcom SoC with and ARMv8 A53 core。它还使用基于 Debian Jessie 的 32 位操作系统。根据ARM的ARM NEON programming quick reference,Section 3.2,指令集

ARMv8-A AArch32 指令集由 A32(ARM 指令集,32 位定长指令集)和 T32(Thumb 指令集,16 位定长指令集;Thumb2 指令集,16 或 32 -位长度指令集)。它是 ARMv7-A 指令集的超集,因此它保留了运行现有软件所需的向后兼容性。 A32 和 T32 有一些添加以保持与 A64 指令集的一致性,包括 NEON 除法和加密扩展指令。还支持 NEON 双精度浮点(符合 IEEE 标准)。

不久前我在 GCC 邮件列表How to test Aarch32 execution environment on Aarch64? 上问过类似的问题,但我不太明白答案:

使用 arm 工具链编译后,可以通过 -march=armv8-a+crc 或选择启用它的 -mcpu 选项启用 CRC 扩展。要启用 Crypto 扩展,您必须指定正确的 -mfpu 选项。

我的问题很简单...如何为 Raspberry Pi 3 启用 CRC 和 Crypto 扩展?


以下是一些无效的尝试。

尝试 (4) 类似于我们在 Aarch64 下的原生​​操作:gcc -march=armv8-a+crc+crypto -mtune=cortex-a53。尝试 (5) 实际上启用了 CRC,但我似乎无法启用其他任何东西,例如 PMULLPMULL2AESSHA1SHA2

  1. gcc -D__ARM_FEATURE_CRYPTO -D__ARM_FEATURE_CRC -march=armv8-a+crc+crypto -mcpu=cortex-a53 -mfpu=neon test.cc -o test.exe
  2. gcc -D__ARM_FEATURE_CRYPTO -D__ARM_FEATURE_CRC -march=armv8-a+crc -mcpu=cortex-a53 -mfpu=neon test.cc -o test.exe
  3. gcc -D__ARM_FEATURE_CRYPTO -D__ARM_FEATURE_CRC -march=armv8-a -mcpu=cortex-a53 -mfpu=neon test.cc -o test.exe
  4. gcc -march=armv8-a+crc+crypto -mcpu=cortex-a53 -mfpu=neon test.cc -o test.exe
  5. gcc -march=armv8-a+crc -mcpu=cortex-a53 -mfpu=neon test.cc -o test.exe
  6. gcc -march=armv8-a -mcpu=cortex-a53 -mfpu=neon test.cc -o test.exe

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.9/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Raspbian 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.9.2 (Raspbian 4.9.2-10) 

【问题讨论】:

    标签: gcc assembly arm intrinsics


    【解决方案1】:

    很简单,“正确的-mfpu 选项”应该是-mfpu=crypto-neon-fp-armv8

    【讨论】:

    • 请注意,即使是 Pi 2,您也可能希望 -mfpu=neon-vfpv4 - -mfpu=neon 用于较旧的 Cortex-A8/A9 FPU,并遗漏了一些较新的指令。
    • 这些家伙是从哪里弄出这些东西的......那个甚至逃脱了ARM blog on GCC command line switches。如果它被记录在AArch64 Options,那肯定会很好。
    • @jww:你的目标不是 AArch64。相关编译器选项始终取决于目标,而不是主机。从 AArch64 系统进行交叉编译并不重要。我确信有 x86 选项仅适用于-m32,但不适用于-m64-mx32,反之亦然。虽然我认为文档更多地将 x86 的东西放在一起,因为架构可能比 AArch32 和 AArch64 更相似。
    • 非常感谢。我知道我应该几天前在这里问这个问题。一个相关的问题:我还需要-mfloat-abi=hard吗?还是 Aarch32 ABI 已经把它叫出来了?为了完整起见,以下是我迄今为止为该设备收集的平台标志:-march=armv8-a+crc -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
    • @PeterCordes - 我们如何区分适用于 32 位 ARMv7 及更低版本以及 ARMv8 和 Aarch32 的内容?你提出m32 很有趣——这是另一个(对我来说)控制这些标志的合乎逻辑的选择。即,-march=armv8-a+crc+crypto 是 Aarch64;而-march=armv8-a+crc+crypto -m32 是 Aarch32。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2015-06-26
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多