Какая информация содержится в регистре состояния fpu
КАТЕГОРИИ:
Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)
FPU предоставляет восемь регистров для хранения данных и пять вспомогательных регистров.
Регистры данных (R0 – R7) не адресуются по именам, как регистры основного процессора. Вместо этого эти восемь регистров рассматриваются как стек, вершина которого называется ST, а более глубокие элементы — ST(1), ST(2) и так далее до ST(7). Если, например, в какой-то момент времени регистр R5 называется ST (рис. 13), то после записи в этот стек числа оно будет записано в регистр R4, который станет называться ST, R5 станет называться ST(1) и т.д.
Рис. 13. Регистры FPU
К регистрам R0 – R7 нельзя обращаться напрямую, по именам, но если процессор поддерживает расширение ММХ, то мантиссы, находящиеся в этих регистрах, становятся доступны, как ММ0 – ММ7.
Регистр состояний SR содержит слово состояния FPU:
Бит 15: В — занятость FPU — этот флаг существует для совместимости с 8087, и его значение всегда совпадает с ES.
Бит 14: С3 — условный флаг 3.
Биты 13 – 11: ТОР — число от 0 до 7, показывающее, какой из регистров данных R0 – R7 в настоящий момент является вершиной стека.
Бит 10: С2 — условный флаг 2.
Бит 9: С1 — условный флаг 1.
Бит 8: С0 — условный флаг 0.
Бит 7: ES — общий флаг ошибки — равен 1, если произошло хотя бы одно немаскированное исключение.
Бит 6: SF — ошибка стека. Если С1 = 1, произошло переполнение (команда пыталась писать в непустую позицию в стеке), если С1 = 0, произошло антипереполнение (команда пыталась считать число из пустой позиции в стеке).
Бит 5: РЕ — флаг неточного результата — результат не может быть представлен точно.
Бит 4: UE — флаг антипереполнения — результат слишком маленький.
Бит 3: ОЕ — флаг переполнения — результат слишком большой.
Бит 2: ZE — флаг деления на ноль — выполнено деление на ноль.
Бит 1: DE — флаг денормализованного операнда — выполнена операция над денормализованным числом.
Бит 0: IE — флаг недопустимой операции — произошла ошибка стека (SF = 1) или выполнена недопустимая операция.
Биты С0 – С3 употребляются так же, как и биты, состояния в основном процессоре, — их значения отражают результат выполнения предыдущей команды и используются для условных переходов; команды
fstsw ax
sahf
копируют их значения в регистр FLAGS так, что флаг С0 переходит в CF, С2 — в PF, а С3 — в ZF (флаг С2 теряется).
Биты 0 – 5 отражают различные ошибочные ситуации, которые могут возникать при выполнении команд FPU. Они рассмотрены в описании управляющих регистров.
Регистр управления CR:
Биты 15 – 13 — зарезервированы.
Бит 12 «IC» — управление бесконечностью
Биты 11 – 10 «RC» — управление округлением.
Биты 9 – 8 «PC» — управление точностью.
Биты 7 – 6 — зарезервированы.
Бит 5 «РМ» — маска неточного результата.
Бит 4 «UM» — маска антипереполнения.
Бит 3 «ОМ» — маска переполнения.
Бит 2 «ZM» — маска деления на ноль.
Бит 1 «DM» — маска денормализованного операнда.
Бит 0 «IM» — маска недействительной операции.
Биты RC определяют способ округления результатов команд FPU до заданной точности (табл. 10).
Таблица 10. Способы округления
Значение RC | Способ округления |
к ближайшему числу | |
к отрицательной бесконечности | |
к положительной бесконечности | |
к нулю |
Биты PC определяют точность результатов команд FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR и FSQRT (табл. 11).
Таблица 11. Точность результатов
Значение PC | Точность результатов |
одинарная точность (32-битные числа) | |
зарезервировано | |
двойная точность (64-битные числа) | |
расширенная точность (80-битные числа) |
Биты 0 – 5 регистра CR маскируют соответствующие исключения — если маскирующий бит установлен, исключения не происходит, а результат вызвавшей его команды определяется правилами для каждого исключения специально.
Регистр тегов TW содержит восемь пар бит, описывающих содержание каждого регистра данных, — биты 15 – 14 описывают регистр R7, 13 – 12 — R6 и т.д. Если пара бит (тег) равна 11, соответствующий регистр пуст. 00 означает, что регистр содержит число, 01 — ноль, 10 — нечисло, бесконечность, денормализованное число, неподдерживаемое число.
Регистры FIP и FDP содержат адрес последней выполненной команды (кроме FINIT, FCLEX, FLDCW, FSTCW, FSTSW, FSTSWAX, FSTENV, FLDENV, FSAVE, FRSTOR и FWAIT) и адрес ее операнда соответственно и используются в обработчиках исключений для анализа вызвавшей его команды.
Набор команд для работы с плавающей запятой в процессорах Intel достаточно разнообразен, чтобы реализовывать весьма сложные алгоритмы, и прост в использовании. Единственное, что может представлять определенную сложность, — почти все команды FPU по умолчанию работают с его регистрами данных как со стеком, выполняя операцию над числами в ST(0) и ST(1) и помещая результат в ST(0), так что естественной формой записи математических выражений для FPU оказывается обратная польская нотация (RPN). Эта форма записи встречается в программируемых калькуляторах, языке Форт и почти всегда неявно присутствует во всех алгоритмах анализа математических выражений: они сначала преобразовывают обычные выражения в обратные и только потом начинают их анализ. В обратной польской нотации все операторы указываются после своих аргументов, так что sin(x) превращается в х sin, a а+b превращается в a b +. При этом полностью пропадает необходимость использовать скобки, например: выражение (a+b)*7-d записывается как а b + 7 * d -.
Посмотрим, как выражение, записанное в RPN, легко воплощается при помощи команд FPU на примере процедуры вычисления арксинуса.
; asin
; вычисляет арксинус числа, находящегося в st(0) (-1 <= х <= +1)
; по формуле asin(x) = atan(sqrt(x2/(1-x2)))
; (в RPN: x x * x x * 1 — / sqrt atan)
; результат возвращается в st(0), в стеке FPU должно быть
; два свободных регистра
asin proc near ; комментарий показывает содержимое стека FPU:
; первое выражение — ST(0), второе — ST(1) и т.д.
; х (начальное состояние стека)
fld st(0) ; х, х
fmul ; x2
fld st(0) ; х2, х2
fld1 ; 1, x2, x2
fsubr ; 1-х2, x2
fdiv ; x2/(1-x2)
fsqrt ; sqrt(x2/(1-x2))
fld1 ; 1, sqrt(x2/(1-x2))
fpatan ; atan(sqrt(x2/(1-x2)))
ret
asin endp
Вычисление корней квадратного уравнения
roots proc near
fild 4 ; 4
fld a ; a, 4
fld c ; c, a, 4
fmul ; c*a, 4
fmul ; c*a*4
fld b ; b, c*a*4
fld b ; b, b, c*a*4
fmul ; b*b, c*a*4
fsubr ; b*b-c*a*4
fsqrt ; sqrt(b*b-c*a*4)
fstp d ; —
fld b ; b
fild 0 ; 0, b
fsubr ; -b
fld d ; d, -b
fadd ; -b+d
fild 2 ; 2, -b+d
fld a ; a, 2, -b+d
fmul ; 2*a, -b+d
fdivr ; (-b+d)/2*a
fstp x1 ; —
fld d ; d
fld b ; b, d
fild 0 ; 0, b, d
fsubr ; -b, d
fsubr ; -b-d
fild 2 ; 2, -b-d
fld a ; a, 2, -b-d
fmul ; 2*a, -b-d
fdivr ; (-b-d)/2*a
fstp x2 ; —
roots endp
Дата добавления: 2014-01-05; Просмотров: 808; Нарушение авторских прав?
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
Рекомендуемые страницы:
Читайте также:
Общие сведения
Системная архитектура процессоров M-профиля кардинально отличается от таковой в профилях A и R. В частности, формат регистров состояния программы (PSR) во всех трёх профилях совпадает лишь в части, доступной непривилегированному коду.
В отличие от профилей A и R, где большая часть функций управления процессором возложена на регистры сопроцессора CP15, формально не являющегося частью центрального процессора (и вообще отсутствующего у некоторых старых процессорных ядер, например, ARM7TDMI архитектуры ARMv4T), в М-профиле самые важные функции управления возложены на несколько регистров, входящих в состав процессорного ядра и доступных с помощью команд MRS и MSR, а все остальные — на довольно многочисленный набор регистров, отображённых на память по строго определённым адресам и доступных с помощью обычных команд загрузки и сохранения данных. В этом разделе описываются регистры, непосредственно входящие в состав ядра; описания прочих регистров можно найти в разделе «Пространство управления системой в M-профиле» и его подразделах.
Регистры состояния
Документация фирмы ARM делит единый регистр состояния на три части: регистр состояния приложения APSR (application program status register), регистр состояния прерывания IPSR (interrupt program status register) и регистр состояния выполнения программы EPSR (execution program status register). Их формат для архитектуры ARMv8-M приведён на рисунке ниже; отличия для более ранних версий будут описаны далее.
Формат регистров состояния для M-профиля
Регистр APSR содержит биты, которые могут явным образом изменяться непривилегированными программами с помощью команды MSR, а также считываться командой MRS. Назначение этих разрядов будет описано ниже. Биты GE[3:0] реализованы лишь в процессорах, имеющих расширение DSP. Бит Q отсутствует в версии ARMv6-M, а также в версии ARMv8-M без основного расширения.
Регистр IPSR состоит из единственного поля, занимающего разряды 8–0 (фактически оно может иметь меньшее число битов, что зависит от количества различных векторов прерываний, поддерживаемых в конкретной реализации). В режиме потока там всегда находится нуль, а в режиме обработчика — номер (вектор) текущего обрабатываемого прерывания. Если процессор имеет расширение безопасности, то при вызове небезопасной функции из безопасного обработчика в этом поле будет содержаться единица, что не позволит небезопасному коду определить, обработчик какого прерывания в данный момент фактически выполняется.
Привилегированный код может прочитать значение IPSR командой MRS, однако запись в него игнорируется. Документация на ARMv8-M указывает, что значение IPSR может быть изменено через отладочный регистр DCRDR, при этом оно становится неизвестным, однако технически допустимым для данной реализации.
Регистр EPSR включает бит T и поле ICI/IT/ECI, разделённое на две части. При считывании командой MRS все эти биты будут иметь нулевое значение, а попытка записи в них игнорируется.
Бит T отражает текущую используемую систему команд и в процессорах M-профиля всегда должен быть равен единице, поскольку они поддерживают только набор Thumb/Thumb-2 (если он равен нулю, попытка выполнения первой же команды после его сброса приведёт к возникновению прерывания).
Поле ICI/IT/ECI, отсутствующее в версиях ARMv8-M без основного расширения и ARMv6-M, предназначено для хранения состояния выполнения условного блока команд, начинаемого командой IT, либо состояния выполнения прерываемых команд групповой загрузки или сохранения регистров LDM, STM, PUSH и POP, либо команд векторной обработки (последние имеются лишь при наличии расширения MVE). В случае возникновения прерывания сохранённое в стеке значение этого поля используется для продолжения выполнения условного блока или прерываемой команды после возврата из обработчика прерывания.
Ещё один, девятый бит регистра EPSR считается зарезервированным, однако при сохранении регистра состояния в стеке во время входа в обработчик прерывания он устанавливается, если указатель стека (SP) был дополнительно уменьшен на 4 для обеспечения выравнивания на границу двойного слова, и сбрасывается, если дополнительное уменьшение SP не выполнялось. При возврате из обработчика прерывания этот бит анализируется с целью определения того, как именно надо скорректировать SP.
С помощью команд MSR и MRS возможен доступ сразу к двум или всем трём этим регистрам. Это объясняется тем, что физически имеется только один общий регистр состояния, а APSR, IPSR и EPSR являются лишь его представлениями «во внешнем мире». Чтобы указать, к каким именно частям регистра требуется доступ, используются обозначения IAPSR, EAPSR, IEPSR и XPSR (последнее означает одновременное обращение ко всему регистру состояния).
Изменения в регистре состояния, внесённые с помощью команды MSR, вступают в силу немедленно по её завершении.
Флаги условий
Биты N, Z, C и V носят общее название флагов условий или просто флагов. Они характеризуют результат выполнения той или иной операции и могут использоваться для организации переходов и условного выполнения команд.
Флаги условий изменяются командами обработки данных в S-форме, отражая полученный в них результат. Общие правила их модификации приведены в таблице; все исключения и уточнения даются в описаниях команд.
Флаг | Описание |
---|---|
N | Устанавливается равным старшему биту результата операции. В том случае, когда результат трактуется как число со знаком, нулевое значение N будет соответствовать нулевому или положительному результату, единичное — отрицательному |
Z | Устанавливается, если результат операции равен нулю, и сбрасывается в противном случае |
C | Устанавливается или сбрасывается одним из следующих способов:
|
V | Операции сложения и вычитания устанавливают флаг V, если возникло знаковое переполнение (т. е. когда знак результата получается не тем, что должен быть по правилам математики), и сбрасывают V при отсутствии переполнения. Остальные команды, как правило, не изменяют его состояние. Все исключения оговариваются в описании команд |
Помимо изменения состояния с помощью команд обработки данных, флаги могут быть изменены ещё несколькими способами, включая прямую их загрузку командой MSR. Эта загрузка может выполняться как привилегированным, так и непривилегированным кодом.
Флаг Q
Этот флаг является признаком переполнения и/или насыщения, возникшего при выполнении некоторых команд цифровой обработки сигналов. Будучи установленным при наступлении соответствующего события, он остаётся установленным до явного сброса программой.
Как и флаги NZVC, этот бит может прямо изменяться непривилегированным кодом. Он присутствует только в процессорах, поддерживающих соответствующие команды; в частности, его нет ни в одном ядре архитектуры ARMv6-M.
Биты GE[3:0]
Эти биты используются командами набора SIMD и отражают выполнение условия «больше или равно» для отдельных байтов или полуслов результата. Они отсутствуют, если соответствующие команды в процессоре не реализованы (например, в ядрах архитектуры ARMv6-M).
Каждый из этих битов устанавливается в следующих случаях:
- для беззнакового сложения байтов — если результат больше 255;
- для беззнакового сложения полуслов — если результат больше 65535;
- для беззнакового вычитания — если результат больше либо равен нулю;
- для знаковой арифметики — если результат больше либо равен нулю.
Если эти условия не выполняются, соответствующий бит сбрасывается.
Регистры масок
Эти регистры управляют приоритетом кода, выполняемого процессором, а соответственно, возможностью его прерывания.
Версии ARMv8-M с основным расширением и ARMv7-M имеют три регистра — основной маски прерываний PRIMASK, маски отказов FAULTMASK и базового приоритета BASEPRI. В версиях ARMv8-M без основного расширения и ARMv6-M присутствует только первый регистр, два других отсутствуют, что эквивалентно наличию в них нулевых значений.
Если процессор имеет расширение безопасности, то у каждого из двух режимов безопасности имеются свои регистры масок.
Формат регистров масок показан на рисунке.
Формат регистров масок для M-профиля
Подробно влияние этих регистров на обработку прерываний описывается в соответствующем разделе, здесь же приведены лишь краткие сведения.
В регистре PRIMASK используется только младший бит, PM. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до 0, из-за чего он может быть прерван только тяжёлым отказом (HardFault), немаскируемым прерыванием (NMI) или сбросом.
В регистре FAULTMASK используется тоже только младший бит, FM. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до –1, и он может быть прерван только NMI или сбросом. Он может быть установлен лишь при текущем уровне приоритета, численно равным или большим нуля; попытка установить этот бит в обработчике HardFault или NMI игнорируется. Возврат из любого прерывания, кроме NMI, сбрасывает этот бит.
Регистр BASEPRI содержит одноимённое поле, которое позволяет повысить приоритет текущего выполняемого кода и тем самым повлиять на способность прерываний вытеснить его с процессора. В отличие от маски PM, поле BASEPRI не запрещает прерывания полностью, а лишь поднимает «верхнюю планку» приоритета. Значение в BASEPRI влияет на текущий приоритет выполнения лишь в случае, если оно численно меньше, чем собственный приоритет текущего выполняющегося обработчика (т. е. нельзя понизить приоритет кода ниже его собственного уровня), при этом значение 0 используется как индикатор того, что повышение приоритета с помощью BASEPRI отключено.
Размер регистра BASEPRI зависит от реализации и может достигать 8 битов. Их количество равно числу разрядов приоритета прерывания, обеспечиваемому данной реализацией.
Для обращения ко всем этим регистрам используются команды MSR и MRS. Кроме того, биты PM и FM могут устанавливаться и сбрасываться командой CPS. Попытки изменения этих регистров непривилегированным кодом игнорируются.
Если команда MSR или CPS используется для повышения (численно — понижения) текущего приоритета выполнения, новый приоритет вступает в силу сразу по завершении выполнения этой команды. Если же она применяется для понижения текущего приоритета, новый приоритет гарантированно вступит в силу лишь после выполнения команды ISB либо при входе или выходе из обработчика прерывания.
Команда MSR, осуществляющая запись в BASEPRI, имеет два варанта. Первый всегда записывает новое значение, а второй — лишь в случае, если новое значение численно меньше старого либо если старое значение BASEPRI равно нулю (т. е. в случае, если запись повышает текущий приоритет выполнения).
При сбросе во все три регистра масок заносятся нули.
Регистр CONTROL
Регистр CONTROL содержит следующие биты:
- Биты 31—4 не используются и должны быть равны нулю.
- Бит 3, SFPA (secure floating-point active), установлен, если регистры FPU содержат новую информацию, сформированную при работе в безопасном режиме, и сброшен, если такой информации в них нет.
При считывании регистра CONTROL в небезопасном режиме этот бит всегда содержит 0; попытка записи в него в этом режиме игнорируется.
Этот бит реализован лишь в процессорах, имеющих FPU и расширение безопасности.
- Бит 2, FPCA (floating-point context active), установлен, если в текущем контексте исполнения FPU использовался, и сброшен в противном случае. Установленное состояние данного бита означает, что при сохранении контекста в момент вызова обработчика прерывания необходимо выделить место под сохранение состояния FPU и, возможно, фактически сохранить его состояние.
Если бит NSACR.CP10 сброшен, в небезопасном режиме возможно только считывание состояния этого бита.
Когда разрешено автоматическое сохранение контекста FPU (установлен бит FPCCR.ASPEN), бит FPCA устанавливается при успешном выполнении любой команды с плавающей запятой.
Этот бит реализован лишь в процессорах, имеющих FPU.
- Бит 1, SPSEL, выбирает текущий используемый стек. Когда он равен нулю, используется основной стек (его указатель находится в регистре SP_main, или MSP), когда равен единице — стек процесса (указатель в SP_process, или PSP). Последнее возможно только при работе процессора в режиме потока; в режиме обработчика этот бит должен быть равен нулю. Явная запись (командой MSR) в этот разряд в режиме обработчика игнорируется, однако он неявно загружается при выполнении возврата из обработчика прерывания.
При наличии расширения безопасности бит SPSEL существует в двух экземплярах: для безопасного и небезопасного режимов.
- Бит 0, nPRIV, определяет привилегированность кода, выполняемого процессором в режиме потока. Когда он равен нулю, выполняется привилегированный код, когда равен единице — непривилегированный. В режиме обработчика всегда выполняется привилегированный код независимо от состояния этого разряда.
Если процессор архитектуры ARMv6-M либо ARMv8-M без основного расширения не поддерживает непривилегированное исполнение, этот разряд всегда будет равен нулю, а запись в него игнорируется.
При наличии расширения безопасности бит nPRIV существует в двух экземплярах: для безопасного и небезопасного режимов.
При сбросе все биты регистра CONTROL обнуляются. При входе в обработчик прерывания биты SPSEL, FPCA и SFPA обнуляются. При возврате из обработчика прерывания бит FPCA изменяется в соответствии со значением кода EXC_RETURN.
Для того, чтобы изменения в регистре CONTROL гарантированно возымели эффект, необходимо обеспечить синхронизацию изменения состояния.
Регистры предела стека
В архитектуре ARMv8-M с основным расширением имеются регистры предела стека MSPLIM и PSPLIM, содержащие минимально допустимые значения для указателей стека (MSP и PSP соответственно). Если при этом имеется расширение безопасности, каждый из режимов безопасности имеет свой набор регистров предела стека.
В архитектуре ARMv8-M без основного расширения и без расширения безопасности регистры предела стека отсутствуют; их нет и в более старых версиях архитектуры. В архитектуре ARMv8-M без основного расширения, но с расширением безопасности имеются регистры предела стека для безопасного режима, однако небезопасный режим их не имеет.
Два младших бита этих регистров всегда равны нулю, остальные могут изменяться привилегированным кодом. При сбросе эти регистры обнуляются.
Проверка на выход за пределы стека выполняется в следующих случаях:
- при входе в обработчик прерывания;
- при сцеплении прерываний, если при этом происходит переход от безопасного к небезопасному обработчику;
- при вызове небезопасной функции из безопасного кода;
- при выполнении многих команд, оперирующих указателем стека. Однако здесь имеются следующие исключения:
- команда MSR, изменяющая SP_NS, выполняет проверку предела стека, однако эта же команда, меняющая регистр предела стека или иной указатель стека, не выполняет проверку предела;
- команда LDR, обновляющая базовый регистр, выполняет проверку предела стека, если SP выступает в роли базового регистра. Однако она не выполняет проверку, если SP является регистром, принимающим загружаемое из памяти значение;
- ряд команд, способных изменить значение указателя стека (как минимум, обычные команды арифметико-логической обработки данных, где SP может быть указан в качестве приёмника результата наряду с любым другим регистром общего назначения), могут выполнять или не выполнять проверку предела стека в зависимости от особенностей реализации. Заметим, что специализированные версии команд ADD и SUB, специально предназначенные для изменения SP, осуществляют проверку на выход за пределы стека;
- команда (например, STR), осуществляющая запись ниже границы стека и одновременно модифицирующая указатель стека таким образом, что он становится допустимым (т. е. увеличивающая его значение), может вызывать или не вызывать прерывание.
Если обнаруживается нарушение предела стека, возникает прерывание UsageFault (HardFault в случае процессора без основного расширения). Запись в ячейки стека, лежащие ниже предела (т. е. запись в которые с использованием указателя стека запрещена), не производится. Если операция, вызывающая выход за пределы стека, должна осуществить запись в ячейки стека, лежащие выше его предела (т. е. формально доступные для записи), нельзя предсказать, будет ли эта запись выполнена. В случае, если нарушение возникло при входе в обработчик прерывания или при сцеплении прерываний, значение указателя стека будет установлено равным пределу стека.
Бит STKOFHFNMIGN регистра CCR позволяет заблокировать проверку выхода за пределы стека для кода, выполняющегося с отрицательным приоритетом (т. е. для обработчиков HardFault и NMI).
Регистр VPR
Регистр VPR (vector predication status and control register) появился в архитектуре ARMv8.1-M с поддержкой MVE.
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA
, если не указано иное.