2014-01-15 186 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