使用-falign-loops选项时这是一个GCC错误吗?
我正在使用此选项来优化嵌入式架构中的for循环( 此处 )。 但是,我注意到当对齐需要添加多个nop
指令时,编译器会生成一个nop
后跟as-many-as-required零( 0000
)。
我怀疑它是我们编译器中的一个错误,但有人可以确认它不是GCC中的错误吗?
这是一段代码:
__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]; }
使用-falign-loops=8
(或与您的体系结构相关的任何数量,超过所需的最小比对)进行编译。 您可以根据需要添加或删除__asm__
行以生成未对齐的循环体。
使用gcc -S -o foo.s foo.c
生成汇编输出而不进行汇编。 我怀疑你会在asm中看到.balign
或.p2align
指令。 假设这个指令打算工作,我认为它是汇编程序中的一个错误。 您也可能有意或无意地将代码放在非默认部分(即非.text
)中(例如,在某些其他内联asm中使用了错误的.data
或.section
); 通常,汇编程序填充具有适当大小和数量的nop
指令,用于包含代码的部分,0字节用于包含数据的部分。