我想在我的cortex-M4(stm32f411)上用半字做无符号乘法累加长指令:
例如: 无符号乘以r0 [31:16]与r1 [15:0]并将其加到64位累加器
但是只有签名半字乘法指令SMLAL XY ,其中 X 和 Y 选择HI和LO部分为r0和r1。
我是否真的需要执行昂贵的移位/打包指令来执行此指令的无符号版本?
答案 0 :(得分:0)
uint32 s = (a ^ b) & 1<<31;
uint32 r = smul(a,b);
if(s) r = -r;
是的,另一种方法是测试标志。
如果您有很多MAC样本,那么您可以将它们分为正面和负面,并且有两个组,最后将它们放在一起。
return positive_mac - negative_mac;
你必须用 Opps查看每个样本的MSB /符号,68k btst
tst rx,#1<<31
很适合(或者你的Cortex -M位绑定,如果STM支持它。)
IOW:使用一些数学和条件。