ARMv7系统寄存器

本文档介绍 NEON 和 VFP 的系统寄存器,他们用于描述 NEON 和 VFP 的系统架构。包括:FPSCR, FPEXC, FPSID,MVFR0/1.

常见的术语

  • CPSR(Current Program Status Register)是 ARM 处理器中的一个寄存器,用于存储当前程序的状态信息。它包含了一些标志位,用于记录程序的运行状态和条件,例如条件码(Condition Codes)标志,用于条件分支和条件执行。CPSR 还包含了处理器模式(Processor Mode)信息,指示处理器当前处于用户模式、特权模式(如系统模式、监管模式等)或异常模式(如中断、异常处理模式)等。

  • NaN 模式指的是在计算中涉及到 NaN(Not-a-Number)值的处理方式。NaN 是一种特殊的浮点数值,通常表示无效或未定义的数值结果。NaN 可以出现在浮点运算中,例如当进行无法定义的计算时,或者当计算结果无法表示为有效的浮点数时。

    • 认 NaN 模式(Default NaN Mode):在这种模式下,处理器将 NaN 视为普通的浮点数值,允许其参与计算并产生新的 NaN 值。这是通常的行为。
    • 静默 NaN 模式(Silent NaN Mode):在这种模式下,处理器不会引发异常或产生任何错误,当遇到 NaN 时,它会默默地将 NaN 替换为预定义的特殊值,而不影响计算的进行。

FPSCR, the floating-point status and control register

包含了所有用户级 NEON 和 VFP 的状态和控制位,NEON 单元仅使用位 [31:27]。这些位的用途如下:

  • bits[31:28], N、Z、C 和 V 标志, NEON 和 VFP 的状态标志, 在将它们复制到 CPSR 中的状态标志之前,它们不能用于控制条件执行。

    • N 负标志(由浮点比较运算更新)
    • Z 零标志(由浮点比较运算更新)
    • C 进位/借位标志(由浮点比较运算更新)
    • V 溢出标志(由浮点比较运算更新)
  • bits[27], QC(累积饱和标志)是指 NEON 饱和指令发生饱和时设置的标志。

  • bits[26], AHP 交替半精度控制位:

    • 0:IEEE半精度格式(默认)
    • 1:交替半精度格式
  • bits[25], DN, 这是默认 NaN(DN)模式控制位:

    • 禁用。NaN 操作数会变为浮点运算的输出(默认)
    • 启用。任何涉及一个或多个 NaN 的操作都会返回默认的 NaN
  • bits[24], FZ, flush-to-zero模式控制位

    • 0,禁用
    • 1,启用
  • bits[23:22], ROUND, 四舍五入模式控制位

    • 00:最近舍入(RN)模式(默认) : 四舍五入
    • 01:正无穷舍入(RP)模式 : 对正数而言,只要多余位不全为0则向最低有效位进1;负数则直接截尾。
    • 10:负无穷舍入(RM)模式 : 对负数而言,只要多余位不全为0则向最低有效位进1;正数若多余位不全部为0则简单截尾。
    • 11:向零舍入(RZ)模式 : 直接截尾。
  • bits[21:20], Stride, 向量中连续值之间的距离

    • 00, STRIDE = 1
    • 11, STRIDE = 2

    这个字段在AArch64状态下没有功能,而且在AArch64状态下执行时忽略非零值。(矢量模式已经弃用该位)

  • bits[19], FZ16, 在半精度数据处理指令上将非规范化数字刷新到零。

    • 0, 对于某些指令,该位禁止将半精度非规范化数字的输入和输出刷新为零。
    • 1, 启用将非规范化数字刷新为零
  • bits[18:16], LEN, 每个向量使用的寄存器数

    • 0b000 LEN = 1.
    • … …
    • 0b111 LEN = 8.

    该字段在AArch64状态下没有作用,并且在执行过程中忽略非零值。(矢量模式已经弃用该位)

  • bits[15, 12:8] 异常陷阱使能位(使能,启用或禁用相关异常)

    • bits[15], IDE 输入非规格化异常使能。
    • bits[12], IXE 不精确异常使能。
    • bits[11], UFE 下溢出异常使能。
    • bits[10], OFE 溢出异常使能。
    • bits[9], DZE 除零异常使能。
    • bits[8], IOE 无效操作异常使能。
  • bits[7, 4:0], 累积异常位

    • bits[7], IDC 输入非正常累积异常位(结果未在正常数值范围内)
    • bits[4], IXC 不精确的累积异常位
    • bits[3], UFC 下溢累积异常位
    • bits[2], OFC 溢出累积异常位
    • bits[1], DZC 被零除累积异常位
    • bits[0], IOC 非法操作累积异常位

FPEXC, the floating-point exception register

只有在特权级别的软件执行中才能访问FPEXC。

  • bit[31], EX 位,可以在所有NEON或VFP实现中读取它。在某些实现中,您还可以写入它。

    如果该值为0,则NEON或VFP系统中唯一重要的状态是NEON和浮点寄存器、FPSCR和FPEXC的内容。

  • bit[30], EN 位。 所有NEON或VFP实现中,您都可以读取和写入它。

    • 如果该值为1,则NEON单元(如果存在)和VFP(如果存在)被启用并正常运行。
    • 如果该值为0,则NEON单元和VFP被禁用。当它们被禁用时,您可以读取或写入FPSID或FPEXC寄存器,但其他NEON或VFP指令将被视为未定义指令。
  • bit[29:0], 可能被特定的VFP实现所使用。您可以在不访问这些位的情况下使用VFP指令。

    除非按照特定实现中的用途,否则不得更改这些位。

    要在不影响其他位的情况下更改某些位,使用读-修改-写过程。

FPSID, the floating-point system ID register

FPSID是一个只读寄存器。您可以阅读NEON架构的信息

  • bits [31:24],ARM处理器表示,值位 0x41,即 ASCII 码的 A

  • bit [23],软件位

    • 0 实现提供了浮点指令的硬件实现
    • 1 实现仅支持浮点指令的软件仿真

    在Armv8-A中,唯一允许的值是0b0。这个字段具有一个由实现定义的值。对该字段的访问是只读的。

  • bit[22:16],子架构版本号

    • 000, VFPv1
    • 001, VFPv2
    • 010, VFPv3
    • 011, VFPv3
    • 100, VFPv3
  • bit[15:8], Arm官方定义的部件号

  • bit[7:4], Arm官方定义的变体号

  • bit[3:0],浮点实现的修订号

MVFR0/1, Media and VFP Feature Registers

MVFR0/1 是一个只读寄存器。它提供有关处理器上的VFP和SIMD架构的信息。即使在没有NEON单元或VFP的处理器上,该寄存器也是可用的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值