開發紀錄(B)
201q3 Homework4 Due: 2015/10/26
詳讀 Virtual Machine Constructions for Dummies,改善 Brainf*ck 執行效能
  • 改善 JIT compiler,加入若干 optimization techniques
 

原始版本

make bench-jit-x64
 
Executing Brainf*ck benchmark suite. Be patient.
 
progs/awib.b               GOOD        106.1ms
progs/mandelbrot.b   GOOD        2923.8ms
progs/hanoi.b              GOOD        7410.7ms
 

改善 JIT compiler

Setp 1: Pattern: +++
參考講義P.44的作法,把相同重複的指令merge成一個指令。
make run-jit-x64 (原始版本)
   4:        fe 03                        incb   (%rbx)
   6:        fe 03                        incb   (%rbx)
   8:        fe 03                        incb   (%rbx)
   a:        fe 03                        incb   (%rbx)
   c:        fe 03                        incb   (%rbx)
   e:        fe 03                        incb   (%rbx)
  10:        fe 03                        incb   (%rbx)
  12:        fe 03                        incb   (%rbx)
  14:        fe 03                        incb   (%rbx)
  16:        fe 03                        incb   (%rbx)
相同指令重複10次,可以把它merge成一個指令,參考資料
inc 運算元  (運算元=運算元+1)   →   add 目的,來源 (目的=目的+來源)
dec 運算元 (運算元=運算元-1)  →    sub 目的,來源 (目的=目的-來源)
   4:        80 03 0a                     addb   $0xa,(%rbx)
原先+1, +1, ...連續十次,merge過後,只要+10一個指令就好了。
時間縮短了一半!!!
Executing Brainf*ck benchmark suite. Be patient.
 
progs/awib.b                   GOOD        41.9ms
progs/mandelbrot.b       GOOD        1057.2ms
progs/hanoi.b                  GOOD        3953.2ms
 
Step 2: pathern: [-]
參考講義P.45, 46的作法,把用來歸零while loop
[-]    while (*p) {    --*p;    }
合併成一個指令 →    MOV  目的,來源 (將來源資料複製到目的),直接設零
 mov byte [PTR], 0
時間縮短的又更驚人了!!!
Executing Brainf*ck benchmark suite. Be patient.
 
progs/awib.b                   GOOD        34.6ms
progs/mandelbrot.b       GOOD        1011.7ms