string.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /* $Id: string.h,v 1.36 2001/12/21 00:54:31 davem Exp $
  2. * string.h: External definitions for optimized assembly string
  3. * routines for the Linux Kernel.
  4. *
  5. * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu)
  6. * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  7. */
  8. #ifndef __SPARC_STRING_H__
  9. #define __SPARC_STRING_H__
  10. #include <asm/page.h>
  11. /* Really, userland/ksyms should not see any of this stuff. */
  12. #ifdef __KERNEL__
  13. extern void __memmove(void *,const void *,__kernel_size_t);
  14. extern __kernel_size_t __memcpy(void *,const void *,__kernel_size_t);
  15. extern __kernel_size_t __memset(void *,int,__kernel_size_t);
  16. #ifndef EXPORT_SYMTAB_STROPS
  17. /* First the mem*() things. */
  18. #define __HAVE_ARCH_MEMMOVE
  19. #undef memmove
  20. #define memmove(_to, _from, _n) \
  21. ({ \
  22. void *_t = (_to); \
  23. __memmove(_t, (_from), (_n)); \
  24. _t; \
  25. })
  26. #define __HAVE_ARCH_MEMCPY
  27. static inline void *__constant_memcpy(void *to, const void *from, __kernel_size_t n)
  28. {
  29. extern void __copy_1page(void *, const void *);
  30. if(n <= 32) {
  31. __builtin_memcpy(to, from, n);
  32. } else if (((unsigned int) to & 7) != 0) {
  33. /* Destination is not aligned on the double-word boundary */
  34. __memcpy(to, from, n);
  35. } else {
  36. switch(n) {
  37. case PAGE_SIZE:
  38. __copy_1page(to, from);
  39. break;
  40. default:
  41. __memcpy(to, from, n);
  42. break;
  43. }
  44. }
  45. return to;
  46. }
  47. static inline void *__nonconstant_memcpy(void *to, const void *from, __kernel_size_t n)
  48. {
  49. __memcpy(to, from, n);
  50. return to;
  51. }
  52. #undef memcpy
  53. #define memcpy(t, f, n) \
  54. (__builtin_constant_p(n) ? \
  55. __constant_memcpy((t),(f),(n)) : \
  56. __nonconstant_memcpy((t),(f),(n)))
  57. #define __HAVE_ARCH_MEMSET
  58. static inline void *__constant_c_and_count_memset(void *s, char c, __kernel_size_t count)
  59. {
  60. extern void bzero_1page(void *);
  61. extern __kernel_size_t __bzero(void *, __kernel_size_t);
  62. if(!c) {
  63. if(count == PAGE_SIZE)
  64. bzero_1page(s);
  65. else
  66. __bzero(s, count);
  67. } else {
  68. __memset(s, c, count);
  69. }
  70. return s;
  71. }
  72. static inline void *__constant_c_memset(void *s, char c, __kernel_size_t count)
  73. {
  74. extern __kernel_size_t __bzero(void *, __kernel_size_t);
  75. if(!c)
  76. __bzero(s, count);
  77. else
  78. __memset(s, c, count);
  79. return s;
  80. }
  81. static inline void *__nonconstant_memset(void *s, char c, __kernel_size_t count)
  82. {
  83. __memset(s, c, count);
  84. return s;
  85. }
  86. #undef memset
  87. #define memset(s, c, count) \
  88. (__builtin_constant_p(c) ? (__builtin_constant_p(count) ? \
  89. __constant_c_and_count_memset((s), (c), (count)) : \
  90. __constant_c_memset((s), (c), (count))) \
  91. : __nonconstant_memset((s), (c), (count)))
  92. #define __HAVE_ARCH_MEMSCAN
  93. #undef memscan
  94. #define memscan(__arg0, __char, __arg2) \
  95. ({ \
  96. extern void *__memscan_zero(void *, size_t); \
  97. extern void *__memscan_generic(void *, int, size_t); \
  98. void *__retval, *__addr = (__arg0); \
  99. size_t __size = (__arg2); \
  100. \
  101. if(__builtin_constant_p(__char) && !(__char)) \
  102. __retval = __memscan_zero(__addr, __size); \
  103. else \
  104. __retval = __memscan_generic(__addr, (__char), __size); \
  105. \
  106. __retval; \
  107. })
  108. #define __HAVE_ARCH_MEMCMP
  109. extern int memcmp(const void *,const void *,__kernel_size_t);
  110. /* Now the str*() stuff... */
  111. #define __HAVE_ARCH_STRLEN
  112. extern __kernel_size_t strlen(const char *);
  113. #define __HAVE_ARCH_STRNCMP
  114. extern int __strncmp(const char *, const char *, __kernel_size_t);
  115. static inline int __constant_strncmp(const char *src, const char *dest, __kernel_size_t count)
  116. {
  117. register int retval;
  118. switch(count) {
  119. case 0: return 0;
  120. case 1: return (src[0] - dest[0]);
  121. case 2: retval = (src[0] - dest[0]);
  122. if(!retval && src[0])
  123. retval = (src[1] - dest[1]);
  124. return retval;
  125. case 3: retval = (src[0] - dest[0]);
  126. if(!retval && src[0]) {
  127. retval = (src[1] - dest[1]);
  128. if(!retval && src[1])
  129. retval = (src[2] - dest[2]);
  130. }
  131. return retval;
  132. case 4: retval = (src[0] - dest[0]);
  133. if(!retval && src[0]) {
  134. retval = (src[1] - dest[1]);
  135. if(!retval && src[1]) {
  136. retval = (src[2] - dest[2]);
  137. if (!retval && src[2])
  138. retval = (src[3] - dest[3]);
  139. }
  140. }
  141. return retval;
  142. case 5: retval = (src[0] - dest[0]);
  143. if(!retval && src[0]) {
  144. retval = (src[1] - dest[1]);
  145. if(!retval && src[1]) {
  146. retval = (src[2] - dest[2]);
  147. if (!retval && src[2]) {
  148. retval = (src[3] - dest[3]);
  149. if (!retval && src[3])
  150. retval = (src[4] - dest[4]);
  151. }
  152. }
  153. }
  154. return retval;
  155. default:
  156. retval = (src[0] - dest[0]);
  157. if(!retval && src[0]) {
  158. retval = (src[1] - dest[1]);
  159. if(!retval && src[1]) {
  160. retval = (src[2] - dest[2]);
  161. if(!retval && src[2])
  162. retval = __strncmp(src+3,dest+3,count-3);
  163. }
  164. }
  165. return retval;
  166. }
  167. }
  168. #undef strncmp
  169. #define strncmp(__arg0, __arg1, __arg2) \
  170. (__builtin_constant_p(__arg2) ? \
  171. __constant_strncmp(__arg0, __arg1, __arg2) : \
  172. __strncmp(__arg0, __arg1, __arg2))
  173. #endif /* !EXPORT_SYMTAB_STROPS */
  174. #endif /* __KERNEL__ */
  175. #endif /* !(__SPARC_STRING_H__) */