From 0be438ea229cb13824c7f0bd98540c8e595f8754 Mon Sep 17 00:00:00 2001 From: Valentin Ilie Date: Mon, 17 Aug 2015 13:25:00 -0700 Subject: [PATCH] arithmetic: Add Ctz function Signed-off-by: Valentin Ilie --- ml-proto/src/arithmetic.ml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ml-proto/src/arithmetic.ml b/ml-proto/src/arithmetic.ml index 62e786667b..5ab228e26d 100644 --- a/ml-proto/src/arithmetic.ml +++ b/ml-proto/src/arithmetic.ml @@ -18,6 +18,8 @@ sig type t val of_value : int -> value -> t val to_value : t -> value + val zero : t + val one : t val size : int val neg : t -> t val abs : t -> t @@ -50,7 +52,14 @@ struct | Abs -> Int.abs | Not -> Int.lognot | Clz -> fun i -> i (* TODO *) - | Ctz -> fun i -> i (* TODO *) + | Ctz -> fun i -> + let open Int in + if i = zero then zero else + let rec loop j = + if logand i j = zero + then add one (loop (shift_left j 1)) + else zero + in loop one in fun v -> Int.to_value (f (Int.of_value 1 v)) let binop op =