..мне надо работасть с дробями. Все получается, но немогу вывести результат с этих регистров.. Может как то округлить до целого, потом уже вывести?
Как я уже сказал, 3dnow использует mmx для вычислений с плавающей точкой. Вопрос в другом - оно нужно? ибо есть ССЕ. И ещё - плавающая или фиксированая точка нужна, если уж на то пошло.
Заваисит от задачи. Если не сложно - можно реализовать все варианты и сравнить. Начинать, думаю, с FPU, затем SSE для scalar значений, потом уж о параллелизме мона задуматься.
maestro-ant Скажи толком, что нужно. Если преобразовать float или double в строку, то можно 1) юзать масмовскую FloatToStr, надыбать другие готовые реализации или написать свою на основе fbstp и преобразования полученного BCD-числа в строку, 2) выделить на FPU или SSE целую и дробную части числа (с заданным числом десятич.знаков) и затем юзать wsprintf или ltoa
3DNow! использует XMM регистры как и SSE. Другое дело что физически это одни и те же регистры совмещённые ещё и с FPU. Но формат хранения данных в них другой. При помощи MMX вещественные числа обрабатывать нельзя.
Мда, удержался я от детского соблазна поправить IceStudent'а и видать зря Инструкции PF... из набора 3DNow работают с MMX как с двумя single prec. флоатами. Вот только кто сейчас использует эти и другие 3DNow, не вошедшие в SSE\SSE2
Не не точно Ошибся. XMM действительно отдельные регистры... У меня тут вопрос по ходу возник. Выходит при переключении задач ОС должна состояние SSE сохранять. С этим ясно - есть FXSAVE/FXRSTOR. Вот тут http://www.tommesani.com/SSEStateManagement.html прочитал следующее: Вопрос в том, что значит сохраняет состояние MMX? Расширений MMX появившихся с SSE, или всё состояние? Т.е. вопрос в том, что если для сохранения контекста использовать fxsave/fxrstor надо ли кроме этого для сохранения контекста MMX/FPU использовать fsave/frstor или fxsave/fxrstor будет достаточно?
cppasm Да. В IA-32 instruction set все черным по белому расписано с наглядной таблицей memory lаyout maestro-ant Если общее число знаков целой и дробной части не превышает 8-9, то можно не возиться с разложением числа на целую и дробные части, а сразу использовать wsprintf со вставкой десятичной точки на нужную позицию. Примерно так Код (Text): tenpows dd 1.0,1E1,1E2,1E3,1E4,1E5,1E6,1E7,1E8 fmt db '%.0d',0 ix dd 0 ;X - число, digs - число знаков после запятой, szStr - ук-ль на вых.строку mov ecx,[digs] xor eax,eax mov [szStr],al cmp ecx,8 jg error fld [X] fmul [tenpows+ecx*4] ;умножаем на степень 10-ти в соотв. с digs fistp [ix] ;сохраняем с округлением до целого cmp [ix],80000000h ;контроль переполнения je error add ecx,'1' ;задаем мин.число знаков в формат fmt = digs+1 mov [fmt+2],cl invoke wsprintf,szStr,fmt,[ix] add esp,3*4 lea edx,[eax+szStr] mov ecx,[digs] inc eax push eax ;сохраняем для return = длина строки @@: mov al,[edx] mov [edx+1],al dec edx dec ecx jge @B mov byte[edx+1],'.' pop eax error:
Да я и не сомневался Просто думал быстро кто-нибудь ответит чтоб в мануалы не лезть... У меня мануал от pii - там fxsave нету и в помине Счас буду новые качать.