【问题标题】:Reduce assembly number of instructions减少汇编指令数量
【发布时间】:2017-01-28 01:19:37
【问题描述】:

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

例如:

pushl <reg1>
popl  <reg1>

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

或者:

pushl <something1>
popl  <something2>

会变成:

movl <something1>, <something2>

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

您能否推荐其他可以用更少指令替换的类似模式?

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

所以我将问题改写为:Linux 汇编代码上的窥孔优化建议。

【问题讨论】:

  • 动机是什么?我并不是说这是一个坏问题,它只是......奇怪。
  • 我想减小输出文件的大小
  • 并不是说操作系统与窥孔优化无关。如果它适用于 linux 代码,它也适用于 windows 或 mac os。您需要区分的是架构。

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


【解决方案1】:

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

push reg1
pop reg1

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

这同样适用于其他优化:

push some1
pop some2

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

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

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

【讨论】:

  • 您不认为这些优化可能适用于简单的输入吗?对于“movl”优化,我假设 some2 是寄存器或内存引用
  • 我的意思是你能想出的优化范围很可能已经由成熟的编译器实现了。是的,这也包括窥视孔优化。即使编译器省略了优化某些内容,您也应该针对编译器添加优化而不是汇编代码,以避免潜在的不良副作用。
  • "仍将 reg1 的值留在内存位置 [sp-nn](其中 nn = reg1 的大小,以字节为单位)。因此,尽管 sp 超过了它,但之后的代码可以假设 [sp-nn]包含 reg1" 的值是不正确的,因为系统中的下一个中断将覆盖它。唯一可以假设的是它可以包含任何值。
【解决方案2】:

要获取有关您尝试执行的操作的更多信息,您可能需要查找“窥视孔优化”。

【讨论】:

    【解决方案3】:
    pushl <something1>
    popl  <something2>
    

    替换为

    mov <something1>, <something2>
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2011-11-22
      • 2016-04-21
      • 1970-01-01
      相关资源
      最近更新 更多