aboutsummaryrefslogtreecommitdiff
path: root/core/math/big/logical.odin
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-07-27 16:41:20 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2021-08-11 20:59:51 +0200
commit2aae1016ab31a89c185639f24a095133a7bef0a2 (patch)
treef72d2fd62333ec240708d8f0a719722f510128cd /core/math/big/logical.odin
parent9c2468ecf71180c854f6d2bb5a0a46599f1e8b31 (diff)
big: Add `sqrt`.
Diffstat (limited to 'core/math/big/logical.odin')
-rw-r--r--core/math/big/logical.odin18
1 files changed, 18 insertions, 0 deletions
diff --git a/core/math/big/logical.odin b/core/math/big/logical.odin
index 53e296dc1..9b6654a5c 100644
--- a/core/math/big/logical.odin
+++ b/core/math/big/logical.odin
@@ -349,6 +349,24 @@ int_shr_digit :: proc(quotient: ^Int, digits: int) -> (err: Error) {
shr_digit :: proc { int_shr_digit, };
/*
+ Shift right by a certain bit count with sign extension.
+*/
+int_shr_signed :: proc(dest, src: ^Int, bits: int) -> (err: Error) {
+ if err = clear_if_uninitialized(src); err != .None { return err; }
+ if err = clear_if_uninitialized(dest); err != .None { return err; }
+
+ if src.sign == .Zero_or_Positive {
+ return shr(dest, src, bits);
+ }
+ if err = add(dest, src, DIGIT(1)); err != .None { return err; }
+
+ if err = shr(dest, dest, bits); err != .None { return err; }
+ return sub(dest, src, DIGIT(1));
+}
+
+shr_signed :: proc { int_shr_signed, };
+
+/*
Shift left by a certain bit count.
*/
int_shl :: proc(dest, src: ^Int, bits: int) -> (err: Error) {