Дает ли использование 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
инструкция? Что может быть лучшим тестом, чтобы проверить это?