summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/i386/strcmp.S
blob: e01064ffb2b6cde827c3a3d11a76688ef6d7a9c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.text
.global strcmp
.type	strcmp,@function
.weak	strcoll
.type	strcoll,@function

#ifdef HIGH_PERFORMANCE
.align 	16
#endif

.Ldiff:
	movzbl	(%edx), %ecx
	subl	%ecx, %eax		# (unsigned char)*p - (unsigned char)*q, so wie die Original libc
	ret				# und ohne Überlaufprobleme: 
					# (int) ((signed char)c - (signed char)d) != (int)(signed char) ((unsigned char)c - (unsigned char)d)
					# c = 'ä', d = 'e': left expression: -129, right expression: 127

strcoll:
strcmp:
	movl 	4(%esp), %ecx
	movl 	8(%esp), %edx
	xorl	%eax, %eax
.Lloop:					# Schleifenanfang liegt genau auf Modulanfang + 0x10, damit alignbar
	movb 	(%ecx), %al
	cmpb	(%edx), %al
	jnz	.Ldiff
	incl 	%edx
	incl 	%ecx
	testb	%al, %al
	jnz	.Lloop
	ret