Skip to content

指令

属性值类型 ​

记号含义
<symbol>符号名,如 foo
<int>整数值,如 42
<float>浮点值,如 3.14
<string>字符串值,如 "hello"
<bool>布尔值,如 (true) 或 (false)
<type>类型引用,如 int64-t、pointer-t
(<symbol> ...)符号列表,如 (x y)

目录 ​

二元运算 ​

指令输出输入属性描述
iaddint64-tint64-t int64-t-整数加法
isubint64-tint64-t int64-t-整数减法
imulint64-tint64-t int64-t-整数乘法
idivint64-tint64-t int64-t-整数除法
faddfloat64-tfloat64-t float64-t-浮点加法
fsubfloat64-tfloat64-t float64-t-浮点减法
fmulfloat64-tfloat64-t float64-t-浮点乘法
fdivfloat64-tfloat64-t float64-t-浮点除法
shlint64-tint64-t int64-t-左移位
shrint64-tint64-t int64-t-右移位
bitandint64-tint64-t int64-t-按位与
bitorint64-tint64-t int64-t-按位或
bitxorint64-tint64-t int64-t-按位异或
paddpointer-tpointer-t int64-t-指针字节偏移加法,结果为 base + offset
andbool-tbool-t bool-t-逻辑与
orbool-tbool-t bool-t-逻辑或
xorbool-tbool-t bool-t-逻辑异或

比较指令 ​

指令输出输入属性描述
icmp-eqbool-tint64-t int64-t-int64 相等
icmp-nebool-tint64-t int64-t-int64 不等
icmp-ltbool-tint64-t int64-t-int64 小于
icmp-lebool-tint64-t int64-t-int64 小于等于
icmp-gtbool-tint64-t int64-t-int64 大于
icmp-gebool-tint64-t int64-t-int64 大于等于
fcmp-eqbool-tfloat64-t float64-t-float64 相等
fcmp-nebool-tfloat64-t float64-t-float64 不等
fcmp-ltbool-tfloat64-t float64-t-float64 小于
fcmp-lebool-tfloat64-t float64-t-float64 小于等于
fcmp-gtbool-tfloat64-t float64-t-float64 大于
fcmp-gebool-tfloat64-t float64-t-float64 大于等于
bool-eqbool-tbool-t bool-t-bool 相等
bool-nebool-tbool-t bool-t-bool 不等
pointer-eqbool-tpointer-t pointer-t-pointer 相等
pointer-nebool-tpointer-t pointer-t-pointer 不等
value-eqbool-tvalue-t value-t-value identity 相等
value-nebool-tvalue-t value-t-value identity 不等

一元运算 ​

指令输出输入属性描述
notbool-tbool-t-逻辑取反
tag-intvalue-tint64-t-将 int64 包装为 value
tag-floatvalue-tfloat64-t-将 float64 包装为 value
tag-boolvalue-tbool-t-将 bool 包装为 value
to-int64int64-tvalue-t-从 value 解构 int64,运行时类型检查
to-float64float64-tvalue-t-从 value 解构 float64,运行时类型检查
to-boolbool-tvalue-t-从 value 解构 bool,运行时类型检查
copyTT-创建 SSA 别名,输入与输出是同一个值

字面量 ​

指令输出输入属性描述
int64int64-t-:content <int>创建 int64-t 常量
float64float64-t-:content <float>创建 float64-t 常量
boolbool-t-:content <bool>创建 bool-t 常量,值为 (true) 或 (false)
addresspointer-t-:name <symbol>获取顶层符号地址,链接时解析

常量 ​

指令输出输入属性描述
symbolpointer-t-:content <symbol>获取 symbol 的裸指针地址
stringpointer-t-:content <string>获取 C 风格字符串指针地址
symbol-valuevalue-t-:content <symbol>获取带 tag 的 symbol 值
text-valuevalue-t-:content <text>获取带 tag 的 text 值

内存操作 ​

指令输出输入属性描述
loadTpointer-t:type <type>从 opaque 指针加载值
store-pointer-t T-将值写入指针
size-ofint64-t-:target-type <type>计算目标类型字节大小,编译时常量
offset-ofint64-t-:struct-type <type> :path (<symbol> ...)沿 struct 字段路径计算累积字节偏移,编译时常量

控制流 ​

指令输出输入属性描述
return-任意类型-函数返回,terminator
goto--:label <symbol>无条件跳转,terminator
branch-bool-t:then-label <symbol> :else-label <symbol>条件分支,terminator

branch ​

branch 的条件为 bool-t,为真时跳转到 :then-label,否则跳转到 :else-label。

scheme
(branch cond :then-label positive :else-label non-positive)

函数调用 ​

指令输出输入属性描述
callRpointer-t T ...-静态函数调用
tail-call-pointer-t T ...-尾调用,terminator
applyRvalue-t T ...-动态函数调用
tail-apply-value-t T ...-尾动态调用,terminator
argumentT-:index <int>获取函数参数,从 0 开始,只能在 entry block 使用

call / apply ​

call 的第一个输入是目标函数地址,apply 的第一个输入是动态函数值,其余输入都是参数列表。

scheme
(= result (call add-addr a b))
(= result (apply fn arg1 arg2))

tail-call / tail-apply ​

语义分别与 call / apply 相同,但当前栈帧会被回收,且是 terminator 指令。

scheme
(tail-call address x y)
(tail-apply fn arg1 arg2)

动态值操作 ​

指令输出输入属性描述
useT-:type <type>从合并点读取值
provide-T:use-site <symbol>向合并点写入值

use / provide ​

use 从合并点读取值,:type 声明结果类型;provide 向对应 :use-site 写入值。多个 provide 可对应同一个 use。

scheme
(block then
  (= tagged-sum (tag-int sum))
  (provide tagged-sum :use-site result)
  (goto :label merge))

(block else
  (= tagged-diff (tag-int diff))
  (provide tagged-diff :use-site result)
  (goto :label merge))

(block merge
  (= result (use :type value-t))
  (return result))