如何使用GCC对齐C for-loop体?

ysa*_*sap 12 c gcc for-loop alignment memory-alignment

在我们的嵌入式架构中,我们有一个64位IAB(指令对齐缓冲器).为了优化获取序列,需要循环体开始与8字节边界对齐.

使用该.balign指令很容易在汇编中实现这一点,但我找不到一个会暗示C编译器对齐代码的语法.

尝试在for循环与内联汇编之前使用该.balign指令不起作用,因为它对齐for循环prolog(设置)而不是循环体本身.

asm()在循环内部执行相同操作时,将nop-s 添加到循环体中,这需要花费宝贵的周期.

编辑1:假设代码:

    __asm__ volatile("nop");  
    __asm__ volatile("nop");  

    for (j0=0; j0<N; j0+=4)
    {
        c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
        c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
        c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
        c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
    }
Run Code Online (Sandbox Code Playgroud)

我希望第一个c=a+b与8字节地址对齐.我可以nop在初步编译后添加类似上面的-s,但这是一个特殊的解决方案,它会破坏第一个代码更改.

编辑2:感谢@R ..,解决方案是使用-falign-loops=8编译器选项.

R..*_*R.. 5

嗯,这不是 GCC 的-falign-loops选择吗?

  • 是的,但是如果您只想影响单个循环怎么办?GCC有什么解决办法吗? (2认同)