summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Norton2018-01-29 15:38:31 +0000
committerRobert Norton2018-01-29 15:38:31 +0000
commit2f833362270c2b9562c627ba5feb97f13371921e (patch)
treef2ce24952acb0858fe5ab909561aab4ca595a8e2 /src
parent36c37fc31421f4965a3613ae9a257cc23ac623cd (diff)
implement shift primitives in sail_lib.ml
Diffstat (limited to 'src')
-rw-r--r--src/sail_lib.ml16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/sail_lib.ml b/src/sail_lib.ml
index 3cd8e18c..f0ea7fb4 100644
--- a/src/sail_lib.ml
+++ b/src/sail_lib.ml
@@ -506,8 +506,18 @@ let sign_extend (vec, n) =
| [] -> replicate_bits ([B0], Big_int.of_int (m - List.length vec)) @ vec
| B1 :: _ as vec -> replicate_bits ([B1], Big_int.of_int (m - List.length vec)) @ vec
-(* FIXME *)
-let shift_bits_right (x, y) = x
-let shift_bits_left (x, y) = x
+let shift_bits_right (x, y) =
+ let ybi = uint(y) in
+ let yi = Big_int.to_int ybi in
+ let zeros = replicate_bits ([B0], ybi) in
+ let rbits = zeros @ x in
+ take (List.length x) rbits
+
+let shift_bits_left (x, y) =
+ let ybi = uint(y) in
+ let yi = Big_int.to_int ybi in
+ let zeros = replicate_bits ([B0], ybi) in
+ let rbits = x @ zeros in
+ drop yi rbits
let speculate_conditional_success () = true