~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/lib/string_32.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/x86/lib/string_32.c (Architecture ppc) and /arch/alpha/lib/string_32.c (Architecture alpha)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 /*                                                
  3  * Most of the string-functions are rather hea    
  4  * see especially strsep,strstr,str[c]spn. The    
  5  * very easy to understand. Everything is done    
  6  * set, making the functions fast and clean. S    
  7  * used through-out, making for "slightly" unc    
  8  *                                                
  9  * AK: On P4 and K7 using non string instructi    
 10  * for large memory blocks. But most of them a    
 11  * strings.                                       
 12  */                                               
 13                                                   
 14 #define __NO_FORTIFY                              
 15 #include <linux/string.h>                         
 16 #include <linux/export.h>                         
 17                                                   
 18 #ifdef __HAVE_ARCH_STRCPY                         
 19 char *strcpy(char *dest, const char *src)         
 20 {                                                 
 21         int d0, d1, d2;                           
 22         asm volatile("1:\tlodsb\n\t"              
 23                 "stosb\n\t"                       
 24                 "testb %%al,%%al\n\t"             
 25                 "jne 1b"                          
 26                 : "=&S" (d0), "=&D" (d1), "=&a    
 27                 : "" (src), "1" (dest) : "memo    
 28         return dest;                              
 29 }                                                 
 30 EXPORT_SYMBOL(strcpy);                            
 31 #endif                                            
 32                                                   
 33 #ifdef __HAVE_ARCH_STRNCPY                        
 34 char *strncpy(char *dest, const char *src, siz    
 35 {                                                 
 36         int d0, d1, d2, d3;                       
 37         asm volatile("1:\tdecl %2\n\t"            
 38                 "js 2f\n\t"                       
 39                 "lodsb\n\t"                       
 40                 "stosb\n\t"                       
 41                 "testb %%al,%%al\n\t"             
 42                 "jne 1b\n\t"                      
 43                 "rep\n\t"                         
 44                 "stosb\n"                         
 45                 "2:"                              
 46                 : "=&S" (d0), "=&D" (d1), "=&c    
 47                 : "" (src), "1" (dest), "2" (c    
 48         return dest;                              
 49 }                                                 
 50 EXPORT_SYMBOL(strncpy);                           
 51 #endif                                            
 52                                                   
 53 #ifdef __HAVE_ARCH_STRCAT                         
 54 char *strcat(char *dest, const char *src)         
 55 {                                                 
 56         int d0, d1, d2, d3;                       
 57         asm volatile("repne\n\t"                  
 58                 "scasb\n\t"                       
 59                 "decl %1\n"                       
 60                 "1:\tlodsb\n\t"                   
 61                 "stosb\n\t"                       
 62                 "testb %%al,%%al\n\t"             
 63                 "jne 1b"                          
 64                 : "=&S" (d0), "=&D" (d1), "=&a    
 65                 : "" (src), "1" (dest), "2" (0    
 66         return dest;                              
 67 }                                                 
 68 EXPORT_SYMBOL(strcat);                            
 69 #endif                                            
 70                                                   
 71 #ifdef __HAVE_ARCH_STRNCAT                        
 72 char *strncat(char *dest, const char *src, siz    
 73 {                                                 
 74         int d0, d1, d2, d3;                       
 75         asm volatile("repne\n\t"                  
 76                 "scasb\n\t"                       
 77                 "decl %1\n\t"                     
 78                 "movl %8,%3\n"                    
 79                 "1:\tdecl %3\n\t"                 
 80                 "js 2f\n\t"                       
 81                 "lodsb\n\t"                       
 82                 "stosb\n\t"                       
 83                 "testb %%al,%%al\n\t"             
 84                 "jne 1b\n"                        
 85                 "2:\txorl %2,%2\n\t"              
 86                 "stosb"                           
 87                 : "=&S" (d0), "=&D" (d1), "=&a    
 88                 : "" (src), "1" (dest), "2" (0    
 89                 : "memory");                      
 90         return dest;                              
 91 }                                                 
 92 EXPORT_SYMBOL(strncat);                           
 93 #endif                                            
 94                                                   
 95 #ifdef __HAVE_ARCH_STRCMP                         
 96 int strcmp(const char *cs, const char *ct)        
 97 {                                                 
 98         int d0, d1;                               
 99         int res;                                  
100         asm volatile("1:\tlodsb\n\t"              
101                 "scasb\n\t"                       
102                 "jne 2f\n\t"                      
103                 "testb %%al,%%al\n\t"             
104                 "jne 1b\n\t"                      
105                 "xorl %%eax,%%eax\n\t"            
106                 "jmp 3f\n"                        
107                 "2:\tsbbl %%eax,%%eax\n\t"        
108                 "orb $1,%%al\n"                   
109                 "3:"                              
110                 : "=a" (res), "=&S" (d0), "=&D    
111                 : "1" (cs), "2" (ct)              
112                 : "memory");                      
113         return res;                               
114 }                                                 
115 EXPORT_SYMBOL(strcmp);                            
116 #endif                                            
117                                                   
118 #ifdef __HAVE_ARCH_STRNCMP                        
119 int strncmp(const char *cs, const char *ct, si    
120 {                                                 
121         int res;                                  
122         int d0, d1, d2;                           
123         asm volatile("1:\tdecl %3\n\t"            
124                 "js 2f\n\t"                       
125                 "lodsb\n\t"                       
126                 "scasb\n\t"                       
127                 "jne 3f\n\t"                      
128                 "testb %%al,%%al\n\t"             
129                 "jne 1b\n"                        
130                 "2:\txorl %%eax,%%eax\n\t"        
131                 "jmp 4f\n"                        
132                 "3:\tsbbl %%eax,%%eax\n\t"        
133                 "orb $1,%%al\n"                   
134                 "4:"                              
135                 : "=a" (res), "=&S" (d0), "=&D    
136                 : "1" (cs), "2" (ct), "3" (cou    
137                 : "memory");                      
138         return res;                               
139 }                                                 
140 EXPORT_SYMBOL(strncmp);                           
141 #endif                                            
142                                                   
143 #ifdef __HAVE_ARCH_STRCHR                         
144 char *strchr(const char *s, int c)                
145 {                                                 
146         int d0;                                   
147         char *res;                                
148         asm volatile("movb %%al,%%ah\n"           
149                 "1:\tlodsb\n\t"                   
150                 "cmpb %%ah,%%al\n\t"              
151                 "je 2f\n\t"                       
152                 "testb %%al,%%al\n\t"             
153                 "jne 1b\n\t"                      
154                 "movl $1,%1\n"                    
155                 "2:\tmovl %1,%0\n\t"              
156                 "decl %0"                         
157                 : "=a" (res), "=&S" (d0)          
158                 : "1" (s), "" (c)                 
159                 : "memory");                      
160         return res;                               
161 }                                                 
162 EXPORT_SYMBOL(strchr);                            
163 #endif                                            
164                                                   
165 #ifdef __HAVE_ARCH_STRLEN                         
166 size_t strlen(const char *s)                      
167 {                                                 
168         int d0;                                   
169         size_t res;                               
170         asm volatile("repne\n\t"                  
171                 "scasb"                           
172                 : "=c" (res), "=&D" (d0)          
173                 : "1" (s), "a" (0), "" (0xffff    
174                 : "memory");                      
175         return ~res - 1;                          
176 }                                                 
177 EXPORT_SYMBOL(strlen);                            
178 #endif                                            
179                                                   
180 #ifdef __HAVE_ARCH_MEMCHR                         
181 void *memchr(const void *cs, int c, size_t cou    
182 {                                                 
183         int d0;                                   
184         void *res;                                
185         if (!count)                               
186                 return NULL;                      
187         asm volatile("repne\n\t"                  
188                 "scasb\n\t"                       
189                 "je 1f\n\t"                       
190                 "movl $1,%0\n"                    
191                 "1:\tdecl %0"                     
192                 : "=D" (res), "=&c" (d0)          
193                 : "a" (c), "" (cs), "1" (count    
194                 : "memory");                      
195         return res;                               
196 }                                                 
197 EXPORT_SYMBOL(memchr);                            
198 #endif                                            
199                                                   
200 #ifdef __HAVE_ARCH_MEMSCAN                        
201 void *memscan(void *addr, int c, size_t size)     
202 {                                                 
203         if (!size)                                
204                 return addr;                      
205         asm volatile("repnz; scasb\n\t"           
206             "jnz 1f\n\t"                          
207             "dec %%edi\n"                         
208             "1:"                                  
209             : "=D" (addr), "=c" (size)            
210             : "" (addr), "1" (size), "a" (c)      
211             : "memory");                          
212         return addr;                              
213 }                                                 
214 EXPORT_SYMBOL(memscan);                           
215 #endif                                            
216                                                   
217 #ifdef __HAVE_ARCH_STRNLEN                        
218 size_t strnlen(const char *s, size_t count)       
219 {                                                 
220         int d0;                                   
221         int res;                                  
222         asm volatile("movl %2,%0\n\t"             
223                 "jmp 2f\n"                        
224                 "1:\tcmpb $0,(%0)\n\t"            
225                 "je 3f\n\t"                       
226                 "incl %0\n"                       
227                 "2:\tdecl %1\n\t"                 
228                 "cmpl $-1,%1\n\t"                 
229                 "jne 1b\n"                        
230                 "3:\tsubl %2,%0"                  
231                 : "=a" (res), "=&d" (d0)          
232                 : "c" (s), "1" (count)            
233                 : "memory");                      
234         return res;                               
235 }                                                 
236 EXPORT_SYMBOL(strnlen);                           
237 #endif                                            
238                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php