]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
PowerPC: Add comments to optimized strncpy
authorGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Tue, 15 Sep 2015 13:51:08 +0000 (10:51 -0300)
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Thu, 1 Oct 2015 20:36:55 +0000 (17:36 -0300)
* sysdeps/powerpc/powerpc64/power8/strncpy.S: Added comments to some
assembly instructions.

ChangeLog
sysdeps/powerpc/powerpc64/power8/strncpy.S

index 9039de10c3b5cbad69d978f82f719874e9a7b82e..d410e0feef6371396063e42aa83c0f73e9149a7a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-01  Gabriel F. T. Gomes  <gftg@linux.vnet.ibm.com>
+
+       * sysdeps/powerpc/powerpc64/power8/strncpy.S: Added comments to some
+       assembly instructions.
+
 2015-10-01  Gabriel F. T. Gomes  <gftg@linux.vnet.ibm.com>
 
        * sysdeps/powerpc/powerpc64/power8/strncpy.S: Remove or add register
index 380d7e1bf1a1d241823a9b708756ff23aa501089..663829f2dfb8b11cae30b81a8483629136c6986f 100644 (file)
@@ -82,44 +82,80 @@ EALIGN (FUNC_NAME, 4, 0)
 L(short_path):
        mr      r9,r3
 L(short_path_1):
+       /* Return if there are no more bytes to be written.  */
        cmpdi   cr7,r5,0
        beq     cr7,L(short_path_loop_end_1)
 L(short_path_2):
+       /* Copy one char from src (r4) and write it to dest (r9).  If it is the
+          end-of-string, start the null padding.  Continue, otherwise.  */
        lbz     r10,0(r4)
        cmpdi   cr7,r10,0
        stb     r10,0(r9)
        beq     cr7,L(zero_pad_start_1)
+       /* If there are no more bytes to be written, return.  */
        cmpdi   cr0,r5,1
        addi    r8,r9,1
        addi    r6,r5,-1
        beq     cr0,L(short_path_loop_end_0)
+       /* Copy another char from src (r4) to dest (r9).  Check again if it is
+          the end-of-string.  If so, start the null padding.  */
        lbz     r10,1(r4)
        cmpdi   cr7,r10,0
        stb     r10,1(r9)
        beq     cr7,L(zero_pad_start_prepare_1)
+       /* Eagerly decrement r5 by 3, which is the number of bytes already
+          written, plus one write that will be performed later on.  */
        addi    r10,r5,-3
        b       L(short_path_loop_1)
 
        .align  4
 L(short_path_loop):
+       /* At this point, the induction variable, r5, as well as the pointers
+          to dest and src (r9 and r4, respectivelly) have been updated.
+
+          Note: The registers r7 and r10 are induction variables derived from
+          r5.  They are used to determine if the total number of writes has
+          been reached at every other write.
+
+          Copy one char from src (r4) and write it to dest (r9).  If it is the
+          end-of-string, start the null padding.  Continue, otherwise.  */
        lbz     r8,0(r4)
        addi    r7,r10,-2
        cmpdi   cr5,r8,0
        stb     r8,0(r9)
        beq     cr5,L(zero_pad_start_1)
        beq     cr7,L(short_path_loop_end_0)
+       /* Copy another char from src (r4) to dest (r9).  Check again if it is
+          the end-of-string.  If so, start the null padding.  */
        lbz     r8,1(r4)
        cmpdi   cr7,r8,0
        stb     r8,1(r9)
        beq     cr7,L(zero_pad_start)
        mr      r10,r7
 L(short_path_loop_1):
+       /* This block is reached after two chars have been already written to
+          dest.  Nevertheless, r5 (the induction variable), r9 (the pointer to
+          dest), and r4 (the pointer to src) have not yet been updated.
+
+          At this point:
+            r5 holds the count of bytes yet to be written plus 2.
+            r9 points to the last two chars that were already written to dest.
+            r4 points to the last two chars that were already copied from src.
+
+          The algorithm continues by decrementing r5, the induction variable,
+          so that it reflects the last two writes.  The pointers to dest (r9)
+          and to src (r4) are increment by two, for the same reason.
+
+          Note: Register r10 is another induction variable, derived from r5,
+          which determines if the total number of writes has been reached.  */
        addic.  r5,r5,-2
        addi    r9,r9,2
-       cmpdi   cr7,r10,0
+       cmpdi   cr7,r10,0 /* Eagerly check if the next write is the last.  */
        addi    r4,r4,2
        addi    r6,r9,1
-       bne     cr0,L(short_path_loop)
+       bne     cr0,L(short_path_loop) /* Check if the total number of writes
+                                         has been reached at every other
+                                         write.  */
 #ifdef USE_AS_STPNCPY
        mr      r3,r9
        b       L(short_path_loop_end)