mirror of
https://github.com/odin-lang/Odin.git
synced 2026-07-11 02:19:30 +00:00
Fix constant x %% y evaluation
This commit is contained in:
@@ -432,6 +432,14 @@ gb_internal void big_int_rem(BigInt *z, BigInt const *x, BigInt const *y) {
|
||||
big_int_quo_rem(x, y, &q, z);
|
||||
big_int_dealloc(&q);
|
||||
}
|
||||
gb_internal void big_int_mod_mod(BigInt *z, BigInt const *x, BigInt const *y) {
|
||||
BigInt q = {};
|
||||
big_int_rem(&q, x, y);
|
||||
big_int_add(&q, &q, y);
|
||||
big_int_rem(z, &q, y);
|
||||
big_int_dealloc(&q);
|
||||
|
||||
}
|
||||
|
||||
gb_internal void big_int_euclidean_mod(BigInt *z, BigInt const *x, BigInt const *y) {
|
||||
BigInt y0 = {};
|
||||
|
||||
@@ -780,7 +780,7 @@ gb_internal ExactValue exact_binary_operator_value(TokenKind op, ExactValue x, E
|
||||
case Token_Quo: return exact_value_float(fmod(big_int_to_f64(a), big_int_to_f64(b)));
|
||||
case Token_QuoEq: big_int_quo(&c, a, b); break; // NOTE(bill): Integer division
|
||||
case Token_Mod: big_int_rem(&c, a, b); break;
|
||||
case Token_ModMod: big_int_euclidean_mod(&c, a, b); break;
|
||||
case Token_ModMod: big_int_mod_mod(&c, a, b); break;
|
||||
case Token_And: big_int_and(&c, a, b); break;
|
||||
case Token_Or: big_int_or(&c, a, b); break;
|
||||
case Token_Xor: big_int_xor(&c, a, b); break;
|
||||
|
||||
Reference in New Issue
Block a user