各位路过帮忙优化一段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条回答
love_ourdev
1楼-- · 2019-12-13 21:27
本帖最后由 love_ourdev 于 2019-4-19 17:30 编辑

比如这样,虽然看起来C语句更多,但其实性能更好。
  1. uint32_t* st;
  2. uint32_t a3, a2, a1, a0;
  3. a3 = st[3];
  4. a2 = st[2];
  5. a1 = st[1];
  6. a0 = st[0];
  7. a3 = (a3 << 1) | ((a2 >> 31) & 1);
  8. a2 = (a2 << 1) | ((a1 >> 31) & 1);
  9. a1 = (a1 << 1) | ((a0 >> 31) & 1);
  10. a0 = (a0 << 1) | v;
  11. st[3] = a3;
  12. st[2] = a2;
  13. st[1] = a1;
  14. st[0] = a0;
复制代码
如果能用汇编的LDM和STM就更好了!

补充,如果是在具备cache的CPU上,就把内存的读取和写入改为地址增序排列能发挥cache行的性能。无cache系统则无所谓。
gallle
2楼-- · 2019-12-13 22:45
查表会不会快
Gorgon_Meducer
3楼-- · 2019-12-14 00:29
楼主为啥不用 uint64_t ?感觉编译器获得的信息会多一点。至少stm32可能会产生比较优化的代码吧?
cloudboy
4楼-- · 2019-12-14 04:27
这种代码交给编译器,开优化,编译器会帮你优化的。这种移位操作什么的编译器一般都会考虑
Gorgon_Meducer
5楼-- · 2019-12-14 06:12
 精彩回答 2  元偷偷看……
Eworm001
6楼-- · 2019-12-14 07:14
  1. __asm void *test(void *st, uint32_t v)
  2. {
  3.         push {r4-r7}
  4.         LDM r0,{r4-r7}
  5.        
  6.         LSL          r7,r7,#1
  7.         LSLS         r6,r6,#1
  8.         ORRCS r7,#1
  9.         LSLS         r5,r5,#1
  10.         ORRCS r6,#1
  11.         LSLS         r4,r4,#1
  12.         ORRCS r5,#1
  13.         RORS         r1,r1,#1
  14.         ORRCS r4,#1
  15.        
  16.         STM        r1,{r4-r7}
  17.         pop {r4-r7}
  18. }
复制代码

一周热门 更多>