]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/newlib-tumbl.git/commitdiff
* libc/machine/arm/strcmp.S (compute_return_value): Fix return value.
authorCorinna Vinschen <corinna@vinschen.de>
Fri, 30 Nov 2012 09:31:38 +0000 (09:31 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Fri, 30 Nov 2012 09:31:38 +0000 (09:31 +0000)
* testsuite/newlib.string/strcmp-1.c (main): Add new test cases.

newlib/ChangeLog
newlib/libc/machine/arm/strcmp.S
newlib/testsuite/newlib.string/strcmp-1.c

index c6a9758d75a11af8ff25f5a327bdfac2059af9ea..c376d9ba911882ae21c11622b64db679c208c790 100644 (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
index 6298bc98d277fee7fbd668fc772e2ded7e26107e..0a4057e3b10aafc5fe76163a4e199b06effc7d30 100644 (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
 
 
index a5258999f86f272b7de40f3e813587859bc3d74c..71a17d6882223522262baefe6b048c11de6d835f 100644 (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)
     {