Tim emulator x86 menemukan kode buruk dan memperbaikinya saat emulasi

Judul asli: The time the x86 emulator team found code so bad they fixed it during emulation

Mengapa Ini Penting

Menunjukkan tantangan optimisasi compiler historis dan bagaimana emulator harus mengatasi ineffisiensi kode legacy untuk mempertahankan performa sistem.

Tim emulator x86-32 Windows menemukan program yang menggunakan 256 kilobyte kode untuk menginisialisasi 64 kilobyte data karena compiler unrolling loop secara ekstrem, lalu mereka menambahkan kode khusus penerjemah untuk mendeteksi dan menggantinya dengan loop yang efisien.

Menurut cerita yang dibagikan Raymond Chen dari Microsoft, pada masa ketika Windows menyertakan emulator prosesor x86-32 untuk sistem dengan prosesor asli yang berbeda, tim emulator menemukan masalah luar biasa dalam suatu program. Program tersebut perlu mengalokasikan sekitar 64 kilobyte memori di stack dan menginisialisasinya.

Seharusnya, compiler akan menggunakan loop ketat untuk menginisialisasi memori tersebut. Namun, compiler yang digunakan untuk mengompilasi program itu melakukan "optimisasi" yang sangat buruk: unrolling loop menjadi 65.536 instruksi individual "write byte to memory" yang terpisah, masing-masing 4 byte panjang. Akibatnya, program menggunakan 256 kilobyte kode hanya untuk menginisialisasi 64 kilobyte data.

Kejadian ini sangat mengusik tim emulator sehingga mereka menambahkan kode khusus ke penerjemah biner untuk mendeteksi fungsi yang mengerikan ini dan menggantinya dengan loop yang setara namun jauh lebih efisien. Emulator ini menggunakan binary translation, menghasilkan kode asli untuk melakukan operasi ekuivalen dari kode x86-32 original, memberikan peningkatan performa signifikan dibanding emulasi interpreter.

Sumber

devblogs.microsoft.com — Baca artikel asli →