【发布时间】:2012-04-10 10:50:09
【问题描述】:
在我们的嵌入式架构中,我们有一个 64 位 IAB(指令对齐缓冲区)。为了优化获取序列,要求循环体开始与 8 字节边界对齐。
使用.balign 指令在汇编中很容易实现这一点,但我找不到提示 C 编译器对齐代码的语法。
尝试在 for 循环之前使用带有 .balign 指令的内联汇编是行不通的,因为它会对齐 for 循环序言(设置)而不是循环体本身。
在循环内部的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];
}
我希望第一个 c=a+b 与 8 字节地址对齐。在初步编译后,我可以像上面一样添加nop-s,但这是一个临时解决方案,会因第一次代码更改而中断。
编辑 2:感谢 @R..,解决方案是使用 -falign-loops=8 编译器选项。
【问题讨论】:
-
所以本质上,您希望
nop-s 会导致循环 body 对齐,但您希望那些nop-s 在循环 prolog? -
@ruakh - 是的,虽然我不在乎
nop-s 是否在序言本身中生成,只要循环末尾的分支指令指向对齐的内存位置。 -
明白。这是一个很好的问题!
-
嗯,这不是 GCC 的
-falign-loops选项的用途吗? -
@R.. - 这似乎是诀窍!请把它作为一个答案,以便我可以代表并接受它。
标签: c gcc for-loop alignment memory-alignment