ASM 4-битное на 4-битное умножение с помощью программного обеспечения - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно заменить операцию ASM, потому что в моей архитектуре такого нет (avrtiny).

mul X, Y Где X и Y - 4-битное число

Интересно, что было быбыть самой быстрой операцией по замене мул?То, что я нахожу в Google, было 8 бит * 8 бит, что не совсем оптимально.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

Он основан на том факте, что 4-битное число b 3 , b 2 , b 1 , b 0 представляет число B = 2 3 × b 3 + 2 2 × b 2 + 2 1 × b 1 + b0

А A × B = 2 3 × A × b 3 + 2 2 × A × b 2 + 2 1 × A × b 1 + A × b0

Умножение на бит b i будет 0, если b i ≠ 1, а умножение на степень 2 - всего лишь сдвиг.

shift-and-add-multiplication
// multiply A X B -> C
C=0
for i in 0..3
  if B & 0x01
     C = C + A
  end if
  A <<=1
  B >>=1
end for

Я не знаю avr asm, но код долженбыть легко переведенным.

Если ваши числа подписаны, проще вычислить произведение их абсолютного значения и изменить знак результата - sign (A) ignsign (B) == 1

Существуют более сложные алгоритмы, которые могут напрямую работать со знаковыми целыми числами и могут уменьшить количество шагов, например, модифицированный алгоритм Бута, но реализация более сложная, и я не уверен, чтовыигрыш будет значительным.

Редактировать: согласно комментариям, первый операнд всегда 14 = 16-2 = 2 4 -2 1 .

В этом случае самым быстрым является вычисление

C = (B << 4) - (B << 1)
0 голосов
/ 21 февраля 2019

Таблица поиска, безусловно, самый быстрый способ, но, вероятно, у вас мало флэш-памяти, я бы предпочел использовать простую сумму.

Примерно так (не знаю, что вы, я полагаю, 16-битный ПК).

mov  factor2, temp2
rla  temp2
mov  #32, temp
sub  temp2, temp
add  temp, PC
add  factor2, factor1
---copy 15 times last row---
...