减少指令的装配数量

时间:2009-11-28 15:49:54

标签: linux assembly design-patterns optimization peephole-optimization

我想减少(手动)Linux程序集文件中的指令数量。这基本上是通过在抽象语法树中搜索预定义的缩减来完成的。

例如:

pushl <reg1>
popl  <reg1>

将被删除,因为它没有任何意义。

或者:

pushl <something1>
popl  <something2>

将成为:

movl <something1>, <something2>

我正在寻找涉及固定数量指令的其他优化。我不想搜索动态范围的指令。

你能否建议其他类似的模式可以用较少的指令替换?

稍后编辑:感谢Richard Pennington,我想要的是窥视孔优化。

所以我将这个问题改为:关于Linux汇编代码的窥孔优化的建议。

3 个答案:

答案 0 :(得分:3)

编译器已经进行了这样的优化。此外,做出这样的优化不是那么直截了当的决定,因为:

push reg1
pop reg1

仍将reg1的值留在内存位置[sp-nn](其中nn = reg1的大小,以字节为单位)。因此,虽然sp超过它,但后面的代码可以假设[sp-nn]包含reg1的值。

同样适用于其他优化:

push some1
pop some2

通常只有在没有等效的movl some1, some2指令时才会发出。

如果您正在尝试优化高级编译器生成的代码,编译器通常会考虑大部分情况。如果您正在尝试优化本机编写的汇编代码,那么汇编程序员应该编写更好的代码。

我建议你优化编译器,而不是优化汇编代码,它会为你提供一个更好的框架来处理代码的意图和注册用法等。

答案 1 :(得分:1)

要获得有关您尝试做的更多信息,您可能需要寻找“窥孔优化”。

答案 2 :(得分:0)

pushl <something1>
popl  <something2>

替换为

mov <something1>, <something2>

实际上增加了我的程序的大小。怪异!

你能提供一些其他可能的窥视孔优化吗?