2020.4.8
相关工作
- JIT-CCS
- SimIt
- EHS
- Rapido
- QEMU
- llvm-qemu和本文的工作相似,但是未曾发表过文章。
Dynamic Translation With LLVM
前人的工作——SimSoc
4个模式:
- DT0解释执行
- DT1增加缓存功能
- DT2增加对缓存进行优化功能
- DT3比较性能
本文的工作
增加DT3模式,优化的粒度为基本块。将所有的指令包装成了函数,一定调用AlwaysInline的优化,其他优化可选,最后用LLVM的JIT生成本地代码。
例子:
PowerPC指令
addis r9, r0, 385
lwz r0, 1076 (r9)
or r1, r0, r0
bl 0xffffff70
直接替换成已包装好的函数(LLVM IR)
define void @bb_687 (%"struct.Proc"* %proc)
{
entry:
%status = call i32 @addis_ra0(%"struct.Proc"* %proc, i8 9, i32 385)
call void @inc_pc(%"struct.Proc"* %proc)
%status1 = call i32 @lwz_raS(%"struct.Proc"* %proc, i8 0, i8 9, i32 1076)
call void @inc_pc(%"struct.Proc"* %proc)
%status2 = call i32 @or(%"struct.Proc"* %proc, i8 0, i8 1, i8 0)
call void @inc_pc(%"struct.Proc"* %proc)
%status3 = call i32 @bl(%"struct.Proc"* %proc, i32 -144)
call void @inc_pc_if_no_branch(i32 %status3,%"struct.Proc"* %proc)
ret void
}
因为用llvm来搞这么一趟开销很大,所以只对热点代码使用llvm优化。