Ada dua cara terkenal untuk menyetel register bilangan bulat ke nilai nol di x86.
Salah satu
mov reg, 0
or
xor reg, reg
Ada pendapat bahwa varian kedua lebih baik karena nilai 0 tidak disimpan dalam kode dan menghemat beberapa byte kode mesin yang dihasilkan. Ini jelas bagus - lebih sedikit cache instruksi yang digunakan dan ini terkadang memungkinkan eksekusi kode lebih cepat. Banyak kompiler menghasilkan kode seperti itu.
Namun secara formal ada ketergantungan antar-instruksi antara instruksi xor dan instruksi sebelumnya apa pun yang mengubah register yang sama. Karena ada ketergantungan, instruksi terakhir harus menunggu hingga instruksi pertama selesai dan ini dapat mengurangi beban unit prosesor dan mengganggu kinerja.
add reg, 17
;do something else with reg here
xor reg, reg
Jelas bahwa hasil xor akan sama persis terlepas dari nilai register awalnya. Tapi apakah prosesor mampu mengenali ini?
Saya mencoba tes berikut di 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;
}
Dengan pengoptimalan yang dinonaktifkan, kedua loop membutuhkan waktu yang persis sama. Apakah ini cukup membuktikan bahwa prosesor mengakui bahwa tidak ada ketergantungan instruksi xor reg, reg
pada instruksi mov eax, 0
sebelumnya? Tes apa yang lebih baik untuk memeriksa ini?
xor reg, reg
lama - masa lalu yang menyenangkan :) - person Nick Dandoulakis   schedule 16.07.2009Count
Anda meluap, sehingga loop akan berjalan dengan siklus yang jauh lebih sedikit dari yang Anda harapkan - person phuclv   schedule 06.12.2013xor reg,reg
tidak memerlukan unit eksekusi (ditangani dalam decode?). Ini merusak ketergantungan padareg
, dan pembaruan sebagian bendera terhenti. Dan itu memiliki pengkodean yang lebih kecil. Tidak ada alasan bagus untuk pendekatanmov
pada x86-64 terbaru, kecuali Anda harus mempertahankan tanda [e]. - person Brett Hale   schedule 10.02.2014xor
, dibandingkan denganmov
. Saya menulis jawaban pada pertanyaan yang lebih baru sebelum saya melihat yang ini: stackoverflow.com/questions/33666617/ . Saya pikir ini adalah jawaban yang lebih baik dan lebih lengkap daripada jawaban lainnya. Idealnya mereka harus ditandai sebagai duplikat satu sama lain. - person Peter Cordes   schedule 19.01.2016