Blame view

include/asm-xtensa/string.h 2.7 KB
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   * include/asm-xtensa/string.h
   *
   * These trivial string functions are considered part of the public domain.
   *
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   *
   * Copyright (C) 2001 - 2005 Tensilica Inc.
   */
  
  /* We should optimize these. See arch/xtensa/lib/strncpy_user.S */
  
  #ifndef _XTENSA_STRING_H
  #define _XTENSA_STRING_H
  
  #define __HAVE_ARCH_STRCPY
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
19
  static inline char *strcpy(char *__dest, const char *__src)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  {
  	register char *__xdest = __dest;
  	unsigned long __dummy;
  
  	__asm__ __volatile__("1:
  \t"
  		"l8ui	%2, %1, 0
  \t"
  		"s8i	%2, %0, 0
  \t"
  		"addi	%1, %1, 1
  \t"
  		"addi	%0, %0, 1
  \t"
  		"bnez	%2, 1b
  \t"
  		: "=r" (__dest), "=r" (__src), "=&r" (__dummy)
  		: "0" (__dest), "1" (__src)
  		: "memory");
  
  	return __xdest;
  }
  
  #define __HAVE_ARCH_STRNCPY
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
44
  static inline char *strncpy(char *__dest, const char *__src, size_t __n)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
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
72
73
74
75
  {
  	register char *__xdest = __dest;
  	unsigned long __dummy;
  
  	if (__n == 0)
  		return __xdest;
  
  	__asm__ __volatile__(
  		"1:
  \t"
  		"l8ui	%2, %1, 0
  \t"
  		"s8i	%2, %0, 0
  \t"
  		"addi	%1, %1, 1
  \t"
  		"addi	%0, %0, 1
  \t"
  		"beqz	%2, 2f
  \t"
  		"bne	%1, %5, 1b
  "
  		"2:"
  		: "=r" (__dest), "=r" (__src), "=&r" (__dummy)
  		: "0" (__dest), "1" (__src), "r" (__src+__n)
  		: "memory");
  
  	return __xdest;
  }
  
  #define __HAVE_ARCH_STRCMP
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
76
  static inline int strcmp(const char *__cs, const char *__ct)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  {
  	register int __res;
  	unsigned long __dummy;
  
  	__asm__ __volatile__(
  		"1:
  \t"
  		"l8ui	%3, %1, 0
  \t"
  		"addi	%1, %1, 1
  \t"
  		"l8ui	%2, %0, 0
  \t"
  		"addi	%0, %0, 1
  \t"
  		"beqz	%2, 2f
  \t"
  		"beq	%2, %3, 1b
  "
  		"2:
  \t"
  		"sub	%2, %3, %2"
  		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
  		: "0" (__cs), "1" (__ct));
  
  	return __res;
  }
  
  #define __HAVE_ARCH_STRNCMP
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
106
  static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  {
  	register int __res;
  	unsigned long __dummy;
  
  	__asm__ __volatile__(
  		"mov	%2, %3
  "
  		"1:
  \t"
  		"beq	%0, %6, 2f
  \t"
  		"l8ui	%3, %1, 0
  \t"
  		"addi	%1, %1, 1
  \t"
  		"l8ui	%2, %0, 0
  \t"
  		"addi	%0, %0, 1
  \t"
  		"beqz	%2, 2f
  \t"
  		"beqz	%3, 2f
  \t"
  		"beq	%2, %3, 1b
  "
  		"2:
  \t"
  		"sub	%2, %3, %2"
  		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
  		: "0" (__cs), "1" (__ct), "r" (__cs+__n));
  
  	return __res;
  }
  
  #define __HAVE_ARCH_MEMSET
  extern void *memset(void *__s, int __c, size_t __count);
  
  #define __HAVE_ARCH_MEMCPY
  extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
  
  #define __HAVE_ARCH_MEMMOVE
  extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
  
  /* Don't build bcopy at all ...  */
  #define __HAVE_ARCH_BCOPY
  
  #define __HAVE_ARCH_MEMSCAN
  #define memscan memchr
  
  #endif	/* _XTENSA_STRING_H */