Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
FPREM1
Влияние команды на флаги и форматы команды:
* |
* |
* |
|
|
* |
|
D9 F5 |
FPREM1 |
ST(0) = остаток от деления ST(0) на ST(1) по стандарту IEEE-754 |
Intel387 |
fprem1 |
Описание:
Команда FPREM1 вычисляет остаток, получаемый при делении ST на ST(1), и оставляет результат в ST.
Команда FPREM1 является операцией вычисления остатка по стандарту IEEE-754. Она отличается от FPREM методом округления частного, когда разница показателей степени ST и ST(1) меньше 64 (смотрите пункт "Операция").
FPREM1 всегда возвращает точный результат; исключения никогда #P не происходит, управление округлением не влияет на результат.
FPREM1 работает методом итерационного вычитания и может уменьшить показатель степени ST не более чем на 63 за одно свое выполнение. Если в процессе выполнения FPREM1 получается остаток меньший чем входное значение в ST(1), то функция считается выполненной и флаг C2 очищается. В противном случае, флаг C2 устанавливается, а результат в ST называется неполным остатком. Показатель степени неполного остатка меньше, чем показатель степени исходного делимого, по крайней мере на 32. Программа может перезапускать команду (используя неполный остаток в ST как делимое), пока флаг C2 не будет очищен.
В таблице 6.171. приведены значения, возвращаемые командой FPREM1 для различных классов операндов.
Таблица 6.171. Значения, возвращаемые командой FPREM1 для различных классов операндов
SRCDEST |
-INF |
-F |
-0 |
+0 |
+F |
+INF |
NaN |
-INF |
#IA |
#IA |
#IA |
#IA |
#IA |
#IA |
NaN |
-F |
ST(0) |
±F или -0 |
#Z |
#Z |
±F или -0 |
ST(0) |
NaN |
-0 |
-0 |
-0 |
#IA |
#IA |
-0 |
-0 |
NaN |
+0 |
+0 |
+0 |
#IA |
#IA |
+0 |
+0 |
NaN |
+F |
ST(0) |
±F или +0 |
#Z |
#Z |
±F или +0 |
ST(0) |
NaN |
+INF |
#IA |
#IA |
#IA |
#IA |
#IA |
#IA |
NaN |
NaN |
NaN |
NaN |
NaN |
NaN |
NaN |
NaN |
NaN |
F - Конечное вещественное значение |
Исключение #IA также возникает, если любой из операндов SNaN или представлен в неподдерживаемом формате.
Важный случай использования команды FPREM1 — это уменьшение аргументов периодических функций. Когда уменьшение выполнено, три наименее значащих бита частного сохраняются во флагах C3, C1, C0 регистра SW. Флаг C1 также устанавливается равным 0 в случае возникновения стековой ошибки #IS.
Операция:
EXPDIF = exponent(ST) - exponent(ST(1));
IF EXPDIF < 64
THEN
QQ = Целое, получаемое округлением ST / ST(1);
(* к ближайшему целому или к ближайшему четному целому, если результат точно по середине между двумя числами *)
ST = ST - (ST(1) * Q);
C2 = 0;
C0, C1, C3 = Три младших бита Q; (* Q2, Q1, Q0 *)
ELSE
C2 = 1;
N = Число между 32 и 63;
QQ = Целое, получаемое округлением (ST / ST(1)) / 2EXPDIF-N в сторону нуля;
ST = ST - (ST(1) * QQ * 2EXPDIF-N;
FI;
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru