当前状态

以下描述了 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 提供的模块,还是此发行版中的模块)来替换内置在内核中的仿真器的功能。