10. Các lệnh dấu phẩy động

Các lệnh này hỗ trợ việc sử dụng bộ đồng xử lý dấu phẩy động ARM (trên các nền tảng như OpenMV Cams được trang bị bộ đồng xử lý này). FPU có 32 thanh ghi được gọi là s0-s31, mỗi thanh ghi có thể chứa một số dấu phẩy động đơn chính xác. Dữ liệu có thể được truyền giữa các thanh ghi FPU và các thanh ghi lõi ARM bằng lệnh vmov.

Lưu ý rằng MicroPython không hỗ trợ truyền số dấu phẩy động đến các hàm assembler, cũng không thể đặt một số dấu phẩy động vào r0 và mong đợi kết quả hợp lý. Có hai cách để khắc phục điều này. Cách đầu tiên là sử dụng mảng, và cách thứ hai là truyền và/hoặc trả về số nguyên rồi chuyển đổi sang và từ số dấu phẩy động trong mã.

10.1. Quy ước tài liệu

Ký hiệu: Sd, Sm, Sn biểu thị các thanh ghi FPU, Rd, Rm, Rn biểu thị các thanh ghi lõi ARM. Thanh ghi sau có thể là bất kỳ thanh ghi lõi ARM nào mặc dù các thanh ghi R13-R15 không phù hợp trong ngữ cảnh này.

10.2. Số học

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

Các thanh ghi có thể giống nhau: vmul(S0, S0, S0) sẽ thực thi S0 = S0*S0

10.3. Di chuyển giữa thanh ghi lõi ARM và thanh ghi FPU

  • vmov(Sd, Rm) Sd = Rm

  • vmov(Rd, Sm) Rd = Sm

FPU có một thanh ghi được gọi là FPSCR, tương tự như APSR của lõi ARM, lưu trữ các mã điều kiện cùng với dữ liệu khác. Các lệnh sau cung cấp quyền truy cập vào thanh ghi này.

  • vmrs(APSR_nzcv, FPSCR)

Di chuyển các cờ N, Z, C và V dấu phẩy động đến các cờ N, Z, C và V của APSR.

Điều này được thực hiện sau một lệnh như so sánh FPU để cho phép các mã điều kiện được kiểm tra bởi mã assembler. Sau đây là dạng tổng quát hơn của lệnh.

  • vmrs(Rd, FPSCR) Rd = FPSCR

10.4. Di chuyển giữa thanh ghi FPU và bộ nhớ

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

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

Trong đó [Rn + offset] biểu thị địa chỉ bộ nhớ thu được bằng cách cộng Rn với offset. Giá trị này được chỉ định bằng byte. Vì mỗi giá trị dấu phẩy động chiếm một từ 32 bit, khi truy cập các mảng số dấu phẩy động thì offset phải luôn là bội số của bốn byte.

10.5. So sánh dữ liệu

  • vcmp(Sd, Sm)

So sánh các giá trị trong Sd và Sm và đặt các cờ N, Z, C và V của FPU. Thông thường điều này sẽ được theo sau bởi vmrs(APSR_nzcv, FPSCR) để cho phép kiểm tra kết quả.

10.6. Chuyển đổi giữa số nguyên và dấu phẩy động

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

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