10. คำสั่งทศนิยม

คำสั่งเหล่านี้รองรับการใช้งาน ARM floating point coprocessor (บนแพลตฟอร์มเช่น OpenMV Cams ที่ติดตั้งมาพร้อมกัน) FPU มี 32 รีจิสเตอร์ที่รู้จักกันในชื่อ s0-s31 แต่ละตัวสามารถเก็บ float ความแม่นยำเดี่ยวได้ ข้อมูลสามารถส่งผ่านระหว่างรีจิสเตอร์ FPU และรีจิสเตอร์ ARM core ด้วยคำสั่ง vmov

โปรดทราบว่า MicroPython ไม่รองรับการส่ง float ไปยังฟังก์ชัน assembler และไม่สามารถวาง float ใน r0 แล้วคาดหวังผลลัพธ์ที่สมเหตุสมผล มีสองวิธีในการแก้ไขปัญหานี้ วิธีแรกคือใช้อาร์เรย์ และวิธีที่สองคือการส่งและ/หรือส่งคืนจำนวนเต็มและแปลงไปและกลับจาก float ในโค้ด

10.1. รูปแบบของเอกสาร

สัญกรณ์: Sd, Sm, Sn แทนรีจิสเตอร์ FPU, Rd, Rm, Rn แทนรีจิสเตอร์ ARM core รีจิสเตอร์หลังสามารถเป็น ARM core register ใดก็ได้ แม้ว่ารีจิสเตอร์ 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 core และ FPU

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

FPU มีรีจิสเตอร์ที่รู้จักกันในชื่อ FPSCR คล้ายกับ APSR ของ ARM core ซึ่งเก็บรหัสเงื่อนไขพร้อมกับข้อมูลอื่น คำสั่งต่อไปนี้ให้การเข้าถึงสิ่งนี้

  • vmrs(APSR_nzcv, FPSCR)

ย้ายแฟล็ก N, Z, C และ V แบบทศนิยมไปยังแฟล็ก N, Z, C และ V ของ APSR

สิ่งนี้ทำหลังจากคำสั่งเช่นการเปรียบเทียบ FPU เพื่อให้รหัสเงื่อนไขสามารถทดสอบได้โดยโค้ด assembler ต่อไปนี้เป็นรูปแบบทั่วไปมากขึ้นของคำสั่ง

  • 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 ครอบครอง word 32 บิต เมื่อเข้าถึงอาร์เรย์ของ float offset ต้องเป็นผลคูณของสี่ไบต์เสมอ

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)