macro_rules! jit(
($func:ident, return) => (
$func.insn_default_return()
);
($func:ident, return $($t:tt)+) => (
$func.insn_return(jit!($func, $($t)+))
);
($func:ident, $var:ident += $($t:tt)+) => (
$func.insn_store($var, &$func.insn_add($var, jit!($func, $($t)+)));
);
($func:ident, $var:ident -= $($t:tt)+) => (
$func.insn_store($var, &$func.insn_sub($var, jit!($func, $($t)+)));
);
($func:ident, $var:ident *= $($t:tt)+) => (
$func.insn_store($var, &$func.insn_mul($var, jit!($func, $($t)+)));
);
($func:ident, $var:ident /= $($t:tt)+) => (
$func.insn_store($var, &$func.insn_div($var, jit!($func, $($t)+)));
);
($func:ident, $($a:tt)+ + $($b:tt)+) => (
$func.insn_add(jit!($func, $($a)+), jit!($func, $($b)+))
);
($func:ident, $($a:tt)+ - $($b:tt)+) => (
$func.insn_sub(jit!($func, $($a)+), jit!($func, $($b)+))
);
($func:ident, $($a:tt)+ * $($b:tt)+) => (
$func.insn_mul(jit!($func, $($a)+), jit!($func, $($b)+))
);
($func:ident, $($a:tt)+ / $($b:tt)+) => (
$func.insn_div(jit!($func, $($a)+), jit!($func, $($b)+))
);
($func:ident, $($a:tt)+ % $($b:tt)+) => (
$func.insn_rem(jit!($func, $($a)+), jit!($func, $($b)+))
);
($func:ident, ($($t:tt)+).sqrt()) => (
$func.insn_sqrt(&jit!($func, $($t)+))
);
($func:ident, $var:ident = $($t:tt)+) => (
$func.insn_store($var, jit!($func, $val));
);
($func:ident, *$var:ident) => (
$func.insn_load($var)
);
($func:ident, call($call:expr,
$($arg:expr),+
)) => (
$func.insn_call(None::<String>, $call, None, [$($arg),+].as_mut_slice())
);
($func:ident, jump_table($value:expr,
$($label:ident),+
)) => (
let ($($label),+) = {
$(let $label:Label = Label::new($func);)+
$func.insn_jump_table($value, [
$($label),+
].as_mut_slice());
($($label),+)
});
);