1 #include "config.h"
2 #include "gcc-plugin.h"
3 #include "system.h"
4 #include "coretypes.h"
5 #include "tree.h"
6 
7 int plugin_is_GPL_compatible;
8 
9 static void
test_double_int_round_udiv(void)10 test_double_int_round_udiv (void)
11 {
12   double_int dmin = { 0, HOST_WIDE_INT_MIN };
13   double_int dmax = { (unsigned HOST_WIDE_INT)-1, HOST_WIDE_INT_MAX };
14   double_int dnegone = { (unsigned HOST_WIDE_INT)-1, -1 };
15   double_int mod, div;
16   div = dmin.udivmod (dnegone, ROUND_DIV_EXPR, &mod);
17   if (div.low != 1 || div.high != 0
18       || mod.low != 1 || mod.high != HOST_WIDE_INT_MIN)
19     abort ();
20   div = dmax.udivmod (dnegone, ROUND_DIV_EXPR, &mod);
21   if (div.low != 0 || div.high != 0
22       || mod.low != dmax.low || mod.high != dmax.high)
23     abort ();
24 }
25 
26 static void
test_wide_int_round_sdiv(void)27 test_wide_int_round_sdiv (void)
28 {
29   if (wi::ne_p (wi::div_round (2, 3, SIGNED), 1))
30     abort ();
31   if (wi::ne_p (wi::div_round (1, 3, SIGNED), 0))
32     abort ();
33   if (wi::ne_p (wi::mod_round (2, 3, SIGNED), -1))
34     abort ();
35   if (wi::ne_p (wi::mod_round (1, 3, SIGNED), 1))
36     abort ();
37 }
38 
39 static void
test_wide_int_mod_trunc(void)40 test_wide_int_mod_trunc (void)
41 {
42   for (unsigned int i = 1; i < MAX_BITSIZE_MODE_ANY_INT; ++i)
43     {
44       if (wi::smod_trunc (wi::lshift (1, i + 1) - 3,
45 			  wi::lshift (1, i) - 1)
46 	  != wi::lshift (1, i) - 2)
47 	abort ();
48       for (unsigned int base = 32; base <= MAX_BITSIZE_MODE_ANY_INT; base *= 2)
49 	for (int bias = -1; bias <= 1; ++bias)
50 	  {
51 	    unsigned int precision = base + bias;
52 	    if (i + 1 < precision && precision <= MAX_BITSIZE_MODE_ANY_INT)
53 	      {
54 		wide_int one = wi::uhwi (1, precision);
55 		wide_int a = wi::lshift (one, i + 1) - 3;
56 		wide_int b = wi::lshift (one, i) - 1;
57 		wide_int c = wi::lshift (one, i) - 2;
58 		if (wi::umod_trunc (a, b) != c)
59 		  abort ();
60 		if (wi::smod_trunc (a, b) != c)
61 		  abort ();
62 		if (wi::smod_trunc (-a, b) != -c)
63 		  abort ();
64 		if (wi::smod_trunc (a, -b) != c)
65 		  abort ();
66 	      }
67 	  }
68     }
69 }
70 
71 int
plugin_init(struct plugin_name_args * plugin_info,struct plugin_gcc_version * version)72 plugin_init (struct plugin_name_args *plugin_info,
73 	     struct plugin_gcc_version *version)
74 {
75   test_double_int_round_udiv ();
76   test_wide_int_round_sdiv ();
77   test_wide_int_mod_trunc ();
78   return 0;
79 }
80