mu/506math.mu

54 lines
798 B
Forth

fn abs n: int -> _/eax: int {
compare n, 0
{
break-if->=
negate n
}
return n
}
fn sgn n: int -> _/eax: int {
compare n, 0
{
break-if-<=
return 1
}
{
break-if->=
return -1
}
return 0
}
fn shift-left-by n: int, bits: int -> _/eax: int {
var i/eax: int <- copy bits
{
compare i, 0
break-if-<=
shift-left n, 1
i <- decrement
loop
}
return n
}
fn shift-right-by n: int, bits: int -> _/eax: int {
var i/eax: int <- copy bits
{
compare i, 0
break-if-<=
shift-right n, 1
i <- decrement
loop
}
return n
}
fn clear-lowest-bits _n: (addr int), bits: int {
var dest/edi: (addr int) <- copy _n
var n/eax: int <- copy *dest
n <- shift-right-by n, bits
n <- shift-left-by n, bits
copy-to *dest, n
}