Привет, All! Какая инструкция заменила FPU-шную FCHS? Я использую Код (Text): xorps xmm0,xmm0 subss xmm0,xmm1; в регистре xmm1 значение у которого нужно сменить знак movss xmm1,xmm0 или так Код (Text): xorps xmm0,const80000000h Но правильно ли это? В FPU было полно тригонометрических инструкций (FSIN, FCOS, FSINCOS, FPTAN, FPATAN) чем их заменять в SSE?
1. В принципе через xor правильно я считаю. Для целых чисел есть PSIGND. 2. Тригонометрические функции вычисляются в цикле через ряды Тейлора (если не ошибаюсь). Это легко гуглится. И по скорости может выйти даже быстрее чем на FPU если вычислять сразу 4 функции.
Вот ещё ссылочка на синус - https://sourceware.org/legacy-ml/glibc-cvs/2017-q4/msg00609.html. Там даже описание алгоритма есть, вроде бы используется интерполяция полиномом эээ... 11 степени (не многовато ли) по таблицам Брадиса. Код не проверял.
Имеет смысл заглянуть в http://www.moshier.net/#Cephes Когда я рисовал свой простенький компилятор, то для SSE-версий функций использовал алгоритмы именно из этой замечательной библиотеки. Если интересует пример моей реализации на fasm, то можно посмотреть на https://maalchemist.ru/SICx/SICx06.01.01.zip Тригонометрические функции лежат в ...\SIC64(32)FuAX_TG.ASM и в ... \SIC64(32)FuAXu_TG.ASM Скорость вычисления синуса будет раза в три выше, чем у процессорного fsin (даже без использования SSE-инструкций).
Ещё не плохо сделать команду(макрос) sinps, sinpd чтобы одновременно 4 или 2 результата вычисляла, в игровых движках некоторые функции можно ускорить.
Mikl___, Я бы вот это посмотрел Intel® Math Kernel Library https://software.intel.com/content/...-kernel-library/vector-math-misc-solvers.html Далее как там реализована тригонометрия. --- Сообщение объединено, 19 июл 2020 --- Где что загрузить я не понял, мб у вас получится.
Ну вот скачал - там куча функций, заточенных под определённый случай. Циклы развёрнуты. Реверсить эту простыню как-то долго...
Mikl___, Довольно странно, модуль по математике от хард вендора. Между тем эти функции используют fpu. vmlcSinh(): Код (Text): .text:103414B2 fld dword ptr [edx+ebp*8] .text:103414B5 fstp [esp+0B4h+var_94] .text:103414B9 fld dword ptr [edx+ebp*8+4] .text:103414BD lea edx, [esp+0B4h+var_2C] .text:103414C4 fstp qword ptr [edx] .text:103414C6 fld dword ptr [ebx+ebp*8+4] .text:103414CA fstp qword ptr [edx+8] .text:103414CD fld dword ptr [ecx+ebp*8] etc. Что интересно в модуле нет непосредственно fsin. Не могу предположить зачем это сделано(вычислять через тот же проц блок если есть хард инструкция, даже не учитывая всякие расширения), но очевидно что не с проста, ясно что не обратная совместимость. Видимо есть какой то не известный нам нюанс. --- Сообщение объединено, 23 июл 2020 --- murder, Действительно, это уже не реверс а хз что. Нужно вручную разбирать плавающую математику, при это понимая сам матан в прямом смысле. Код конечно жесть, это не всякие вирты с протекторами --- Сообщение объединено, 23 июл 2020 --- ..
TermoSINteZ, табличный синус это как-то так Код (ASM): .data Sin dd 0,175,349,523,698,872; 0-5 dd 1045,1219,1392,1564,1736; 6-10 dd 1908,2079,2250,2419,2588; 11-15 dd 2756,2924,3090,3256,3420; 16-20 dd 3584,3746,3907,4067,4226; 21-25 dd 4384,4540,4695,4848,5000; 26-30 dd 5150,5299,5446,5592,5736; 31-35 dd 5878,6018,6157,6293,6428; 36-40 dd 6561,6691,6820,6947,7071; 41-45 dd 7193,7313,7431,7547,7660; 46-50 dd 7771,7880,7986,8090,8191; 51-55 dd 8290,8387,8480,8572,8660; 56-60 dd 8746,8829,8910,8988,9063; 61-65 dd 9135,9205,9272,9336,9397; 66-70 dd 9455,9511,9563,9613,9659; 71-75 dd 9703,9744,9781,9816,9848; 76-80 dd 9877,9903,9926,9945,9962; 81-85 dd 9976,9986,9994,9998,10000;86-90 .code proc find_sin cmp eax,181 jb a2 sub eax,180 cmp eax,91 jb @f neg eax add eax,180 @@: mov eax,sin[eax*4] neg eax jmp a4 a2: cmp eax,91 jb @f neg eax add eax,180 @@: mov eax,sin[eax*4] a4: retn endp find_sin
TermoSINteZ, Если граф посмотреть, то там цикл и множество вложенных процедур, в первых ссылок на талицы данных нет. Можно выяснить, но для этого нужно визором прокрутить(там x32) что бы найти все данные, те необходимы прототипы для этих функций. Гугл про vmlcSin_11() ничего не знает. Либа есть, вот бы есчо документацию на неё, либо вызывающий код отладить что бы прототип узнать. --- Сообщение объединено, 25 июл 2020 --- Mikl___, > табличный синус На спекки тригонометрия вычислялась через полиномы(ряды Чебышёва), крайне эффективно и с достаточной для любых расчётов точностью. Я пытался как то на пик портировать, но там косяк был с отладочным софтом так что я это забросил --- Сообщение объединено, 25 июл 2020 --- Могу точную инфу дать. p.222 Ниже есть ссылка на матчасть откуда взяты коэфф: Это самый эффективный алго. --- Сообщение объединено, 25 июл 2020 --- UbIvItS, Да какие тесты это же билд готовый по математике от вендора. Либо это работает быстрее чем сам fsin(что маловероятно), либо это закрытие хард errata, наиболее вероятно.
такие ошибки обычно закрываются обновлением микрокода. правда, у софтварной версии мб погрешности меньше.
UbIvItS, Нельзя всё обновить микрокодом, для этого нужен хард сброс. Проще решить софтом налету. Почему не используются более производительные блоки(mmx/sse etc) это есчо одна загадка. Я не помню точно, формат sse поддерживает fpu, те формат чисел с плз ? Короче нужны прототипы что бы снять профайл и вообще посмотреть как оно работает. Откуда это было загружено ?
Mikl___, если не секрет, а зачем это нужно? Неужели фпу могут отключить/удалить, или новые инструкции просто во много раз быстрее?
M0rg0t, не секрет, для OpenGL. Там практически все расчеты в вещественных числах и передача параметров через XMM0-XMM3. И да, быстрее OpenGL in masm64