问题描述
我正在研究Rust编译器生成的机器代码。这是一个简单的函数,用于计算切片中所有元素的总和。 (在Rust中,切片实际上是一个数组,其长度通常仅在运行时才知道。它位于内存的连续区域中,并由指向第一个元素和元素数量的指针来描述。)
fn sum_imperative(slice: &[i64]) -> i64 {
let mut sum = 0;
for n in slice {
sum += n;
}
sum
}
在禁用SSE并启用优化的情况下,rustc 1.46.0 produces code的开始如下:
example::sum_imperative:
test rsi,rsi
je .LBB0_1
lea rax,[8*rsi - 8]
mov rdx,rax
shr rdx,3
add rdx,1
在此,切片中的元素N的数量在rsi
中。如果我的理解是正确的,则代码首先计算8N-8并将其存储在rax
中。然后,它使用该结果来计算(8N-8)/ 8 + 1并将其存储在rdx
中。假设没有溢出,则rdx
的结果应始终等于rsi
中仍然可用的N的原始值。
为什么编译器重新计算N的值而不是使用rsi
中已经可用的值?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)