summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Norton2017-06-30 14:56:50 +0100
committerRobert Norton2017-06-30 14:56:50 +0100
commit522e9ae14eabd09bb3e7cc2fd20a8f75df9d5870 (patch)
tree4c98b08c392eeafd3f1243468265d2713957f682 /src
parentacfa76485c252aa2a6df199aeeaf9af6b4dc4930 (diff)
add more tests for sail library. Can't compile entire file due to sail performance bug or infinite loop. Add some missing shallow embedding funcitons.
Diffstat (limited to 'src')
-rw-r--r--src/gen_lib/sail_values.ml11
-rw-r--r--src/test/lib/test_lib.sail56
2 files changed, 61 insertions, 6 deletions
diff --git a/src/gen_lib/sail_values.ml b/src/gen_lib/sail_values.ml
index cc1979a1..945a7c22 100644
--- a/src/gen_lib/sail_values.ml
+++ b/src/gen_lib/sail_values.ml
@@ -333,6 +333,8 @@ let most_significant = function
| Vregister(array,_,_,_,_) -> !array.(0)
| _ -> assert false
+let _most_significant = most_significant
+
let bitwise_not_bit = function
| Vone -> Vzero
| Vzero -> Vone
@@ -1053,6 +1055,15 @@ let duplicate_big (bit,length) =
let duplicate = duplicate_big
+let duplicate_bits_big (bits, x) =
+ let len = (length_int bits) * (int_of_big_int x) in
+ let is_inc = get_ord bits in
+ let bits_arr = get_barray bits in
+ let arr = Array.concat (Array.to_list(Array.make (int_of_big_int x) bits_arr)) in
+ Vvector(arr, (if is_inc then 0 else (len - 1)), is_inc)
+
+let duplicate_bits = duplicate_bits_big
+
let compare_op op (l,r) =
if (op l r)
then Vone
diff --git a/src/test/lib/test_lib.sail b/src/test/lib/test_lib.sail
index bcabe2cc..af783317 100644
--- a/src/test/lib/test_lib.sail
+++ b/src/test/lib/test_lib.sail
@@ -24,7 +24,6 @@ function (bit[64]) run ((bit[64]) x) = {
test_assert ("not_bit0", (not (bitzero)) == bitone);
test_assert ("not_bit1", (not (bitone)) == bitzero);
-
test_assert ("bitwise_not", (~ (0b01) == 0b10));
test_assert ("bitwise_not_bit0", (~ (bitzero) == bitone));
test_assert ("bitwise_not_bit1", (~ (bitone) == bitzero));
@@ -36,19 +35,17 @@ function (bit[64]) run ((bit[64]) x) = {
test_assert ("bitwise_or_11", (bitone | bitone) == bitone);
test_assert ("bitwise_xor", (0b0101 ^ 0b0011) == 0b0110);
- (*
- XXX something in here causes sail to infinite loop
test_assert ("bitwise_xor_00", (bitzero ^ bitzero) == bitzero);
test_assert ("bitwise_xor_01", (bitzero ^ bitone) == bitone);
test_assert ("bitwise_xor_10", (bitone ^ bitzero) == bitone);
- test_assert ("bitwise_xor_11", (bitone ^ bitone) == bitzero);*)
+ test_assert ("bitwise_xor_11", (bitone ^ bitone) == bitzero);
test_assert ("bitwise_and", (0b0101 & 0b0011) == 0b0001);
test_assert ("bitwise_and_00", (bitzero & bitzero) == bitzero);
test_assert ("bitwise_and_01", (bitzero & bitone) == bitzero);
test_assert ("bitwise_and_10", (bitone & bitzero) == bitzero);
test_assert ("bitwise_and_11", (bitone & bitone) == bitone);
-
+
test_assert ("divpospos_exact", (21 div 7) == 3);
test_assert ("divposneg_exact", (21 div -7) == -3);
test_assert ("divnegpos_exact", (-21 div 7) == -3);
@@ -59,10 +56,57 @@ function (bit[64]) run ((bit[64]) x) = {
test_assert ("divnegpos_approx", (-21 div 8) == -2);
test_assert ("divnegneg_approx", (-21 div -8) == 2);
- (* XXX currently crashes on shallow embedding
+ (* XXX currently crashes on shallow embedding
test_assert ("div_overflow", ((bit[8])(0x80 quot_s 0xff)) == 0x80);
*)
+ test_assert ("leftshift_small0", (0x99 << 0) == 0x99);
+ test_assert ("leftshift_small3", (0x99 << 3) == 0xc8);
+ test_assert ("leftshift_small7", (0x99 << 7) == 0x80);
+ test_assert ("leftshift_small8", (0x99 << 8) == 0x00);
+ test_assert ("leftshift_big0", (0x99999999999999999 << 0) == 0x99999999999999999);
+ test_assert ("leftshift_big3", (0x99999999999999999 << 3) == 0xcccccccccccccccc8);
+ test_assert ("leftshift_big7", (0x99999999999999999 << 7) == 0xccccccccccccccc80);
+ test_assert ("leftshift_big68", (0x99999999999999999 << 68) == 0x00000000000000000);
+
+ test_assert ("rightshift_small0", (0x99 >> 0) == 0x99);
+ test_assert ("rightshift_small3", (0x99 >> 3) == 0x13);
+ test_assert ("rightshift_small7", (0x99 >> 7) == 0x01);
+ test_assert ("rightshift_small8", (0x99 >> 8) == 0x00); (* XXX fails on interp *)
+ test_assert ("rightshift_big0", (0x99999999999999999 >> 0) == 0x99999999999999999);
+ test_assert ("rightshift_big3", (0x99999999999999999 >> 3) == 0x13333333333333333);
+ test_assert ("rightshift_big7", (0x99999999999999999 >> 7) == 0x01333333333333333);
+ test_assert ("rightshift_big68", (0x99999999999999999 >> 68) == 0x00000000000000000); (* XXX fails on interp *)
+
+ test_assert ("rotate0", (0x99 <<< 0) == 0x99); (* XXX fails on interp *)
+ test_assert ("rotate3", (0x99 <<< 3) == 0xcc);
+ test_assert ("rotate7", (0x99 <<< 7) == 0xcc);
+ test_assert ("rotate8", (0x99 <<< 8) == 0x99);
+
+ (* XXX crashes on shallow embedding
+ test_assert ("duplicate_empty", (bitzero ^^ 0) == []); *)
+ test_assert ("duplicate0", (bitzero ^^ 8) == 0x00);
+ test_assert ("duplicate1", (bitone ^^ 8) == 0xff);
+
+ (* XXX crashes on shallow embedding
+ test_assert ("duplicate_bits0", (0x21 ^^ 0) == []);*)
+ test_assert ("duplicate_bits1", (0xce ^^ 1) == 0xce);
+ test_assert ("duplicate_bits9", (0xce ^^ 9) == 0xcecececececececece);
+ test_assert ("duplicate_covfefe", (0xc0 : (0xfe ^^ 2)) == 0xc0fefe);
+
+ test_assert ("extz0", EXTZ(0b00) == 0x00);
+ test_assert ("extz1", EXTZ(0b10) == 0x02);
+ test_assert ("extz2", EXTZ(0b10) == 0b10);
+ test_assert ("extz3", EXTZ(0b10) == 0b0);
+
+ test_assert ("exts0", EXTS(0b00) == 0x00);
+ test_assert ("exts1", EXTS(0b10) == 0xfe);
+ test_assert ("exts2", EXTS(0b10) == 0b10);
+ test_assert ("exts3", EXTS(0b10) == 0b0);
+
+ test_assert ("most_significant0", most_significant(0b011) == bitzero);
+ test_assert ("most_significant1", most_significant(0b100) == bitone);
+
return 0;
}