大家好,我做了一个指令序列图以及它如何被解码成操作。我还展示了它们之间的数据依赖关系如何创建关键的操作路径。我唯一的问题就是如果我正确地做到这一点,我也很困惑如何找到%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
答案 0 :(得分:1)
BTW,IACA可以为您生成这样的图表。它是来自英特尔的闭源免费软件,适用于Linux。
您应该将整数add
与FP addsd
和mulsd
区分开来。
Jester是对的,xmm1应来自vmovsd
负载。
vaddsd
写xmm0。您正在使用AT&amp; T语法,因此目标是最后一个操作数。您的图表显示它修改xmm1,但xmm0实际上是累加器。
add
修改rcx
,但您的图表并未反映出来。涉及rcx的依赖链是形成循环的因素,因此向上返回的箭头在那里是有意义的。
与xmm0
类似,箭头应形成一个循环(闭环)。
re:你的评论:代码有两个带内存源操作数的指令,因此有两个加载。