Я думаю, что вы действительно хотите это для Инструкции с длинной задержкой , где movd
/ movq
+ sqrtss
или sqrtsd
работает легче, чем ?? -> fsqrt.
Соединение целочисленной зависимости в зависимость x87 можно выполнить с помощью fcmovcc
через целочисленные флаги вместо передачи битового шаблона. На Skylake это инструкция с 4 мопами, но это 4 ALU мопс.
В другом направлении fcomi
+ setcc
или cmovcc
или даже просто fcom
+fnstsw ax
.
Как указывает @Hadi, вы можете создавать значения в регистрах x87 с fldz
(1 моп) или fld1
(2 моп). Затем сделайте это зависимым от того, что вы хотите, используя fcmovne st0, st1
или аналогичный.
Возможный ответ, не совсем изученный, поскольку он вряд ли будет полезен для вас (возможно, с микрокодированием emms
: 10 мопов на Skylake, 31 моп на Haswell.)
Возможно, вы можете использовать movq mm0, rax
, а затем emms
, чтобы выйти из состояния MMX . Это помечает все теги регистра x87 как «пустые».
На текущем AMD FEMMS идентична EMMS, согласно Справочному руководству по ISA PDF от ISA 2018-го мая , но я, кажется, напоминаюсчитая, что FEMMS на более старых процессорах AMD оставили регистры x87 неопределенными. Может быть, это пригодится для чего-то. Он по-прежнему устанавливает слова тега, поэтому неопределенное содержимое, вероятно, относится только к случаям, которые, возможно, ожидали найти содержимое mm0..7
, все еще находящееся там после EMMS, и затем запустить другую инструкцию MMX. Или найти данные в состоянии fxsave
.
64-разрядный MMX регистрирует псевдонимы значимостей (мантисс) 80-разрядных регистров x87. (я думаю). Стек st0..7
отображается на те базовые 80-битные регистры, которые начинаются с того, который проиндексирован 3-битным полем TOP в слове состояния x87. (http://www.ray.masmcode.com/tutorial/fpuchap1.htm хорошо описывает это по аналогии с револьверным стволом).
Я не уверен, действительно ли это можно использовать, но я не думаю, что emms
очищает mm
/Содержимое регистра, только теги x87. ( Запись Intel vol.2 для emms
говорит: «Устанавливает пустые значения всех тегов в слове тега x87 FPU (все 1 с)»
Если плавающее-точечная инструкция загружает один из регистров в стеке регистров данных x87 FPU до того, как слово метки x87 FPU было сброшено инструкцией EMMS, может произойти переполнение стека регистров x87, что приведет к исключению с плавающей точкой x87 илиневерный результат.
Он говорит только "может", а не "будет". Возможно, с метаданными x87 в известном состоянии вы можете смешивать инструкции MMX и инструкции x87 с некоторым согласованным поведением? по крайней мере, для конкретной микроархитектуры.
Вы не можете прочитать регистр x87, у которого слово тега 11
(имеется в виду пустое), и funfree
нет, просто ffree
дляустановите для одного слова тега значение 11
(без влияния на указатель на верхнюю часть стека или его содержимое).
Вам потребуется fstenv
и изменить слово тега в сохраненных метаданных состояния x87 (28 байт в том числезаполнение в 32/64-битном режиме), затем fldenv
.
. Или вы можете иметь готовую предустановленную среду x87 для fldenv
с некоторыми словами тега, установленными на not-в использовании. (Но Agner Fog даже не рассчитывает время этой инструкции. Очевидно, что она будет микрокодирована и, вероятно, медленна.) Вы могли бы использовать ее без emms
, но это все еще одна микрокодированная инструкция.
related: Запрос о наследии 3DNow! набор инструкций имеет несколько ссылок, которые я недавно выкопал о femms
и как мало 3dNow! может взаимодействовать с SSE. Хм, по-видимому, он по-прежнему устанавливает для слова тега все неиспользованные, но не сохраняет известное отображение между регистрами mm0..7
и x87.