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

Assembly 手臂;VFP;浮点扩展;未定义的指令;,assembly,floating-point,arm,cortex-a,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,用户空间代码生成另一个

我在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
  • 提出并实现了全硬件FPU指令集
  • MVFR0
    MVFR1
    也表明所有功能都已实现,不需要软件模拟
你知道这些额外的例外是什么原因吗


附言:

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

vpush…
vldr…
仅当VFP关闭时生成异常(按预期操作)

根据,设置FPEXC.DEX的唯一原因是未正确配置尝试短向量操作。自从NEON问世以来,VFP中的“V”就被弃用了,并且在任何比Cortex-A8更新的版本上都不受支持

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

*好的,所以严格来说,当Len==0时,步长的值应该无关紧要,但是,嘿,没有好的理由不…

根据,设置FPEXC.DEX的唯一原因是如果对象被错误地配置为尝试短向量操作。自从NEON问世以来,VFP中的“V”就被弃用了,并且在任何比Cortex-A8更新的版本上都不受支持

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


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

我想你是说,在异常处理程序启用VFP并返回重试
vadd.f32 s19、s19、s17之后,用户空间代码会生成另一个异常。我花了一段时间才弄明白第一次让handler打开VFP时说的是什么,因为它的英文翻译得太糟糕了(请进行编辑以改进这一点;如果我对你说的话猜对了,请随意复制第一句话中的措辞。@PeterCordes谢谢,Fixed我想你是说,在异常处理程序启用VFP并返回重试
vadd.f32 s19、s19、s17
后,用户空间代码会生成另一个异常。它也是让我花点时间弄清楚第一次让handler打开VFP时说的是什么,因为它的英文翻译得太糟糕了(请进行编辑以改进这一点;如果我对你说的话猜对了,请随意复制我第一句话中的措辞。@PeterCordes谢谢,修复了你的错误。在处理程序中清除Len&Stride后,应用程序工作。参考手册“ARM不赞成使用这些字段的非零值”.顺便问一下,你知道零值是如何首先进入FPSCR.Len和FPSCR.Stride的吗?我经常分别得到它们“7”和“3”。对不起,我的错,在切换过程中没有正确清理存储缓冲区并从一些垃圾中恢复FPSCR。你是对的。当Len和Stride在处理程序中被清除时,应用程序工作。参考手册“ARM不赞成使用这些字段的非零值”。顺便说一句,你知道零值是如何首先进入FPSCR.Len和FPSCR.Stride的吗?我经常分别得到它们“7”和“3”。对不起,我的错,在切换过程中没有正确清理存储缓冲区并从一些垃圾中恢复FPSCR。