手臂;副总裁;浮点扩展;未定义的指令;
arm; VFP; Floating-point Extension; Undefined Instructions;
我有一个基于 ARM cortex-a9 的设备,我正在尝试为该设备实现 "lazy float switching" for OS。 "lazy switching" 是
- VFP 支持已禁用,
- 线程尝试执行任何 VFP 指令并生成异常,
- 异常处理程序打开 VFP,管理线程上下文 & return 因此将再次尝试相同的指令,
- 调度程序在切换线程之前关闭 VFP。
问题是几乎所有的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
而且我不明白这个同步异常的原因是什么。我查了一下
- 中断被禁用
FPSCR[15, 12-8] == 0
;
- 提出了VFPv3并实现了完整的硬件FPU指令集;
MVFR0
& MVFR1
也表示所有功能都实现了,不需要软件模拟。
知道这些额外异常的原因是什么吗?
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 .. .
我有一个基于 ARM cortex-a9 的设备,我正在尝试为该设备实现 "lazy float switching" for OS。 "lazy switching" 是
- VFP 支持已禁用,
- 线程尝试执行任何 VFP 指令并生成异常,
- 异常处理程序打开 VFP,管理线程上下文 & return 因此将再次尝试相同的指令,
- 调度程序在切换线程之前关闭 VFP。
问题是几乎所有的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
而且我不明白这个同步异常的原因是什么。我查了一下
- 中断被禁用
FPSCR[15, 12-8] == 0
; - 提出了VFPv3并实现了完整的硬件FPU指令集;
MVFR0
&MVFR1
也表示所有功能都实现了,不需要软件模拟。
知道这些额外异常的原因是什么吗?
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 .. .