with W_Pred;   use W_Pred;
with FZ_Arith; use FZ_Arith;


package body FZ_Cmp is
   
   ---------------------------------------------
   -- Arithmetical Predicate Operations on FZ --
   ---------------------------------------------
   
   -- 1 iff X == Y (branch-free); else 0
   function FZ_EqP(X : in FZ; Y : in FZ) return WBool is
      A : WBool := 1;
   begin
      for i in X'Range loop
         A := A and W_EqP(X(i), Y(i));
      end loop;
      return A;
   end FZ_EqP;
   pragma Inline_Always(FZ_EqP);
   
   
   -- 1 iff X < Y (branch-free); else 0
   function FZ_LessThanP(X : in FZ; Y : in FZ) return WBool is
      Scratch : FZ(X'Range);
      Borrow  : WBool := 0;
   begin
      FZ_Sub(X, Y, Scratch, Borrow);
      return Borrow;
   end FZ_LessThanP;
   pragma Inline_Always(FZ_LessThanP);
   
   
   -- 1 iff X > Y (branch-free); else 0
   function FZ_GreaterThanP(X : in FZ; Y: in FZ) return WBool is
      Scratch : FZ(X'Range);
      Borrow  : WBool := 0;
   begin
      FZ_Sub(Y, X, Scratch, Borrow);
      return Borrow;
   end FZ_GreaterThanP;
   pragma Inline_Always(FZ_GreaterThanP);
   
end FZ_Cmp;
