Well, I suggested it, so here's my attempt to switch powerpc64's
libc memmove.S over to 64 bits:
* Treat length parameter as 64 bits (size_t) instead of 32 (u_int).
* Set up the main loop to copy 64-bit doublewords instead of 32-bit
  words.

This definitely needs double and triple checking.

Things I wonder about, but didn't touch:
* Why is the memcpy entry point commented out?
* END... STRONG? WEAK? BUILTIN?

Index: memmove.S
===================================================================
RCS file: /cvs/src/lib/libc/arch/powerpc64/string/memmove.S,v
retrieving revision 1.1
diff -u -p -r1.1 memmove.S
--- memmove.S   25 Jun 2020 02:34:22 -0000      1.1
+++ memmove.S   26 Jun 2020 22:22:51 -0000
@@ -39,7 +39,7 @@
  * ==========================================================================
  */
 
-#include "SYS.h"
+#include "DEFS.h"
 
         .text
 
@@ -64,45 +64,45 @@ ENTRY(memmove)
                                        /* start of dest                */
 
 fwd:
-       addi    %r4, %r4, -4            /* Back up src and dst pointers */
-       addi    %r8, %r8, -4            /* due to auto-update of 'load' */
+       addi    %r4, %r4, -8            /* Back up src and dst pointers */
+       addi    %r8, %r8, -8            /* due to auto-update of 'load' */
 
-       srwi.   %r9,%r5,2               /* How many words in total cnt  */
-       beq-    last1                   /* Handle byte by byte if < 4   */
+       srdi.   %r9,%r5,3               /* Doublewords in total count   */
+       beq-    last1                   /* Handle byte by byte if < 8   */
                                        /* bytes total                  */
-       mtctr   %r9                     /* Count of words for loop      */
-       lwzu    %r7, 4(%r4)             /* Preload first word           */
+       mtctr   %r9                     /* Count of dwords for loop     */
+       ldu     %r7, 8(%r4)             /* Preload first doubleword     */
 
        b       g1
 
 g0:                                    /* Main loop                    */
 
-       lwzu    %r7, 4(%r4)             /* Load a new word              */
-       stwu    %r6, 4(%r8)             /* Store previous word          */
+       ldu     %r7, 8(%r4)             /* Load a new doubleword        */
+       stdu    %r6, 8(%r8)             /* Store previous doubleword    */
 
 g1:
 
        bdz-    last                    /* Dec cnt, and branch if just  */
-                                       /* one word to store            */
-       lwzu    %r6, 4(%r4)             /* Load another word            */
-       stwu    %r7, 4(%r8)             /* Store previous word          */
+                                       /* one doubleword to store      */
+       ldu     %r6, 8(%r4)             /* Load another doubleword      */
+       stdu    %r7, 8(%r8)             /* Store previous doubleword    */
        bdnz+   g0                      /* Dec cnt, and loop again if   */
-                                       /* more words                   */
-       mr      %r7, %r6                /* If word count -> 0, then...  */
+                                       /* more doublewords             */
+       mr      %r7, %r6                /* If dword count -> 0, then... */
 
 last:
 
-       stwu    %r7, 4(%r8)             /* ... store last word          */
+       stdu    %r7, 8(%r8)             /* ... store last doubleword    */
 
 last1:                                 /* Byte-by-byte copy            */
 
-       clrlwi. %r5,%r5,30              /* If count -> 0, then ...      */
+       clrldi. %r5,%r5,61              /* If count -> 0, then ...      */
        beqlr                           /* we're done                   */
 
        mtctr   %r5                     /* else load count for loop     */
 
-       lbzu    %r6, 4(%r4)             /* 1st byte: update addr by 4   */
-       stbu    %r6, 4(%r8)             /* since we pre-adjusted by 4   */
+       lbzu    %r6, 8(%r4)             /* 1st byte: update addr by 8   */
+       stbu    %r6, 8(%r8)             /* since we pre-adjusted by 8   */
        bdzlr-                          /* in anticipation of main loop */
 
 last2:
@@ -120,40 +120,40 @@ reverse:
 
        add     %r4, %r4, %r5           /* Work from end to beginning   */
        add     %r8, %r8, %r5           /* so add count to string ptrs  */
-       srwi.   %r9,%r5,2               /* Words in total count         */
-       beq-    rlast1                  /* Handle byte by byte if < 4   */
+       srdi.   %r9,%r5,3               /* Doublewords in total count   */
+       beq-    rlast1                  /* Handle byte by byte if < 8   */
                                        /* bytes total                  */
 
-       mtctr   %r9                     /* Count of words for loop      */
+       mtctr   %r9                     /* Count of dwords for loop     */
 
-       lwzu    %r7, -4(%r4)            /* Preload first word           */
+       ldu     %r7, -8(%r4)            /* Preload first doubleword     */
        b       rg1
 
 rg0:                                   /* Main loop                    */
 
-       lwzu    %r7, -4(%r4)            /* Load a new word              */
-       stwu    %r6, -4(%r8)            /* Store previous word          */
+       ldu     %r7, -8(%r4)            /* Load a new doubleword        */
+       stdu    %r6, -8(%r8)            /* Store previous doubleword    */
 
 rg1:
 
        bdz-    rlast                   /* Dec cnt, and branch if just  */
-                                       /* one word to store            */
+                                       /* one doubleword to store      */
 
-       lwzu    %r6, -4(%r4)            /* Load another word            */
-       stwu    %r7, -4(%r8)            /* Store previous word          */
+       ldu     %r6, -8(%r4)            /* Load another doubleword      */
+       stdu    %r7, -8(%r8)            /* Store previous doubleword    */
 
        bdnz+   rg0                     /* Dec cnt, and loop again if   */
-                                       /* more words                   */
+                                       /* more doublewords             */
 
-       mr      %r7, %r6                /* If word count -> 0, then...  */
+       mr      %r7, %r6                /* If dword count -> 0, then... */
 
 rlast:
 
-       stwu    %r7, -4(%r8)            /* ... store last word          */
+       stdu    %r7, -8(%r8)            /* ... store last doubleword    */
 
 rlast1:                                        /* Byte-by-byte copy            
*/
 
-       clrlwi. %r5,%r5,30              /* If count -> 0, then...       */
+       clrldi. %r5,%r5,61              /* If count -> 0, then...       */
        beqlr                           /* ... we're done               */
 
        mtctr   %r5                     /* else load count for loop     */
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to