10. تعليمات الفاصلة العائمة

تدعم هذه التعليمات استخدام المعالج المساعد للفاصلة العائمة في ARM (على منصات مثل OpenMV Cams المزودة بواحد). تمتلك وحدة FPU 32 سجلًا تُعرف بـ s0-s31 يمكن لكل منها أن يحمل عددًا عشريًا بدقة مفردة. يمكن تمرير البيانات بين سجلات FPU وسجلات نواة ARM باستخدام تعليمة vmov.

لاحظ أن MicroPython لا يدعم تمرير الأعداد العشرية إلى دوال المُجمِّع، ولا يمكنك وضع عدد عشري في r0 وتوقع نتيجة معقولة. هناك طريقتان للتغلب على هذا. الأولى هي استخدام المصفوفات، والثانية هي تمرير و/أو إرجاع أعداد صحيحة والتحويل من وإلى الأعداد العشرية في الشيفرة.

10.1. اصطلاحات التوثيق

الترميز: Sd, Sm, Sn تدل على سجلات FPU، وRd, Rm, Rn تدل على سجلات نواة ARM. يمكن أن تكون الأخيرة أي سجل من سجلات نواة ARM، رغم أن السجلات R13-R15 من غير المرجح أن تكون مناسبة في هذا السياق.

10.2. الحساب

  • vadd(Sd, Sn, Sm) Sd = Sn + Sm

  • vsub(Sd, Sn, Sm) Sd = Sn - Sm

  • vneg(Sd, Sm) Sd = -Sm

  • vmul(Sd, Sn, Sm) Sd = Sn * Sm

  • vdiv(Sd, Sn, Sm) Sd = Sn / Sm

  • vsqrt(Sd, Sm) Sd = sqrt(Sm)

يمكن أن تكون السجلات متطابقة: vmul(S0, S0, S0) سينفّذ S0 = S0*S0

10.3. النقل بين سجلات نواة ARM وسجلات FPU

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

تمتلك وحدة FPU سجلًا يُعرف بـ FPSCR، مشابهًا لسجل APSR في نواة ARM، يخزّن رموز الشرط بالإضافة إلى بيانات أخرى. توفر التعليمات التالية الوصول إلى هذا.

  • vmrs(APSR_nzcv, FPSCR)

انقل أعلام N وZ وC وV الخاصة بالفاصلة العائمة إلى أعلام N وZ وC وV في APSR.

يتم هذا بعد تعليمة مثل مقارنة FPU لتمكين اختبار رموز الشرط بواسطة شيفرة المُجمِّع. التالي صيغة أكثر عمومية للتعليمة.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. النقل بين سجل FPU والذاكرة

  • vldr(Sd, [Rn, offset]) Sd = [Rn + offset]

  • vstr(Sd, [Rn, offset]) [Rn + offset] = Sd

حيث يدل [Rn + offset] على عنوان الذاكرة الناتج عن إضافة Rn إلى الإزاحة. يُحدَّد هذا بالبايتات. وبما أن كل قيمة عشرية تشغل كلمة بعرض 32 بت، فعند الوصول إلى مصفوفات الأعداد العشرية يجب أن تكون الإزاحة دائمًا من مضاعفات أربعة بايتات.

10.5. مقارنة البيانات

  • vcmp(Sd, Sm)

قارن القيمتين في Sd وSm واضبط أعلام N وZ وC وV الخاصة بـ FPU. يتبع هذا عادةً vmrs(APSR_nzcv, FPSCR) لتمكين اختبار النتائج.

10.6. التحويل بين العدد الصحيح والعدد العشري

  • vcvt_f32_s32(Sd, Sm) Sd = float(Sm)

  • vcvt_s32_f32(Sd, Sm) Sd = int(Sm)