как проще всего сравнить два xmm регистра?

Тема в разделе "WASM.X64", создана пользователем jorikh, 23 янв 2012.

  1. jorikh

    jorikh New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2011
    Сообщения:
    31
    хай всем

    как проще всего сравнить два xmm регистра с изменением eflags?
    можно сохранить в память и сравнить по-словно, но это как-то коряво
    comis-ы сравнивают только левые 32-бита.
    sse-шные cmp* делают в принципе что надо, но мне надо изменение eflags а не самого регистра.
    есть какое-то элегантное решение, или прийдётся сохранять в память?
     
  2. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    А какая конечная задача? то есть, для чего нужно именно в eflags результат? МОжет быть, правильным решением будет реорганизовать исходные данные так, чтоб не требовалось сравнение xmm-регистров как единого целого?
     
  3. jorikh

    jorikh New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2011
    Сообщения:
    31
    это будут просто отладочные тесты, проверяющие содержимое регистров на определённых этапах выполнения алгоритма. я сейчас разбираюсь с sse, поэтому стало интерестно - как это реализовывается элегантно. ещё один вариант что пришел мне в голову это cmp* + movmskb + cmp. это уже чтото приближенное к более менее компактному варианту.
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Идеология SSE расчитана на то, что потоки данных, проходящие через разные части SSE-регистров, должны взаимодействовать как можно реже. То есть, в циклах по возможности должны исключаться операции, в которых операндами являются разные части SSE-регистров, взаимодействовать должны только одинаковые части разных SSE-регистров. НУ или в специальных случаях - переставляться как для операции типа "бабочка" в БПФ, для чего есть специальные перестановочные команды.

    Сравнение SSE-регистров целиком - это тоже неявно выраженная логическая операция И над разными частями: если (равны первые части) И (равны вторые части) И (равны третьи части) И (равны четвертые части).

    Если необходимость в подобных операциях возникает редко - то нет смысла заморачиваться, и сравнивать можно прямо побайтно/пословно/подвордно в памяти. Ну или очень сильно хочется сравнить не выгружая в память - тогда последовательностями операций типа shufps или movmskb.

    Если же у вас операции взаимодействия разных частей SSE-регистров занимают основную массу процессорного времени - значит у вас неудачно организовано хранение данных для работы с SSE. Нужно реорганизовать, скажем вместо массива 4-элементов - 4 массива отдельных частей 4-элементов, или массивы из четверок 4-элементов, где четверки 4-элементов хранятся в транспонированном виде.

    В некоторых случаях можно обойтись пересмотром алгоритма. Предположим, в основном все время у вас тратится на сравнение 16-байтных последовательностей, но сравнение такое, когда конечное решение только одно и является истиной, если все сравнения дали истину. В этом случае можно не объединяя результаты от разных частей регистров тащить через все итерации цикла 4 независимых цепочки сравнений (реализуемых параллельно одиночной SSE-командой), и только уже псле окончания цикла произвести логическую операцию над результатами цепочек.
     
  5. jorikh

    jorikh New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2011
    Сообщения:
    31
    Dmitry_Milk спасибо за ответ. сравнение я использую чисто для _ASSERT(), на этапе отладки. в самой работе алгоритма оно не нужно.