在我们的嵌入式架构中,我们有一个64位IAB(指令对齐缓冲区)。为了优化获取序列,需要循环体从8字节边界开始对齐。
在汇编语言中,使用“.balign”指令很容易实现这一点,但我找不到一种语法来提示C编译器对代码进行对齐。
尝试通过带有“.balign”指令的内联汇编来先于for循环,但这样做会对for循环的前导部分(设置)进行对齐,而不是循环体本身。
将“asm()”行放在循环体内部并进行相同操作会向循环体添加成本昂贵的“nop”指令。
编辑1:假设代码如下:
在汇编语言中,使用“.balign”指令很容易实现这一点,但我找不到一种语法来提示C编译器对代码进行对齐。
尝试通过带有“.balign”指令的内联汇编来先于for循环,但这样做会对for循环的前导部分(设置)进行对齐,而不是循环体本身。
将“asm()”行放在循环体内部并进行相同操作会向循环体添加成本昂贵的“nop”指令。
编辑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
以实现对齐,但这是一种临时解决方案,会随着第一次代码更改而失效。
编辑2: 多亏了@R..,解决方法是使用 -falign-loops=8
编译器选项。
nop
使循环主体对齐,但是您希望这些nop
在循环前导之前执行? - ruakhnop
是否在prolog本身中生成,只要循环末尾的分支指令指向对齐的内存位置即可。 - ysap-falign-loops
选项的作用吗? - R.. GitHub STOP HELPING ICE