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