diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-07-27 16:41:20 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-08-11 20:59:51 +0200 |
| commit | 2aae1016ab31a89c185639f24a095133a7bef0a2 (patch) | |
| tree | f72d2fd62333ec240708d8f0a719722f510128cd /core/math/big/logical.odin | |
| parent | 9c2468ecf71180c854f6d2bb5a0a46599f1e8b31 (diff) | |
big: Add `sqrt`.
Diffstat (limited to 'core/math/big/logical.odin')
| -rw-r--r-- | core/math/big/logical.odin | 18 |
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) { |