div
يغطي lyszt.net div وتعليمات RISC-V الأخرى بمزيد من التفصيل.
تنسيق الترميز
الوصف
div يقسم سجلاً على آخر. يقرأ سجلات المصدر rs1 و rs2، ويقسم الأول على الثاني، ويكتب النتيجة في سجل الوجهة rd. الصيغة أدناه تعني rd = rs1 / rs2.
div rd, rs1, rs2
مثل الضرب، ينتمي إلى امتداد M لتعليمات الرياضيات الاختيارية، والذي يتضمنه هذا المحاكي.
هذه قسمة صحيحة، لذا يُسقط الجزء الكسري. 7 مقسومة على 2 تعطي 3. الباقي 1 يأتي من rem، الذي يحسب باقي نفس العددين. النتائج السالبة تُقرَّب نحو الصفر، لذا -7 / 2 تعطي -3.
القسمة على صفر تُرجع -1، وهو سجل كل بتاته مضبوطة على 1. لا يعطي العتاد أي تحذير، لذا الكود الذي يجب أن يعامل المقسوم عليه الصفري كخطأ يتحقق من المقسوم عليه قبل القسمة.
يحدد دليل RISC-V الحالات الخاصة. القسمة على صفر تعطي خارج قسمة كل بتاته مضبوطة، والذي يُقرأ كـ -1 بالنسبة لـ div، وباقٍ يساوي المقسوم. يحدث الفائض المُوقَّع فقط عندما يُقسم العدد الأكثر سلبية على -1. عندئذٍ يساوي خارج القسمة المقسوم والباقي صفر. يقول الدليل إن الفخ عند القسمة على صفر قد تم النظر فيه ورُفض، لأنه سيكون الفخ الحسابي الوحيد في مجموعة التعليمات، ولأن ضبط كل البتات يبقي دائرة القسمة بسيطة.
لأي قسمة لا تفيض، يساوي المقسوم المقسوم عليه مضروباً في خارج القسمة زائد الباقي. عندما يُحتاج إلى خارج القسمة والباقي معاً، يوصي الدليل بالسطرين أدناه، مع أن يكون rdq مختلفاً عن rs1 و rs2. يمكن للمعالج عندئذٍ دمج الاثنين في قسمة واحدة.
div rdq, rs1, rs2 rem rdr, rs1, rs2
القسمة هي أبطأ عملية حسابية يقوم بها المعالج، وغالباً ما تكون أبطأ بعدة مرات من الضرب. القسمة على قوة اثنين (2، 4، 8 وهكذا) يمكن أن تستخدم إزاحة يمينية بدلاً من ذلك (انظر srai). يقسم المثال 17 على 5. 5 تدخل في 17 ثلاث مرات كاملة مع بقاء 2، لذا يدخل خارج القسمة 3 في t2.
مثال
li t0, 17 li t1, 5 div t2, t0, t1 # t2 = 3
