xref: /linux/arch/x86/include/asm/shared/string.h (revision 5b6fe00406ce967c556d544a7fc80233341c67c8)
1*5b6fe004SMauricio Faria de Oliveira /* SPDX-License-Identifier: GPL-2.0 */
2*5b6fe004SMauricio Faria de Oliveira #ifndef _ASM_X86_SHARED_STRING_H
3*5b6fe004SMauricio Faria de Oliveira #define _ASM_X86_SHARED_STRING_H
4*5b6fe004SMauricio Faria de Oliveira 
5*5b6fe004SMauricio Faria de Oliveira /*
6*5b6fe004SMauricio Faria de Oliveira  * Returns:	0 (equal)
7*5b6fe004SMauricio Faria de Oliveira  * 		1 (not equal)
8*5b6fe004SMauricio Faria de Oliveira  *
9*5b6fe004SMauricio Faria de Oliveira  * In contrast, the regular memcmp() follows glibc return value semantics.
10*5b6fe004SMauricio Faria de Oliveira  */
11*5b6fe004SMauricio Faria de Oliveira static __always_inline int __inline_memcmp(const void *s1, const void *s2, size_t len)
12*5b6fe004SMauricio Faria de Oliveira {
13*5b6fe004SMauricio Faria de Oliveira 	bool diff;
14*5b6fe004SMauricio Faria de Oliveira 
15*5b6fe004SMauricio Faria de Oliveira 	/*
16*5b6fe004SMauricio Faria de Oliveira 	 * Make sure ZF is properly set in the len==0 case because in it,
17*5b6fe004SMauricio Faria de Oliveira 	 * RCX==0 and the REPE; CMPSB won't get executed.
18*5b6fe004SMauricio Faria de Oliveira 	 *
19*5b6fe004SMauricio Faria de Oliveira 	 * The "cc" clobber has no meaning anymore, just source compatibility.
20*5b6fe004SMauricio Faria de Oliveira 	 * On x86 the flag status bits are automatically added to the clobber
21*5b6fe004SMauricio Faria de Oliveira 	 * set when there are no =@ccXY constraints. Keep it as documentation.
22*5b6fe004SMauricio Faria de Oliveira 	 */
23*5b6fe004SMauricio Faria de Oliveira 	asm volatile("test %3, %3\n\t"
24*5b6fe004SMauricio Faria de Oliveira 		     "repe cmpsb"
25*5b6fe004SMauricio Faria de Oliveira 		     : "=@ccnz" (diff), "+D" (s1), "+S" (s2), "+c" (len)
26*5b6fe004SMauricio Faria de Oliveira 		     : : /* "cc", */ "memory");
27*5b6fe004SMauricio Faria de Oliveira 
28*5b6fe004SMauricio Faria de Oliveira 	return diff;
29*5b6fe004SMauricio Faria de Oliveira }
30*5b6fe004SMauricio Faria de Oliveira 
31*5b6fe004SMauricio Faria de Oliveira #endif /* _ASM_X86_SHARED_STRING_H */
32