[英]Assembly code x86
所以我對匯編代碼完全不了解並且也閱讀它們
所以我有一個簡單的C代碼
void saxpy()
{
for(int i = 0; i < ARRAY_SIZE; i++) {
float product = a*x[i];
z[i] = product + y[i];
}
}
以及使用編譯時的等效匯編代碼
gcc -std=c99 -O3 -fno-tree-vectorize -S code.c -o code-O3.s
給我以下匯編代碼
saxpy:
.LFB0:
.cfi_startproc
movss a(%rip), %xmm1
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
movss x(%rax), %xmm0
addq $4, %rax
mulss %xmm1, %xmm0
addss y-4(%rax), %xmm0
movss %xmm0, z-4(%rax)
cmpq $262144, %rax
jne .L3
rep ret
.cfi_endproc
我確實了解到已經展開了循環展開,但是我無法理解背后的意圖和想法
addq $4, %rax
mulss %xmm1, %xmm0
addss y-4(%rax), %xmm0
movss %xmm0, z-4(%rax)
有人可以解釋一下4的用法,這些語句是什么意思y-4(%rax)
x
, y
和z
是全局數組。 您沒有在列表末尾聲明符號。
我為您提供了代碼 ,並定義了必要的全局變量(並修復了縮進)。 看底部。
順便說一句,這里沒有展開。 每個標量單精度mul都有一個,並添加到循環中。 嘗試使用-funroll-loops
進行查看。
使用-march=haswell
,gcc將使用FMA指令 。 如果通過省略-fno-tree-vectorize
來取消編譯器的#define ARRAY_SIZE
,並且#define ARRAY_SIZE
很小,如100,則它將以32個字節的FMA ymm指令完全展開循環,以16個字節的FMA xmm結尾。
另外,需要向rax寄存器添加立即數4。 按照語句“ addq $ 4,%rax”完成
循環將指針增加4個字節,而不是使用縮放索引尋址模式。
查看https://stackoverflow.com/questions/tagged/x86上的鏈接。 此外,使用調試器單步執行代碼通常是確保您了解其功能的好方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.