Skip to content

Instantly share code, notes, and snippets.

@dominictarr
Created April 15, 2020 07:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dominictarr/ff00c27a6ce48c23bc36dfb0a25c5496 to your computer and use it in GitHub Desktop.
Save dominictarr/ff00c27a6ce48c23bc36dfb0a25c5496 to your computer and use it in GitHub Desktop.
(module
;; an operation defined inside a macro
(def op_mac (mac (a b) (block
&[i32_load (mod a 1000)]
)))
;;a function that contains that macro
(def op_fun (fun (a b) (op_mac a b) ))
(def N 10000000)
;;do the function call inside a loop
(export calls (fun () {block
(def i 0)
(loop
(lt i N)
(block
(def i (add i 1))
(op_fun i 10) ;;call a small function
)
)
}))
;;inline the op into the loop (so no calls)
(export inlines (fun () {block
(def i 0)
(loop
(lt i N)
(block
(def i (add i 1))
(op_mac i 0)
)
)
}))
;; macro to inline N ops
(def unroll (mac R [n op]
(if n
(block
(def n (sub n 1))
&(block (R n op) op)
)
op
)))
;; a loop with the op inlined in batches of 100
(export unrolled (fun () {block
(def i 0)
(loop
(lt i N)
(block
(def i (add i 100))
;;(op_mac)
(unroll 100 (op_mac i 0))
0
)
)
}))
)
(module (memory (export "memory")
1)
(global $FREE (mut i32) (i32.const 0))
(func (result i32)
(local $i i32)
(local $batch i32)
(local $1 i32)
(local.set $i (i32.const 0))
(local.set $batch (i32.const 1000))
(loop (if
(i32.lt_s (local.get $i) (i32.const 10000000))
(then
(local.set $i (i32.add (local.get $i) (i32.const 100)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(i32.load (i32.rem_s (local.get $i) (i32.const 1000)))
(local.set $1 (i32.const 0))
(br 1))))
(local.get $1)
)
(func (result i32)
(local $i i32)
(local $1 i32)
(local.set $i (i32.const 0))
(loop (if
(i32.lt_s (local.get $i) (i32.const 10000000))
(then
(local.set $i (i32.add (local.get $i) (i32.const 1)))
(local.set
$1 (i32.load (i32.rem_s (local.get $i) (i32.const 1000))))
(br 1))))
(local.get $1))
(func (param $a i32) (param $b i32) (result i32)
(i32.load (i32.rem_s (local.get $a) (i32.const 1000))))
(func (result i32)
(local $i i32)
(local $1 i32)
(local.set $i (i32.const 0))
(loop (if
(i32.lt_s (local.get $i) (i32.const 10000000))
(then
(local.set $i (i32.add (local.get $i) (i32.const 1)))
(local.set $1
(call 2
(local.get $i)
(i32.const 10)))
(br 1))))
(local.get $1))
(export "calls" (func 3))
(export "inlines" (func 1))
(export "unrolled" (func 0))
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment