https://github.com/akkartik/mu/blob/main/506math.mu
1 fn abs n: int -> _/eax: int {
2 compare n, 0
3 {
4 break-if->=
5 negate n
6 }
7 return n
8 }
9
10 fn sgn n: int -> _/eax: int {
11 compare n, 0
12 {
13 break-if-<=
14 return 1
15 }
16 {
17 break-if->=
18 return -1
19 }
20 return 0
21 }
22
23 fn shift-left-by n: int, bits: int -> _/eax: int {
24 var i/eax: int <- copy bits
25 {
26 compare i, 0
27 break-if-<=
28 shift-left n, 1
29 i <- decrement
30 loop
31 }
32 return n
33 }
34
35 fn shift-right-by n: int, bits: int -> _/eax: int {
36 var i/eax: int <- copy bits
37 {
38 compare i, 0
39 break-if-<=
40 shift-right n, 1
41 i <- decrement
42 loop
43 }
44 return n
45 }
46
47 fn clear-lowest-bits _n: (addr int), bits: int {
48 var dest/edi: (addr int) <- copy _n
49 var n/eax: int <- copy *dest
50 n <- shift-right-by n, bits
51 n <- shift-left-by n, bits
52 copy-to *dest, n
53 }