OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [machine/] [w65/] [divsi3.c] - Diff between revs 207 and 345

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
 
 
#define divnorm(num, den, sign)                 \
#define divnorm(num, den, sign)                 \
{                                               \
{                                               \
  if (num < 0)                                   \
  if (num < 0)                                   \
    {                                           \
    {                                           \
      num = -num;                               \
      num = -num;                               \
      sign = 1;                                 \
      sign = 1;                                 \
    }                                           \
    }                                           \
  else                                          \
  else                                          \
    {                                           \
    {                                           \
      sign = 0;                                  \
      sign = 0;                                  \
    }                                           \
    }                                           \
                                                \
                                                \
  if (den < 0)                                   \
  if (den < 0)                                   \
    {                                           \
    {                                           \
      den = - den;                              \
      den = - den;                              \
      sign = 1 - sign;                          \
      sign = 1 - sign;                          \
    }                                           \
    }                                           \
}
}
 
 
 
 
 
 
 
 
 
 
static unsigned long
static unsigned long
divmodsi4(int modwanted, unsigned long num, unsigned long den)
divmodsi4(int modwanted, unsigned long num, unsigned long den)
{
{
  long int bit = 1;
  long int bit = 1;
  long int res = 0;
  long int res = 0;
  long prevden;
  long prevden;
  while (den < num && bit && !(den & (1L<<31)))
  while (den < num && bit && !(den & (1L<<31)))
    {
    {
      den <<=1;
      den <<=1;
      bit <<=1;
      bit <<=1;
    }
    }
  while (bit)
  while (bit)
    {
    {
      if (num >= den)
      if (num >= den)
        {
        {
          num -= den;
          num -= den;
          res |= bit;
          res |= bit;
        }
        }
      bit >>=1;
      bit >>=1;
      den >>=1;
      den >>=1;
    }
    }
  if (modwanted) return num;
  if (modwanted) return num;
  return res;
  return res;
}
}
 
 
 
 
#define exitdiv(sign, res) if (sign) { res = - res;} return res;
#define exitdiv(sign, res) if (sign) { res = - res;} return res;
 
 
long
long
__modsi3 (long numerator, long denominator)
__modsi3 (long numerator, long denominator)
{
{
  int sign = 0;
  int sign = 0;
  long dividend;
  long dividend;
  long modul;
  long modul;
 
 
 
 
  if (numerator < 0)
  if (numerator < 0)
    {
    {
      numerator = -numerator;
      numerator = -numerator;
      sign = 1;
      sign = 1;
    }
    }
  if (denominator < 0)
  if (denominator < 0)
    {
    {
      denominator = -denominator;
      denominator = -denominator;
    }
    }
 
 
  modul =  divmodsi4 (1, numerator, denominator);
  modul =  divmodsi4 (1, numerator, denominator);
  if (sign)
  if (sign)
    return - modul;
    return - modul;
  return modul;
  return modul;
}
}
 
 
 
 
long
long
__divsi3 (long numerator, long denominator)
__divsi3 (long numerator, long denominator)
{
{
  int sign;
  int sign;
  long dividend;
  long dividend;
  long modul;
  long modul;
  divnorm (numerator, denominator, sign);
  divnorm (numerator, denominator, sign);
 
 
  dividend = divmodsi4 (0,  numerator, denominator);
  dividend = divmodsi4 (0,  numerator, denominator);
  exitdiv (sign, dividend);
  exitdiv (sign, dividend);
}
}
 
 
long
long
__umodsi3 (unsigned long numerator, unsigned long denominator)
__umodsi3 (unsigned long numerator, unsigned long denominator)
{
{
  long dividend;
  long dividend;
  long modul;
  long modul;
 
 
modul= divmodsi4 (1,  numerator, denominator);
modul= divmodsi4 (1,  numerator, denominator);
  return modul;
  return modul;
}
}
 
 
long
long
__udivsi3 (unsigned long numerator, unsigned long denominator)
__udivsi3 (unsigned long numerator, unsigned long denominator)
{
{
  int sign;
  int sign;
  long dividend;
  long dividend;
  long modul;
  long modul;
  dividend =   divmodsi4 (0, numerator, denominator);
  dividend =   divmodsi4 (0, numerator, denominator);
  return dividend;
  return dividend;
}
}
 
 
 
 
 
 
 
 
 
 
 
 
#ifdef TEST
#ifdef TEST
 
 
 
 
 
 
main ()
main ()
{
{
  long int i, j, k, m;
  long int i, j, k, m;
  for (i = -10000; i < 10000; i += 8)
  for (i = -10000; i < 10000; i += 8)
    {
    {
      for (j = -10000; j < 10000; j += 11)
      for (j = -10000; j < 10000; j += 11)
        {
        {
          k = i / j;
          k = i / j;
          m = __divsi3 (i, j);
          m = __divsi3 (i, j);
          if (k != m)
          if (k != m)
            printf ("fail %d %d %d %d\n", i, j, k, m);
            printf ("fail %d %d %d %d\n", i, j, k, m);
        }
        }
    }
    }
}
}
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.