Дает ли использование xor reg, reg преимущество перед mov reg, 0? [Дубликат]

This question already has an answer here:

What is the best way to set a register to zero in x86 assembly: xor, mov or and? 1 answer

Есть два хорошо известных способа установить целочисленный регистр равным нулю на x86.

Или

mov reg, 0

или же

xor reg, reg

Существует мнение, что второй вариант лучше, поскольку значение 0 не сохраняется в коде, и это сохраняет несколько байтов созданного машинного кода. Это определенно хорошо - меньше кэша команд используется, и это может иногда позволить более быстрое выполнение кода. Многие компиляторы создают такой код.

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

add reg, 17
;do something else with reg here
xor reg, reg

Очевидно, что результат xor будет точно таким же, независимо от начального значения регистра. Но сможет ли процессор это распознать?

Я попробовал следующий тест в VC ++ 7:

const int Count = 10 * 1000 * 1000 * 1000;
int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    DWORD start = GetTickCount();
    for( i = 0; i < Count ; i++ ) {
        __asm {
            mov eax, 10
            xor eax, eax
        };
    }
    DWORD diff = GetTickCount() - start;
    start = GetTickCount();
    for( i = 0; i < Count ; i++ ) {
        __asm {
            mov eax, 10
            mov eax, 0
        };
    }
    diff = GetTickCount() - start;
    return 0;
}

При отключенных оптимизациях оба цикла занимают одинаковое время. Достаточно ли это доказывает, что процессор распознает, что нет зависимости отxor reg, reg инструкция по ранееmov eax, 0 инструкция? Что может быть лучшим тестом, чтобы проверить это?

Ответы на вопрос(6)

Ваш ответ на вопрос