SSE Integer сравнение, результат в флаг(и)

Тема в разделе "WASM.A&O", создана пользователем SolidCode, 7 дек 2006.

  1. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Нужно как можно быстрее выполнять сравнение. С помощью SSE2. В регистрах XMM0,XMM1,XMM2 лежат целочисленные данные. Надо сравнить их с памятью по адресу в ESI. Если точно одинаковые, то выставить флаг переноса CARRY (или флаг нуля ZERO на худой конец), иначе убрать этот флаг. Пока делаю так. Хочется быстрее.
    Код (Text):
    1.     pxor    xmm0,[esi]
    2.     pxor    xmm1,[esi+16]
    3.     pxor    xmm2,[esi+32]
    4.     por     xmm0,xmm1
    5.     por     xmm0,xmm2
    6.     packsswb    xmm0,xmm0
    7.     packsswb    xmm0,xmm0
    8.     movd        edx,xmm0
    9.     sub     edx,1
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Код (Text):
    1.   ;1)
    2.   pcmpeqd xmm0,[esi]
    3.   pcmpeqd xmm1,[esi+16]
    4.   pcmpeqd xmm2,[esi+32]
    5.   pand xmm0,xmm1
    6.   pand xmm0,xmm2
    7.   pmovmskb eax,xmm0
    8.   add eax,$FFFF0001
    9.  
    10.   ;2) на пару тактов быстрее (на P4)
    11.   pcmpeqd xmm0,[esi]
    12.   pcmpeqd xmm1,[esi+16]
    13.   pcmpeqd xmm2,[esi+32]
    14.   pmovmskb eax,xmm0
    15.   pmovmskb edx,xmm1
    16.   and edx,eax
    17.   pmovmskb eax,xmm2
    18.   and eax,edx
    19.   add eax,$FFFF0001
     
  3. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Большое спасибо, leo. Я раньше пользовался подобным вариантом, но небыл уверен, что при использовании pmovmskb не потеряется какой-нибудь бит. К тому же я не додумался прибавлять FFFF0001. Я делал "add ax,1", что, естественно, тормозило дело.
    Сейчас я пересмотрел этот код, проверил его и пришёл к выводу, что это - самый быстрый вариант. А может у кого-нибудь есть быстрее?