当前状态¶
以下描述了 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 提供,或此发行版中的模块)来替换内核内置模拟器的功能。