| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | !    Copyright (C) 2013 Imagination Technologies Ltd.!    Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.#include <features.h>	.text	.global	_strcmp	.type	_strcmp,function!D1Ar1 s1!D0Ar2 s2_strcmp:	TST	D1Ar1,#3	TSTZ	D0Ar2,#3	MOVT	D1Re0,#0x0101	ADD	D1Re0,D1Re0,#0x0101	BNZ	$Lstrcmp_slow	GETD	D1Ar3,[D1Ar1+#4++]	! Load 32-bits from s1	GETD	D1Ar5,[D0Ar2+#4++]      ! Load 32-bits from s2	LSL	D0FrT,D1Re0,#7		! D0FrT = 0x80808080$Lstrcmp4_loop:	SUB	D0Re0,D1Ar3,D1Re0	! D1Re0 = 0x01010101	MOV	D0Ar6,D1Ar3	SUBS	D0Ar4,D1Ar3,D1Ar5	! Calculate difference	XOR	D0Ar6,D0Ar6,#-1	GETD	D1Ar3,[D1Ar1+#4++]	! Load 32-bits from s1	AND	D0Re0,D0Re0,D0Ar6	ANDSZ	D0Ar6,D0Re0,D0FrT	! D0FrT = 0x80808080	GETD	D1Ar5,[D0Ar2+#4++]      ! Load 32-bits from s2	BZ	$Lstrcmp4_loop	AND	D0Ar6, D0Re0, D0FrT	! D0FrT = 0x80808080!! Either they are different or they both contain a NULL + junk!$Lstrcmp4_end:	LSLS	D0Re0,D0Ar4,#24		! Was Byte[0] the same?	LSLSZ	D0Ar2,D0Ar6,#24		! Yes: AND they where not zero?	LSLSZ	D0Re0,D0Ar4,#16		! Yes: Was Byte[1] the same?	LSLSZ	D0Ar2,D0Ar6,#16		! Yes: AND they where not zero?	LSLSZ	D0Re0,D0Ar4,#8		! Tes: Was Byte[2] the same?	LSLSZ	D0Ar2,D0Ar6,#8		! Yes: AND they where not zero?	MOVZ	D0Re0,D0Ar4		! Yes: Must by Byte[3] thats the result	ASR	D0Re0,D0Re0,#24		! Sign extend result to integer	MOV	PC,D1RtP!! Misaligned case, byte at a time!$Lstrcmp_slow:	GETB	D1Ar3,[D1Ar1++]		! Load char from s1	GETB	D1Ar5,[D0Ar2++]         ! Load char from s2	CMP	D1Ar3,#1		! Null -> C and NZ, rest -> NC (\1->Z)	CMPNC	D1Ar3,D1Ar5		! NOT Null: Same -> Z, else -> NZ	BZ	$Lstrcmp_slow		! NOT Null and Same: Loop	SUB	D0Re0,D1Ar3,D1Ar5	! Generate result	MOV	PC,D1RtP        .size _strcmp,.-_strcmplibc_hidden_def(strcmp)#ifndef __UCLIBC_HAS_LOCALE__strong_alias(strcmp,strcoll)libc_hidden_def(strcoll)#endif
 |