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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [gas/] [flonum-copy.c] - Diff between revs 816 and 818

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

Rev 816 Rev 818
/* flonum_copy.c - copy a flonum
/* flonum_copy.c - copy a flonum
   Copyright 1987, 1990, 1991, 1992, 1993, 2000, 2003, 2005, 2007
   Copyright 1987, 1990, 1991, 1992, 1993, 2000, 2003, 2005, 2007
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   This file is part of GAS, the GNU Assembler.
   This file is part of GAS, the GNU Assembler.
 
 
   GAS is free software; you can redistribute it and/or modify
   GAS is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   the Free Software Foundation; either version 3, or (at your option)
   any later version.
   any later version.
 
 
   GAS is distributed in the hope that it will be useful,
   GAS is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with GAS; see the file COPYING.  If not, write to the Free
   along with GAS; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */
   02110-1301, USA.  */
 
 
#include "as.h"
#include "as.h"
 
 
void
void
flonum_copy (FLONUM_TYPE *in, FLONUM_TYPE *out)
flonum_copy (FLONUM_TYPE *in, FLONUM_TYPE *out)
{
{
  unsigned int in_length;       /* 0 origin */
  unsigned int in_length;       /* 0 origin */
  unsigned int out_length;      /* 0 origin */
  unsigned int out_length;      /* 0 origin */
 
 
  out->sign = in->sign;
  out->sign = in->sign;
  in_length = in->leader - in->low;
  in_length = in->leader - in->low;
 
 
  if (in->leader < in->low)
  if (in->leader < in->low)
    {
    {
      out->leader = out->low - 1;       /* 0.0 case */
      out->leader = out->low - 1;       /* 0.0 case */
    }
    }
  else
  else
    {
    {
      out_length = out->high - out->low;
      out_length = out->high - out->low;
      /* Assume no GAPS in packing of littlenums.
      /* Assume no GAPS in packing of littlenums.
         I.e. sizeof(array) == sizeof(element) * number_of_elements.  */
         I.e. sizeof(array) == sizeof(element) * number_of_elements.  */
      if (in_length <= out_length)
      if (in_length <= out_length)
        {
        {
          {
          {
            /* For defensive programming, zero any high-order
            /* For defensive programming, zero any high-order
               littlenums we don't need.  This is destroying evidence
               littlenums we don't need.  This is destroying evidence
               and wasting time, so why bother???  */
               and wasting time, so why bother???  */
            if (in_length < out_length)
            if (in_length < out_length)
              {
              {
                memset ((char *) (out->low + in_length + 1), '\0',
                memset ((char *) (out->low + in_length + 1), '\0',
                        out_length - in_length);
                        out_length - in_length);
              }
              }
          }
          }
          memcpy ((void *) (out->low), (void *) (in->low),
          memcpy ((void *) (out->low), (void *) (in->low),
                  ((in_length + 1) * sizeof (LITTLENUM_TYPE)));
                  ((in_length + 1) * sizeof (LITTLENUM_TYPE)));
          out->exponent = in->exponent;
          out->exponent = in->exponent;
          out->leader = in->leader - in->low + out->low;
          out->leader = in->leader - in->low + out->low;
        }
        }
      else
      else
        {
        {
          int shorten;          /* 1-origin. Number of littlenums we drop.  */
          int shorten;          /* 1-origin. Number of littlenums we drop.  */
 
 
          shorten = in_length - out_length;
          shorten = in_length - out_length;
          /* Assume out_length >= 0 ! */
          /* Assume out_length >= 0 ! */
          memcpy ((void *) (out->low), (void *) (in->low + shorten),
          memcpy ((void *) (out->low), (void *) (in->low + shorten),
                  ((out_length + 1) * sizeof (LITTLENUM_TYPE)));
                  ((out_length + 1) * sizeof (LITTLENUM_TYPE)));
          out->leader = out->high;
          out->leader = out->high;
          out->exponent = in->exponent + shorten;
          out->exponent = in->exponent + shorten;
        }
        }
    }                           /* if any significant bits */
    }                           /* if any significant bits */
}
}
 
 

powered by: WebSVN 2.1.0

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