Documentation ¶
Overview ¶
Package ir实现了一种中间代码
Deprecated:已弃用
ir实现的中间代码,是四元式、线性的中间代码
ArgEnum 是中间代码的操作数类型枚举
OPEnum 是中间代码的指令枚举
IrNode 给定了一条ir指令的结构体定义
Index ¶
- Variables
- type ArgEnum
- type IrNode
- type OPEnum
- type ToState
- func (t *ToState) ASSIGNOptimize(ptrir *IrNode, ret *[]IrNode)
- func (t *ToState) AmexprOptimize(ret *[]IrNode) (ArgObj string, ArgTyp ArgEnum)
- func (t *ToState) AmexprOptimizeOrImm(ptrir *IrNode, typ int8, op enum.OPSymbol) bool
- func (t *ToState) HavaTmpVar(name string) string
- func (t *ToState) ObjectToArg(obj *ast.Object, sbt *ast.Sbt) (ArgObj string, ArgTyp ArgEnum)
- func (t *ToState) ToASSIGN(ptr *ast.ASSIGNNode, sbt *ast.Sbt) (ret []IrNode)
- func (t *ToState) ToAmexpr(ptr *ast.OpExpr, sbt *ast.Sbt) (ret []IrNode)
- func (t *ToState) ToExprNode(ptr ast.Node, sbt *ast.Sbt, ret *[]IrNode) (ArgObj string, ArgTyp ArgEnum)
Constants ¶
This section is empty.
Variables ¶
View Source
var ArgEnumStr = [...]string{ NoArg: "noarg (未定义的操作数)", StackVar: "stackvar (栈变量)", Var: "var (全局变量)", Tmp: "tmp (临时变量)", TmpIntVar: "tmp_int_var (int型临时变量)", TmpFloatVar: "ttmp_float_var (float型临时变量)", ImmInt: "imm_int (int型立即数)", ImmFloat: "imm_float (float型立即数)", }
Functions ¶
This section is empty.
Types ¶
type IrNode ¶
type IrNode struct { Arg1Obj string //第一操作数 Arg2Obj string //第二操作数 ResultObj string //运算结果的值 Op OPEnum //操作码 Arg1Typ ArgEnum //第一操作数类型 Arg2Typ ArgEnum //第二操作数类型 ResultTyp ArgEnum //运算结果的值类型 }
IrNode 代表一条ir指令
type ToState ¶
type ToState struct {
// contains filtered or unexported fields
}
ToState 转换状态
记录某次ast转换ir的特定状态,并发不安全
func (*ToState) ASSIGNOptimize ¶
ASSIGNOptimize 赋值转换的中间代码优化
实现下列优化
- 如果赋值源操作数类型为临时变量,且这个临时变量为上一个的结果,将上一个的结果改写为赋值目的操作数
- 如果其中任意两条中间代码形如(a op1 b) op2 c,且b和c为立即数,同时op1和op2优先级相同,改写为a op1 (b op2 c),并编译期求值
func (*ToState) AmexprOptimize ¶
AmexprOptimize 算术表达式优化
实现下列优化
- 如果结果为立即数临时变量(也就是编译期可求值),直接使用该立即数,不等到运行时计算
func (*ToState) AmexprOptimizeOrImm ¶
AmexprOptimizeOrImm 算术表达式可能立即数优化
如果算术表达式的操作数都是立即数(也就是编译期可求值),直接计算该立即数,不等到运行时计算
func (*ToState) HavaTmpVar ¶
HavaTmpVar 查找本次转换是否存在临时变量
- name是被查找的临时变量
如果查找到存在,返回临时变量的值
如果查找到不存在,将 panic
func (*ToState) ObjectToArg ¶
ObjectToArg 转换一个对象为中间代码操作数
Click to show internal directories.
Click to hide internal directories.