我需要替换ASM操作,因为我的体系结构中没有这样的操作(avrtiny)。
mul X,Y X和Y是4位数字
我想知道替换mul最快的操作是什么?我在Google中发现的是8位* 8位,这并不是真正的最佳选择。
答案 0 :(得分:2)
您可以使用经典移位并添加乘法算法(假设您的数字是无符号的)。
它基于以下事实:一个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 ≠1,乘以b i 位将为0,乘以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)⊕sign(B)== 1
还有更复杂的算法,可以直接处理带符号整数并可以减少步数,例如修改后的Booth算法,但是实现起来更加复杂,我不确定收益会很大。
编辑:根据注释,第一个操作数始终为14 = 16-2 = 2 4 -2 1 。
在这种情况下,最快的是计算
C = (B << 4) - (B << 1)
答案 1 :(得分:0)
查找表无疑是最快的方法,但可能浪费的闪存很少,我宁愿使用简单的总和。
类似这样的东西(不知道你是不是,我假设是16位PC)。
mov factor2, temp2
rla temp2
mov #32, temp
sub temp2, temp
add temp, PC
add factor2, factor1
---copy 15 times last row---