See Mips run 之 浮點支援

2021-07-02 20:03:49 字數 2585 閱讀 1032

一般來說,若要支援浮點,必須支援ieee745, ieee745主要規定了:

結果的捨入和精度,4種選項

什麼時候乙個結果被看作是異常:除以0或負數平方根或其他等。。

當乙個操作產生異常結果時採取的動作:使用者讓計算中斷並發出訊號 或者 不想讓使用者知道給出乙個規定的值。

包括指數,尾數和符號位。例如,mips單精度和雙精度儲存結構如下:

支援浮點計算一般有兩種方法:

ieee異常處理

浮點協處理器擁有專門的浮點暫存器和浮點流水線,對於產生ieee異常結果時,協處理器可以選擇:

這樣會導致停止整個流水線

這要求在去指令的時決定是否自陷。自陷的結果一般交給軟體實現的自陷處理程式處理(實際上就是異常處理程式)或者產生預設的結果(例如溢位異常會產生乙個無窮大的值)

浮點協處理器暫存器

指令集

匯程式設計序需要考慮時序問題:

修改浮點協處理器的控制暫存器和狀態暫存器時,會影響浮點流水線的結果。一般在ctc1之後加上一兩條nop

浮點和通用暫存器之間的資料傳送完成的時間比較晚,因此後續的指令要使用傳送的結果需要等待

浮點暫存器載入和整數載入一樣慢,後面緊跟的指令不能立即使用剛載入的值

測試指令和分支,條件分支不能緊跟測試指令之後

現代mips fpu常常是完全流水線化的,允許每個始終啟動乙個心的浮點乘法、加法或者乘加計算,但是如果你要在下乙個指令使用某天指令的結果的花,就會讓程式停下來等待。對於浮點來說,乘法和加減法一樣快。一般將除法轉換為乘法進行加速。

即需初始化和使能

fpu使能後,在中斷和上下文切換時需要儲存和恢復浮點暫存器。所以:

新任務預設禁止浮點(這樣不需要儲存和恢復浮點暫存器)

當發生cu1不可用的自陷時,表示該任務為浮點使用者,返回之前使能浮點。

當處於核心態或中斷例程直接間接呼叫的軟體中,禁止浮點(這樣可以避免中斷時儲存浮點暫存器)

應當用你選用的捨入模式和自陷使能設定控制/狀態暫存器。

即需初始化和使能一般發生在程序切換。

在程序第一次使用浮點部件的時候,由於浮點部件預設是不可用的,因此會產生浮點部件不可用異常,異常檢查程序是否是第一次使用,如果是第一次使用則初始化task_struct ,thread_info等結構體相應的標識,並開啟浮點部件。

在程序切換的時候檢查程序是否使用了浮點部件(即檢查上述初始化的標識),如果沒使用則不儲存,否則儲存現場並關閉浮點部件。

浮點現場恢復並不是在程序切換的時候,而是在程序切換後第一次使用浮點部件的時候。因為程序切換後浮點部件一定是關閉的。(原因是浮點部件預設關閉,而且即使前乙個程序開啟了浮點部件,切換時也會關閉)。在第一次使用時會產生浮點部件不可用例外,例外檢查到程序不是第一次使用浮點部件則恢復浮點部件現場,並開啟浮點部件。

浮點**

對於不支援浮點協處理器來說,一般通過軟體浮點庫或者自陷**程式支援浮點計算

軟浮點:計算操作使用庫函式實現,資料傳送載入儲存使用和整數一樣的方式處理

自陷和**:硬體檢測到浮點指令而發生自陷

不管是那種方式,**比硬體實現要慢50-300倍

mips浮點相關編譯選項

-mfp32

assume that floating-point registers are 32 bits wide.

假定浮點暫存器32bit.

-mfp64

assume that floating-point registers are 64 bits wide.

假定浮點暫存器64bit.

-mhard-float

use floating-point coprocessor instructions. 使用浮點協處理器指令.

-msoft-float

do not use floating-point coprocessor instructions. implement floating-point calculations using library calls instead. 

不時用浮點協處理器指令. 而使用浮點庫.

-msingle-float

assume that the floating-point coprocessor only supports single-precision operations.

設定浮點協處理器只支援單精度操作.

-mdouble-float

assume that the floating-point coprocessor supports double-precision operations. this is the default. 雙精度操作.

ADS 支援浮點。

最近在忙畢業設計,2410的相關驅動,a d驅動操作要用到浮點操作,串列埠列印需要支援float,ads裡面c編譯器相關設定支援了浮點,可是就是用在板子上面執行的時候會遇到資料異常。為什麼呢?看了別人的 串列埠列印uart printf的實現,我和他們的一樣,為什麼別人的可以。奇怪了。最後在網上找了...

工具鏈浮點支援

mipse linux gnu gcc help mipse linux gnu gcc target help grep float 輸出結果如下 mdouble float allow hardware floating point instructions to mfp32 use 32 bi...

linux kernel對於浮點運算的支援

一 對於帶fpu的處理器 1 對於linux kernel來說,kernel本身編譯預設使用了 msoft float選項,預設編譯為軟浮點程式,軟浮點含義是有gcc編譯器模擬浮點運算 glibc庫提供 將 浮點運算 替換為定點運算。二 對於不帶fpu處理器 1 對於linux kernel來說,編...