待辦事項列表¶
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。