mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01:00 
			
		
		
		
	string: Use memcpy() within memmove() when we can
A common use of memmove() can be handled by memcpy(). Also memcpy() includes an optimization for large sizes: it copies a word at a time. So we can get a speed-up by calling memcpy() to handle our move in this case. Update memmove() to call also memcpy() if the source don't overlap the destination (src + count <= dest). Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
This commit is contained in:
		
				
					committed by
					
						 Tom Rini
						Tom Rini
					
				
			
			
				
	
			
			
			
						parent
						
							67b2ed0243
						
					
				
				
					commit
					976a68a20d
				
			
							
								
								
									
										14
									
								
								lib/string.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								lib/string.c
									
									
									
									
									
								
							| @@ -567,7 +567,19 @@ void * memmove(void * dest,const void *src,size_t count) | ||||
| { | ||||
| 	char *tmp, *s; | ||||
|  | ||||
| 	if (dest <= src) { | ||||
| 	if (dest <= src || (src + count) <= dest) { | ||||
| 	/* | ||||
| 	 * Use the fast memcpy implementation (ARCH optimized or lib/string.c) when it is possible: | ||||
| 	 * - when dest is before src (assuming that memcpy is doing forward-copying) | ||||
| 	 * - when destination don't overlap the source buffer (src + count <= dest) | ||||
| 	 * | ||||
| 	 * WARNING: the first optimisation cause an issue, when __HAVE_ARCH_MEMCPY is defined, | ||||
| 	 *          __HAVE_ARCH_MEMMOVE is not defined and if the memcpy ARCH-specific | ||||
| 	 *          implementation is not doing a forward-copying. | ||||
| 	 * | ||||
| 	 * No issue today because memcpy is doing a forward-copying in lib/string.c and for ARM32 | ||||
| 	 * architecture; no other arches use __HAVE_ARCH_MEMCPY without __HAVE_ARCH_MEMMOVE. | ||||
| 	 */ | ||||
| 		memcpy(dest, src, count); | ||||
| 	} else { | ||||
| 		tmp = (char *) dest + count; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user