0

给出指令:

ADD EAX, 4

在 x86 程序集 P2+ 中,如果目标是执行速度并且代码大小无关紧要,将其编码为ADD EAX, imm32(op code 05) 还是(op code 83 /0) 会更好吗?ADD r/m32, imm8

请注意,EAX 在这种情况下是一个指针,因此ADD AL, imm8不可行。

选项 2(操作码 83 / 0)将导致更小的代码大小,但根据我有限的理解,它可能不像选项 1 那样流水线,即使它更短。

4

2 回答 2

1

如果您不是针对某个特定的 CPU(例如“Intel Pentium II, model 2”而不仅仅是“P2+”)进行优化,请猜测一下。不管你怎么猜,有些 CPU 可能更快,有些可能更慢(但我希望对于大多数 CPU 来说根本不会有任何区别)。

如果您正在针对一个特定的 CPU 进行优化,只需猜测。另一种方法是在您计划使用它的确切条件下对其进行分析,然后意识到您想在 2 天后更改代码,并且浪费了 8 个小时来搞乱分析。

最后; 如果您正在编写代码优化器(例如,作为编译器后端或优化汇编器的一部分),那么只需猜测——您需要担心的事情远比这重要得多。另一种方法是使用大约 50 台不同的计算机,并在所有计算机上配置许多不同的指令序列;并使用结果为许多不同的情况创建规则。

于 2012-11-15T02:24:13.290 回答
1

选择简写形式 83 /0。代码密度将提高,这意味着性能和功耗在许多处理器上都有适度的提高机会。编码胖立即值没有好处。

现代 x86 处理器上的指令缓存大小至少为 32KB,这意味着适度的代码密度改进不会真正改善缓存请参阅Steenkiste的论文“代码密度对指令缓存性能的影响” 。抱歉,我似乎找不到该链接的免费链接。

真正的潜在胜利是密集代码在紧密循环中执行。如果循环足够紧,现代处理器可以采取捷径,它们只获取和解码指令一次,然后从流水线本身的内部缓冲中执行小循环。即使循环性能由于数据危险或其他原因而受到限制,这些技巧仍然可以降低功耗。

于 2012-11-15T05:59:50.520 回答