Как сделать 64-битное деление в устройстве ARM cortex M3 - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу разделить 64-разрядное число на 32-разрядное число в устройстве ARM cortex M3 с помощью встроенного ассемблера ARM.

Я попытался разделить 32-разрядное число на 32-разрядное, все работает нормально. Я также поделился кодом. Пожалуйста, дайте мне знать, какие изменения или какие новые вещи нужно добавить, чтобы я мог выполнить 64-битное деление.

long res = 0;
long Divide(long i,long j)
{
asm ("sdiv  %0,%[input_i], %[input_j];"
    : "=r" (res)
    : [input_i] "r" (i), [input_j] "r" (j)
     );
    return res;
 }

1 Ответ

0 голосов
/ 30 сентября 2019

Cortex-M ISA в настоящее время не поддерживает 64-битное целочисленное деление.

Вам придется его запрограммировать.

Ниже приведен пример, который я только что написал. Вероятно, это было неэффективно и глючно.

 .syntax unified
    .cpu cortex-m3
    .fpu softvfp
    .thumb

.global div64

    .section .text.div64
    .type div64, %function

div64:
  cbz   r1, normal_divu
  stm   sp!, {r4-r7}
  mov   r6, #0
  mov   r7, #32
rot_init:
  cbz   r7, exit
#evaluate free space on left of higher word
  clz   r3, r1
#limit to free digits
  cmp   r7, r3
  it    pl
  bpl   no_limit
  mov   r3, r7
no_limit:
#update free digits
  sub   r7, r3
#shift upper word r3 times
  lsl   r1, r3
#evaluate right shift for masking upper bits
  rsb   r4, r3, #32
#mask higher bits of lower word
  mov   r4, r0, LSR r4
#add them to higher word
  add   r1, r4
#shift lower word r3 times
  lsl   r0, r3
#divide higher word
  udiv  r5, r1, r2
#put the remainder in higher word
  mul   r4, r5, r2
  sub   r1, r4
#add result bits
  lsl   r6, r3
  add   r6, r5
  b     rot_init
exit:
  mov   r0, r6
  ldm   sp!, {r4-r7}
  bx    lr

normal_divu:
  udiv  r0, r2
  bx    lr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...