summaryrefslogtreecommitdiff
path: root/src/gen_lib
diff options
context:
space:
mode:
authorBrian Campbell2017-09-28 11:34:22 +0100
committerBrian Campbell2017-09-28 11:34:22 +0100
commit1bd35a0934582ff08be0b99280b8d7080cbca4d1 (patch)
tree276e8d13cffdfc9c0ff2771e534795559d86be61 /src/gen_lib
parentb5969ea7ca7de19ea2b96c48b1765e2c51e5d2af (diff)
parent381a3967ebd9269082b452669f507787decf28b0 (diff)
Merge branch 'experiments' into mono-experiments
Diffstat (limited to 'src/gen_lib')
-rw-r--r--src/gen_lib/prompt.lem29
-rw-r--r--src/gen_lib/state.lem29
2 files changed, 58 insertions, 0 deletions
diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem
index 5c539354..8e04bd30 100644
--- a/src/gen_lib/prompt.lem
+++ b/src/gen_lib/prompt.lem
@@ -170,6 +170,35 @@ let rec foreachM_dec (i,stop,by) vars body =
foreachM_dec (i - by,stop,by) vars body
else return vars
+val while_PP : forall 'vars. bool -> 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars
+let rec while_PP is_while vars cond body =
+ if (cond vars = is_while)
+ then while_PP is_while (body vars) cond body
+ else vars
+
+val while_PM : forall 'vars 'r. bool -> 'vars -> ('vars -> bool) ->
+ ('vars -> MR 'vars 'r) -> MR 'vars 'r
+let rec while_PM is_while vars cond body =
+ if (cond vars = is_while)
+ then body vars >>= fun vars -> while_PM is_while vars cond body
+ else return vars
+
+val while_MP : forall 'vars 'r. bool -> 'vars -> ('vars -> MR bool 'r) ->
+ ('vars -> 'vars) -> MR 'vars 'r
+let rec while_MP is_while vars cond body =
+ cond vars >>= fun continue ->
+ if (continue = is_while)
+ then while_MP is_while (body vars) cond body
+ else return vars
+
+val while_MM : forall 'vars 'r. bool -> 'vars -> ('vars -> MR bool 'r) ->
+ ('vars -> MR 'vars 'r) -> MR 'vars 'r
+let rec while_MM is_while vars cond body =
+ cond vars >>= fun continue ->
+ if (continue = is_while)
+ then body vars >>= fun vars -> while_MM is_while vars cond body
+ else return vars
+
let write_two_regs r1 r2 vec =
let is_inc =
let is_inc_r1 = is_inc_of_reg r1 in
diff --git a/src/gen_lib/state.lem b/src/gen_lib/state.lem
index 0ea65551..fa6515fb 100644
--- a/src/gen_lib/state.lem
+++ b/src/gen_lib/state.lem
@@ -203,6 +203,35 @@ let rec foreachM_dec (i,stop,by) vars body =
foreachM_dec (i - by,stop,by) vars body
else return vars
+val while_PP : forall 'vars. bool -> 'vars -> ('vars -> bool) -> ('vars -> 'vars) -> 'vars
+let rec while_PP is_while vars cond body =
+ if (cond vars = is_while)
+ then while_PP is_while (body vars) cond body
+ else vars
+
+val while_PM : forall 'regs 'vars 'e. bool -> 'vars -> ('vars -> bool) ->
+ ('vars -> ME 'regs 'vars 'e) -> ME 'regs 'vars 'e
+let rec while_PM is_while vars cond body =
+ if (cond vars = is_while)
+ then body vars >>= fun vars -> while_PM is_while vars cond body
+ else return vars
+
+val while_MP : forall 'regs 'vars 'e. bool -> 'vars -> ('vars -> ME 'regs bool 'e) ->
+ ('vars -> 'vars) -> ME 'regs 'vars 'e
+let rec while_MP is_while vars cond body =
+ cond vars >>= fun continue ->
+ if (continue = is_while)
+ then while_MP is_while (body vars) cond body
+ else return vars
+
+val while_MM : forall 'regs 'vars 'e. bool -> 'vars -> ('vars -> ME 'regs bool 'e) ->
+ ('vars -> ME 'regs 'vars 'e) -> ME 'regs 'vars 'e
+let rec while_MM is_while vars cond body =
+ cond vars >>= fun continue ->
+ if (continue = is_while)
+ then body vars >>= fun vars -> while_MM is_while vars cond body
+ else return vars
+
(*let write_two_regs r1 r2 bvec state =
let vec = bvec_to_vec bvec in
let is_inc =