2016-07-28 259 views
1

Raspberry Pi 3 uses a Broadcom SoC with and ARMv8 A53 core。它還使用基於Debian Jessie的32位操作系統。根據ARM的ARM NEON programming quick reference,第3.2節,指令集如何在ARMv8-a上啓用Aarch32指令集?

的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?但我不明白的答案:

一旦你用手臂工具鏈的延伸CRC編譯可以通過-march=armv8-a+crc或選擇啓用它的-mcpu選項啓用。要啓用Crypto擴展,您必須指定正確的-mfpu選項。

我的問題很簡單...我如何啓用Raspberry Pi 3的CRC和Crypto擴展?


以下是一些不起作用的嘗試。

嘗試(4)類似於我們在Aarch64下如何進行本地化:gcc -march=armv8-a+crc+crypto -mtune=cortex-a53。嘗試(5)實際上啓用CRC,但我似乎無法得到任何其他功能,如PMULL,PMULL2,AES,SHA1SHA2

  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) 

回答

4

很簡單,「正確的-mfpu選項」應該是-mfpu=crypto-neon-fp-armv8

+0

請注意,即使對於一個Pi 2,您可能也需要'-mfpu = neon-vfpv4' - '-mfpu = neon'用於較舊的Cortex-A8/A9 FPU,並在幾條較新的指令中漏掉。 – Notlikethat

+0

這些傢伙從哪裏拿出這些東西......這個人甚至逃脫了[ARM的GCC命令行開關博客](http://community.arm.com/groups/tools/blog/2013/04/15 /臂皮質-一個處理器和 - GCC-命令行)。如果它在[AArch64選項](http://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html)中有記錄,那肯定會很好。 – jww

+0

@jww:你的目標不是AArch64。相關的編譯器選項總是取決於目標,而不是主機。從AArch64系統進行交叉編譯並不重要。我確定有x86選項只適用於'-m32',但不適用'-m64'或'-mx32',反之亦然。儘管我認爲這些文檔對於x86來說很多,因爲這些架構可能比AArch32和AArch64更類似。 –