Tentu saja kondisinya diperiksa setiap saat. Tetapi pada saat itu diperiksa, itu jauh ke dalam pipa CPU. Sementara itu, instruksi lain juga telah memasuki pipa, dan berada pada berbagai tahap pelaksanaan.
Biasanya, suatu kondisi segera diikuti oleh instruksi cabang bersyarat, yang cabang baik jika kondisi mengevaluasi ke TRUE, atau jatuh melalui jika kondisi mengevaluasi ke FALSE. Ini berarti bahwa ada dua aliran instruksi yang berbeda yang dapat dimuat ke dalam pipa setelah instruksi kondisi dan instruksi cabang, tergantung pada apakah kondisi mengevaluasi ke TRUE atau FALSE. Sayangnya, segera setelah memuat instruksi kondisi dan instruksi cabang, CPU belum tahu kondisi apa yang akan dievaluasi, tetapi masih harus tetap memuat barang-barang ke dalam pipa. Jadi ia mengambil salah satu dari dua set instruksi berdasarkan dugaan seperti apa kondisi yang akan dievaluasi.
Kemudian, ketika instruksi kondisi melewati pipa, sekarang saatnya untuk dievaluasi. Pada saat itu, CPU mengetahui apakah tebakannya benar atau salah.
Jika tebakan ternyata benar, maka cabang pergi ke tempat yang benar, dan instruksi yang tepat dimuat ke dalam pipa. Jika ternyata dugaan itu salah, maka semua instruksi yang dimuat ke dalam pipa setelah instruksi cabang bersyarat salah, mereka harus dibuang, dan pengambilan instruksi harus dimulai lagi dari tempat yang tepat.
Amandemen
Menanggapi komentar StarWeaver, untuk memberikan gambaran tentang apa yang harus dilakukan CPU untuk menjalankan satu instruksi:
Anggap sesuatu yang sesederhana MOV AX,[SI+10]
yang oleh manusia kita anggap naif sebagai "memuat AXE dengan kata di SI plus 10". Secara kasar, CPU harus:
- memancarkan isi PC ("register program register") ke bus alamat;
- baca instruksi opcode dari bus data;
- kenaikan PC;
- decode opcode untuk mencari tahu apa yang harus dilakukan dengannya;
- memancarkan isi PC ke bus alamat;
- baca operan instruksi (dalam hal ini 10) dari bus data;
- kenaikan PC;
- beri makan operan dan SI ke penambah;
- memancarkan hasil dari penambah ke bus alamat;
- baca AX dari bus data.
Ini adalah 10 langkah kekalahan. Beberapa langkah-langkah ini akan dioptimalkan jauh bahkan dalam CPU non-pipeline, misalnya CPU akan hampir selalu meningkatkan PC secara paralel dengan langkah berikutnya, yang merupakan hal yang mudah dilakukan karena PC adalah register yang sangat, sangat istimewa yang tidak pernah digunakan untuk pekerjaan lain, jadi tidak ada kemungkinan pertikaian antara berbagai bagian CPU untuk akses ke register khusus ini. Tapi tetap saja, kita dibiarkan dengan 8 langkah untuk instruksi yang begitu sederhana, dan perhatikan bahwa saya sudah mengasumsikan tingkat kecanggihan atas nama CPU, misalnya saya mengasumsikan bahwa tidak perlu untuk seluruh langkah ekstra untuk penambah untuk benar-benar melakukan penambahan sebelum hasilnya dapat dibaca dari itu,
Sekarang, pertimbangkan bahwa ada mode pengalamatan yang lebih rumit, seperti MOV AX, [DX+SI*4+10]
, dan bahkan instruksi yang jauh lebih rumit, seperti MUL AX, operand
yang benar-benar melakukan loop di dalam CPU untuk menghitung hasilnya.
Jadi, maksud saya di sini adalah metafora "level atom" jauh dari cocok untuk level instruksi CPU. Mungkin cocok untuk tingkat langkah pipa, jika Anda tidak ingin pergi terlalu jauh ke tingkat gerbang logika yang sebenarnya.