summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/vector_dec.sail2
-rw-r--r--test/builtins/slice_mask.sail12
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/vector_dec.sail b/lib/vector_dec.sail
index ee84087e..7e2414de 100644
--- a/lib/vector_dec.sail
+++ b/lib/vector_dec.sail
@@ -205,7 +205,7 @@ val replicate_bits = "replicate_bits" : forall 'n 'm. (bits('n), atom('m)) -> bi
val slice_mask : forall 'n, 'n >= 0. (implicit('n), int, int) -> bits('n) effect pure
function slice_mask(n,i,l) =
if l >= n then {
- sail_ones(n)
+ sail_shiftleft(sail_ones(n), i)
} else {
let one : bits('n) = sail_mask(n, [bitone] : bits(1)) in
sail_shiftleft(sub_bits(sail_shiftleft(one, l), one), i)
diff --git a/test/builtins/slice_mask.sail b/test/builtins/slice_mask.sail
new file mode 100644
index 00000000..e694f029
--- /dev/null
+++ b/test/builtins/slice_mask.sail
@@ -0,0 +1,12 @@
+default Order dec
+
+$include <exception_basic.sail>
+$include <flow.sail>
+$include <vector_dec.sail>
+
+function main (() : unit) -> unit = {
+ assert(slice_mask(32, 8, 4) == 0x00000F00);
+ assert(slice_mask(32, 16, 8) == 0x00FF0000);
+ assert(slice_mask(32, 15, 3) == 0x00038000);
+ assert(slice_mask(32, 16, 32) == 0xFFFF0000);
+}