【问题标题】:regarding gcc produced assembly code (assembly code not in order?)关于 gcc 生成的汇编代码(汇编代码不按顺序?)
【发布时间】: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 使用什么优化选项来生成这种汇编代码?

谢谢。

【问题讨论】:

    标签: gcc assembly


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2013-10-05
    相关资源
    最近更新 更多