當前狀態

以下描述了 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 提供,或此發行版中的模組)來替換核心內建模擬器的功能。