操作碼 |
指令 |
說明 |
0F,AE,/2 |
LDMXCSR m32 |
從 m32 載入“數據流單指令多數據擴充套件指令集”控制/狀態字。 |
MXCSR 控制/狀態暫存器用於啟用掩碼/無掩碼異常處理、設定取整模式、設定清除為零模式以及檢視異常狀態標誌。下圖顯示 MXCSR 中各個欄位的格式與編碼:
31-16 |
15 |
|
|
|
|
10 |
|
|
|
|
5 |
|
|
|
|
0 |
保留 |
FZ |
RC |
RC |
PM |
UM |
OM |
ZM |
DM |
IM |
保留 |
PE |
UE |
OE |
ZE |
DE |
IE |
復位時 MXCSR 的預設值是 0x1f80。
位 5-0 表示是否檢測到“數據流單指令多數據擴充套件指令集”異常。它們是“粘性”標誌,可以通過使用 LDMXCSR 指令向這些欄位寫入零加以清除。如果 LDMXCSR 指令清除掩碼位並設定相應的異常標誌位,則不會立即產生異常。僅當執行下一條會導致此類異常的“數據流單指令多數據擴充套件指令集”指令時,才會發生異常。“數據流單指令多數據擴充套件指令集”對於每個異常僅使用一個異常標誌。對於壓縮數據型別中的異常,不提供單獨的報告。在相同的指令中發生多個完全相同的異常情況下,將更新關聯的異常標誌,以指出至少發生其中一種情況。復位時這些標誌都將清除。
位 12-7 配置數值異常掩碼。如果設定異常型別對應的位,則遮蔽該異常型別;如果該位清除,則取消掩碼。復位時將設定這些啟用位,表示遮蔽所有數值異常。
位 14-13 給取整控制編碼,提供普通就近模式的取整、定向取整以及截尾取整。取整控制影響算術指令與某些轉換指令。RC 的編碼如下所示:
取整模式 |
RC 欄位 |
說明 |
就近取整(偶數) |
00B |
取整結果最接近無限精確的結果。如果兩個值近似,則結果是偶數值(即最低有效位為零的值)。 |
向下取整(向負無窮大) |
01B |
取整結果接近但不大於無限精確的結果 |
向上取整(向正無窮大) |
10B |
取整結果接近但不小於無限精確的結果 |
向零取整(截斷) |
11B |
取整結果的絕對值接近但不大於無限精確的結果。 |
復位時取整控制設定為就近取整。
位 15 (FZ) 用於打開“清除為零”模式(位設定為 1)。發生下溢時,打開“清除為零”模式時具有以下效果:
返回結果零與正確結果的符號
設定精度與下溢異常標誌
IEEE 規定的下溢掩碼響應是傳遞非規格化結果(即逐漸下溢);因此“清除為零”模式與 IEEE 754 標準不相容。提供它主要是出於效能方面的考慮。在經常發生下溢的應用程式中,稍微損失一點精度可以換來更快的執行速度。取消下溢異常掩碼的優先順序高於“清除為零”模式。這種安排表示,不論是否啟用“清除為零”,在取消下溢異常的掩碼時,處理器都會為產生下溢情況的“數據流單指令多數據擴充套件指令集”指令啟用異常處理程式。
MXCSR 的其它位(位 31-16 與位 6)定義為保留位並處于清除狀態;試圖使用 FXRSTOR 或 LDMXCSR 指令向這些位寫入非零值,將導致一般保護性異常。
線性地址對應于引用的記憶體數據的最低有效位元組。
MXCSR m32;
_mm_setcsr(unsigned int i)
將控制暫存器設定為指定的值。
一般保護性錯誤 - 如果將非零值載入到保留位。
無。
#GP(0) - CS、DS、ES、FS 或 GS 段中的記憶體運算元有效地址非法。
#SS(0) - SS 段中的地址非法。
#PF(錯誤程式碼) - 頁錯誤。
#UD - 如果 CR0.EM 1。
#NM - 如果 CR0 中的 TS 位設定為 1。
#AC - 未對齊的記憶體引用。要啟用 #AC 異常,必須滿足三個條件(CR0.AM 設定為 1;EFLAGS.AC 設定為 1;目前的 CPL 是 3)。#UD - 如果 CR4.OSFXSR(位 9) 0。 #UD - 如果 CPUID.XMM(EDX 位 25) 0。
中斷 13 - 如果運算元的任何部分出現在從 0 到 0FFFFH 的有效地址空間之外。
#UD - 如果 CR0.EM 1。
#NM - 如果 CR0 中的 TS 位設定為 1。
#UD - 如果 CR4.OSFXSR(位 9) 0。 #UD 如果 CPUID.XMM(EDX 位 25) 0。
與“實地址模式”中的異常相同。
#PF(錯誤程式碼) - 頁錯誤。
#AC - 未對齊的記憶體引用。
配合 Repeat 字首 (F3H) 使用 LDMXCSR 屬於保留用法。不同的處理器版本處理此字首的方式可能會有所不同。配合此字首使用 LDMXCSR 可能會同將來的處理器不相容。