Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 May 2009 07:59:55 -0500 (CDT)
From:      Mark Tinguely <tinguely@casselton.net>
To:        channa.kad@gmail.com, mlfbsd@ci0.org, tinguely@casselton.net, venkiece2005@gmail.com
Cc:        freebsd-arm@freebsd.org
Subject:   Re: strncmp issue
Message-ID:  <200905041259.n44CxtV2077931@casselton.net>
In-Reply-To: <515c64960905032352j25edfbcajb3d146fa769b97bb@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

Hi, the propose code by both of you two:

/* if (len == 0) return 0 */
	cmp	r2, #0
	moveq	r0, #0
	moveq	pc, lr

/* ip == last src address to compare */
	add	ip, r0, r2
1:
	ldrb	r2, [r0], #1
	ldrb	r3, [r1], #1
	cmp	ip, r0
	cmp	r2, #1
	cmpcs	r2, r3
	beq	1b
	sub	r0, r2, r3

That was one of my failed attempts. I to was hoping to not add the branch
to cut down in cycles. A person has to test every possible call to strncmp.
This will fail on a positive string length less than strlen length of the
input strings:

strncmp("abcdefg", "abcdefh", 6)

Will return (-1) str1 < str2 at 6 characters which is wrong.


/* if (len == 0) return 0 */
	cmp	r2, #0
	moveq	r0, #0
	moveq	pc, lr

/* ip == last src address to compare */
	add	ip, r0, r2
1:
	ldrb	r2, [r0], #1
	ldrb	r3, [r1], #1
	cmp	ip, r0
	beq	2f		<- stops in the case where strlen(s1) > len
	cmp	r2, #1		<- stops thea NULL case, we can't just change
				   the comparison because below we loop on
				   an equality and can end up in a big loop
				
	cmpcs	r2, r3		<- compare characters.
	beq	1b
2:
	sub	r0, r2, r3




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905041259.n44CxtV2077931>