各位路过帮忙优化一段C语言16字节左移一位的C代码

2019-12-11 18:35发布

项目遇到一段调用非常多的代码,运算能力不足,各位路过帮帮看看怎么优化一下.
一段16字节整体左移一位,最后或上一位可变量C代码.跑在stm32或者arm9上.
改查表,汇编都行,谢过.代码如下

  1. uint32_t* st;
  2. st[3] = (st[3] << 1) | ((st[2] >> 31) & 1);
  3. st[2] = (st[2] << 1) | ((st[1] >> 31) & 1);
  4. st[1] = (st[1] << 1) | ((st[0] >> 31) & 1);
  5. st[0] = (st[0] << 1) | v;
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
zzm24
1楼-- · 2019-12-13 05:03
 精彩回答 2  元偷偷看……
myxiaonia
2楼-- · 2019-12-13 07:10
wye11083 发表于 2019-4-19 12:29
没戏,arm竟没有rol,所以无解,编译器给出的效率是最高的。你要是右移,也得12个周期(ror a0,ror a1,ro ...

循环左移可以用循环右移搞定的
myxiaonia
3楼-- · 2019-12-13 08:29
这不是个移位寄存器么,用个cpld搞定?
wye11083
4楼-- · 2019-12-13 12:24
myxiaonia 发表于 2019-4-19 15:21
循环左移可以用循环右移搞定的

还真是,中午精力不太好

不过再怎么优化也得12个周期保底,因为risc没有内存操作指令,只能先ld再st。
apple_eat
5楼-- · 2019-12-13 17:29
如果是右移可以加速,用寄存器缓存移位数据,连续16个RRX指令可以完成移位.
  1. RRX 可提供经右移一位后的寄存器中的值。 原先的进位标记将会移入位 [31]。 如果有 S 后缀,则将原先的位 [0] 存入进位标记中。
复制代码
love_ourdev
6楼-- · 2019-12-13 17:30
 精彩回答 2  元偷偷看……

一周热门 更多>