* libc/machine/arm/strcmp.S (compute_return_value): Fix return value.

* testsuite/newlib.string/strcmp-1.c (main): Add new test cases.
This commit is contained in:
Corinna Vinschen 2012-11-30 09:31:38 +00:00
parent d551cb9226
commit b8637f43b0
3 changed files with 52 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2012-11-30 Greta Yorsh <Greta.Yorsh@arm.com>
* libc/machine/arm/strcmp.S (compute_return_value): Fix return value.
* testsuite/newlib.string/strcmp-1.c (main): Add new test cases.
2012-11-29 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libc/include/sys/reent.h (__sFILE): Change type of _offset

View File

@ -396,7 +396,17 @@ do_return:
lsr r2, r2, r0
compute_return_value:
subs r0, r1, r2
movs r0, #1
cmp r1, r2
/* The return value is computed as follows.
If r1>r2 then (C==1 and Z==0) and LS doesn't hold and r0 is #1 at return.
If r1<r2 then (C==0 and Z==0) and we execute SBC with carry_in=0,
which means r0:=r0-r0-1 and r0 is #-1 at return.
If r1=r2 then (C==1 and Z==1) and we execute SBC with carry_in=1,
which means r0:=r0-r0 and r0 is #0 at return.
(C==0 and Z==1) cannot happen because the carry bit is "not borrow". */
it ls
sbcls r0, r0, r0
bx lr

View File

@ -239,6 +239,42 @@ main (void)
}
}
}
/* Check some corner cases. */
src[1] = 'A';
dest[1] = 'A';
src[2] = 'B';
dest[2] = 'B';
src[3] = 'C';
dest[3] = 'C';
src[4] = '\0';
dest[4] = '\0';
src[0] = 0xc1;
dest[0] = 0x41;
ret = strcmp (src, dest);
if (ret <= 0)
print_error ("\nFailed: expected positive, return %d\n", ret);
src[0] = 0x01;
dest[0] = 0x82;
ret = strcmp (src, dest);
if (ret >= 0)
print_error ("\nFailed: expected negative, return %d\n", ret);
dest[0] = src[0] = 'D';
src[3] = 0xc1;
dest[3] = 0x41;
ret = strcmp (src, dest);
if (ret <= 0)
print_error ("\nFailed: expected positive, return %d\n", ret);
src[3] = 0x01;
dest[3] = 0x82;
ret = strcmp (src, dest);
if (ret >= 0)
print_error ("\nFailed: expected negative, return %d\n", ret);
printf ("\n");
if (errors != 0)
{