Sender, x86 — это очень широкое понятие. На 286 процессорах —
fcom/
fcomp/
fcompp c переброской битов SW через ax (при помощи
fstsw ax) в регистр флагов (при помощи
sahf) [
Регистр флагов].
На современных процессорах в случае fpu-ориентированных вычислений сравнивать можно
fcomi + переход по значениям флагов в eflags. Если
fcomi регистровое, то где-то latency — 4 / throughput — 1 (На Sandy Bridge — 4/1; Ivy Bridge — 5/1; SkylakeX — 4/1; см. Agner Fog "4. Instruction tables (Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD and VIA CPUs)"). Легко нагуглить. Там есть данные и для других процессоров.
Можно было бы на равенство попробовать проверять при помощи
хоr (throughput около 0.5). Однако перед сравнением вычитание. Следовательно, для использования
хоr нужна пересылка из регистра fpu в регистр общего назначения. Поэтому, если выигрыш и будет, то ничтожный.
Но на сегодняшний день вычисления с числами с плавающей точкой в основном SSE/AVX-ориентированные.
Инструкции сравнения (на равенство, нестрогое и строгое неравенство)
cmppd/cmpps быстры (где-то latency — 3, throughput — 0.5), но не изменяют флаги, а заносят в приемник (регистр SSE/AVX) нули или единицы. {UPD. У Sandy Bridge, Ivy Bridge и Haswell latency/ throughput — 3/1 [см., например, “Inel 64 and IA-32 Architectures Optimization manual”] /UPD}. Результат типа Boolean в большинстве компиляторов возвращается функцией через регистр общего назначения: ax/eax/rax. Нужно скопировать из xmm в ax/eax/rax и, если истина кодируется одним битом, то при помощи
and обнулить старшие биты {Upd или результат сравнения в регистре xmm скопировать в rax при помощи
movmskpd: latency/troughput — 2/1. в случае истины в rax будет как раз 1 в младшем бите. /Upd}.
Очевидная альтернатива: скопировать разность из xmm в регистр общего назначения, выполнить битовую операцию и по результату в регистре флагов занести в ax/eax/rax значение. (Это на глаз не быстрее, а медленнее
cmppd). Если же в качестве истины годится любой ненулевой результат, то
при сравнении на равенство/неравенство можно результат
xor использовать как возвращаемое значение. У
xor меньше latency/throughput (где-то 1 / 0.5 или 0.25, если второй операнд в регистре) по сравнению с
cmppd. Различие невелико, но может и сыграть.
Да, мне тоже непонятно, для чего нужен текст в стартовом сообщении.