这和你的
lea r12, [rsi + 1]
和
mov r12, rsi inc r12
其中一个是否优于另一个(性能方面)?
5lwkijsr1#
莱亚的机器码更短,只有1个uop而不是2个,并且不依赖于mov-elimination(在Ice Lake上禁用),只有1个周期延迟。它在所有现有的微体系结构(https://uops.info//https://agner.org/optimize/)上都明显更好,这就是为什么编译器在编译int foo(int x){ return x+1; }时使用它另请参阅Using LEA on values that aren't addresses / pointers?并且重新计算微操作等等,一般来说,* What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand? *inc在桤木Lake E核心或其他Silvermont系列CPU上的效能会有轻微的降低,因为它会行程部分旗标。* INC instruction vs ADD 1: Does it matter? *lea不影响FLAGS,这对周围的代码偶尔会有帮助。现代CPU每个周期可以重命名FLAGS的次数与管道宽度一样多,所以除了adc循环或其他特殊情况外,编写FLAGS通常不是问题。
int foo(int x){ return x+1; }
inc
lea
adc
1条答案
按热度按时间5lwkijsr1#
莱亚的机器码更短,只有1个uop而不是2个,并且不依赖于mov-elimination(在Ice Lake上禁用),只有1个周期延迟。它在所有现有的微体系结构(https://uops.info//https://agner.org/optimize/)上都明显更好,这就是为什么编译器在编译
int foo(int x){ return x+1; }
时使用它另请参阅Using LEA on values that aren't addresses / pointers?
并且重新计算微操作等等,一般来说,* What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand? *
inc
在桤木Lake E核心或其他Silvermont系列CPU上的效能会有轻微的降低,因为它会行程部分旗标。* INC instruction vs ADD 1: Does it matter? *lea
不影响FLAGS,这对周围的代码偶尔会有帮助。现代CPU每个周期可以重命名FLAGS的次数与管道宽度一样多,所以除了adc
循环或其他特殊情况外,编写FLAGS通常不是问题。