在 arm7 上启用浮点异常时 fpscr 寄存器未更新,未生成 SIGFPE
fpscr register is not updated when enabling floating point exceptions on arm7, SIGFPE not generated
fpscr 寄存器未更新且未生成 SIGFPE。这是在 NVidia Shield 平板电脑和第一代 Nexus 7 上测试的。
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
实现调用最终执行此程序集的代码:
asm _volatile__("vmsr fpscr,%0" : :"ri" (fpscr));
; disassembly follows
ldr r3, [r11, #-8]
vmsr fpscr, r3
vmsr fpscr
不更新。当它应该更新为 0x20000710 时它仍然是 0x20000010。
使用 -mfloat-abi=soft
和 -mfloat-abi=softfp
测试。
我能得出什么结论?
ARM ARM 对 FPSCR 中的所有异常捕获位有这样的说法:
[...]. This bit is RW only if the implementation supports the trapping of floating-point exceptions. In an implementation that does not support floating-point exception trapping, this bit is RES0.
SHIELD 平板电脑中的 Tegra K1 SoC 具有 Cortex-A15 CPU,don't support VFP exception trapping。
原始 Nexus 7 中的 Tegra 3 SoC 具有 Cortex-A9 CPU(采用 VFP+NEON 实现),don't support VFP exception trapping
特别无益的是,您甚至无法从用户空间访问 MVFR0 功能寄存器以编程方式找到它。
我认为您只能得出结论,您没有任何支持捕获异常的硬件 ;)
fpscr 寄存器未更新且未生成 SIGFPE。这是在 NVidia Shield 平板电脑和第一代 Nexus 7 上测试的。
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
实现调用最终执行此程序集的代码:
asm _volatile__("vmsr fpscr,%0" : :"ri" (fpscr));
; disassembly follows
ldr r3, [r11, #-8]
vmsr fpscr, r3
vmsr fpscr
不更新。当它应该更新为 0x20000710 时它仍然是 0x20000010。
使用 -mfloat-abi=soft
和 -mfloat-abi=softfp
测试。
我能得出什么结论?
ARM ARM 对 FPSCR 中的所有异常捕获位有这样的说法:
[...]. This bit is RW only if the implementation supports the trapping of floating-point exceptions. In an implementation that does not support floating-point exception trapping, this bit is RES0.
SHIELD 平板电脑中的 Tegra K1 SoC 具有 Cortex-A15 CPU,don't support VFP exception trapping。
原始 Nexus 7 中的 Tegra 3 SoC 具有 Cortex-A9 CPU(采用 VFP+NEON 实现),don't support VFP exception trapping
特别无益的是,您甚至无法从用户空间访问 MVFR0 功能寄存器以编程方式找到它。
我认为您只能得出结论,您没有任何支持捕获异常的硬件 ;)