10. Instruksi floating point¶
Instruksi-instruksi ini mendukung penggunaan coprocessor floating point ARM (pada platform seperti OpenMV Cam yang dilengkapi dengan satu). FPU memiliki 32 register yang dikenal sebagai s0-s31 yang masing-masing dapat menampung satu float presisi tunggal. Data dapat dipindahkan antara register FPU dan register inti ARM dengan instruksi vmov.
Perhatikan bahwa MicroPython tidak mendukung penerusan float ke fungsi assembler, dan Anda juga tidak bisa menempatkan float ke dalam r0 dan mengharapkan hasil yang wajar. Ada dua cara untuk mengatasinya. Yang pertama adalah menggunakan array, dan yang kedua adalah meneruskan dan/atau mengembalikan bilangan bulat dan mengkonversi ke dan dari float dalam kode.
10.1. Konvensi dokumen¶
Notasi: Sd, Sm, Sn menunjukkan register FPU, Rd, Rm, Rn menunjukkan register inti ARM. Yang terakhir dapat berupa register inti ARM mana pun meskipun register R13-R15 kemungkinan tidak sesuai dalam konteks ini.
10.2. Aritmetika¶
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)
Register bisa identik: vmul(S0, S0, S0) akan mengeksekusi S0 = S0*S0
10.3. Pindah antara register inti ARM dan FPU¶
vmov(Sd, Rm)
Sd = Rmvmov(Rd, Sm)
Rd = Sm
FPU memiliki register yang dikenal sebagai FPSCR, mirip dengan APSR inti ARM, yang menyimpan kode kondisi beserta data lainnya. Instruksi berikut menyediakan akses ke ini.
vmrs(APSR_nzcv, FPSCR)
Pindahkan flag N, Z, C, dan V floating-point ke flag N, Z, C, dan V APSR.
Ini dilakukan setelah instruksi seperti perbandingan FPU untuk memungkinkan kode kondisi diuji oleh kode assembler. Berikut ini adalah bentuk instruksi yang lebih umum.
vmrs(Rd, FPSCR)
Rd = FPSCR
10.4. Pindah antara register FPU dan memori¶
vldr(Sd, [Rn, offset])
Sd = [Rn + offset]vstr(Sd, [Rn, offset])
[Rn + offset] = Sd
Di mana [Rn + offset] menunjukkan alamat memori yang diperoleh dengan menambahkan Rn ke offset. Ini ditentukan dalam byte. Karena setiap nilai float menempati kata 32 bit, saat mengakses array float, offset harus selalu merupakan kelipatan empat byte.
10.5. Perbandingan data¶
vcmp(Sd, Sm)
Bandingkan nilai dalam Sd dan Sm dan setel flag N, Z, C, dan V FPU. Ini biasanya diikuti dengan vmrs(APSR_nzcv, FPSCR) untuk memungkinkan hasil diuji.
10.6. Konversi antara integer dan float¶
vcvt_f32_s32(Sd, Sm)
Sd = float(Sm)vcvt_s32_f32(Sd, Sm)
Sd = int(Sm)