Move uinteger_pow gdb/valarith.c to gdb/utils.c and make it public

This is a generic function which I would like to use in a followup
patch adding support for fixed-point types. So this commit moves it
out of valarith.c into util.c, and makes it non-static.

gdb/ChangeLog:

        * utils.h (uinteger_pow): Add declaration.
        * utils.c (uinteger_pow): Moved here (without changes)...
        * valarith.c (uinteger_pow): ... from here.
This commit is contained in:
Joel Brobecker 2020-11-15 03:10:52 -05:00
parent b34c74ab9a
commit e55c6530db
4 changed files with 43 additions and 31 deletions

View file

@ -1,3 +1,9 @@
2020-11-15 Joel Brobecker <brobecker@adacore.com>
* utils.h (uinteger_pow): Add declaration.
* utils.c (uinteger_pow): Moved here (without changes)...
* valarith.c (uinteger_pow): ... from here.
2020-11-15 Joel Brobecker <brobecker@adacore.com>
* gmp-utils.h, gmp-utils.h: New file.

View file

@ -709,6 +709,36 @@ myread (int desc, char *addr, int len)
return orglen;
}
/* See utils.h. */
ULONGEST
uinteger_pow (ULONGEST v1, LONGEST v2)
{
if (v2 < 0)
{
if (v1 == 0)
error (_("Attempt to raise 0 to negative power."));
else
return 0;
}
else
{
/* The Russian Peasant's Algorithm. */
ULONGEST v;
v = 1;
for (;;)
{
if (v2 & 1L)
v *= v1;
v2 >>= 1;
if (v2 == 0)
return v;
v1 *= v1;
}
}
}
void
print_spaces (int n, struct ui_file *file)
{

View file

@ -593,6 +593,13 @@ extern pid_t wait_to_die_with_timeout (pid_t pid, int *status, int timeout);
extern int myread (int, char *, int);
/* Integer exponentiation: Return V1**V2, where both arguments
are integers.
Requires V1 != 0 if V2 < 0.
Returns 1 for 0 ** 0. */
extern ULONGEST uinteger_pow (ULONGEST v1, LONGEST v2);
/* Resource limits used by getrlimit and setrlimit. */
enum resource_limit_kind

View file

@ -819,37 +819,6 @@ integer_pow (LONGEST v1, LONGEST v2)
}
}
/* Integer exponentiation: V1**V2, where both arguments are
integers. Requires V1 != 0 if V2 < 0. Returns 1 for 0 ** 0. */
static ULONGEST
uinteger_pow (ULONGEST v1, LONGEST v2)
{
if (v2 < 0)
{
if (v1 == 0)
error (_("Attempt to raise 0 to negative power."));
else
return 0;
}
else
{
/* The Russian Peasant's Algorithm. */
ULONGEST v;
v = 1;
for (;;)
{
if (v2 & 1L)
v *= v1;
v2 >>= 1;
if (v2 == 0)
return v;
v1 *= v1;
}
}
}
/* Obtain argument values for binary operation, converting from
other types if one of them is not floating point. */
static void