2014-01-15 130 views
2

我对64位mips机器使用gcc编译器。 我注意到一些生成的汇编代码有趣。下面是详细的:关于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在0x58中使用,它恰好在bnez(0x54)之后。

那么是否有可能在同一时间执行0x54和0x58指令?超标量处理器在一个时钟周期内通过同时向处理器上的冗余功能单元分配多条指令来执行多条指令。

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

谢谢。

回答

4

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

+0

在我设法实现之前两分钟,您发布了几乎相同的答案。所以,加强你的,删除我的。 O :) – dbrank0

+1

也许这将与下一个问题相关:http://stackoverflow.com/questions/15375084/what-is-the-point-of-delay-slots – dbrank0