是的,x86 架构有据可查,并形成了一个抽象层。但是,如果优化编译器了解加载使用延迟、加载存储单元的数量、计算单元的数量和类型、缓存大小和缓存行,则它可以做得更好;内部寄存器的数量,一些处理器对指令流进行更多的重新排序等;这些东西是特定于实现的。
例如,一个较旧的处理器可能只有一个整数乘法单元,一个较新的处理器可能有两个(一个非常旧的处理器可能没有,我研究过这样的一个,虽然不是 x86)。它们的类型也可能不同。这些差异改变了优化/代码生成中速度-空间权衡之间的平衡,因此一种知道哪个可能使用不同指令序列的策略。例如,使用乘法指令乘以一个大常数可能是最短的,但可能比几个移位和加法操作更慢或更快,具体取决于底层实现。因此,编译器可以做出一些选择,并且由于它可以跟踪正在编写的代码的许多状态,因此它可以使用相当复杂的决策策略。
Another common optimization strategy is to interleave two or more different computations; this so as to keep the processor more busy. To do this often increases the number of registers needed, and may even require more instructions, and could be quicker yet longer or not depending again on the underlying implementation.