【发布时间】:2014-02-25 11:32:41
【问题描述】:
我想知道这对于 Krait 400 CPU 是否可行。我遵循了一些建议 here
当我使用 mcpu=cortexa15 进行编译时,代码会编译并有效地在程序集转储中看到 udiv 指令。
不过,我想知道:
- 是否可以让它与march=armv7-a 一起工作? (不指定 cpu;这就是我最初的方式)
- 我尝试使用 mcpu=krait2,但由于我没有使用 snapdragon llvm(我还不知道要付出多少努力),它无法识别它。是否可以从 llvm 获取 cpu 定义并以某种方式使其可用于我的编译器?
- 还有其他方法/补丁/技巧吗?
我的编译器选项如下:
/development/android-ndk-r8e/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -DANDROID -DNEON -fexceptions -Wno-psabi --sysroot=/development/android-ndk-r8e/platforms/android-14/arch-arm -fpic -funwind-tables -funswitch-loops -finline-limit=300 -fsigned-char -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=neon -fdata-sections -ffunction-sections -Wa,--noexecstack -marm -fomit-frame-pointer -fstrict-aliasing -O3 -DNDEBUG
我得到的错误是:
Error: selected processor does not support ARM mode `udiv r1,r1,r3'
作为旁注,我不得不说我才刚刚开始了解整个方案,因此我想保持小步骤以了解我在做什么。
提前致谢。
编辑 1:
我尝试编译一个单独的模块,只包含 udiv 指令。该模块使用 -mcpu=cortex-a15 参数编译,而应用程序的其余部分使用 -march=armv7-a 参数编译。结果是(以某种方式预期)函数调用开销影响了应用程序的时间性能。我无法获得内联代码,因为进入内联的字符串导致了与我最初遇到的相同的错误。在尝试重新发明轮子之前,我将切换到 Snapdragon 看看是否有更好的性能。感谢大家的回答和提示。
【问题讨论】:
-
如果您使用的是 ndk,您就无法进行此类黑客攻击,并期望它可以与许多目标一起使用。如果你想和 krait 一起玩,那么只需使用 a15。这将是最简单的。
-
@auselen 感谢您注意到它是 Android。对于查询
idiv支持,我给出了bare metal 答案;如果你有 Linux,/proc/cpuinfo 是最好的信息来源。我将尝试删除 ISAR0 并将所有 cmets 合并到我的答案中... -
感谢@auselen 和无艺术的噪音。我知道如果实现了这一点,那么代码将(可能)仅适用于 Armv7-a CPU支持 idiv。当你说:“如果你想玩 krait,那就用 a15。”你的意思是让它最容易编译? (即切换 gcc 的标志)。尽管生成的代码是为我实际上没有的 CPU 量身定制的,但我有点担心。目前我无法评估这种变化的影响。我想我也会寻找有关这方面的文献。