Welcome to mirror list, hosted at ThFree Co, Russian Federation.

strcmp.c « mips « machine « libc « newlib - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c9c1c65956f4386e48a19ac7a8c93c6ad6fb6f38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 * strcmp.c -- strcmp function.  On at least some MIPS chips, a strcmp that is
 * unrolled twice is faster than the 'optimized' C version in newlib.
 *
 * Copyright (c) 2001 Red Hat, Inc.
 *
 * The authors hereby grant permission to use, copy, modify, distribute,
 * and license this software and its documentation for any purpose, provided
 * that existing copyright notices are retained in all copies and that this
 * notice is included verbatim in any distributions. No written agreement,
 * license, or royalty fee is required for any of the authorized uses.
 * Modifications to this software may be copyrighted by their authors
 * and need not follow the licensing terms described here, provided that
 * the new terms are clearly indicated on the first page of each file where
 * they apply.  */

#include <stddef.h>
#include <string.h>
#include <stdlib.h>

int
strcmp (const char *s1, const char *s2)
{ 
  unsigned const char *us1 = (unsigned const char *)s1;
  unsigned const char *us2 = (unsigned const char *)s2;
  int c1a, c1b;
  int c2a, c2b;

  /* If the pointers aren't both aligned to a 16-byte boundary, do the
     comparison byte by byte, so that we don't get an invalid page fault if we
     are comparing a string whose null byte is at the last byte on the last
     valid page.  */
  if (((((long)us1) | ((long)us2)) & 1) == 0)
    {
      c1a = *us1;
      for (;;)
	{
	  c1b = *us2;
	  us1 += 2;
	  if (c1a == '\0')
	    goto ret1;

	  c2a = us1[-1];
	  if (c1a != c1b)
	    goto ret1;

	  c2b = us2[1];
	  us2 += 2;
	  if (c2a == '\0')
	    break;

	  c1a = *us1;
	  if (c2a != c2b)
	    break;
	}

      return c2a - c2b;
    }
  else
    {
      do
	{
	  c1a = *us1++;
	  c1b = *us2++;
	}
      while (c1a != '\0' && c1a == c1b);
    }

 ret1:
  return c1a - c1b;
}