| #include "config.h" |
| #include "gcc-plugin.h" |
| #include "system.h" |
| #include "coretypes.h" |
| #include "tree.h" |
| |
| int plugin_is_GPL_compatible; |
| |
| static void |
| test_double_int_round_udiv (void) |
| { |
| double_int dmin = { 0, HOST_WIDE_INT_MIN }; |
| double_int dmax = { (unsigned HOST_WIDE_INT)-1, HOST_WIDE_INT_MAX }; |
| double_int dnegone = { (unsigned HOST_WIDE_INT)-1, -1 }; |
| double_int mod, div; |
| div = dmin.udivmod (dnegone, ROUND_DIV_EXPR, &mod); |
| if (div.low != 1 || div.high != 0 |
| || mod.low != 1 || mod.high != HOST_WIDE_INT_MIN) |
| abort (); |
| div = dmax.udivmod (dnegone, ROUND_DIV_EXPR, &mod); |
| if (div.low != 0 || div.high != 0 |
| || mod.low != dmax.low || mod.high != dmax.high) |
| abort (); |
| } |
| |
| static void |
| test_wide_int_round_sdiv (void) |
| { |
| if (wi::ne_p (wi::div_round (2, 3, SIGNED), 1)) |
| abort (); |
| if (wi::ne_p (wi::div_round (1, 3, SIGNED), 0)) |
| abort (); |
| if (wi::ne_p (wi::mod_round (2, 3, SIGNED), -1)) |
| abort (); |
| if (wi::ne_p (wi::mod_round (1, 3, SIGNED), 1)) |
| abort (); |
| } |
| |
| static void |
| test_wide_int_mod_trunc (void) |
| { |
| for (unsigned int i = 1; i < MAX_BITSIZE_MODE_ANY_INT; ++i) |
| { |
| if (wi::smod_trunc (wi::lshift (1, i + 1) - 3, |
| wi::lshift (1, i) - 1) |
| != wi::lshift (1, i) - 2) |
| abort (); |
| for (unsigned int base = 32; base <= MAX_BITSIZE_MODE_ANY_INT; base *= 2) |
| for (int bias = -1; bias <= 1; ++bias) |
| { |
| unsigned int precision = base + bias; |
| if (i + 1 < precision && precision <= MAX_BITSIZE_MODE_ANY_INT) |
| { |
| wide_int one = wi::uhwi (1, precision); |
| wide_int a = wi::lshift (one, i + 1) - 3; |
| wide_int b = wi::lshift (one, i) - 1; |
| wide_int c = wi::lshift (one, i) - 2; |
| if (wi::umod_trunc (a, b) != c) |
| abort (); |
| if (wi::smod_trunc (a, b) != c) |
| abort (); |
| if (wi::smod_trunc (-a, b) != -c) |
| abort (); |
| if (wi::smod_trunc (a, -b) != c) |
| abort (); |
| } |
| } |
| } |
| } |
| |
| int |
| plugin_init (struct plugin_name_args *plugin_info, |
| struct plugin_gcc_version *version) |
| { |
| test_double_int_round_udiv (); |
| test_wide_int_round_sdiv (); |
| test_wide_int_mod_trunc (); |
| return 0; |
| } |