Branch Instruction — shartning natijasiga qarab dastur bajarilishini nishon manziliga o‘tkazadigan yoki odatdagi ketma-ket yo‘lda qoldiradigan protsessor buyrug‘i. U if, sikl va taqqoslashga asoslangan boshqaruv tuzilmalarining mashina darajasidagi asosiy vositasidir. Shartsiz o‘tish odatda jump deb ajratiladi, garchi ayrim ISA hujjatlarida umumiy branch oilasiga kiritilsa ham.
Shartni hosil qilish
Ba’zi arxitekturalarda oldingi arifmetik yoki compare buyrug‘i nol, manfiy, carry va overflow kabi holat bayroqlarini o‘rnatadi; branch shu bayroqlar kombinatsiyasini tekshiradi. Boshqa ISAlarda branch ikki registrni bevosita solishtiradi. Ikkala modelda ham signed va unsigned taqqoslash farqi muhim, chunki eng katta biti birida ishora, boshqasida qiymatning qismi hisoblanadi.
Nishon ko‘pincha joriy program counterga qo‘shiladigan ishorali siljish bilan kodlanadi. Nisbiy manzil kodni xotiraning boshqa joyiga ko‘chirishni yengillashtiradi. Siljish maydoni cheklangan bo‘lsa, uzoq nishon uchun assembler yoki linker teskari shartli qisqa branch va alohida uzoq jump ketma-ketligini yaratishi mumkin.
Quvurga ta’siri
Fetch keyingi manzilni branch bajarilishidan oldin bilishi kerak. Har safar natijani kutish chuqur quvurda katta bo‘shliq yaratadi. Branch predictor tarixga va kod manziliga qarab “olinadi” yoki “olinmaydi” deb taxmin qiladi; branch target buffer esa ehtimoliy nishonni beradi.
Taxmin to‘g‘ri bo‘lsa spekulyativ buyruqlar odatdagidek davom etadi. Xato bo‘lsa ular bekor qilinib, to‘g‘ri manzildan fetch boshlanadi. Dastur natijasi o‘zgarmaydi, ammo jarima quvur chuqurligi va to‘g‘ri nishonni aniqlash vaqtiga bog‘liq.
Kompilyator yaratadigan shakllar
Kompilyator tez-tez bajariladigan yo‘lni ketma-ket joylashtirib, kam uchraydigan yo‘lni branch nishoniga qo‘yishi mumkin. Bu instruction cache joylashuvi va predictor ishiga yordam beradi. Kichik shartli amal ba’zi arxitekturalarda conditional move yoki predikatsiya bilan branchsiz bajariladi; noto‘g‘ri bashorat xavfi kamayadi, ammo ikki yo‘lning keraksiz ishini bajarish ehtimoli bor.
Siklning orqa branchi odatda ko‘p marta olinadi va chiqishda bir marta olinmaydi. Oddiy predictor bunday naqshni yaxshi o‘rganadi. Ma’lumotga bog‘liq tasodifiy shart esa bashorat qilinishi qiyin bo‘lib, branch miss ko‘rsatkichini oshiradi.
Xavfsizlik va to‘g‘rilik
Branch sharti va nishoni ISA ko‘rsatgan operand kengligida hisoblanadi; noto‘g‘ri overflow talqini xavfsizlik tekshiruvini chetlab o‘tishi mumkin. Spekulyativ noto‘g‘ri yo‘l me’moriy commit qilinmasa ham keshda iz qoldirishi mumkin. Maxfiy qiymatga bog‘liq branchlar kriptografik kodda vaqt va mikroarxitektura yon kanaliga sabab bo‘lishi mumkin, shu bois doimiy vaqtli usullar qo‘llanadi.
Branch delay slot mavjud tarixiy arxitekturalarda o‘tishdan keyingi bitta yoki bir nechta buyruq nishon tanlanishidan qat’i nazar bajariladi. Kompilyator bu joyga foydali mustaqil amal qo‘yishga harakat qiladi, topilmasa NOP ishlatadi. Bunday semantika ISAga ko‘rinadi va zamonaviy bashoratning ichki spekulyatsiyasidan farq qiladi. Binary tarjimon va debugger delay slotdagi istisno manzili hamda bir qadamli bajarishni aynan spetsifikatsiyaga muvofiq yuritishi kerak.
Profilga yo‘naltirilgan optimallashtirish haqiqiy ishga tushirishdan branch chastotasi va yo‘nalishini yig‘adi. Kompilyator shu ma’lumot bilan bloklarni joylashtiradi, lekin ishlab chiqarish kirishlari profil namunalaridan keskin farq qilsa kutilgan foyda kamayadi yoki kesh joylashuvi yomonlashadi.
Branch statistikasi kirish ma’lumotiga bog‘liq bo‘ladi.
Bog‘liq tushunchalar
condition code, branch prediction, branch target buffer, control hazard, jump instruction, constant-time programming