给出指令:
ADD EAX, 4在x86汇编P2+中,如果目标是执行速度和代码大小无关,那么将其编码为ADD EAX, imm32 (操作码05)或ADD r/m32, imm8 (操作码83 /0)会更好?
请注意,在这种情况下,EAX是一个指针,因此ADD AL, imm8是不可行的。
选项2(操作码83 /0)将导致较小的代码长度,但据我有限的理解,它可能不会像选项1那样流水线,即使它更短。
发布于 2012-11-15 10:24:13
如果您没有针对某个特定的CPU进行优化(例如“英特尔奔腾II,型号2”,而不仅仅是"P2+"),只是猜测。不管你怎么猜测,有些CPU可能更快,有些可能更慢(但我预计对于大多数CPU来说,这根本不会有什么不同)。
如果您正在针对某个特定的CPU进行优化,那么只需猜测。另一种选择是在你计划使用它的确切条件下分析它,然后意识到两天后你想要更改代码,而你却浪费了8个小时在分析上却一无所获。
最后,如果您正在编写代码优化器(例如,作为编译器后端或优化汇编器的一部分),那么只需猜测-您有比这更重要的事情要担心。另一种选择是获得大约50台不同的计算机,并在所有计算机上分析许多不同的指令序列;然后使用结果为许多不同的情况创建规则。
发布于 2012-11-15 13:59:51
选择简写形式83 /0。代码密度将提高,这意味着在许多处理器上,性能和功耗都有适度的提高机会。编码胖的立即值没有任何好处。
现代x86处理器上的指令缓存大小至少为32KB,这意味着适度的代码密度改进不会真正改善缓存。请参阅Steenkiste的论文“代码密度对指令缓存性能的影响”。对不起,我好像找不到那个的免费链接。
真正的潜在赢家是在紧密循环中执行的密集代码。如果循环足够紧密,现代处理器可以采取捷径,只取并解码一次指令,然后从流水线内部的内部缓冲中执行小循环。即使循环性能由于数据风险或其他原因而受到限制,这些技巧仍然可以降低功耗。
https://stackoverflow.com/questions/13389052
复制相似问题