diff options
| author | Thomas Bauereiss | 2017-09-29 16:33:55 +0100 |
|---|---|---|
| committer | Thomas Bauereiss | 2017-09-29 16:33:55 +0100 |
| commit | d24027629670f9ecd67cf107a988df242c42ed19 (patch) | |
| tree | 367a79b1e6fec48a8e1dfb81770c0c7d3360d0de /src/gen_lib/prompt.lem | |
| parent | 7e1293604ff02c072568e03830d25adfea063087 (diff) | |
| parent | 381a3967ebd9269082b452669f507787decf28b0 (diff) | |
Merge branch 'experiments' of bitbucket.org:Peter_Sewell/sail into experiments
Diffstat (limited to 'src/gen_lib/prompt.lem')
| -rw-r--r-- | src/gen_lib/prompt.lem | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/gen_lib/prompt.lem b/src/gen_lib/prompt.lem index 9c245d6a..0de76624 100644 --- a/src/gen_lib/prompt.lem +++ b/src/gen_lib/prompt.lem @@ -172,6 +172,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 |
