2014-11-24 4 views
1

У меня есть пара 32-битных поплавков, хранящихся в eax и ecx. Могу ли я напрямую загрузить их в FPU для работы с ними, без предварительного хранения в памяти? Это значительно упростило бы некоторый код компилятора, но fld, похоже, сможет работать только с памятью.Добавить 32-битные поплавки в регистры eax/ecx?

+1

Нет, вы не можете. Что касается кода компилятора, я сомневаюсь, что это имеет существенное значение, если вам нужно пройти через память. Вы можете легко имитировать 'fld r32' (' push r32; fld [esp]; pop r32'). В любом случае, рассмотрите возможность использования SSE, если он доступен. – Jester

+0

@Jester Я открыт для использования SSE, каков будет эквивалентный код SSE для этого примера push-fld-pop? – Rotten194

+0

Вы можете напрямую перейти к регистру SSE, используя инструкцию MOVD. Вы можете сделать «movd xmm0, eax; movd xmm1, ecx; addss xmm0, xmm1; 'затем, при необходимости, вернуться назад. Конечно, вы могли бы использовать xmm-регистры для ваших поплавков вообще :) – Jester

ответ

5

Нет, вы не можете этого сделать. Что касается генерации кода идет, вы можете моделировать fld r32 достаточно легко с помощью следующей последовательности, например (оптимизированный для размера;)):

push r32 
fld [esp] 
pop r32 

Рассмотрите возможность использования SSE если таковая имеется, которая делает предлагают прямые ходы GPR-на-XMM используя инструкцию movd. Добавление двух регистров может выглядеть примерно так:

movd xmm0, eax 
movd xmm1, ecx 
addss xmm0, xmm1 

Если вам нужен результат в GPR, вы можете переместить его обратно, используя другой movd.

 Смежные вопросы

  • Нет связанных вопросов^_^