手臂;副总裁;浮点扩展;未定义的指令;

arm; VFP; Floating-point Extension; Undefined Instructions;

我有一个基于 ARM cortex-a9 的设备,我正在尝试为该设备实现 "lazy float switching" for OS。 "lazy switching" 是

问题是几乎所有的VFP指令在启用VFP时都会产生同步异常。 简单来说

vadd.f32    s19, s19, s17

首先异常处理程序使 VFP 和 returns 重试 vadd.f32 s19, s19, s17,用户 space 代码生成另一个异常

第二次产生同步异常。
异常寄存器,FPEXC为FPEXC.EX == 0, FPEXC.EN == 1, FPEXC.DEX == 1

而且我不明白这个同步异常的原因是什么。我查了一下

知道这些额外异常的原因是什么吗?


PS:

应用程序是使用 -mcpu=cortex-a9 -marm -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math;

构建的

vpush...vldr... 仅在 VFP 关闭时生成异常(按预期运行)

根据 the Cortex-A9 FPU docs,设置 FPEXC.DEX 的唯一原因是该事物被错误地配置为尝试短向量操作。自 NEON 出现以来,VFP 中的“V”已被弃用,并且在任何比 Cortex-A8 更新的东西上都完全不支持。

您需要确保 FPSCR.Len 和 FPSCR.Stride* 设置为 0。

* 好吧,严格来说,当 Len == 0 时,Stride 的值应该无关紧要,但是,嘿,没有充分的理由 not .. .