У меня есть пара 32-битных поплавков, хранящихся в eax и ecx. Могу ли я напрямую загрузить их в FPU для работы с ними, без предварительного хранения в памяти? Это значительно упростило бы некоторый код компилятора, но fld
, похоже, сможет работать только с памятью.Добавить 32-битные поплавки в регистры eax/ecx?
1
A
ответ
5
Нет, вы не можете этого сделать. Что касается генерации кода идет, вы можете моделировать fld r32
достаточно легко с помощью следующей последовательности, например (оптимизированный для размера;)):
push r32
fld [esp]
pop r32
Рассмотрите возможность использования SSE если таковая имеется, которая делает предлагают прямые ходы GPR-на-XMM используя инструкцию movd
. Добавление двух регистров может выглядеть примерно так:
movd xmm0, eax
movd xmm1, ecx
addss xmm0, xmm1
Если вам нужен результат в GPR, вы можете переместить его обратно, используя другой movd
.
Нет, вы не можете. Что касается кода компилятора, я сомневаюсь, что это имеет существенное значение, если вам нужно пройти через память. Вы можете легко имитировать 'fld r32' (' push r32; fld [esp]; pop r32'). В любом случае, рассмотрите возможность использования SSE, если он доступен. – Jester
@Jester Я открыт для использования SSE, каков будет эквивалентный код SSE для этого примера push-fld-pop? – Rotten194
Вы можете напрямую перейти к регистру SSE, используя инструкцию MOVD. Вы можете сделать «movd xmm0, eax; movd xmm1, ecx; addss xmm0, xmm1; 'затем, при необходимости, вернуться назад. Конечно, вы могли бы использовать xmm-регистры для ваших поплавков вообще :) – Jester