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 + 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 core และ FPU¶
vmov(Sd, Rm)
Sd = Rmvmov(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)