хай всем как проще всего сравнить два xmm регистра с изменением eflags? можно сохранить в память и сравнить по-словно, но это как-то коряво comis-ы сравнивают только левые 32-бита. sse-шные cmp* делают в принципе что надо, но мне надо изменение eflags а не самого регистра. есть какое-то элегантное решение, или прийдётся сохранять в память?
А какая конечная задача? то есть, для чего нужно именно в eflags результат? МОжет быть, правильным решением будет реорганизовать исходные данные так, чтоб не требовалось сравнение xmm-регистров как единого целого?
это будут просто отладочные тесты, проверяющие содержимое регистров на определённых этапах выполнения алгоритма. я сейчас разбираюсь с sse, поэтому стало интерестно - как это реализовывается элегантно. ещё один вариант что пришел мне в голову это cmp* + movmskb + cmp. это уже чтото приближенное к более менее компактному варианту.
Идеология SSE расчитана на то, что потоки данных, проходящие через разные части SSE-регистров, должны взаимодействовать как можно реже. То есть, в циклах по возможности должны исключаться операции, в которых операндами являются разные части SSE-регистров, взаимодействовать должны только одинаковые части разных SSE-регистров. НУ или в специальных случаях - переставляться как для операции типа "бабочка" в БПФ, для чего есть специальные перестановочные команды. Сравнение SSE-регистров целиком - это тоже неявно выраженная логическая операция И над разными частями: если (равны первые части) И (равны вторые части) И (равны третьи части) И (равны четвертые части). Если необходимость в подобных операциях возникает редко - то нет смысла заморачиваться, и сравнивать можно прямо побайтно/пословно/подвордно в памяти. Ну или очень сильно хочется сравнить не выгружая в память - тогда последовательностями операций типа shufps или movmskb. Если же у вас операции взаимодействия разных частей SSE-регистров занимают основную массу процессорного времени - значит у вас неудачно организовано хранение данных для работы с SSE. Нужно реорганизовать, скажем вместо массива 4-элементов - 4 массива отдельных частей 4-элементов, или массивы из четверок 4-элементов, где четверки 4-элементов хранятся в транспонированном виде. В некоторых случаях можно обойтись пересмотром алгоритма. Предположим, в основном все время у вас тратится на сравнение 16-байтных последовательностей, но сравнение такое, когда конечное решение только одно и является истиной, если все сравнения дали истину. В этом случае можно не объединяя результаты от разных частей регистров тащить через все итерации цикла 4 независимых цепочки сравнений (реализуемых параллельно одиночной SSE-командой), и только уже псле окончания цикла произвести логическую операцию над результатами цепочек.
Dmitry_Milk спасибо за ответ. сравнение я использую чисто для _ASSERT(), на этапе отладки. в самой работе алгоритма оно не нужно.