aboutsummaryrefslogtreecommitdiff
path: root/src/Util/ZUtil/Definitions.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/Util/ZUtil/Definitions.v')
-rw-r--r--src/Util/ZUtil/Definitions.v10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/Util/ZUtil/Definitions.v b/src/Util/ZUtil/Definitions.v
index 4a5d3a0ab..6fc969dfd 100644
--- a/src/Util/ZUtil/Definitions.v
+++ b/src/Util/ZUtil/Definitions.v
@@ -18,6 +18,16 @@ Module Z.
Definition add_get_carry (bitwidth : Z) (x y : Z) : Z * Z
:= add_with_get_carry bitwidth 0 x y.
+ Definition get_borrow (bitwidth : Z) (v : Z) : Z * Z
+ := let '(v, c) := get_carry bitwidth v in
+ (v, -c).
+ Definition sub_with_borrow (c : Z) (x y : Z) : Z
+ := add_with_carry (-c) x (-y).
+ Definition sub_with_get_borrow (bitwidth : Z) (c : Z) (x y : Z) : Z * Z
+ := get_borrow bitwidth (sub_with_borrow c x y).
+ Definition sub_get_borrow (bitwidth : Z) (x y : Z) : Z * Z
+ := sub_with_get_borrow bitwidth 0 x y.
+
(* splits at [bound], not [2^bitwidth]; wrapper to make add_getcarry
work if input is not known to be a power of 2 *)
Definition add_get_carry_full (bound : Z) (x y : Z) : Z * Z