Saya pikir saya sedang mencari jawaban untuk pertanyaan trivia. Saya mencoba memahami mengapa arsitektur MIPS menggunakan nilai "nol" eksplisit dalam register ketika Anda dapat mencapai hal yang sama dengan hanya XOR'ing register apa pun terhadap dirinya sendiri. Orang bisa mengatakan bahwa operasi sudah dilakukan untuk Anda; Namun, saya tidak bisa membayangkan situasi di mana Anda akan menggunakan banyak nilai "nol". Saya membaca makalah asli Hennessey, dan hanya menetapkan nol sebagai fakta tanpa pembenaran nyata.
Apakah alasan logis untuk memiliki tugas biner kode-nol nol ada?
pembaruan: Dalam 8k dari executable dari xc32-gcc untuk inti MIPS di PIC32MZ, saya punya satu contoh "nol".
add t3,t1,zero
jawaban aktual: Saya memberikan hadiah kepada orang yang memiliki informasi tentang MIPS dan kode kondisi. Jawabannya sebenarnya terletak pada arsitektur MIPS untuk kondisi. Meskipun pada awalnya saya tidak ingin menetapkan waktu untuk ini, saya meninjau arsitektur untuk opensparc , MIPS-V , dan OpenPOWER (dokumen ini bersifat internal) dan di sini adalah ringkasan temuan. Daftar R0 diperlukan untuk perbandingan pada cabang karena arsitektur pipa.
- bilangan bulat dibandingkan dengan nol dan cabang (bgez, bgtz, blez, bltz)
- integer membandingkan dua register dan cabang (beq, bne)
- integer membandingkan dua register dan trap (teq, tge, tlt, tne)
- integer bandingkan register dan segera dan trap (teqi, tgei, tlti, tnei)
Itu hanya datang ke bagaimana hardware terlihat dalam implementasi. Dari manual MIPS-V, ada kutipan tanpa referensi di halaman 68:
Cabang bersyarat dirancang untuk mencakup operasi perbandingan aritmatika antara dua register (seperti yang juga dilakukan dalam PA-RISC dan Xtensa ISA), daripada menggunakan kode kondisi (x86, ARM, SPARC, PowerPC), atau hanya membandingkan satu register dengan nol ( Alpha, MIPS), atau dua register only for equality (MIPS). Desain ini dimotivasi oleh pengamatan bahwa gabungan perintah bandingkan dan cabang ke dalam pipa biasa, menghindari status kode kondisi tambahan atau penggunaan register sementara, dan mengurangi ukuran kode statis dan instruksi dinamis mengambil trac. Poin lain adalah bahwa perbandingan terhadap nol memerlukan penundaan sirkuit non-trivial (terutama setelah pindah ke logika statis dalam proses lanjutan) dan karenanya hampir semahal perbandingan besarnya aritmatika. Keuntungan lain dari instruksi membandingkan-dan-cabang menyatu adalah bahwa cabang diamati sebelumnya dalam aliran instruksi front-end, dan dengan demikian dapat diprediksi sebelumnya. Mungkin ada keuntungan untuk desain dengan kode kondisi dalam kasus di mana beberapa cabang dapat diambil berdasarkan kode kondisi yang sama, tetapi kami percaya kasus ini relatif jarang.
Dokumen MIPS-V tidak mengenai penulis bagian yang dikutip. Saya berterima kasih kepada semua orang atas waktu dan pertimbangan mereka.