待办事项列表

POW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - power
RPW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse power
POL{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - polar angle (arctan2)

LOG{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - logarithm to base 10
LGN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - logarithm to base e
EXP{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - exponent
SIN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - sine
COS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - cosine
TAN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - tangent
ASN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arcsine
ACS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arccosine
ATN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arctangent

这些尚未实现。它们目前不由编译器发出,而是由 libc 中的例程处理。它们不由 FPA11 硬件实现,而是由浮点支持代码处理。它们应该在未来的版本中实现。

有几种方法可以实现这些功能。一种方法是对这些例程使用精确的表格方法。我有 S. Gal 来自以色列海法 IBM 研究实验室的几篇论文,它们似乎承诺极高的精度(大约 99.8%)和合理的速度。这些方法在 GLIBC 中用于一些超越函数。

另一种我知之甚少的方法是 CORDIC。CORDIC 代表“坐标旋转数字计算机”,它是一种主要使用移位和加法以及少量乘法和除法来计算超越函数的方法。ARM 擅长移位和加法,因此这种方法可能很有前景,但需要更多研究来确定其可行性。

舍入方法

IEEE 标准定义了 4 种舍入模式。舍入到最近是默认模式,但也允许舍入到正无穷大、负无穷大或舍入到零。许多架构允许通过修改控制寄存器中的位来指定舍入模式。ARM FPA11 架构并非如此。要更改舍入模式,必须在每条指令中指定它。

这使得移植一些基准测试变得困难。可以将这种能力引入仿真器。FPCR 包含描述舍入模式的位。可以修改仿真器来检查一个标志,如果该标志被设置,则强制仿真器忽略指令中的舍入模式,并使用 FPCR 中位指定的模式。

这将需要一种获取/设置该标志以及 FPCR 中位的方法。这在 ArmLinux 中需要一个内核调用,因为 WFC/RFC 是仅限 supervisor 模式的指令。如果任何人有任何想法或评论,我乐意倾听。

注意

摘自一些 ARM 浮点文档,特别是针对 Acorn FPE,但不仅限于此

浮点控制寄存器 (FPCR) 可能只存在于某些实现中:它用于以实现特定的方式控制硬件,例如禁用浮点系统。ARM 的用户模式不允许使用此寄存器(因为在不同实现之间修改它的权利被保留),并且如果尝试在用户模式下使用 WFC 和 RFC 指令,将会触发陷阱。

因此,答案是肯定的,你可以这样做,但如果硬件浮点仿真出现,你将面临被孤立的高风险

—— Russell。