关于gcc生成的汇编代码(汇编代码不按顺序?)

时间:2014-01-15 08:10:37

标签: gcc assembly

我正在使用64位mips机器的gcc编译器。 我注意到生成的一段汇编代码很有趣。下面是详细信息:

00000001200a4348 <get_pa_txr_index+0x50> 2ca2001f   sltiu   v0,a1,31
00000001200a434c <get_pa_txr_index+0x54> 14400016   bnez    v0,00000001200a43a8 <get_pa_txr_index+0xb0>
00000001200a4350 <get_pa_txr_index+0x58> 64a2000e   daddiu  v0,a1,14

00000001200a43a8 <get_pa_txr_index+0xb0> 000210f8   dsll    v0,v0,0x3
00000001200a43ac <get_pa_txr_index+0xb4> 0062102d   daddu   v0,v1,v0
00000001200a43b0 <get_pa_txr_index+0xb8> dc440008   ld  a0,8(v0)
00000001200a43b4 <get_pa_txr_index+0xbc> df9955c0   ld  t9,21952(gp)
00000001200a43b8 <get_pa_txr_index+0xc0> 0320f809   jalr    t9
00000001200a43bc <get_pa_txr_index+0xc4> 00000000   nop
通常,bnez会立即跳转到0xb0。但是在0xb0之后的块中,我确信程序必须使用a1作为参数。 但正如我们所看到的,在0xb0之后,a1从未出现在块中。

但是a1用于0x58,它位于bnez(0x54)之后。

那么有可能同时执行0x54和0x58指令吗?超标量处理器通过同时将多个指令分派给处理器上的冗余功能单元,在时钟周期内执行多个指令。

我的问题是,gcc编译器怎么知道我的cpu有这个功能? gcc使用什么样的技术?什么优化选项是gcc用来生成这种汇编代码?

感谢。

1 个答案:

答案 0 :(得分:4)

此功能通常称为branch delay slot。查找用于填充分支延迟槽的指令通常在优化编译器后端的调度阶段完成。