2020.4.8

相关工作

  • JIT-CCS
  • SimIt
  • EHS
  • Rapido
  • QEMU
    • llvm-qemu和本文的工作相似,但是未曾发表过文章。

Dynamic Translation With LLVM

前人的工作——SimSoc

4个模式:

  1. DT0解释执行
  2. DT1增加缓存功能
  3. DT2增加对缓存进行优化功能
  4. 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优化。