我想减少(手动)Linux程序集文件中的指令数量。这基本上是通过在抽象语法树中搜索预定义的缩减来完成的。
例如:
pushl <reg1>
popl <reg1>
将被删除,因为它没有任何意义。
或者:
pushl <something1>
popl <something2>
将成为:
movl <something1>, <something2>
我正在寻找涉及固定数量指令的其他优化。我不想搜索动态范围的指令。
你能否建议其他类似的模式可以用较少的指令替换?
稍后编辑:感谢Richard Pennington,我想要的是窥视孔优化。
所以我将这个问题改为:关于Linux汇编代码的窥孔优化的建议。
答案 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>
实际上增加了我的程序的大小。怪异!
你能提供一些其他可能的窥视孔优化吗?