10. הוראות נקודה צפה

הוראות אלה תומכות בשימוש במעבד המשני לנקודה צפה של ARM (בפלטפורמות כגון OpenMV Cams המצוידות באחד). ל-FPU יש 32 אוגרים הידועים כ-s0-s31, שכל אחד מהם יכול להחזיק float ברמת דיוק יחיד. ניתן להעביר נתונים בין אוגרי ה-FPU לאוגרי ליבת ARM באמצעות ההוראה vmov.

שימו לב ש-MicroPython אינו תומך בהעברת floats לפונקציות אסמבלר, ואף אינכם יכולים להציב float ב-r0 ולצפות לתוצאה סבירה. ישנן שתי דרכים להתגבר על כך. הראשונה היא להשתמש במערכים, והשנייה היא להעביר ו/או להחזיר מספרים שלמים ולהמיר אל float וממנו בקוד.

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 ל-offset. זה מצוין בבייטים. מכיוון שכל ערך float תופס מילה בת 32 סיביות, בעת גישה למערכים של floats ה-offset חייב תמיד להיות כפולה של ארבעה בייטים.

10.5. השוואת נתונים

  • vcmp(Sd, Sm)

משווה את הערכים ב-Sd וב-Sm ומגדיר את דגלי N, Z, C ו-V של ה-FPU. בדרך כלל יבוא אחרי זה vmrs(APSR_nzcv, FPSCR) כדי לאפשר את בדיקת התוצאות.

10.6. המרה בין מספר שלם ל-float

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

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