2015-12-02 47 views
1

大家好,我做了一個指令序列的圖表,以及它如何被解碼爲操作。我還展示了它們之間的數據依賴關係如何創建關鍵操作路徑。我唯一的問題是,如果我正確地做了這個,我也很困惑如何找到%rbx。請問我可能對我的圖表有什麼問題,現在這是一個粗略的草案。感謝您的時間。將指令序列轉化爲圖表

.L15: # loop: 

vmovsd 0(%rbp,%rcx,8), %xmm1 
vmulsd (%rax,%rcx,8), %xmm1, %xmm1 
vaddsd %xmm1, %xmm0, %xmm0 
addq $1, %rcx 
cmpq %rbx, %rcx 
jl .L15 # If <, goto loop 

enter image description here

+1

是不是應該從左邊的'Load'到頂部'%xmm1'的箭頭? – Jester

+0

應該只有一個負載? – Luke12

+1

@ Luke12:代碼有兩條帶有內存源操作數的指令,所以有兩個加載。另外,你應該區分FP'addsd'和'mulsd'的整數'add'。小丑的右邊,xmm0和xmm1應該來自負載。順便說一下,IACA可以爲你生成這樣的圖表。 (https://software.intel.com/en-us/articles/intel-architecture-code-analyzer,英特爾的免費軟件,適用於Linux) –

回答

1

BTW,IACA可以產生這樣的圖給你。它是英特爾的封閉源代碼免費軟件,適用於Linux。


你應該從FP addsdmulsd區分整數add

傑斯特的權利,xmm1應該來自vmovsd負載。

vaddsd寫入xmm0。您正在使用AT & T語法,所以目的地是最後一個操作數。你的圖表顯示它修改xmm1,但xmm0實際上是累加器。


add修改rcx,但你的圖沒有反映這一點。包含rcx的依賴關係鏈是循環的形式,所以向上返回的箭頭在那裏是有意義的。

xmm0一樣,箭頭應該形成一個循環(閉環)。


re:你的評論:該代碼有兩個指令與內存源操作數,所以有兩個負載。

+0

非常感謝!以上是我更新的圖 – Luke12

+1

@ Luke12:現在可能是正確的,但它幾乎是不可讀的。對於循環中不更改的寄存器,您不需要將它們列出兩次。 –

+0

哦,你的權利,謝謝! – Luke12