blob: eea56be5e7c2a3661786bd8dad3a474f09688538 [file] [log] [blame]
#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;
}