Są dwa dobrze znane sposoby ustawiania rejestru liczb całkowitych na zero na x86.Czy użycie xor reg, reg daje przewagę nad mov reg, 0?
Albo
mov reg, 0
lub
xor reg, reg
Istnieje opinia, że drugi wariant jest lepszy ponieważ wartość 0 nie jest zapisany w kodzie i że oszczędza kilka bajtów wytwarzanego kodu maszynowego. Jest to zdecydowanie dobre - mniej pamięci podręcznej instrukcji jest używane, co czasami pozwala na szybsze wykonanie kodu. Wiele kompilatorów tworzy taki kod.
Jednak istnieje formalna zależność między instrukcjami między instrukcją xor i dowolną wcześniejszą instrukcją, która zmienia ten sam rejestr. Ponieważ istnieje depedencja, ta ostatnia instrukcja musi poczekać, aż poprzednia zakończy, a to może zmniejszyć obciążenie procesorów i obniżyć wydajność.
add reg, 17
;do something else with reg here
xor reg, reg
Jest oczywiste, że wynik xor będzie dokładnie taki sam, niezależnie od początkowej wartości rejestru. Ale czy procesor jest w stanie to rozpoznać?
Próbowałem następujący test w 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;
}
Dzięki optymalizacji off obu pętlach wziąć dokładnie ten sam czas. Czy to rozsądnie udowadnia, że procesor rozpoznaje, że nie ma zależności od wcześniejszej instrukcji 0123-? Jaki może być lepszy test, aby to sprawdzić?
Myślę, że właśnie dlatego używamy języków wysokiego poziomu. Jeśli naprawdę chcesz wiedzieć, po prostu zmień etap kodegena, aby wykonać jedną lub drugą. Reper. Wybierz najlepsze. – jrockway
ah, stara reguła 'xor reg, reg' - stare dobre czasy :) –
Myślę, że architektura x86 jawnie definiuje XOR reg, reg jako łamiąc zależność od reg. Zobacz podręcznik architektury Intel. Spodziewałbym się MOV reg, ... zrobić to samo po prostu dlatego, że jest MOV. Zatem twoim prawdziwym wyborem jest to, który z nich zajmuje mniej miejsca (zgaduję, że czas wykonania jest taki sam), jeśli nie zależy ci na bitach statusu (XOR niszczy je wszystkie). –