【发布时间】:2014-02-03 14:38:47
【问题描述】:
我正在为 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作为参数。 但正如我们所见,a1 从未出现在 0xb0 之后的块中。
但是 a1 在 bnez (0x54) 之后的 0x58 中使用。
那么 0x54 和 0x58 指令有可能同时执行吗?超标量处理器在一个时钟周期内通过同时向处理器上的冗余功能单元分派多条指令来执行多条指令。
我的问题是,gcc 编译器怎么知道我的 cpu 有这个能力? gcc 使用什么样的技术? gcc 使用什么优化选项来生成这种汇编代码?
谢谢。
【问题讨论】: