beq
يغطي lyszt.net beq وتعليمات RISC-V الأخرى بمزيد من التفصيل.
تنسيق الترميز
الوصف
beq تتيح للبرنامج اتخاذ قرار. ينفذ المعالج التعليمات عادة بالترتيب الذي تظهر به في القائمة. هذا الترتيب وحده لا يمكنه اختيار أو تكرار أي شيء. يغيّر الفرع هذا الترتيب. يختبر شرطًا، وإذا تحقق الشرط، يتابع المعالج من مكان مختلف بدلًا من السطر التالي. تُبنى جميع عبارات if والحلقات من الفروع.
يُسمّى المكان المختلف بواسطة تسمية، وهي اسم يتبعه نقطتان تحددان موضعًا في الكود، مثل التسمية done في المثال. يقارن beq (branch if equal) بين سجلين. عندما يحملان القيمة نفسها، يقفز إلى الموضع المحدد بالتسمية؛ وعندما يختلفان، يستمر التنفيذ بالتعليمة التالية. يظهر الشكل أدناه.
beq rs1, rs2, label
لا يغيّر beq سوى التعليمة التي تُنفَّذ تاليًا. يتطلب تخزين نتيجة المقارنة yes أو no كرقم تعليمة مختلفة، موصوفة في صفحة slt.
يتتبع المعالج موضعه بسجل يسمى عداد البرنامج، يحمل عنوان التعليمة التي تعمل. يغيّر الفرع المتخذ ذلك العنوان، لذا تأتي التعليمة التالية من التسمية.
يذكر دليل RISC-V أن الفرع الشرطي يخزّن إزاحته كقيمة 12 بت تُعد بمضاعفات 2 بايت. تُوسَّع الإزاحة إشارةً وتُضاف إلى عنوان تعليمة الفرع، مما يعطي نطاقًا قدره زائد أو ناقص 4 KiB، حيث KiB هي 1024 بايت. تقارن تعليمات الفرع سجلين مباشرة ولا تستخدم رموز شرط. يذكر الدليل السبب وهو أن تعليمة مقارنة وفرع مدمجة تناسب خط أنابيب منتظم ولا تحتاج إلى حالة إضافية أو سجل مؤقت. كما ينصح البرمجيات بإبقاء المسار الأكثر شيوعًا ككود مستقيم، وبأن تتوقع أن تُتوقع الفروع الخلفية كمتخذة والفروع الأمامية كغير متخذة، على الأقل في أول مرة تُصادف فيها.
يقارن الفرع سجلين ولا يمكنه أخذ ثابت مكتوب في التعليمة، لذا لا يوجد شكل مثل beq t0, 5, label. لمقارنة سجل بثابت، حمّل الثابت إلى سجل أولًا باستخدام li، ثم قارن السجلين.
li t1, 5 beq t0, t1, done
لا تحتاج القيمة 0 إلى تحميل، لأن السجل zero يحملها دائمًا.
من الاستخدامات الشائعة مقارنة سجل بـ zero، السجل الذي يحمل 0 دائمًا، للسؤال عما إذا وصلت قيمة إلى الصفر. ينهي هذا حلقات العد التنازلي ويفحص النتائج. يتفرع المثال إلى done عندما يعد a0 تنازليًا إلى الصفر. يكفي beq والتسميات لبناء كل قرار وحلقة في برنامج.
مثال
beq a0, zero, done # if a0 == 0, jump to 'done'
