Перейти к содержанию

Ассемблер СЕ - как быстрее integer перевести во float?


Рекомендуемые сообщения

Собственно вопрос в названии темы.

1. Могу я допустим записать просто так:

i: dd 0mov i, dword ptr [eax+08] // Допустим в [eax+08] лежит integer значениеmov [eax+04],(float)i     // А в [eax+04] нужно записать это значение во float.

2. Если нет, то как правильно?

3. Если да, то могу ли я использовать вместо i регистр? Допустим так: 

push ebxmov ebx, dword ptr [eax+08] // Допустим в [eax+08] лежит integer значениеmov [eax+04],(float)ebx     // А в [eax+04] нужно записать это значение во float.pop ebx

4. Если да, то может есть всё-таки короче запись.

Ссылка на комментарий
Поделиться на другие сайты

Привет! Если я не ошибаюсь, то:
fild [eax+8] ; Грузим значение в ST(0), конвертируя его во floatfistp [eax+4] ; Выгружаем из ST(0), конвертируя в int, выталкивая заодно это значение из FPU-стэка

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

keng, Большой СЕНК!!!

Т.е. для моего случая, который я описал нужно будет сделать так:

fild [eax+08] // Допустим в [eax+08] лежит integer значение, переводим его во floatfstp [eax+04] // А в [eax+04] нужно записать это значение во float. Просто выгружаем без изменений. 

Правильно?

Изменено пользователем garik66
Ссылка на комментарий
Поделиться на другие сайты

Я проснулся 5 минут назад, так что не соображаю толком. Проверь в отладчике. Штука в том, что CPU не обучен работать с дробными числами - для этой задачи есть FPU, маленький "процессор" с отдельным "стеком". И набор f-инструкций под это дело. CPU оперирует типом integer, FPU - float. Для взаимодействия есть несколько инструкций. Подробнее можно почитать [тут].
Ссылка на комментарий
Поделиться на другие сайты

gmz, а чем твоя запись:

cvtsi2ss xmm0,dword[eax+8]movss dword[eax+4],xmm0 

короче этой:

fild [eax+08]fstp [eax+04] 

или она быстрее?

Прочитай - http://stackoverflow.com/questions/8847429/sse-slower-than-fpu

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Прочитай

К сожалению с английским плохо, но что понял через Гугл-переводчик - эта запись:

fild [eax+08]fstp [eax+04] 

быстрее, чем эта:

cvtsi2ss xmm0,dword[eax+8]movss dword[eax+4],xmm0 
Ссылка на комментарий
Поделиться на другие сайты

На самом деле, я слабо верю, что в скрипте СЕ разница будет сколько-нибудь заметна. То есть если некоторый код занимается только расчетом чисел с плавающей точкой (сотни миллионов раз) - тогда да, но и то обычно компилятор умнее человека и лучше может решить, какой набор инструкций нужно использовать. Если же (в редких случаях) компилятор ошибается - тогда да, ассемблер в руки и вперед, оптимизировать.
Ссылка на комментарий
Поделиться на другие сайты

как то писал float rand генератор на fpu и sse. sse был почти в 2 раза быстрее fpu (примерный замер через rdtsc)

в даном случае наверно все равно так как слишком мало действий

Ссылка на комментарий
Поделиться на другие сайты

  • 5 лет спустя...
  • 2 недели спустя...
1 час назад, Pitronic сказал:

в этом месте нет ссылки

 

В 10.09.2020 в 09:12, Kvazimado сказал:

Форум два раза менял дислокацию и естесно что-то могло похериться.

 

Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, Pitronic сказал:

Тогда может вспомните что вы там предлагали? Мне интересно!

я не помню. что было сегодня. а ты - 5,5 лет назад :(((( (склероз однако)

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.