Performance 最好将ADD EAX、4编码为r/m32 imm32或r32 imm8?x86汇编

Performance 最好将ADD EAX、4编码为r/m32 imm32或r32 imm8?x86汇编,performance,optimization,assembly,x86,Performance,Optimization,Assembly,X86,根据指示: ADD EAX, 4 在x86汇编P2+中,如果目标是执行速度且代码大小不相关,那么将其编码为addeax、imm32(操作代码05)或addr/m32、imm8(操作代码83/0)会更好吗 请注意,在这种情况下EAX是一个指针,因此addal,imm8不可行 选项2(操作码83/0)将导致更小的代码大小,但据我有限的了解,它可能不如选项1,即使它更短。如果您没有针对一个特定的CPU(例如“英特尔奔腾II,型号2”,而不仅仅是“P2+”)进行优化,请猜一猜。不管你怎么猜测,有些CP

根据指示:

ADD EAX, 4
在x86汇编P2+中,如果目标是执行速度且代码大小不相关,那么将其编码为
addeax、imm32
(操作代码05)或
addr/m32、imm8
(操作代码83/0)会更好吗

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


选项2(操作码83/0)将导致更小的代码大小,但据我有限的了解,它可能不如选项1,即使它更短。

如果您没有针对一个特定的CPU(例如“英特尔奔腾II,型号2”,而不仅仅是“P2+”)进行优化,请猜一猜。不管你怎么猜测,有些CPU可能更快,有些可能更慢(但我认为对大多数CPU来说,这根本没有什么区别)

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


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

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

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


真正的潜在赢家是在紧密循环中执行密集代码。如果循环足够紧密,现代处理器可以采取捷径,只提取和解码一次指令,然后从管道内部的内部缓冲执行小循环。即使环路性能由于数据危害或其他原因而受到限制,这些技巧仍然会降低功耗。

您也可以根据上下文来考虑<代码> LEA EAX、[EAX+1] 4 /代码>。或者在取消引用时添加常数偏移。如果事实,请猜测较短的指令。现代x86执行“简单”指令(这两种指令都是)的速度通常相当快。如果使用较短的指令,则循环的缓存线会较少,这可能会产生明显的效果。当我们这样做的时候,A.韦伯在另一篇评论中说LEA指令也是一个不错的选择。x86设计人员实际上在优化地址算法方面遇到了很多麻烦,因此LEA指令通常有特殊的路径。如果您正在编写编译器,代码密度的提高会增加大量代码。但是,是的,越短越好,通常允许更好地打包到uop缓存和其他前端好处。