authorgravatar for jahe788@gmail.comIntegratedQuantum <jahe788@gmail.com> 2022-12-14 01:29:25+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-12-14 00:29:25+00:00
log0b4461d97b5d315e71302f96076c54bbdffb7717
tree1c52ec832285d2234c7a423b46327b56da0d3cc0
parentf1b536c44c2854b33a1541624711e006748469a3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Fix tautological big_int tests.


5 files changed, 68 insertions(+), 37 deletions(-)

lib/std/math/big/int.zig+23-5
...@@ -1176,15 +1176,26 @@ pub const Mutable = struct {...@@ -1176,15 +1176,26 @@ pub const Mutable = struct {
1176 /// `a.limbs.len - (shift / (@sizeOf(Limb) * 8))`.1176 /// `a.limbs.len - (shift / (@sizeOf(Limb) * 8))`.
1177 pub fn shiftRight(r: *Mutable, a: Const, shift: usize) void {1177 pub fn shiftRight(r: *Mutable, a: Const, shift: usize) void {
1178 if (a.limbs.len <= shift / limb_bits) {1178 if (a.limbs.len <= shift / limb_bits) {
1179 r.len = 1;1179 // Shifting negative numbers converges to -1 instead of 0
1180 r.positive = true;1180 if (a.positive) {
1181 r.limbs[0] = 0;1181 r.len = 1;
1182 r.positive = true;
1183 r.limbs[0] = 0;
1184 } else {
1185 r.len = 1;
1186 r.positive = false;
1187 r.limbs[0] = 1;
1188 }
1182 return;1189 return;
1183 }1190 }
11841191
1185 llshr(r.limbs[0..], a.limbs[0..a.limbs.len], shift);1192 llshr(r.limbs[0..], a.limbs[0..a.limbs.len], shift);
1186 r.normalize(a.limbs.len - (shift / limb_bits));1193 r.normalize(a.limbs.len - (shift / limb_bits));
1187 r.positive = a.positive;1194 r.positive = a.positive;
1195 // Shifting negative numbers converges to -1 instead of 0
1196 if (!r.positive and r.len == 1 and r.limbs[0] == 0) {
1197 r.limbs[0] = 1;
1198 }
1188 }1199 }
11891200
1190 /// r = ~a under 2s complement wrapping semantics.1201 /// r = ~a under 2s complement wrapping semantics.
...@@ -2974,8 +2985,15 @@ pub const Managed = struct {...@@ -2974,8 +2985,15 @@ pub const Managed = struct {
2974 /// r and a may alias.2985 /// r and a may alias.
2975 pub fn shiftRight(r: *Managed, a: *const Managed, shift: usize) !void {2986 pub fn shiftRight(r: *Managed, a: *const Managed, shift: usize) !void {
2976 if (a.len() <= shift / limb_bits) {2987 if (a.len() <= shift / limb_bits) {
2977 r.metadata = 1;2988 // Shifting negative numbers converges to -1 instead of 0
2978 r.limbs[0] = 0;2989 if (a.isPositive()) {
2990 r.metadata = 1;
2991 r.limbs[0] = 0;
2992 } else {
2993 r.metadata = 1;
2994 r.setSign(false);
2995 r.limbs[0] = 1;
2996 }
2979 return;2997 return;
2980 }2998 }
29812999
lib/std/math/big/int_test.zig+33-30
...@@ -516,8 +516,8 @@ test "big.int add multi-single" {...@@ -516,8 +516,8 @@ test "big.int add multi-single" {
516}516}
517517
518test "big.int add multi-multi" {518test "big.int add multi-multi" {
519 const op1 = 0xefefefef7f7f7f7f;519 var op1: u128 = 0xefefefef7f7f7f7f;
520 const op2 = 0xfefefefe9f9f9f9f;520 var op2: u128 = 0xfefefefe9f9f9f9f;
521 var a = try Managed.initSet(testing.allocator, op1);521 var a = try Managed.initSet(testing.allocator, op1);
522 defer a.deinit();522 defer a.deinit();
523 var b = try Managed.initSet(testing.allocator, op2);523 var b = try Managed.initSet(testing.allocator, op2);
...@@ -830,8 +830,8 @@ test "big.int sub multi-single" {...@@ -830,8 +830,8 @@ test "big.int sub multi-single" {
830}830}
831831
832test "big.int sub multi-multi" {832test "big.int sub multi-multi" {
833 const op1 = 0xefefefefefefefefefefefef;833 var op1: u128 = 0xefefefefefefefefefefefef;
834 const op2 = 0xabababababababababababab;834 var op2: u128 = 0xabababababababababababab;
835835
836 var a = try Managed.initSet(testing.allocator, op1);836 var a = try Managed.initSet(testing.allocator, op1);
837 defer a.deinit();837 defer a.deinit();
...@@ -914,8 +914,8 @@ test "big.int mul multi-single" {...@@ -914,8 +914,8 @@ test "big.int mul multi-single" {
914}914}
915915
916test "big.int mul multi-multi" {916test "big.int mul multi-multi" {
917 const op1 = 0x998888efefefefefefefef;917 var op1: u256 = 0x998888efefefefefefefef;
918 const op2 = 0x333000abababababababab;918 var op2: u256 = 0x333000abababababababab;
919 var a = try Managed.initSet(testing.allocator, op1);919 var a = try Managed.initSet(testing.allocator, op1);
920 defer a.deinit();920 defer a.deinit();
921 var b = try Managed.initSet(testing.allocator, op2);921 var b = try Managed.initSet(testing.allocator, op2);
...@@ -1033,8 +1033,8 @@ test "big.int mulWrap single-single signed" {...@@ -1033,8 +1033,8 @@ test "big.int mulWrap single-single signed" {
1033}1033}
10341034
1035test "big.int mulWrap multi-multi unsigned" {1035test "big.int mulWrap multi-multi unsigned" {
1036 const op1 = 0x998888efefefefefefefef;1036 var op1: u256 = 0x998888efefefefefefefef;
1037 const op2 = 0x333000abababababababab;1037 var op2: u256 = 0x333000abababababababab;
1038 var a = try Managed.initSet(testing.allocator, op1);1038 var a = try Managed.initSet(testing.allocator, op1);
1039 defer a.deinit();1039 defer a.deinit();
1040 var b = try Managed.initSet(testing.allocator, op2);1040 var b = try Managed.initSet(testing.allocator, op2);
...@@ -1044,7 +1044,7 @@ test "big.int mulWrap multi-multi unsigned" {...@@ -1044,7 +1044,7 @@ test "big.int mulWrap multi-multi unsigned" {
1044 defer c.deinit();1044 defer c.deinit();
1045 try c.mulWrap(&a, &b, .unsigned, 65);1045 try c.mulWrap(&a, &b, .unsigned, 65);
10461046
1047 try testing.expect((try c.to(u128)) == (op1 * op2) & ((1 << 65) - 1));1047 try testing.expect((try c.to(u256)) == (op1 * op2) & ((1 << 65) - 1));
1048}1048}
10491049
1050test "big.int mulWrap multi-multi signed" {1050test "big.int mulWrap multi-multi signed" {
...@@ -1150,8 +1150,8 @@ test "big.int div single-single with rem" {...@@ -1150,8 +1150,8 @@ test "big.int div single-single with rem" {
1150}1150}
11511151
1152test "big.int div multi-single no rem" {1152test "big.int div multi-single no rem" {
1153 const op1 = 0xffffeeeeddddcccc;1153 var op1: u128 = 0xffffeeeeddddcccc;
1154 const op2 = 34;1154 var op2: u128 = 34;
11551155
1156 var a = try Managed.initSet(testing.allocator, op1);1156 var a = try Managed.initSet(testing.allocator, op1);
1157 defer a.deinit();1157 defer a.deinit();
...@@ -1169,8 +1169,8 @@ test "big.int div multi-single no rem" {...@@ -1169,8 +1169,8 @@ test "big.int div multi-single no rem" {
1169}1169}
11701170
1171test "big.int div multi-single with rem" {1171test "big.int div multi-single with rem" {
1172 const op1 = 0xffffeeeeddddcccf;1172 var op1: u128 = 0xffffeeeeddddcccf;
1173 const op2 = 34;1173 var op2: u128 = 34;
11741174
1175 var a = try Managed.initSet(testing.allocator, op1);1175 var a = try Managed.initSet(testing.allocator, op1);
1176 defer a.deinit();1176 defer a.deinit();
...@@ -1188,8 +1188,8 @@ test "big.int div multi-single with rem" {...@@ -1188,8 +1188,8 @@ test "big.int div multi-single with rem" {
1188}1188}
11891189
1190test "big.int div multi>2-single" {1190test "big.int div multi>2-single" {
1191 const op1 = 0xfefefefefefefefefefefefefefefefe;1191 var op1: u128 = 0xfefefefefefefefefefefefefefefefe;
1192 const op2 = 0xefab8;1192 var op2: u128 = 0xefab8;
11931193
1194 var a = try Managed.initSet(testing.allocator, op1);1194 var a = try Managed.initSet(testing.allocator, op1);
1195 defer a.deinit();1195 defer a.deinit();
...@@ -1981,22 +1981,22 @@ test "big.int shift-right negative" {...@@ -1981,22 +1981,22 @@ test "big.int shift-right negative" {
1981 var arg = try Managed.initSet(testing.allocator, -20);1981 var arg = try Managed.initSet(testing.allocator, -20);
1982 defer arg.deinit();1982 defer arg.deinit();
1983 try a.shiftRight(&arg, 2);1983 try a.shiftRight(&arg, 2);
1984 try testing.expect((try a.to(i32)) == -20 >> 2);1984 try testing.expect((try a.to(i32)) == -5); // -20 >> 2 == -5
19851985
1986 var arg2 = try Managed.initSet(testing.allocator, -5);1986 var arg2 = try Managed.initSet(testing.allocator, -5);
1987 defer arg2.deinit();1987 defer arg2.deinit();
1988 try a.shiftRight(&arg2, 10);1988 try a.shiftRight(&arg2, 10);
1989 try testing.expect((try a.to(i32)) == -5 >> 10);1989 try testing.expect((try a.to(i32)) == -1); // -5 >> 10 == -1
1990}1990}
19911991
1992test "big.int shift-left negative" {1992test "big.int shift-right negative" {
1993 var a = try Managed.init(testing.allocator);1993 var a = try Managed.init(testing.allocator);
1994 defer a.deinit();1994 defer a.deinit();
19951995
1996 var arg = try Managed.initSet(testing.allocator, -10);1996 var arg = try Managed.initSet(testing.allocator, -10);
1997 defer arg.deinit();1997 defer arg.deinit();
1998 try a.shiftRight(&arg, 1232);1998 try a.shiftRight(&arg, 1232);
1999 try testing.expect((try a.to(i32)) == -10 >> 1232);1999 try testing.expect((try a.to(i32)) == -1); // -10 >> 1232 == -1
2000}2000}
20012001
2002test "big.int sat shift-left simple unsigned" {2002test "big.int sat shift-left simple unsigned" {
...@@ -2064,34 +2064,35 @@ test "big.int sat shift-left signed simple positive" {...@@ -2064,34 +2064,35 @@ test "big.int sat shift-left signed simple positive" {
2064}2064}
20652065
2066test "big.int sat shift-left signed multi positive" {2066test "big.int sat shift-left signed multi positive" {
2067 const x = 1;2067 var x: SignedDoubleLimb = 1;
2068 const shift = @bitSizeOf(SignedDoubleLimb) - 1;2068 const shift = @bitSizeOf(SignedDoubleLimb) - 1;
20692069
2070 var a = try Managed.initSet(testing.allocator, x);2070 var a = try Managed.initSet(testing.allocator, x);
2071 defer a.deinit();2071 defer a.deinit();
2072 try a.shiftLeftSat(&a, shift, .signed, @bitSizeOf(SignedDoubleLimb));2072 try a.shiftLeftSat(&a, shift, .signed, @bitSizeOf(SignedDoubleLimb));
20732073
2074 try testing.expect((try a.to(SignedDoubleLimb)) == @as(SignedDoubleLimb, x) <<| shift);2074 try testing.expect((try a.to(SignedDoubleLimb)) == x <<| shift);
2075}2075}
20762076
2077test "big.int sat shift-left signed multi negative" {2077test "big.int sat shift-left signed multi negative" {
2078 const x = -1;2078 var x: SignedDoubleLimb = -1;
2079 const shift = @bitSizeOf(SignedDoubleLimb) - 1;2079 const shift = @bitSizeOf(SignedDoubleLimb) - 1;
20802080
2081 var a = try Managed.initSet(testing.allocator, x);2081 var a = try Managed.initSet(testing.allocator, x);
2082 defer a.deinit();2082 defer a.deinit();
2083 try a.shiftLeftSat(&a, shift, .signed, @bitSizeOf(SignedDoubleLimb));2083 try a.shiftLeftSat(&a, shift, .signed, @bitSizeOf(SignedDoubleLimb));
20842084
2085 try testing.expect((try a.to(SignedDoubleLimb)) == @as(SignedDoubleLimb, x) <<| shift);2085 try testing.expect((try a.to(SignedDoubleLimb)) == x <<| shift);
2086}2086}
20872087
2088test "big.int bitNotWrap unsigned simple" {2088test "big.int bitNotWrap unsigned simple" {
2089 var a = try Managed.initSet(testing.allocator, 123);2089 var x: u10 = 123;
2090 var a = try Managed.initSet(testing.allocator, x);
2090 defer a.deinit();2091 defer a.deinit();
20912092
2092 try a.bitNotWrap(&a, .unsigned, 10);2093 try a.bitNotWrap(&a, .unsigned, 10);
20932094
2094 try testing.expect((try a.to(u10)) == ~@as(u10, 123));2095 try testing.expect((try a.to(u10)) == ~x);
2095}2096}
20962097
2097test "big.int bitNotWrap unsigned multi" {2098test "big.int bitNotWrap unsigned multi" {
...@@ -2104,12 +2105,13 @@ test "big.int bitNotWrap unsigned multi" {...@@ -2104,12 +2105,13 @@ test "big.int bitNotWrap unsigned multi" {
2104}2105}
21052106
2106test "big.int bitNotWrap signed simple" {2107test "big.int bitNotWrap signed simple" {
2108 var x: i11 = -456;
2107 var a = try Managed.initSet(testing.allocator, -456);2109 var a = try Managed.initSet(testing.allocator, -456);
2108 defer a.deinit();2110 defer a.deinit();
21092111
2110 try a.bitNotWrap(&a, .signed, 11);2112 try a.bitNotWrap(&a, .signed, 11);
21112113
2112 try testing.expect((try a.to(i11)) == ~@as(i11, -456));2114 try testing.expect((try a.to(i11)) == ~x);
2113}2115}
21142116
2115test "big.int bitNotWrap signed multi" {2117test "big.int bitNotWrap signed multi" {
...@@ -2232,14 +2234,16 @@ test "big.int bitwise xor simple" {...@@ -2232,14 +2234,16 @@ test "big.int bitwise xor simple" {
2232}2234}
22332235
2234test "big.int bitwise xor multi-limb" {2236test "big.int bitwise xor multi-limb" {
2235 var a = try Managed.initSet(testing.allocator, maxInt(Limb) + 1);2237 var x: DoubleLimb = maxInt(Limb) + 1;
2238 var y: DoubleLimb = maxInt(Limb);
2239 var a = try Managed.initSet(testing.allocator, x);
2236 defer a.deinit();2240 defer a.deinit();
2237 var b = try Managed.initSet(testing.allocator, maxInt(Limb));2241 var b = try Managed.initSet(testing.allocator, y);
2238 defer b.deinit();2242 defer b.deinit();
22392243
2240 try a.bitXor(&a, &b);2244 try a.bitXor(&a, &b);
22412245
2242 try testing.expect((try a.to(DoubleLimb)) == (maxInt(Limb) + 1) ^ maxInt(Limb));2246 try testing.expect((try a.to(DoubleLimb)) == x ^ y);
2243}2247}
22442248
2245test "big.int bitwise xor single negative simple" {2249test "big.int bitwise xor single negative simple" {
...@@ -2327,7 +2331,6 @@ test "big.int bitwise or multi-limb" {...@@ -2327,7 +2331,6 @@ test "big.int bitwise or multi-limb" {
23272331
2328 try a.bitOr(&a, &b);2332 try a.bitOr(&a, &b);
23292333
2330 // TODO: big.int.cpp or is wrong on multi-limb.
2331 try testing.expect((try a.to(DoubleLimb)) == (maxInt(Limb) + 1) + maxInt(Limb));2334 try testing.expect((try a.to(DoubleLimb)) == (maxInt(Limb) + 1) + maxInt(Limb));
2332}2335}
23332336
src/value.zig+6-2
...@@ -4194,8 +4194,12 @@ pub const Value = extern union {...@@ -4194,8 +4194,12 @@ pub const Value = extern union {
4194 const result_limbs = lhs_bigint.limbs.len -| (shift / (@sizeOf(std.math.big.Limb) * 8));4194 const result_limbs = lhs_bigint.limbs.len -| (shift / (@sizeOf(std.math.big.Limb) * 8));
4195 if (result_limbs == 0) {4195 if (result_limbs == 0) {
4196 // The shift is enough to remove all the bits from the number, which means the4196 // The shift is enough to remove all the bits from the number, which means the
4197 // result is zero.4197 // result is 0 or -1 depending on the sign.
4198 return Value.zero;4198 if (lhs_bigint.positive) {
4199 return Value.zero;
4200 } else {
4201 return Value.negative_one;
4202 }
4199 }4203 }
42004204
4201 const limbs = try allocator.alloc(4205 const limbs = try allocator.alloc(
test/behavior.zig+1
...@@ -125,6 +125,7 @@ test {...@@ -125,6 +125,7 @@ test {
125 _ = @import("behavior/bugs/13159.zig");125 _ = @import("behavior/bugs/13159.zig");
126 _ = @import("behavior/bugs/13164.zig");126 _ = @import("behavior/bugs/13164.zig");
127 _ = @import("behavior/bugs/13171.zig");127 _ = @import("behavior/bugs/13171.zig");
128 _ = @import("behavior/bugs/13209.zig");
128 _ = @import("behavior/bugs/13285.zig");129 _ = @import("behavior/bugs/13285.zig");
129 _ = @import("behavior/bugs/13435.zig");130 _ = @import("behavior/bugs/13435.zig");
130 _ = @import("behavior/bugs/13664.zig");131 _ = @import("behavior/bugs/13664.zig");
test/behavior/bugs/13209.zig created+5
...@@ -0,0 +1,5 @@
1const std = @import("std");
2test {
3 try std.testing.expect(-1 == @as(i8, -3) >> 2);
4 try std.testing.expect(-1 == -3 >> 2000);
5}