aboutsummaryrefslogtreecommitdiff
path: root/core/math/big/logical.odin
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-07-21 13:46:37 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2021-08-11 20:59:50 +0200
commit7648f2e655b0e280bfb049eb02634d0f5cd136ac (patch)
tree2b245d2766e67503f807550997bfe264313a2666 /core/math/big/logical.odin
parentd9efa6c8b5cbaaf04c6468f465a6b402b4dc8e82 (diff)
big: Finish big ZII refactor.
Diffstat (limited to 'core/math/big/logical.odin')
-rw-r--r--core/math/big/logical.odin87
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