Нужно как можно быстрее выполнять сравнение. С помощью SSE2. В регистрах XMM0,XMM1,XMM2 лежат целочисленные данные. Надо сравнить их с памятью по адресу в ESI. Если точно одинаковые, то выставить флаг переноса CARRY (или флаг нуля ZERO на худой конец), иначе убрать этот флаг. Пока делаю так. Хочется быстрее. Код (Text): pxor xmm0,[esi] pxor xmm1,[esi+16] pxor xmm2,[esi+32] por xmm0,xmm1 por xmm0,xmm2 packsswb xmm0,xmm0 packsswb xmm0,xmm0 movd edx,xmm0 sub edx,1
Код (Text): ;1) pcmpeqd xmm0,[esi] pcmpeqd xmm1,[esi+16] pcmpeqd xmm2,[esi+32] pand xmm0,xmm1 pand xmm0,xmm2 pmovmskb eax,xmm0 add eax,$FFFF0001 ;2) на пару тактов быстрее (на P4) pcmpeqd xmm0,[esi] pcmpeqd xmm1,[esi+16] pcmpeqd xmm2,[esi+32] pmovmskb eax,xmm0 pmovmskb edx,xmm1 and edx,eax pmovmskb eax,xmm2 and eax,edx add eax,$FFFF0001
Большое спасибо, leo. Я раньше пользовался подобным вариантом, но небыл уверен, что при использовании pmovmskb не потеряется какой-нибудь бит. К тому же я не додумался прибавлять FFFF0001. Я делал "add ax,1", что, естественно, тормозило дело. Сейчас я пересмотрел этот код, проверил его и пришёл к выводу, что это - самый быстрый вариант. А может у кого-нибудь есть быстрее?