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