1/* Test count_leading_zeros and count_trailing_zeros.
2
3Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library.
6
7The GNU MP Library is free software; you can redistribute it and/or modify
8it under the terms of the GNU Lesser General Public License as published by
9the Free Software Foundation; either version 3 of the License, or (at your
10option) any later version.
11
12The GNU MP Library is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15License for more details.
16
17You should have received a copy of the GNU Lesser General Public License
18along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
19
20#include <stdio.h>
21#include <stdlib.h>
22#include "gmp.h"
23#include "gmp-impl.h"
24#include "longlong.h"
25#include "tests.h"
26
27void
28check_clz (int want, mp_limb_t n)
29{
30  int  got;
31  count_leading_zeros (got, n);
32  if (got != want)
33    {
34      printf        ("count_leading_zeros wrong\n");
35      mp_limb_trace ("  n    ", n);
36      printf        ("  want %d\n", want);
37      printf        ("  got  %d\n", got);
38      abort ();
39    }
40}
41
42void
43check_ctz (int want, mp_limb_t n)
44{
45  int  got;
46  count_trailing_zeros (got, n);
47  if (got != want)
48    {
49      printf ("count_trailing_zeros wrong\n");
50      mpn_trace ("  n    ", &n, (mp_size_t) 1);
51      printf    ("  want %d\n", want);
52      printf    ("  got  %d\n", got);
53      abort ();
54    }
55}
56
57void
58check_various (void)
59{
60  int        i;
61
62#ifdef COUNT_LEADING_ZEROS_0
63  check_clz (COUNT_LEADING_ZEROS_0, CNST_LIMB(0));
64#endif
65
66  for (i=0; i < GMP_LIMB_BITS; i++)
67    {
68      check_clz (i, CNST_LIMB(1) << (GMP_LIMB_BITS-1-i));
69      check_ctz (i, CNST_LIMB(1) << i);
70
71      check_ctz (i, MP_LIMB_T_MAX << i);
72      check_clz (i, MP_LIMB_T_MAX >> i);
73    }
74}
75
76
77int
78main (int argc, char *argv[])
79{
80  tests_start ();
81  mp_trace_base = 16;
82
83  check_various ();
84
85  tests_end ();
86  exit (0);
87}
88