Хочу складывать 64-битные регистры в MMX. Но комманды PADDQ в MMX вроде нет. Но в машинах с SSE2 вроде как есть даже с MMX. Совсем запутался... Как определить поддержку PADDQ в машине? И есще, видимо нужно будет использовать и альтернативный код где такой фичи нет. Как тогда сложить 64 бита в MMX? Про 32-разрядные ADD,ADC знаю, это удобно но медленно... С другой стороны эмулировать PADDQ будет гиморно с масками MMX да и так сразу не сообразишь как отловить перенос внутри упакованного двойного числа.
persicum быстрее add+adc без SSE2 и XMM-регистров сложить вряд ли получится. а с MMX можно что-то попытаться сделать только если младшие половины хранить отдельно от старших и грузить парами. Код (Text): movq mm0,[low1] movq mm1,[low2] movq mm2,[high1] paddd mm0,mm1 paddd mm2,[high2] pcmpgtd mm1,mm0 psubd mm2,mm1 movq [res_l],mm0 movq [res_h],mm2 вроде как-то так
код, нарисованный выше, совсем не годится, потому что pcmpgt сравнивает числа со знаком, то есть их предварительно с 2^31 нужно xor'ить, а это +2 команды и скорее всего полный проигрыш.
PADDQ - это медиа инструкция. И все такие инструкции разрабатывались для увелечения скорости выполнения конкретных алгоритмов. Так что cкорей всего add/adc.
Написал тестовый код =))) Код (Text): pcmpeqd mm0,mm0 //-1 pcmpeqd mm1,mm1 psrlq mm1,63 //+1 paddq mm0,mm1 Прикольно получается, на II Пне он вылетает в недопустимую инструкцию, а на IV Пне отрабатывается корректно, при всем при том что как известно mmx регистры это не младшие части xmm, а вполне себе отдельные регистры впридачу к xmm Стало быть есть риск что данный код будет вылетать на всяких там несовсем свежих AMD и т.п. =((( >бросайте кодить под 32 бита Да я бы с радостью, тока интели и мелкомягкие решили что для 64бит нужна специальная винда 64битная, а так бы я вызывал 64-комманды скажем для умножения 64х64=128 для RSA и так далее.
А на "II Пне" есть SSE2? Код (Text): sub eax, eax inc eax cpuid and edx, 0x4000000 ;bit 26 == SSE2 Extensions jz not_supported
G13 Ну, например у меня как-то получились интересные вещи на Mendocino. У него и SSE-то нет, так он, подлец на оные инструкции UD не кидает, а тупо игнорирует префикс и выполняет как MMX. Так что варианты есть