summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sail.c3
-rw-r--r--test/c/large_bitvector.expect12
-rw-r--r--test/c/large_bitvector.sail30
3 files changed, 44 insertions, 1 deletions
diff --git a/lib/sail.c b/lib/sail.c
index 4e5694e9..31b11284 100644
--- a/lib/sail.c
+++ b/lib/sail.c
@@ -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);
+ ()
+}