проблема с fpu - real4 и real8

Тема в разделе "WASM.BEGINNERS", создана пользователем Drakon Rider, 28 окт 2007.

  1. Drakon Rider

    Drakon Rider New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2002
    Сообщения:
    21
    Адрес:
    Russia
    пытаюсь переделать:
    было:
    Код (Text):
    1. fst dword [esp+0CH]
    2. fld dword [esp+08H]
    3. fld st0
    4. fdivp st2, st0
    5. fxch st1
    6. fst dword [esp+4]
    стало

    Код (Text):
    1. fst dword [esp+0CH] ; b
    2. movss xmm1, [esp+0CH]
    3. fld dword [esp+08H]
    4.  
    5. movss xmm0, [esp+08H] ; a
    6. rcpss xmm0, xmm0
    7. mulss xmm0, xmm1
    8.  
    9. movss [esp+04H], xmm0
    10. fld dword [esp+04H] ; b/a
    здесь вроде считается хорошо, но при этом программа дальше начинает глючить...

    т.е. например при последующей
    fld qword [esp+068H]

    в st0 получается -NotANumber вместо числа из памяти :dntknw: ... похоже что-то случается с состоянием FPU, но после чего ? после применения sse регистров (вроде это не mmx и emms не требуется) или после какого-то нарушения порядка загрузки/выгрузки чисел с одинарной или двойной точностью ?
     
  2. Drakon Rider

    Drakon Rider New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2002
    Сообщения:
    21
    Адрес:
    Russia
    исходно программа была из странных конструкций типа

    Код (Text):
    1. fstp     DWORD PTR [esp+0ch]
    2. fld      DWORD PTR [esp+0ch] - зачем так ???
    3. fld      DWORD PTR [esp+08h]
    4. fld      st(0)
    5. fdivp    st(2), st(0)
    6. fxch     st(1)
    7. fstp     DWORD PTR [esp+04h]
    8. fld      DWORD PTR [esp+04h] - зачем так ???
    9. fcom     QWORD PTR [esp+068h] - а тута уже с Real8 работа...
    имхается странные пуши стека таки зачем-то нужны ? если да - где почитать когда/зачем/сколько их надо делать ?
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Видимо в коде ЯВУ было приведение ко float, т.е. для снижения точности.
     
  4. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    в книге В Пирогова
    Ассемблер и Дизассемблирование написано на стр 49
    Расширение mmx включает 8 регистров общего пользования
    (ММ0-ММ7). Размер регистров составляет 64 бита. Физически эти регистры пользуются младшими битами рабочих регистров сопроцессора (R0-R7). Комманды MMX портят регистр состояния и регистр тегов. по этой причине совместное использование команд MMX и команд сопроцессора может вызвать определенные трудности. Другими словами, перед каждым применением команд mmx вам придется сохранять контекст сопроессора, а это может весьма замедлить работу программы.
    Важно отметить также , что комманды mmx работают непосредственно с регистрами сопроцессора, а не с указателями на элементы стека.
    конец цытаты
    Для Xmm отчати вышеуказанное справедливо ибо они 128-битные
     
  5. Drakon Rider

    Drakon Rider New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2002
    Сообщения:
    21
    Адрес:
    Russia
    хмм совсем отдельны от регистров математического сопроцессора...

    пока что имхается что-то в последовательности пуша из фпу стека зарыто... типа долго и много делать fst низя - надо перебивать fstp или перед переходом на real8 ...

    если сразу бага неизвестна - буду понемногу натыкивать ссе команд между старыми фпу и смотреть когда начнутся глюки...
     
  6. Drakon Rider

    Drakon Rider New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2002
    Сообщения:
    21
    Адрес:
    Russia
    >Видимо в коде ЯВУ было приведение ко float, т.е. для снижения точности.

    хмм - странно... при этом процессор на вроде полностью и сразу кешируемой операции

    fstp DWORD PTR [esp+0ch]
    fld DWORD PTR [esp+0ch]

    аццки тормозит и на загрузке свежезаписанного :/ ... поэтому я сразу сделал

    fst DWORD PTR [esp+0ch]

    чтобы в памяти осталось значение для следующих вычислений и чтобы в стеке фпу осталось что было и чтобы лишней операции тормозной небыло... при этом глюки в программе еще не начинались...