待办事项清单¶
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 硬件实现的,而是由浮点支持代码处理的。它们应该在未来版本中实现。
有几种方法可以实现这些。一种方法是为这些例程使用精确的表格方法。我有以色列海法 IBM 研究实验室的 S. Gal 的几篇论文,这些论文似乎保证了极高的精度(大约 99.8%)和合理的速度。这些方法在 GLIBC 中用于某些超越函数。
另一种方法,我知之甚少,是 CORDIC。这是坐标旋转数字计算机的缩写,是一种主要使用移位和加法以及少量乘法和除法计算超越函数的方法。ARM 在移位和加法方面表现出色,因此这种方法可能很有希望,但需要更多研究来确定其是否可行。
舍入方法¶
IEEE 标准定义了 4 种舍入模式。舍入到最近是默认值,但也允许舍入到 + 或 - 无穷大或舍入到零。许多架构允许通过修改控制寄存器中的位来指定舍入模式。ARM FPA11 架构并非如此。要更改舍入模式,必须在每条指令中指定它。
这使得移植某些基准测试变得困难。可以将这种能力引入到模拟器中。FPCR 包含描述舍入模式的位。可以更改模拟器以检查一个标志,如果设置该标志,则强制其忽略指令中的舍入模式,并使用 FPCR 中的位指定的模式。
这将需要一种获取/设置标志和 FPCR 中的位的方法。这需要在 ArmLinux 中进行内核调用,因为 WFC/RFC 是仅限管理员的指令。如果有人有任何想法或意见,我很乐意听取。
- 注意
从一些关于 ARM 浮点的文档中提取出来,特别是针对 Acorn FPE,但不仅限于它
浮点控制寄存器 (FPCR) 可能仅存在于某些实现中:它用于以特定于实现的方式控制硬件,例如禁用浮点系统。不允许 ARM 的用户模式使用此寄存器(因为保留了在实现之间更改它的权利),如果在用户模式下尝试,WFC 和 RFC 指令将陷入陷阱。
因此,答案是肯定的,你可以这样做,但是如果硬件浮点仿真出来,你将面临很高的被隔离的风险
-- Russell.