臂; VFP;浮点扩展;未定义的指令;

时间:2016-06-21 08:21:15

标签: assembly floating-point arm cortex-a

我在ARM cortex-a9上有一个设备,试图实现"懒惰浮动切换"用于此设备的操作系统。 "懒惰切换"是什么时候

  • 禁用VFP支持,
  • 线程尝试执行任何VFP指令并生成异常,
  • 异常处理程序打开VFP,管理线程上下文&返回,以便再次尝试相同的指令,
  • 调度程序在切换线程之前关闭VFP。

问题是,当启用VFP时,几乎所有VFP指令都会生成同步异常。 简单来说就是

vadd.f32    s19, s19, s17

第一个异常处理程序启用VFP并返回重试vadd.f32 s19, s19, s17,用户空间代码生成另一个异常

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

我无法理解这种同步异常的原因是什么。我查了一下

  • 禁用中断FPSCR[15, 12-8] == 0;
  • 提供VFPv3并实现全硬件FPU指令集;
  • MVFR0& MVFR1也表示所有功能都已实现,并且不需要进行软件模拟。

任何想法可能是这些额外例外的原因?


PS:

应用已构建w / -mcpu=cortex-a9 -marm -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math;

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

1 个答案:

答案 0 :(得分:3)

根据the Cortex-A9 FPU docs,设置FPEXC.DEX的唯一原因是,如果该东西被错误地配置为尝试短向量操作。自从NEON出现以来,VFP中的“V”已经被弃用,并且除了Cortex-A8之外的任何东西都不受支持。

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

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