- Apa
rep; nop
maksudnya - Apakah itu sama dengan
pause
instruksi? - Apakah sama dengan
rep nop
(tanpa titik koma)? - Apa bedanya
nop
instruksi sederhana ? - Apakah itu berperilaku berbeda pada prosesor AMD dan Intel?
- (bonus) Di manakah dokumentasi resmi untuk instruksi ini?
Motivasi untuk pertanyaan ini
Setelah beberapa diskusi di komentar dari pertanyaan lain , saya menyadari bahwa saya tidak tahu apa rep; nop;
artinya dalam perakitan x86 (atau x86-64). Dan juga saya tidak dapat menemukan penjelasan yang bagus di web.
Saya tahu itu rep
adalah awalan yang berarti "ulangi instruksi cx
kali berikutnya " (atau setidaknya itu, dalam perakitan x86 16-bit lama). Menurut ini tabel ringkasan di Wikipedia , tampaknya rep
hanya dapat digunakan dengan movs
, stos
, cmps
, lods
, scas
(tapi mungkin keterbatasan ini telah dihapus pada prosesor yang lebih baru). Jadi, saya akan berpikir rep nop
(tanpa titik koma) akan mengulangi waktu nop
operasi cx
.
Namun, setelah mencari lebih jauh, saya semakin bingung. Tampaknya rep; nop
dan pause
memetakan ke opcode yang persis sama , dan pause
memiliki perilaku yang sedikit berbeda dari sekadar nop
. Beberapa surat lama dari tahun 2005 mengatakan hal yang berbeda:
- "cobalah untuk tidak membakar terlalu banyak tenaga"
- "Ini setara dengan 'nop' hanya dengan pengkodean 2 byte."
- "Ini sihir bagi intel. Ini seperti 'nop tapi biarkan saudara HT lainnya lari'"
- "Ini adalah jeda pada intel dan padding cepat di Athlon"
Dengan pendapat yang berbeda ini, saya tidak dapat memahami arti yang benar.
Ini digunakan di kernel Linux (di i386 dan x86_64 ), bersama dengan komentar ini: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
Ini juga digunakan di BeRTOS , dengan komentar yang sama.
Jawaban:
rep; nop
memang sama denganpause
instruksi (opcodeF390
). Ini mungkin digunakan untuk assembler yang belum mendukungpause
instruksi. Pada prosesor sebelumnya, ini tidak melakukan apa-apa, sama sepertinop
tetapi dalam dua byte. Pada prosesor baru yang mendukung hyperthreading, ini digunakan sebagai petunjuk bagi prosesor bahwa Anda menjalankan spinloop untuk meningkatkan kinerja. Dari referensi instruksi Intel :sumber
pause
, spin-loop Anda secara efektif satu pipeline-clear lebih lambat untuk memperhatikan perubahan status lokasi memori yang ditulis oleh inti lain.rep nop
= F3 90 = pengkodeanpause
, serta cara menerjemahkannya pada CPU lama yang tidak mendukungpause
.Awalan (selain
lock
) yang tidak berlaku untuk instruksi diabaikan dalam praktiknya oleh CPU yang ada.Dokumentasi mengatakan penggunaan
rep
dengan instruksi yang tidak berlaku untuk "dicadangkan dan dapat menyebabkan perilaku tak terduga" karena CPU di masa mendatang mungkin mengenalinya sebagai bagian dari beberapa instruksi baru. Setelah mereka membuat pengkodean instruksi baru yang spesifik menggunakanf3 xx
, mereka mendokumentasikan bagaimana itu berjalan pada CPU lama. (Ya, ruang opcode x86 sangat terbatas sehingga mereka melakukan hal-hal gila seperti ini, dan ya itu membuat decoder menjadi rumit.)Dalam hal ini, itu berarti Anda dapat menggunakan
pause
spinloop tanpa melanggar compat mundur . CPU lama yang tidak tahu tentangpause
akan mendekodekannya sebagai NOP tanpa kerusakan, seperti yang dijamin oleh entripause
manual referensi ISA Intel untuk . Pada CPU baru, Anda mendapatkan manfaat dari hemat daya / keramahan HT, dan menghindari kesalahan spekulasi pengurutan memori saat memori yang Anda putar berubah dan Anda meninggalkan putaran putaran.Tautan ke manual Intel dan banyak hal bagus lainnya di halaman info wiki tag x86
Kasus lain dari
rep
awalan yang tidak berarti menjadi instruksi baru pada CPU baru:lzcnt
adalahF3 0F BD /r
. Pada CPU yang tidak mendukung instruksi itu (tidak memiliki tanda fitur LZCNT di CPUID-nya), ia mendekode sebagairep bsr
, yang berjalan sama denganbsr
. Jadi pada CPU lama, ia menghasilkan32 - expected_result
, dan tidak ditentukan saat inputnya nol.Tetapi
tzcnt
danbsf
melakukan hal yang sama dengan input bukan nol, sehingga kompiler dapat dan memang menggunakantzcnt
meskipun tidak ada jaminan bahwa CPU target akan menjalankannya sebagaitzcnt
. CPU AMD memiliki kecepatan yang cepattzcnt
, lambatbsf
, dan pada Intel keduanya juga cepat. Selama tidak masalah kebenarannya (Anda tidak bergantung pada pengaturan bendera, atau meninggalkan tujuan tujuan yang tidak dimodifikasi dalam kasus input = 0), membuatnya didekode sepertitzcnt
pada CPU yang mendukungnya akan sangat membantu.Salah satu kasus
rep
awalan yang tidak berarti yang mungkin tidak akan pernah didekode secara berbeda:rep ret
digunakan secara default oleh gcc saat menargetkan CPU "generik" (yaitu tidak menargetkan CPU tertentu dengan-march
atau-mtune
, dan tidak menargetkan AMD K8 atau K10.) Ini akan memakan waktu puluhan tahun sebelum siapa pun dapat membuat CPU yang menerjemahkan koderep ret
selainret
, karena ia ada di sebagian besar binari di sebagian besar distro Linux. Lihat Apa arti `rep ret`?sumber
rep
prefix juga digunakan oleh Intel untuk menambahkan kunci penghilangan bunyi dlm percakapan.F2H
danF3H
) Dicadangkan dan dapat mengakibatkan perilaku yang tidak dapat diprediksi pada Tabel 11-3. Pengaruh Awalan pada Instruksi SSE, SSE2, dan SSE3 . Jadi aplikasi awalan diabaikan untuk beberapa instruksi, tidak untuk semua. Jadi, apakah fitur ini dianggap tidak berdokumen?f3 xx
mereka mendokumentasikan bagaimana itu berjalan pada CPU yang lebih lama.rep movbe
Penyebabnya didokumentasikan#UD
, jadirep
tidak selalu diabaikan. Bahkan jika itu tidak berlaku untuk instruksi dalam arti seperti yang ditentukan dalamREP/REPE/REPZ/REPNE/REPNZ
entri manual.