操作碼 |
指令 |
說明 |
D9 FD |
FSCALE |
按 ST(1) 縮放 ST(0)。 |
將源運算元中的值截斷(向 0)為整數值,然後將該值加到目標運算元的指數上。目標運算元與源運算元是分別位於暫存器 ST(0) 與 ST(1) 的浮點值。此指令提供快速乘以或除以 2 的整數次冪的方法。下表顯示縮放各類數值時得到的結果(假設未發生上溢或下溢)。
F 表示有限實數。N 表示整數。
大多數情況下,只更改指數,底數(有效位)保持不變。不過,ST(0) 中縮放的值是非規格化值時,底數也會發生改變,結果可能會是規格化數。類似地,如果縮放操作發生上溢或下溢,產生的底數將與源運算元的底數不同。
FSCALE 指令也可以用於執行 FXTRACT 指令的逆操作,如下例所示:
FXTRACT;
FSCALE;
FSTP ST(1);
在本例中,FXTRACT 指令從 ST(0) 的值中提取有效位與指數,將它們分別儲存到 ST(0) 與 ST(1)。接著,FSCALE 指令按 ST(1) 中的指數縮放 ST(0) 中的有效位,重新產生執行 FXTRACT 操作之前的原始值。FSTP ST(1) 指令使用重新產生的值覆蓋指數(由 FXTRACT 指令提取),只佔用一個暫存器 [ST(0)] 就將堆疊恢復到原始狀態。
ST(0)<-- ST(0) * 2RoundTowardZero(ST(1));
C1 - 如果發生堆疊下溢,則設定為 0。如果產生不精確的結果異常 (#P),則表示取整方向:
0 非向上取整;1 向上取整。
C0、C2、C3 - 未定義。
#IS - 發生堆疊下溢。
#IA - 源運算元是 SNaN 值或不支援的格式。
#D - 源運算元是非規格化值。
#U - 結果對於目標格式而言太小。
#O - 結果對於目標格式而言太大。
#P - 值無法按目標格式精確表示。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。