ARM без ALU сколько для операций

У меня была проблема на ARM Cortex M3
с некоторыми функциями, которые требуют умножения и деления натуральных чисел.
Дело в том, можно ли производить вычисления между 128-битными числами?
Мне нужно знать, сколько сборочных операций требуется программному обеспечению, эмулировать несколько двух 32-разрядных чисел и делить два 32-разрядных числа, а затем я буду вычислять затраты времени на мои вычисления.
Я придерживался некоторых расчетов, и мне нужна помощь, потому что, возможно, мне нужно сменить ОК на Cortex M4 с аппаратным ALU.

Ты можешь помочь мне с этим?

Учитывая простой C-код:

uint32_t var1 = 12304;
uint32_t var2 = 1892637198;
uint64_t result = var1*var2;

И objdump ассемблер:

   0:   b480            push    {r7}
2:   b085            sub     sp, #20
4:   af00            add     r7, sp, #0
uint32_t var1 = 12304;
6:   f243 0310       movw    r3, #12304      ; 0x3010
a:   60fb            str     r3, [r7, #12]
uint32_t var2 = 1892637198;
c:   f645 230e       movw    r3, #23054      ; 0x5a0e
10:   f2c7 03cf       movt    r3, #28879      ; 0x70cf
14:   60bb            str     r3, [r7, #8]

uint64_t result = var1*var2;
16:   68fb            ldr     r3, [r7, #12]
18:   68ba            ldr     r2, [r7, #8]
1a:   fb02 f103       mul.w   r1, r2, r3
1e:   460a            mov     r2, r1
20:   f04f 0300       mov.w   r3, #0
24:   e9c7 2300       strd    r2, r3, [r7]

Так, если я вычислю, например, многократное умножение, могу ли я получить целую инструкцию (потому что загрузка значений в регистры, плюс 3 инструкции для каждой нагрузки) или только умножение (в данном случае 6 инструкций)

Поскольку умножение двух 128-битных переменных в формате (x ^ 5 + x), где x — 32-битная переменная, дает мне (a + b) (c + d) ab + ad + bc + bd 4 умножение (или 3 с использованием алгоритмов).
Так что, если я должен рассчитать 4 * (3 + 3 + 6) или 4 * (6 +? +?).

0

Решение

ARM Инструкции

Эта страница содержит все количество циклов на одну инструкцию для процессора ARM M-Series. Если у вас есть ассемблерный код (который звучит так же, как у вас?), Тогда достаточно просто сложить все свои циклы, умножить на 1 / clock_freq и получить общее время, потраченное на разные сценарии.

1

Другие решения

Другое решение заключается в использовании systick для измерения количества циклов.

Видеть это ссылка от ARM

Редактировать: Вы можете установить Counter на максимум и заставить его заново загрузить значение счетчика, как только оно достигнет 0.

// Настройка Systick
* STRVR = 0xFFFFFF; // максимальное количество
* STCVR = 0; // принудительно перезагружаем регистр значений счетчика
* STCSR = 5; // включить подсчет FCLK без прерывания

Вы можете прочитать STCVR reg, который является регистром сбоя до и после функции, а затем удалить циклы служебных данных (чтобы прочитать регистр STCVR).

-1

По вопросам рекламы [email protected]