10. 부동 소수점 명령어

이 명령어들은 ARM 부동 소수점 보조 프로세서의 사용을 지원합니다(이를 탑재한 OpenMV Cam과 같은 플랫폼에서). FPU에는 s0-s31 로 알려진 32개의 레지스터가 있으며, 각각 단정밀도 float를 담을 수 있습니다. 데이터는 vmov 명령어로 FPU 레지스터와 ARM 코어 레지스터 사이에서 전달될 수 있습니다.

MicroPython은 float를 어셈블러 함수에 전달하는 것을 지원하지 않으며, float를 r0 에 넣고 합당한 결과를 기대할 수도 없다는 점에 유의하세요. 이를 극복하는 방법은 두 가지입니다. 첫 번째는 배열을 사용하는 것이고, 두 번째는 정수를 전달하거나 반환하고 코드 안에서 float와 변환하는 것입니다.

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에는 ARM 코어의 APSR과 유사한 FPSCR이라는 레지스터가 있으며, 조건 코드와 기타 데이터를 저장합니다. 다음 명령어들이 이에 대한 접근을 제공합니다.

  • vmrs(APSR_nzcv, FPSCR)

부동 소수점 N, Z, C, V 플래그를 APSR의 N, Z, C, V 플래그로 이동합니다.

이것은 조건 코드를 어셈블러 코드에서 테스트할 수 있도록 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에 offset을 더해 얻은 메모리 주소를 나타냅니다. 이것은 바이트 단위로 지정됩니다. 각 float 값은 32비트 워드를 차지하므로, float 배열에 접근할 때 offset은 항상 4바이트의 배수여야 합니다.

10.5. 데이터 비교

  • vcmp(Sd, Sm)

Sd와 Sm의 값을 비교하고 FPU의 N, Z, C, V 플래그를 설정합니다. 이것은 보통 결과를 테스트할 수 있도록 vmrs(APSR_nzcv, FPSCR) 가 뒤따릅니다.

10.6. 정수와 float 사이 변환

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

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