我正在使用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用来生成这种汇编代码?
感谢。