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 + Smvsub(Sd, Sn, Sm)
Sd = Sn - Smvneg(Sd, Sm)
Sd = -Smvmul(Sd, Sn, Sm)
Sd = Sn * Smvdiv(Sd, Sn, Sm)
Sd = Sn / Smvsqrt(Sd, Sm)
Sd = sqrt(Sm)
אוגרים יכולים להיות זהים: vmul(S0, S0, S0) יבצע S0 = S0*S0
10.3. העברה בין אוגרי ליבת ARM ל-FPU¶
vmov(Sd, Rm)
Sd = Rmvmov(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)