about summary refs log tree commit diff stats
path: root/506math.mu
diff options
context:
space:
mode:
Diffstat (limited to '506math.mu')
-rw-r--r--506math.mu32
1 files changed, 32 insertions, 0 deletions
diff --git a/506math.mu b/506math.mu
index d4e4194c..40b8ccdb 100644
--- a/506math.mu
+++ b/506math.mu
@@ -19,3 +19,35 @@ fn sgn n: int -> _/eax: int {
   }
   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
+}