5.2. 浮点寄存器
浮点数指令会涉及3类寄存器:作为指令操作数使用的浮点寄存器(FR)、用于保存浮点比较结果的条件标志寄存器(CFR),以及记录浮点运算非法操作、除零、溢出等异常状态的浮点控制状态寄存器(FCSR)。
5.2.1. 浮点寄存器
浮点寄存器(FR)共有32个,记为f0~f31。通常情况下,FR位宽为64位。当浮点寄存器保存单精度浮点数或整数时,数据位于低32位[31:0],高32位[63:32]可以为任意值。
5.2.1.1. 条件标志寄存器
条件标志寄存器(CFR)共有8个,记为fcc0~fcc7。每个CFR宽度为1位,用于保存浮点比较指令的执行结果,供后续浮点分支指令进行条件判断。
龙芯架构的浮点运算单元提供8个条件标志寄存器,这有利于软件层面的程序优化。例如,现代编译系统常采用循环展开等独立于具体机器的优化技术。对于带循环的浮点数组计算,可以展开循环,并有意交错相邻几次循环的计算,以更充分地利用浮点单元和浮点寄存器,同时减少循环迭代次数。如果循环体内存在分支指令,单个条件位可能不够用,此时多个条件标志寄存器就能提供帮助。
5.2.1.2. 浮点控制状态寄存器
浮点控制状态寄存器(FCSR)共有4个,记为fcsr0~fcsr3。FCSR位宽为32位,其中fcsr1~fcsr3是fcsr0中部分域的别名。fcsr0各字段定义如表4-1所示。
表4-1中的浮点例外,是指浮点运算单元无法按常规方式处理操作数或计算结果时产生的例外。LoongArch基础浮点数指令支持IEEE 754-2008定义的5类浮点例外。
不精确(Inexact,记为I):FPU执行浮点指令时,如果舍入结果不精确,或舍入结果上溢且上溢例外使能位未置位,则触发该例外。
下溢(Underflow,记为U):FPU检测到结果为非零微小值,且无法按目标格式精确表示时,触发该例外。
上溢(Overflow,记为O):将指数视为无界并对中间结果舍入后,如果结果绝对值超过目标格式的最大有限数,则触发该例外。
除零(Division by Zero,记为Z):除法运算中,除数为0且被除数是有限非零数据时,触发该例外。
非法操作(Invalid Operation,记为V):待执行指令中的一个或两个操作数非法或无效时,触发该例外(NaN)。例如0/0、∞/∞、(+∞)+(-∞)、对负数开平方等。
fcsr0中的Cause域每一位都对应一种浮点例外,而Enable域用于决定例外发生后是否触发例外陷入。也就是说,如果某个浮点例外对应的Enable位为1,发生该例外时会触发浮点例外陷入;如果Enable位为0,则不会触发陷入,只会把Flag域中对应位置置1。