Comments 11
Ну а что касается того, равны ли по продолжительности исполнения команда XCHG и три команды XOR, то судя по этому тесту, XCHG выполняется на 5% быстрее, что никак не вписывается в мою теорию
Я не большой спец в процессоростроени. Однако там есть всякие стадии выполнения команд, а также конвееры и хитрые оптимизации, и куча ещё всего интересного. Что может быть в теории может и накинуть 5% на исполнение 21 команды против 7.
На StackOverflow есть замечательное обсуждение команды XCHG — https://stackoverflow.com/questions/45766444/why-is-xchg-reg-reg-a-3-micro-op-instruction-on-modern-intel-architectures
Вы ведь не учли время на выборку и декодирование команд. Очевидно, что выборка 3 команд потребует больше операций чтения и займет больше времени, чем выборка одной команды, если они одинакового размера. Правда, конвейер может это компенсировать.
Можно попробовать компенсировать это, добив команду XCHG NOP'ами до нужной длины.
Также, непонятно, почему используются 32-битные инструкции вместо 64-битных?
Ну и по моему, команда эта абсолютно бесполезная. В какой ситуации компилятор может ее использовать?
Ну и по моему, команда эта абсолютно бесполезная. В какой ситуации компилятор может ее использовать?
Не совсем, std::swap например. Обмен указателей или еще что нибудь. Иногда удобно.
Сам обмен удобен, да. Но компиляторы для этого XCHG редко используют.
Benchmark CPU's Instructions (just before loading the OS) — XCHG vs XOR, XOR, XOR