10. Kayan nokta komutları

Bu komutlar, ARM kayan nokta yardımcı işlemcisinin (bununla donatılmış OpenMV Cam’ler gibi platformlarda) kullanımını destekler. FPU’nun her biri tek duyarlıklı bir kayan nokta sayısı tutabilen, s0-s31 olarak bilinen 32 yazmacı vardır. vmov komutuyla FPU yazmaçları ile ARM çekirdek yazmaçları arasında veri aktarılabilir.

MicroPython’un assembler fonksiyonlarına kayan nokta sayıları geçirmeyi desteklemediğini, ne de r0 içine bir kayan nokta sayısı koyup makul bir sonuç bekleyemeyeceğinizi unutmayın. Bunun üstesinden gelmenin iki yolu vardır. İlki dizileri kullanmak, ikincisi ise tamsayıları geçirmek ve/veya döndürmek ve kod içinde kayan nokta sayılarına dönüştürmektir.

10.1. Belge kuralları

Gösterim: Sd, Sm, Sn FPU yazmaçlarını, Rd, Rm, Rn ise ARM çekirdek yazmaçlarını belirtir. İkincisi herhangi bir ARM çekirdek yazmacı olabilir, ancak R13-R15 yazmaçlarının bu bağlamda uygun olması olası değildir.

10.2. Aritmetik

  • 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)

Yazmaçlar aynı olabilir: vmul(S0, S0, S0), S0 = S0*S0 işlemini çalıştırır

10.3. ARM çekirdek ile FPU yazmaçları arasında taşıma

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

FPU’nun, ARM çekirdeğinin APSR’sine benzer, koşul kodlarını ve diğer verileri saklayan FPSCR olarak bilinen bir yazmacı vardır. Aşağıdaki komutlar buna erişim sağlar.

  • vmrs(APSR_nzcv, FPSCR)

Kayan nokta N, Z, C ve V bayraklarını APSR N, Z, C ve V bayraklarına taşır.

Bu, koşul kodlarının assembler kodu tarafından test edilebilmesini sağlamak için FPU karşılaştırması gibi bir komuttan sonra yapılır. Aşağıdaki, komutun daha genel bir biçimidir.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. FPU yazmacı ile bellek arasında taşıma

  • vldr(Sd, [Rn, offset]) Sd = [Rn + offset]

  • vstr(Sd, [Rn, offset]) [Rn + offset] = Sd

Burada [Rn + offset], Rn’nin offset’e eklenmesiyle elde edilen bellek adresini belirtir. Bu, bayt cinsinden belirtilir. Her kayan nokta değeri 32 bitlik bir kelime kapladığından, kayan nokta dizilerine erişirken offset her zaman dört baytın katı olmalıdır.

10.5. Veri karşılaştırma

  • vcmp(Sd, Sm)

Sd ve Sm içindeki değerleri karşılaştırır ve FPU N, Z, C ve V bayraklarını ayarlar. Bunu normalde, sonuçların test edilmesini sağlamak için vmrs(APSR_nzcv, FPSCR) izler.

10.6. Tamsayı ile kayan nokta arasında dönüştürme

  • vcvt_f32_s32(Sd, Sm) Sd = float(Sm)

  • vcvt_s32_f32(Sd, Sm) Sd = int(Sm)