当前状态

以下描述了 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> - 极角 (反正切2)

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 提供,或此发行版中的模块)来替换内核内置模拟器的功能。