compiler: do: replace set+get by tee

This commit is contained in:
Remko Tronçon 2022-04-26 20:11:02 +02:00
parent d6e8406c11
commit 175bf67767

View file

@ -2095,6 +2095,9 @@
(call $emitEnd)) (call $emitEnd))
(func $compileDo (func $compileDo
;; var 1: whether the start index was greater than the end index (necessary for +loop)
;; var 2: current index
;; var 3: end index
(global.set $currentLocal (i32.add (global.get $currentLocal) (i32.const 3))) (global.set $currentLocal (i32.add (global.get $currentLocal) (i32.const 3)))
(if (i32.gt_s (global.get $currentLocal) (global.get $lastLocal)) (if (i32.gt_s (global.get $currentLocal) (global.get $lastLocal))
(then (then
@ -2108,12 +2111,10 @@
(call $compilePop) (call $compilePop)
(call $emitSetLocal (i32.sub (global.get $currentLocal) (i32.const 1))) (call $emitSetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $compilePop) (call $compilePop)
(call $emitSetLocal (global.get $currentLocal)) (call $emitTeeLocal (global.get $currentLocal))
(call $emitGetLocal (global.get $currentLocal))
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1))) (call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitGreaterEqualSigned) (call $emitGreaterEqualSigned)
(call $emitSetLocal (i32.sub (global.get $currentLocal) (i32.const 2))) (call $emitSetLocal (i32.sub (global.get $currentLocal) (i32.const 2)))
(call $emitBlock) (call $emitBlock)
(call $emitLoop)) (call $emitLoop))
@ -2121,38 +2122,33 @@
(call $emitConst (i32.const 1)) (call $emitConst (i32.const 1))
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1))) (call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitAdd) (call $emitAdd)
(call $emitSetLocal (i32.sub (global.get $currentLocal) (i32.const 1))) (call $emitTeeLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitGetLocal (global.get $currentLocal)) (call $emitGetLocal (global.get $currentLocal))
(call $emitGreaterEqualSigned) (call $emitLesserSigned)
(call $emitBrIf (i32.const 1)) (call $emitBrIf (i32.const 0))
(call $compileLoopEnd)) (call $compileLoopEnd))
(func $compilePlusLoop (func $compilePlusLoop
(call $compilePop) (call $compilePop)
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1))) (call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitAdd) (call $emitAdd)
(call $emitSetLocal (i32.sub (global.get $currentLocal) (i32.const 1))) (call $emitTeeLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 2))) (call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 2)))
(call $emitEqualsZero) (call $emitEqualsZero)
(call $emitIf) (call $emitIf2)
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitGetLocal (global.get $currentLocal))
(call $emitLesserSigned)
(call $emitBrIf (i32.const 2))
(call $emitElse)
(call $emitGetLocal (i32.sub (global.get $currentLocal) (i32.const 1)))
(call $emitGetLocal (global.get $currentLocal)) (call $emitGetLocal (global.get $currentLocal))
(call $emitGreaterEqualSigned) (call $emitGreaterEqualSigned)
(call $emitBrIf (i32.const 2)) (call $emitBrIf (i32.const 1))
(call $emitElse)
(call $emitGetLocal (global.get $currentLocal))
(call $emitLesserSigned)
(call $emitBrIf (i32.const 1))
(call $emitEnd) (call $emitEnd)
(call $compileLoopEnd)) (call $compileLoopEnd))
;; Assumes increment is on the operand stack ;; Assumes increment is on the operand stack
(func $compileLoopEnd (func $compileLoopEnd
(local $btors i32) (local $btors i32)
(call $emitBr (i32.const 0))
(call $emitEnd) (call $emitEnd)
(call $emitEnd) (call $emitEnd)
(global.set $currentLocal (i32.sub (global.get $currentLocal) (i32.const 3))) (global.set $currentLocal (i32.sub (global.get $currentLocal) (i32.const 3)))
@ -2244,6 +2240,12 @@
(i32.store8 (global.get $cp) (i32.const 0x00)) ;; Block type (i32.store8 (global.get $cp) (i32.const 0x00)) ;; Block type
(global.set $cp (i32.add (global.get $cp) (i32.const 1)))) (global.set $cp (i32.add (global.get $cp) (i32.const 1))))
(func $emitIf2
(i32.store8 (global.get $cp) (i32.const 0x04))
(global.set $cp (i32.add (global.get $cp) (i32.const 1)))
(i32.store8 (global.get $cp) (i32.const 0x01)) ;; Block type
(global.set $cp (i32.add (global.get $cp) (i32.const 1))))
(func $emitElse (func $emitElse
(i32.store8 (global.get $cp) (i32.const 0x05)) (i32.store8 (global.get $cp) (i32.const 0x05))
(global.set $cp (i32.add (global.get $cp) (i32.const 1)))) (global.set $cp (i32.add (global.get $cp) (i32.const 1))))