summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Norton2017-07-06 12:36:44 +0100
committerRobert Norton2017-07-06 12:36:44 +0100
commitadaabb05518f68c5a2aea672920f7355b39b18cc (patch)
tree059e338a92f0d7fb497a2ef9fdccd4c2d3cdd7ec /src
parentbf58dee32245592bfd85e4eaab959fb4caffea6c (diff)
fix interpreter version of get_min/max_representable which similarly broken to ocaml version. TODO: also fix copies in sail_values.lem and sail_values_word.lem.
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp_lib.lem30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem
index 84dec140..40dbab88 100644
--- a/src/lem_interp/interp_lib.lem
+++ b/src/lem_interp/interp_lib.lem
@@ -86,23 +86,29 @@ let (min_32 : integer) = integerNegate (integerFromNat (natPow 2 31)) (*2147483
let (max_8 : integer) = (integerFromNat 127)
let (min_8 : integer) = (integerFromNat 0) - (integerFromNat 128)
let (max_5 : integer) = (integerFromNat 31)
-let (min_5 : integer) = (integerFromNat 0)-(integerFromNat 32)
val get_max_representable_in : signed -> nat -> integer
let get_max_representable_in sign n =
- if (n = 64) then match sign with | Signed -> max_64 | Unsigned -> max_64u end
- else if (n=32) then match sign with | Signed -> max_32 | Unsigned -> max_32u end
- else if (n=8) then max_8
- else if (n=5) then max_5
- else match sign with | Signed -> 2**n - 1 | Unsigned -> 2**n end
+ match (sign, n) with
+ | (Signed, 64) -> max_64
+ | (Unsigned, 64) -> max_64u
+ | (Signed, 32) -> max_32
+ | (Unsigned, 32) -> max_32u
+ | (Signed, 8) -> max_8
+ | (Unsigned, 5) -> max_5
+ | (Signed, _) -> 2**(n -1) - 1
+ | (Unsigned, _) -> 2**n - 1
+ end
val get_min_representable_in : signed -> nat -> integer
-let get_min_representable_in _ n =
- if (n = 64) then min_64
- else if (n=32) then min_32
- else if (n=8) then min_8
- else if (n=5) then min_5
- else 0-(2**n)
+let get_min_representable_in sign n =
+ match (sign, n) with
+ | (Unsigned, _) -> 0
+ | (Signed, 64) -> min_64
+ | (Signed, 32) -> min_32
+ | (Signed, 8) -> min_8
+ | (Signed, _) -> 0-(2**(n-1))
+ end
let ignore_sail x = V_lit (L_aux L_unit Unknown) ;;