diff options
-rw-r--r-- | newlib/ChangeLog | 5 | ||||
-rw-r--r-- | newlib/libc/machine/arm/strcmp.S | 12 | ||||
-rw-r--r-- | newlib/testsuite/newlib.string/strcmp-1.c | 36 |
3 files changed, 52 insertions, 1 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index c6a9758..c376d9b 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -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 diff --git a/newlib/libc/machine/arm/strcmp.S b/newlib/libc/machine/arm/strcmp.S index 6298bc9..0a4057e 100644 --- a/newlib/libc/machine/arm/strcmp.S +++ b/newlib/libc/machine/arm/strcmp.S @@ -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 diff --git a/newlib/testsuite/newlib.string/strcmp-1.c b/newlib/testsuite/newlib.string/strcmp-1.c index a525899..71a17d6 100644 --- a/newlib/testsuite/newlib.string/strcmp-1.c +++ b/newlib/testsuite/newlib.string/strcmp-1.c @@ -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) { |