diff options
| -rw-r--r-- | lib/sail.c | 3 | ||||
| -rw-r--r-- | test/c/large_bitvector.expect | 12 | ||||
| -rw-r--r-- | test/c/large_bitvector.sail | 30 |
3 files changed, 44 insertions, 1 deletions
@@ -670,6 +670,7 @@ void vector_update_subrange_sail_bits(sail_bits *rop, uint64_t m = mpz_get_ui(m_mpz); mpz_set(*rop->bits, *op.bits); + rop->len = op.len; for (uint64_t i = 0; i < n - (m - 1ul); i++) { if (mpz_tstbit(*slice.bits, i)) { @@ -685,7 +686,7 @@ void slice(sail_bits *rop, const sail_bits op, const sail_int start_mpz, const s uint64_t start = mpz_get_ui(start_mpz); uint64_t len = mpz_get_ui(len_mpz); - mpz_set_ui(*rop->bits, 0ul); + mpz_set_ui(*rop->bits, 0); rop->len = len; for (uint64_t i = 0; i < len; i++) { diff --git a/test/c/large_bitvector.expect b/test/c/large_bitvector.expect new file mode 100644 index 00000000..f67ec84a --- /dev/null +++ b/test/c/large_bitvector.expect @@ -0,0 +1,12 @@ +x = 0x1FFFF0000FFFFFFFF +length(x) = 68 +y = 0x1FFFF0000FFFFFFFF1FFFF0000FFFFFFFF1FFFF0000FFFFFFFF +length(y) = 204 +z = 0x1FFFF0000FFFFFFFF1FFFF0000FFFFFFFF1CAFE0000FFFFFFFF +length(z) = 204 +q = 0xFF0000FFFFFFFF1FFFF0000FFFFFFFF1CAFE0000FFFFFFFF +w = -24519554509435141245919758063389544641259977658452672513 +length(q) = 192 +0x8000 +0b1 @ zeros(64 * 3 - 1) = 0x800000000000000000000000000000000000000000000000 +q = 0x800000000000000000000000000000000000000000000000 diff --git a/test/c/large_bitvector.sail b/test/c/large_bitvector.sail new file mode 100644 index 00000000..78189d7d --- /dev/null +++ b/test/c/large_bitvector.sail @@ -0,0 +1,30 @@ +default Order dec + +$include <arith.sail> +$include <vector_dec.sail> + +val "zeros" : forall 'n. int('n) -> bits('n) + +val main : unit -> unit + +function main() = { + let x = [0x1FFFF0000FFFF0000 with 15 .. 0 = 0xFFFF]; + print_bits("x = ", x); + print_int("length(x) = ", length(x)); + let y = replicate_bits(x, 3); + print_bits("y = ", y); + print_int("length(y) = ", length(y)); + let z = [y with 63 .. (63 - 15) = 0xCAFE]; + print_bits("z = ", z); + print_int("length(z) = ", length(z)); + q = slice(z, 0, 64 * 3); + print_bits("q = ", q); + w = signed(q); + print_int("w = ", w); + print_int("length(q) = ", length(q)); + print_bits("", [0xFFFF with 14 .. 0 = zeros(15)]); + print_bits("0b1 @ zeros(64 * 3 - 1) = ", 0b1 @ zeros(64 * 3 - 1)); + q[64 * 3 - 2 .. 0] = zeros(64 * 3 - 1); + print_bits("q = ", q); + () +} |
