1#include "config.h" 2#include "gcc-plugin.h" 3#include "system.h" 4#include "coretypes.h" 5#include "tree.h" 6 7int plugin_is_GPL_compatible; 8 9static void 10test_double_int_round_udiv (void) 11{ 12 double_int dmin = { 0, HOST_WIDE_INT_MIN }; 13 double_int dmax = { -1, HOST_WIDE_INT_MAX }; 14 double_int dnegone = { -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 26static void 27test_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 39static void 40test_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 71int 72plugin_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