aboutsummaryrefslogtreecommitdiffstats
path: root/backend/SelectDiv.vp
diff options
context:
space:
mode:
Diffstat (limited to 'backend/SelectDiv.vp')
-rw-r--r--backend/SelectDiv.vp36
1 files changed, 35 insertions, 1 deletions
diff --git a/backend/SelectDiv.vp b/backend/SelectDiv.vp
index a275a850..d708afb7 100644
--- a/backend/SelectDiv.vp
+++ b/backend/SelectDiv.vp
@@ -36,7 +36,7 @@ Fixpoint find_div_mul_params (fuel: nat) (nc: Z) (d: Z) (p: Z) : option (Z * Z)
| S fuel' =>
let twp := two_p p in
if zlt (nc * (d - twp mod d)) twp
- then Some(p - 32, (twp + d - twp mod d) / d)
+ then Some(p, (twp + d - twp mod d) / d)
else find_div_mul_params fuel' nc d (p + 1)
end.
@@ -47,6 +47,7 @@ Definition divs_mul_params (d: Z) : option (Z * Z) :=
d 32 with
| None => None
| Some(p, m) =>
+ let p := p - 32 in
if zlt 0 d
&& zlt (two_p (32 + p)) (m * d)
&& zle (m * d) (two_p (32 + p) + two_p (p + 1))
@@ -62,6 +63,7 @@ Definition divu_mul_params (d: Z) : option (Z * Z) :=
d 32 with
| None => None
| Some(p, m) =>
+ let p := p - 32 in
if zlt 0 d
&& zle (two_p (32 + p)) (m * d)
&& zle (m * d) (two_p (32 + p) + two_p p)
@@ -70,6 +72,38 @@ Definition divu_mul_params (d: Z) : option (Z * Z) :=
then Some(p, m) else None
end.
+Definition divls_mul_params (d: Z) : option (Z * Z) :=
+ match find_div_mul_params
+ Int64.wordsize
+ (Int64.half_modulus - Int64.half_modulus mod d - 1)
+ d 64 with
+ | None => None
+ | Some(p, m) =>
+ let p := p - 64 in
+ if zlt 0 d
+ && zlt (two_p (64 + p)) (m * d)
+ && zle (m * d) (two_p (64 + p) + two_p (p + 1))
+ && zle 0 m && zlt m Int64.modulus
+ && zle 0 p && zlt p 64
+ then Some(p, m) else None
+ end.
+
+Definition divlu_mul_params (d: Z) : option (Z * Z) :=
+ match find_div_mul_params
+ Int64.wordsize
+ (Int64.modulus - Int64.modulus mod d - 1)
+ d 64 with
+ | None => None
+ | Some(p, m) =>
+ let p := p - 64 in
+ if zlt 0 d
+ && zle (two_p (64 + p)) (m * d)
+ && zle (m * d) (two_p (64 + p) + two_p p)
+ && zle 0 m && zlt m Int64.modulus
+ && zle 0 p && zlt p 64
+ then Some(p, m) else None
+ end.
+
Definition divu_mul (p: Z) (m: Z) :=
shruimm (Eop Omulhu (Eletvar O ::: Eop (Ointconst (Int.repr m)) Enil ::: Enil))
(Int.repr p).