Pull to refresh

Comments 11

xchg же типичное сокращение от exchange.
Ну а что касается того, равны ли по продолжительности исполнения команда XCHG и три команды XOR, то судя по этому тесту, XCHG выполняется на 5% быстрее, что никак не вписывается в мою теорию

Я не большой спец в процессоростроени. Однако там есть всякие стадии выполнения команд, а также конвееры и хитрые оптимизации, и куча ещё всего интересного. Что может быть в теории может и накинуть 5% на исполнение 21 команды против 7.

Вы ведь не учли время на выборку и декодирование команд. Очевидно, что выборка 3 команд потребует больше операций чтения и займет больше времени, чем выборка одной команды, если они одинакового размера. Правда, конвейер может это компенсировать.


Можно попробовать компенсировать это, добив команду XCHG NOP'ами до нужной длины.


Также, непонятно, почему используются 32-битные инструкции вместо 64-битных?


Ну и по моему, команда эта абсолютно бесполезная. В какой ситуации компилятор может ее использовать?

Ну и по моему, команда эта абсолютно бесполезная. В какой ситуации компилятор может ее использовать?

Не совсем, std::swap например. Обмен указателей или еще что нибудь. Иногда удобно.

Сам обмен удобен, да. Но компиляторы для этого XCHG редко используют.

Если оба операнда std::swap находятся в регистрах, то компилятору вообще не надо генерировать инструкции. Достаточно изменить свои внутренние маппинги после прохождения инструкции swap, какая переменная находится в каком регистре.
Регистры на х86 неравнозначны и имеют разные наборы разрешенных операций. Совершенно очевидно, что если компилятор может обойтись без обмена, то он без него обходится. Учтите, что и процессор тоже достаточно умный для ремапа регистра на ходу, впрочем об этом тут уже написали.
Не зависимо от результатов теста, в документации XCHG написано что она, в случае если один из операндов находится в памяти, производит атомарный обмен с блокировкой шины процессора, даже независимо от префикса LOCK. Т.е. это не совсем эквивалент трех XOR, не просто обмен, а атомарный обмен и одна из операций для построения более сложных примитивов синхронизации.
В современном процессоре нет строгого соответствия EAX/EBX и некоего места в регистровом файле процессора. XCHG может вообще не перемещать биты в процессоре, а просто назначить для EAX ту область регистровой памяти процессора, которая числилась ранее за EBX.

С регистрами — да, а с памятью уже не получится переименовать.

Sign up to leave a comment.

Articles