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 + 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에는 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)