3地址指令和2地址指令之间的比较

时间:2013-09-09 06:42:48

标签: compiler-construction compiler-optimization

我看到3个地址指令和2个地址指令用作前端和后端之间的IR,因为它们非常相似,所以它们的优缺点是什么?

2 个答案:

答案 0 :(得分:1)

三个地址是一个显示SSA主要原则的表格,该中间词总是不可变的。 (如果你总是为新的中间人分配一个新的虚拟寄存器)。

当然,基于机器的分配器也可以轻松转换并使用其他形式。三个地址代码只是一个可概述的简单方法来模拟和解释SSA。

答案 1 :(得分:1)

我觉得2个地址和3个地址指令集完全不同。在确定使用哪种因素时,有很多因素可以发挥作用。

  • 代码复杂性与代码大小。较少的操作数意味着每个单独的指令更容易表示和实现。更多操作数意味着更多功能可以由单个指令表示。采用以下比较示例:
+---------------------------------------------------------
| C instruction  | 2 address | 3 address   | 4 address   |
+----------------+-----------+-------------+-------------+
| r = x;         | mov r,x   | mov r,x     | mov r,x     |
+----------------+-----------+-------------+-------------+
| r = x + y;     | mov r,x   | add r,x,y   | add r,x,y,0 |
|                | add r,y   |             |             |
+----------------+-----------+-------------+-------------+
| r = x + y + z; | mov r,x   | add q,x,y   | add r,x,y,z |
|                | add r,y   | add r,q,z   |             |
|                | add r,z   |             |             |
+----------------+-----------+-------------+-------------+
  • 易于优化。如前所述,具有3+地址计数的指令集允许SSA实现和分析,这极大地简化了许多编译时优化。

  • 易于转换为目标代码。这取决于您将IR转换为的内容。将4个地址代码转换为基于堆栈的语言将是一件麻烦事。将2个地址代码转换为通用的CISC架构(如x86程序集)可能会导致代码效率非常低。