OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

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

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/*
/*
FUNCTION
FUNCTION
        <<memcmp>>---compare two memory areas
        <<memcmp>>---compare two memory areas
 
 
INDEX
INDEX
        memcmp
        memcmp
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <string.h>
        #include <string.h>
        int memcmp(const void *<[s1]>, const void *<[s2]>, size_t <[n]>);
        int memcmp(const void *<[s1]>, const void *<[s2]>, size_t <[n]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <string.h>
        #include <string.h>
        int memcmp(<[s1]>, <[s2]>, <[n]>)
        int memcmp(<[s1]>, <[s2]>, <[n]>)
        void *<[s1]>;
        void *<[s1]>;
        void *<[s2]>;
        void *<[s2]>;
        size_t <[n]>;
        size_t <[n]>;
 
 
DESCRIPTION
DESCRIPTION
        This function compares not more than <[n]> characters of the
        This function compares not more than <[n]> characters of the
        object pointed to by <[s1]> with the object pointed to by <[s2]>.
        object pointed to by <[s1]> with the object pointed to by <[s2]>.
 
 
 
 
RETURNS
RETURNS
        The function returns an integer greater than, equal to or
        The function returns an integer greater than, equal to or
        less than zero  according to whether the object pointed to by
        less than zero  according to whether the object pointed to by
        <[s1]> is greater than, equal to or less than the object
        <[s1]> is greater than, equal to or less than the object
        pointed to by <[s2]>.
        pointed to by <[s2]>.
 
 
PORTABILITY
PORTABILITY
<<memcmp>> is ANSI C.
<<memcmp>> is ANSI C.
 
 
<<memcmp>> requires no supporting OS subroutines.
<<memcmp>> requires no supporting OS subroutines.
 
 
QUICKREF
QUICKREF
        memcmp ansi pure
        memcmp ansi pure
*/
*/
 
 
#include <string.h>
#include <string.h>
 
 
 
 
/* Nonzero if either X or Y is not aligned on a "long" boundary.  */
/* Nonzero if either X or Y is not aligned on a "long" boundary.  */
#define UNALIGNED(X, Y) \
#define UNALIGNED(X, Y) \
  (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1)))
  (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1)))
 
 
/* How many bytes are copied each iteration of the word copy loop.  */
/* How many bytes are copied each iteration of the word copy loop.  */
#define LBLOCKSIZE (sizeof (long))
#define LBLOCKSIZE (sizeof (long))
 
 
/* Threshhold for punting to the byte copier.  */
/* Threshhold for punting to the byte copier.  */
#define TOO_SMALL(LEN)  ((LEN) < LBLOCKSIZE)
#define TOO_SMALL(LEN)  ((LEN) < LBLOCKSIZE)
 
 
int
int
_DEFUN (memcmp, (m1, m2, n),
_DEFUN (memcmp, (m1, m2, n),
        _CONST _PTR m1 _AND
        _CONST _PTR m1 _AND
        _CONST _PTR m2 _AND
        _CONST _PTR m2 _AND
        size_t n)
        size_t n)
{
{
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
  unsigned char *s1 = (unsigned char *) m1;
  unsigned char *s1 = (unsigned char *) m1;
  unsigned char *s2 = (unsigned char *) m2;
  unsigned char *s2 = (unsigned char *) m2;
 
 
  while (n--)
  while (n--)
    {
    {
      if (*s1 != *s2)
      if (*s1 != *s2)
        {
        {
          return *s1 - *s2;
          return *s1 - *s2;
        }
        }
      s1++;
      s1++;
      s2++;
      s2++;
    }
    }
  return 0;
  return 0;
#else  
#else  
  unsigned char *s1 = (unsigned char *) m1;
  unsigned char *s1 = (unsigned char *) m1;
  unsigned char *s2 = (unsigned char *) m2;
  unsigned char *s2 = (unsigned char *) m2;
  unsigned long *a1;
  unsigned long *a1;
  unsigned long *a2;
  unsigned long *a2;
 
 
  /* If the size is too small, or either pointer is unaligned,
  /* If the size is too small, or either pointer is unaligned,
     then we punt to the byte compare loop.  Hopefully this will
     then we punt to the byte compare loop.  Hopefully this will
     not turn up in inner loops.  */
     not turn up in inner loops.  */
  if (!TOO_SMALL(n) && !UNALIGNED(s1,s2))
  if (!TOO_SMALL(n) && !UNALIGNED(s1,s2))
    {
    {
      /* Otherwise, load and compare the blocks of memory one
      /* Otherwise, load and compare the blocks of memory one
         word at a time.  */
         word at a time.  */
      a1 = (unsigned long*) s1;
      a1 = (unsigned long*) s1;
      a2 = (unsigned long*) s2;
      a2 = (unsigned long*) s2;
      while (n >= LBLOCKSIZE)
      while (n >= LBLOCKSIZE)
        {
        {
          if (*a1 != *a2)
          if (*a1 != *a2)
            break;
            break;
          a1++;
          a1++;
          a2++;
          a2++;
          n -= LBLOCKSIZE;
          n -= LBLOCKSIZE;
        }
        }
 
 
      /* check m mod LBLOCKSIZE remaining characters */
      /* check m mod LBLOCKSIZE remaining characters */
 
 
      s1 = (unsigned char*)a1;
      s1 = (unsigned char*)a1;
      s2 = (unsigned char*)a2;
      s2 = (unsigned char*)a2;
    }
    }
 
 
  while (n--)
  while (n--)
    {
    {
      if (*s1 != *s2)
      if (*s1 != *s2)
        return *s1 - *s2;
        return *s1 - *s2;
      s1++;
      s1++;
      s2++;
      s2++;
    }
    }
 
 
  return 0;
  return 0;
#endif /* not PREFER_SIZE_OVER_SPEED */
#endif /* not PREFER_SIZE_OVER_SPEED */
}
}
 
 
 
 

powered by: WebSVN 2.1.0

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