当前状态¶
以下描述了 NetWinder 浮点仿真器的当前状态。
在以下内容中,使用术语来描述浮点指令。它遵循 ARM 手册中的约定。
<S|D|E> = <single|double|extended>, no default
{P|M|Z} = {round to +infinity,round to -infinity,round to zero},
default = round to nearest
注意:用 {} 括起来的项目是可选的。
浮点协处理器数据传输指令 (CPDT)¶
LDF/STF - 加载和存储浮点数
<LDF|STF>{cond}<S|D|E> Fd, Rn <LDF|STF>{cond}<S|D|E> Fd, [Rn, #<expression>]{!} <LDF|STF>{cond}<S|D|E> Fd, [Rn], #<expression>
这些指令已完全实现。
LFM/SFM - 加载和存储多个浮点数
格式 1 语法:<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn] <LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn, #<expression>]{!} <LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn], #<expression>
格式 2 语法:<LFM|SFM>{cond}<FD,EA> Fd, <count>, [Rn]{!}
这些指令已完全实现。它们将每个浮点寄存器的三个字存储/加载到指令中给定的内存位置。内存中的格式不太可能与其他实现兼容,特别是实际的硬件。ARM 手册中对此进行了特别说明。
浮点协处理器寄存器传输指令 (CPRT)¶
转换、读取/写入状态/控制寄存器指令
FLT{cond}<S,D,E>{P,M,Z} Fn, Rd 将整数转换为浮点数 FIX{cond}{P,M,Z} Rd, Fn 将浮点数转换为整数 WFS{cond} Rd 写入浮点状态寄存器 RFS{cond} Rd 读取浮点状态寄存器 WFC{cond} Rd 写入浮点控制寄存器 RFC{cond} Rd 读取浮点控制寄存器
FLT/FIX 已完全实现。
RFS/WFS 已完全实现。
RFC/WFC 已完全实现。RFC/WFC 是仅限管理员的指令,目前检查 CPU 模式,如果不是从管理员模式调用,则会执行无效指令陷阱。
比较指令
CMF{cond} Fn, Fm 比较浮点数 CMFE{cond} Fn, Fm 比较浮点数(带异常)CNF{cond} Fn, Fm 比较取反的浮点数 CNFE{cond} Fn, Fm 比较取反的浮点数(带异常)
这些已完全实现。
浮点协处理器数据指令 (CPDT)¶
二元运算
ADF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 加法 SUF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 减法 RSF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 反向减法 MUF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 乘法 DVF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 除法 RDV{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 反向除法
这些已完全实现。
FML{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 快速乘法 FDV{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 快速除法 FRD{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 快速反向除法
这些也已完全实现。它们使用与非快速版本相同的算法。因此,在此实现中,它们的性能等同于 MUF/DVF/RDV 指令。根据 ARM 手册,这是可以接受的。该手册指出,这些指令仅为单操作数定义,在实际的 FPA11 硬件上,它们不适用于双精度或扩展精度操作数。仿真器目前不检查请求的权限条件,并执行请求的操作。
RMF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - IEEE 余数
这已完全实现。
一元运算
MVF{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 移动 MNF{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 移动取反
这些已完全实现。
ABS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 绝对值 SQT{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 平方根 RND{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 四舍五入
这些已完全实现。
URD{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 未规范化的四舍五入 NRM{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 规范化
这些已实现。URD 使用与 RND 指令相同的代码实现。由于 URD 无法返回未规范化的数字,因此 NRM 变为 NOP。
库调用
POW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 幂 RPW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 反向幂 POL{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - 极角 (arctan2)
LOG{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 以 10 为底的对数 LGN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 以 e 为底的对数 EXP{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 指数 SIN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 正弦 COS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 余弦 TAN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 正切 ASN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 反正弦 ACS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 反余弦 ATN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - 反正切
这些尚未实现。它们当前未由编译器发出,而是由 libc 中的例程处理。FPA11 硬件未实现这些,而是由浮点支持代码处理。它们应在未来的版本中实现。
信号
信号已实现。但是,Rebel.com 生成的当前 ELF 内核中存在一个错误,该错误会阻止模块生成 SIGFPE。这是由于未能将 fp_current 正确地别名为内核变量 current_set[0] 引起的。
此发行版(vmlinux-nwfpe-0.93)随附的内核包含了此问题的修复程序,并且直接合并了当前版本的仿真器。可以使用此内核在未加载浮点模块的情况下运行。它作为一项技术的演示,也为那些想要进行依赖于信号的浮点工作的人提供。严格来说,没有必要使用该模块。
可以加载一个模块(无论是 Russell King 提供的模块,还是此发行版中的模块)来替换内置在内核中的仿真器的功能。