Равнозначны ли данные asm инструкции?

Тема в разделе "WASM.BEGINNERS", создана пользователем st47k3r, 27 ноя 2008.

  1. st47k3r

    st47k3r New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    5
    Приветствую, ALL!

    Вопрос к аудитории:

    Равнозначны ли по действию, данные инструкции?

    1) FADD ST(0), ST(0)
    2) FMUL QWORD PTR [fl_2]; Если: fl_2 DQ 2.0

    ?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    st47k3r
    Сам-то, как думаешь? И в том и в другом случае происходит удвоение числа
    Аналогичного результата можно добится если числу в ST(0) "подправить" порядок, т.е.
    число вида 1.283*2^N изменить на 1.283*2^N+1 смотри здесь
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    При умножении погрешность больше
     
  4. st47k3r

    st47k3r New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    5
    murder: тЭЭкс, а вот это интересно. Спасибо! А как определить на каких величинах он становиться ощутим?

    Mikl___: ..типа "аналогии" с SHL X, 2?
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    При умножении на 2 ?! Хорошая шутка :)
    PS: При умножении на степень 2-ки реально изменяется только двоичный порядок, а мантисса остается неизменной, поэтому говорить о каких-то погрешностях - сами понимаете ;)
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Абсолютно верно, здесь все числа, и вещественные в том числе, по основанию 2. Для замены порядка понадобятся AND, ADD, OR
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    но fadd, да к тому же без чтения памяти выполнится быстрее и лишнюю переменную хранить не надо :))
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Y_Mur
    Если вещественная переменная типа dword находится в ячейке памяти [temp] и потребовалось ее удвоить:
    add dword ptr [temp],800000h и всё! FPU здесь не нужен!
    Сответственно, нужно сделать поправку на qword и tbyte и отследить ситуацию, что бы не был испорчен старший знаковый бит
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Mikl___
    согласен, но если удвоить нужно по ходу fpu вычислений, то сохранять в память, синхронизировать cpu/fpu и грузить обратно в st0 намного дольше ;))
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Y_Mur
    Тогда, да fadd, так как fmul это скорее всего некие действия с мантиссой и порядком на порядок должно быть дольше
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Хотя если нужно не умножать на степень двойки, а возводить в неё, то даже подход с сохранением в память может увеличить скорость.
     
  12. st47k3r

    st47k3r New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    5
    угу.. для себя подчерпнул, разобрался.
    Всем спасибо! :)
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Mikl___
    Не шути. В данном случае fmul будет заметно дольше только из-за чтения операнда из памяти. А вообще в отличие от целых чисел, fadd и fmul на всех процах выполняется практически за одно время (fadd м.б.чуть-чуть быстрее), именно из-за того, что тормозит fadd, а не fmul (которая выполняется максимум на такт дольше целочисленных mul\imul). Дело в том, что вещ.числа хранятся в нормализованном виде и при умножении достаточно одновременно поксорить знаки, сложить порядки и перемножить мантиссы, и затем произвести коррекцию порядка и сдвиг мантисы на 1, если в мантиссе возникает перенос из старшего разряда. А для сложения нужно сначала привести числа к общему порядку, т.е. определить какое число больше и сдвинуть мантиссу меньшего числа на разность порядков, затем сложить с учетом знака, и затем снова произвести нормализацию (т.к. в отличие от умножения при сложении знаковых чисел в итоге может получиться любой порядок) - а это, сами понимаете, сродни bsr над 64-битной мантиссой. В итоге и получается, что fadd\fsub выполняется примерно столько же, как и fmul - на атлонах одинаково, на пеньках на пару тактов быстрее - но уж никак не "на порядок" :)
     
  14. st47k3r

    st47k3r New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    5
    leo
    Спасибо! Въехал :)