mul

mul

تجميع RISC-V مرجع

يغطي lyszt.net mul وتعليمات RISC-V الأخرى بمزيد من التفصيل.

تنسيق الترميز

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

الوصف

mul يضرب سجلين. يقرأ rs1 و rs2، ويضرب هاتين القيمتين، ويكتب الناتج في rd. الصيغة أدناه تعني rd = rs1 * rs2.

mul rd, rs1, rs2

يُنظَّم RISC-V في طبقات تُسمى الامتدادات. ينتمي الضرب والقسمة إلى الامتداد المسمى M، والذي يمكن لأصغر نواة RISC-V حذفه. يتضمنه هذا المحاكي، لأن اسمه الكامل RV32IM ينتهي بـ M، لذا فإن mul وdiv متاحان. المعالج الذي لا يملك M يجب أن يقوم بهذا العمل في البرمجيات.

قد يبلغ ناتج ضرب عددين 32-بت 64 بت، وهو ما يتجاوز ما يمكن لسجل واحد أن يحمله. يحتفظ mul بالـ 32 بت السفلية. بالنسبة للقيم الصغيرة يكون ذلك هو الجواب الكامل. تأتي الـ 32 بت العلوية من تعليمة منفصلة، mulh. تنتج المدخلات الموقّعة وغير الموقّعة نفس الـ 32 بت السفلية، لذا تغطي تعليمة واحدة كليهما.

عندما تكون هناك حاجة إلى نصفي الناتج، يوصي دليل RISC-V بزوج ثابت من التعليمات. توفّر تعليمة mulh (أو أحد متغيراتها غير الموقّعة) النصف العلوي، ويوفّر mul بنفس سجلات المصدر وبنفس الترتيب النصف السفلي. لا يمكن أن تكون وجهة النصف العلوي هي rs1 أو rs2. يمكن للمعالج بعد ذلك دمج التعلميتين في عملية ضرب واحدة.

يمكن استخدام الإزاحة اليسرى بدلاً من الضرب في قوة اثنين (2، 4، 8، 16 وهكذا). الإزاحة لليسار بمقدار 3 مواضع تضرب في 8، وتكلفة الإزاحة أقل من الضرب (انظر slli). يقوم المترجمون بهذا الاستبدال تلقائيًا. يضرب المثال 6 في 7 ويترك 42 في t2.

مثال

li t0, 6
li t1, 7
mul t2, t0, t1   # t2 = 42