【发布时间】:2015-09-12 04:01:45
【问题描述】:
所以我对汇编代码和阅读它们都是个菜鸟
所以我有一个简单的 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)
【问题讨论】:
-
4 是浮点数的大小
-
你能告诉我 y-4(%rax) 做了什么吗,假设我有循环运行 20 次。优化后我的静态和动态insns计数是多少?
-
另外,向 rax 寄存器添加立即数 4 有什么必要。这是根据语句“addq $4, %rax”
标签: gcc assembly x86 intel compiler-optimization