Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
FPREM
Влияние команды на флаги и форматы команды:
* |
* |
* |
|
|
* |
|
D9 F8 |
FPREM |
ST(0) = остаток от деления ST(0) на ST(1) |
8087 |
fprem |
Описание:
Команда FPREM вычисляет остаток, получаемый от деления ST на ST(1), и помещает результат в ST. Знак остатка такой же, как и знак исходного делимого в ST.
FPREM всегда возвращает точный результат; исключения никогда #P не происходит, управление округлением не влияет на результат.
FPREM работает методом итерационного вычитания и может уменьшить показатель степени ST не более чем на 63 за одно свое выполнение. Если в процессе выполнения FPREM получается остаток меньший чем входное значение в ST(1), то функция считается выполненной и флаг C2 очищается. В противном случае, флаг C2 устанавливается, а результат в ST называется неполным остатком. Показатель степени неполного остатка меньше, чем показатель степени исходного делимого, по крайней мере на 32. Программа может перезапускать команду (используя неполный остаток в ST как делимое), пока флаг C2 не будет очищен.
В таблице 6.169. приведены значения, возвращаемые командой FPREM для различных классов операндов.
Таблица 6.169. Значения, возвращаемые командой FPREM для различных классов операндов
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 или представлен в неподдерживаемом формате.
Важный случай использования команды FPREM — это уменьшение аргументов периодических функций. Когда уменьшение выполнено, три наименее значащих бита частного сохраняются во флагах C3, C1, C0 регистра SW. Флаг C1 также устанавливается равным 0 в случае возникновения стековой ошибки #IS.
Операция:
EXPDIF = exponent(ST) - exponent(ST(1));
IF EXPDIF < 64
THEN
Q = Целое, получаемое округлением 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;
Замечание:
Команда FPREM не является операцией вычисления остатка по стандарту IEEE-754. Необходимо использовать команду FPREM1 для нахождения такого рода остатка. FPREM поддерживается для совместимости с математическими сопроцессорами 8087, 80287.
На процессорах, поддерживающих стандарт IEEE-754 (Intel387, Intel486, …) операция над денормализованными операндами может привести к исключению #U. На математических сопроцессорах Intel287 и 8087, не отвечающих стандарту IEEE-754, возникновение #U в этом случае невозможно, операция над денормализованными операндами приводит к исключению #IA. Изменение обработчика исключения #U может потребоваться, только если необходимо по разному обрабатывать различные коды операций.
Биты C3, C1, C0 в слове состояния в процессорах Intel387, Intel486,… корректно отражают три младших бита частного. В сопроцессорах Intel287 и 8087 биты частного некорректны, когда выполняется понижение аргументов, равных 64N+M, где N³1 и M=1 или M=2.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru