1

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

例如:

pushl <reg1> 
popl <reg1> 

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

或者:

pushl <something1> 
popl <something2> 

将变为:

movl <something1>, <something2> 

我在寻找涉及的指令数是固定的优化项目。我不想搜索动态范围的指令。

你能否建议其他类似的模式,可以用更少的指令来代替?

后来编辑:发现了,多亏了理查德·彭宁顿,那我要的是窥孔优化。

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

+0

动机是什么?我不是说这是一个糟糕的问题,只是......很奇怪。 – jprete 2009-11-28 15:51:21

+0

我想减小输出文件的大小 – 2009-11-28 16:21:38

+0

并非操作系统与窥孔优化无关。如果它适用于linux代码,它也可以在windows或mac os上运行。你需要区分的是架构。 – hirschhornsalz 2009-11-29 19:14:22

回答

3

编译器已经做了这样的优化。此外,它不是简单的决定做出这样的优化,这是因为:

push reg1 
pop reg1 

内存位置仍留下REG1的值[SP-NN(其中nn字节=大小REG1的)。因此,虽然sp已经过去了,但是之后的代码可以假设[sp-nn]包含reg1的值。

这同样适用于其他的优化,以及:

push some1 
pop some2 

而这通常只发射时,有没有相应的movl some1, some2指令。

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

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

+0

好点,你必须非常小心。 – Krystian 2009-11-28 16:05:54

+0

难道你不认为这些优化可能适用于简单输入吗?对于“movl”优化,我假定some2是一个寄存器或一个内存引用 – 2009-11-28 16:24:25

+0

我的意思是你可以实现的优化范围很可能已经由成熟的编译器实现了。是的,这也包括窥视孔优化。即使省略了编译器以优化某些内容,您也应该以编译器为目标来添加优化,而不是汇编代码,以避免潜在的不需要的副作用。 – 2009-11-28 17:26:56

1

要获得有关你的详细信息正在尝试做,你可能想要寻找“窥视孔优化”。

+0

这是一个很好的起点! – 2009-11-28 16:23:14

0
pushl <something1> 
popl <something2> 

替换

mov <something1>, <something2> 

实际上增加了我的计划的规模。奇怪的!

您能否提供一些其他可能的窥孔优化?