10. Інструкції з плаваючою комою

Ці інструкції підтримують використання співпроцесора ARM з плаваючою комою (на платформах, таких як OpenMV Cams, оснащених ним). FPU має 32 регістри, відомі як s0-s31, кожен з яких може зберігати число з плаваючою комою одинарної точності. Дані можна передавати між регістрами FPU та основними регістрами ARM за допомогою інструкції vmov.

Зверніть увагу, що MicroPython не підтримує передачу чисел з плаваючою комою до функцій асемблера, і ви не можете помістити число з плаваючою комою в r0 та очікувати розумного результату. Є два способи вирішити цю проблему. Перший – використовувати масиви, другий – передавати та/або повертати цілі числа і перетворювати їх у числа з плаваючою комою і назад у коді.

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 до зміщення. Це вказується в байтах. Оскільки кожне значення з плаваючою комою займає 32-бітне слово, при доступі до масивів чисел з плаваючою комою зміщення завжди повинно бути кратним чотирьом байтам.

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)