diff options
| author | Alasdair | 2020-05-14 10:25:33 +0100 |
|---|---|---|
| committer | Alasdair | 2020-05-14 10:25:33 +0100 |
| commit | a6c52e67303b9180c6925d0538769304883e6cae (patch) | |
| tree | 2eb226c2e76b8c1c3c392a80c8f74929ba154e7a /lib | |
| parent | 3f217002bd732d4c408af6bd34fafbb8bdd4404e (diff) | |
| parent | 88fe9754f897d3d96533748c6fc73a2d8da76fec (diff) | |
Merge remote-tracking branch 'origin' into codegen
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/arith.sail | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/lib/arith.sail b/lib/arith.sail index 6b064433..58f25bbc 100644 --- a/lib/arith.sail +++ b/lib/arith.sail @@ -88,13 +88,38 @@ val tdiv_int = { } : (int, int) -> int /*! Remainder for truncating division (has sign of dividend) */ -val tmod_int = { +val _tmod_int = { ocaml: "tmod_int", interpreter: "tmod_int", lem: "tmod_int", c: "tmod_int", coq: "Z.rem" -} : (int, int) -> nat +} : (int, int) -> int + +/*! If we know the second argument is positive, we know the result is positive */ +val _tmod_int_positive = { + ocaml: "tmod_int", + interpreter: "tmod_int", + lem: "tmod_int", + c: "tmod_int", + coq: "Z.rem" +} : forall 'n, 'n >= 1. (int, int('n)) -> nat + +overload tmod_int = {_tmod_int_positive, _tmod_int} + +function fdiv_int(n: int, m: int) -> int = { + if n < 0 & m > 0 then { + tdiv_int(n + 1, m) - 1 + } else if n > 0 & m < 0 then { + tdiv_int(n - 1, m) - 1 + } else { + tdiv_int(n, m) + } +} + +function fmod_int(n: int, m: int) -> int = { + n - (m * fdiv_int(n, m)) +} val abs_int_plain = { smt : "abs", |
