about summary refs log tree commit diff
path: root/boot/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'boot/runtime')
-rw-r--r--boot/runtime/core.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/boot/runtime/core.c b/boot/runtime/core.c
index e377e0a..cc9210e 100644
--- a/boot/runtime/core.c
+++ b/boot/runtime/core.c
@@ -87,6 +87,26 @@ println(const ascii* s)
 
 // `printf` is already linked in via <stdio.h>.
 
+// integer exponentiation by squaring.
+// see: https://en.wikipedia.org/wiki/Exponentiation_by_squaring
+// negative exponent rounds to 0 for any base except 1 / -1.
+integer
+pow_integer(integer base, integer exponent)
+{
+    if (exponent < 0) {
+        if (base == 1) return 1;
+        if (base == -1) return (exponent & 1) ? -1 : 1;
+        return 0;
+    }
+    integer result = 1;
+    while (exponent > 0) {
+        if (exponent & 1) result *= base;
+        base *= base;
+        exponent >>= 1;
+    }
+    return result;
+}
+
 void*
 allocate(size_t size)
 {