diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-07-21 13:46:37 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2021-08-11 20:59:50 +0200 |
| commit | 7648f2e655b0e280bfb049eb02634d0f5cd136ac (patch) | |
| tree | 2b245d2766e67503f807550997bfe264313a2666 /core/math/big/logical.odin | |
| parent | d9efa6c8b5cbaaf04c6468f465a6b402b4dc8e82 (diff) | |
big: Finish big ZII refactor.
Diffstat (limited to 'core/math/big/logical.odin')
| -rw-r--r-- | core/math/big/logical.odin | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/core/math/big/logical.odin b/core/math/big/logical.odin index 6c857a2f2..47537d092 100644 --- a/core/math/big/logical.odin +++ b/core/math/big/logical.odin @@ -20,29 +20,33 @@ package big 2's complement `and`, returns `dest = a & b;` */ and :: proc(dest, a, b: ^Int) -> (err: Error) { - assert_initialized(dest); assert_initialized(a); assert_initialized(b); - + if err = clear_if_uninitialized(a); err != .None { + return err; + } + if err = clear_if_uninitialized(b); err != .None { + return err; + } used := max(a.used, b.used) + 1; - neg: bool; - - neg = is_neg(a) && is_neg(b); - - ac, bc, cc := DIGIT(1), DIGIT(1), DIGIT(1); - /* Grow the destination to accomodate the result. */ - if err = grow(dest, used); err != .OK { + if err = grow(dest, used); err != .None { return err; } + neg_a, _ := is_neg(a); + neg_b, _ := is_neg(b); + neg := neg_a && neg_b; + + ac, bc, cc := DIGIT(1), DIGIT(1), DIGIT(1); + for i := 0; i < used; i += 1 { x, y: DIGIT; /* Convert to 2's complement if negative. */ - if is_neg(a) { + if neg_a { ac += _MASK if i >= a.used else (~a.digit[i] & _MASK); x = ac & _MASK; ac >>= _DIGIT_BITS; @@ -53,7 +57,7 @@ and :: proc(dest, a, b: ^Int) -> (err: Error) { /* Convert to 2's complement if negative. */ - if is_neg(a) { + if neg_b { bc += _MASK if i >= b.used else (~b.digit[i] & _MASK); y = bc & _MASK; bc >>= _DIGIT_BITS; @@ -75,37 +79,40 @@ and :: proc(dest, a, b: ^Int) -> (err: Error) { dest.used = used; dest.sign = .Negative if neg else .Zero_or_Positive; - clamp(dest); - return .OK; + return clamp(dest); } /* 2's complement `or`, returns `dest = a | b;` */ or :: proc(dest, a, b: ^Int) -> (err: Error) { - assert_initialized(dest); assert_initialized(a); assert_initialized(b); - + if err = clear_if_uninitialized(a); err != .None { + return err; + } + if err = clear_if_uninitialized(b); err != .None { + return err; + } used := max(a.used, b.used) + 1; - neg: bool; - - neg = is_neg(a) || is_neg(b); - - ac, bc, cc := DIGIT(1), DIGIT(1), DIGIT(1); - /* Grow the destination to accomodate the result. */ - if err = grow(dest, used); err != .OK { + if err = grow(dest, used); err != .None { return err; } + neg_a, _ := is_neg(a); + neg_b, _ := is_neg(b); + neg := neg_a || neg_b; + + ac, bc, cc := DIGIT(1), DIGIT(1), DIGIT(1); + for i := 0; i < used; i += 1 { x, y: DIGIT; /* Convert to 2's complement if negative. */ - if is_neg(a) { + if neg_a { ac += _MASK if i >= a.used else (~a.digit[i] & _MASK); x = ac & _MASK; ac >>= _DIGIT_BITS; @@ -116,7 +123,7 @@ or :: proc(dest, a, b: ^Int) -> (err: Error) { /* Convert to 2's complement if negative. */ - if is_neg(a) { + if neg_b { bc += _MASK if i >= b.used else (~b.digit[i] & _MASK); y = bc & _MASK; bc >>= _DIGIT_BITS; @@ -138,37 +145,40 @@ or :: proc(dest, a, b: ^Int) -> (err: Error) { dest.used = used; dest.sign = .Negative if neg else .Zero_or_Positive; - clamp(dest); - return .OK; + return clamp(dest); } /* 2's complement `xor`, returns `dest = a ~ b;` */ xor :: proc(dest, a, b: ^Int) -> (err: Error) { - assert_initialized(dest); assert_initialized(a); assert_initialized(b); - + if err = clear_if_uninitialized(a); err != .None { + return err; + } + if err = clear_if_uninitialized(b); err != .None { + return err; + } used := max(a.used, b.used) + 1; - neg: bool; - - neg = is_neg(a) != is_neg(b); - - ac, bc, cc := DIGIT(1), DIGIT(1), DIGIT(1); - /* Grow the destination to accomodate the result. */ - if err = grow(dest, used); err != .OK { + if err = grow(dest, used); err != .None { return err; } + neg_a, _ := is_neg(a); + neg_b, _ := is_neg(b); + neg := neg_a != neg_b; + + ac, bc, cc := DIGIT(1), DIGIT(1), DIGIT(1); + for i := 0; i < used; i += 1 { x, y: DIGIT; /* Convert to 2's complement if negative. */ - if is_neg(a) { + if neg_a { ac += _MASK if i >= a.used else (~a.digit[i] & _MASK); x = ac & _MASK; ac >>= _DIGIT_BITS; @@ -179,7 +189,7 @@ xor :: proc(dest, a, b: ^Int) -> (err: Error) { /* Convert to 2's complement if negative. */ - if is_neg(a) { + if neg_b { bc += _MASK if i >= b.used else (~b.digit[i] & _MASK); y = bc & _MASK; bc >>= _DIGIT_BITS; @@ -201,6 +211,5 @@ xor :: proc(dest, a, b: ^Int) -> (err: Error) { dest.used = used; dest.sign = .Negative if neg else .Zero_or_Positive; - clamp(dest); - return .OK; + return clamp(dest); }
\ No newline at end of file |