summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sail.c14
-rw-r--r--lib/sail.h2
-rw-r--r--test/c/issue37.expect1
-rw-r--r--test/c/issue37.sail9
4 files changed, 26 insertions, 0 deletions
diff --git a/lib/sail.c b/lib/sail.c
index c66c057c..6c71d7ae 100644
--- a/lib/sail.c
+++ b/lib/sail.c
@@ -930,6 +930,20 @@ void set_slice_int(sail_int *rop,
}
}
+void update_lbits(lbits *rop, const lbits op, const sail_int n_mpz, const uint64_t bit)
+{
+ uint64_t n = mpz_get_ui(n_mpz);
+
+ mpz_set(*rop->bits, *op.bits);
+ rop->len = op.len;
+
+ if (bit == UINT64_C(0)) {
+ mpz_clrbit(*rop->bits, n);
+ } else {
+ mpz_setbit(*rop->bits, n);
+ }
+}
+
void vector_update_subrange_lbits(lbits *rop,
const lbits op,
const sail_int n_mpz,
diff --git a/lib/sail.h b/lib/sail.h
index d5597a64..5a7722de 100644
--- a/lib/sail.h
+++ b/lib/sail.h
@@ -290,6 +290,8 @@ void set_slice_int(sail_int *rop,
const sail_int start_mpz,
const lbits slice);
+void update_lbits(lbits *rop, const lbits op, const sail_int n_mpz, const uint64_t bit);
+
void vector_update_subrange_lbits(lbits *rop,
const lbits op,
const sail_int n_mpz,
diff --git a/test/c/issue37.expect b/test/c/issue37.expect
new file mode 100644
index 00000000..6e77c916
--- /dev/null
+++ b/test/c/issue37.expect
@@ -0,0 +1 @@
+foo = 0xE
diff --git a/test/c/issue37.sail b/test/c/issue37.sail
new file mode 100644
index 00000000..404c4ef4
--- /dev/null
+++ b/test/c/issue37.sail
@@ -0,0 +1,9 @@
+default Order dec
+
+$include <vector_dec.sail>
+
+function main () : unit->unit = {
+ foo = 0xf;
+ foo[0] = bitzero;
+ print_bits("foo = ", foo)
+} \ No newline at end of file