Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/common/lib/libc/arch/aarch64/string Fixed to not use the "br...



details:   https://anonhg.NetBSD.org/src/rev/ca73623b9456
branches:  trunk
changeset: 1009052:ca73623b9456
user:      ryo <ryo%NetBSD.org@localhost>
date:      Sat Apr 11 05:12:52 2020 +0000

description:
Fixed to not use the "br" instruction. Branch Target Identification (BTI) doesn't like "br".

requested by maxv@

diffstat:

 common/lib/libc/arch/aarch64/string/bcopy.S  |  134 ++++++++++++++++++--------
 common/lib/libc/arch/aarch64/string/memset.S |   30 +++--
 2 files changed, 110 insertions(+), 54 deletions(-)

diffs (245 lines):

diff -r b183fd4509eb -r ca73623b9456 common/lib/libc/arch/aarch64/string/bcopy.S
--- a/common/lib/libc/arch/aarch64/string/bcopy.S       Sat Apr 11 01:51:14 2020 +0000
+++ b/common/lib/libc/arch/aarch64/string/bcopy.S       Sat Apr 11 05:12:52 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bcopy.S,v 1.1 2018/02/04 21:52:16 skrll Exp $ */
+/* $NetBSD: bcopy.S,v 1.2 2020/04/11 05:12:52 ryo Exp $ */
 
 /*
  * Copyright (c) 2018 Ryo Shimizu <ryo%nerv.org@localhost>
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 
 #if defined(LIBC_SCCS)
-RCSID("$NetBSD: bcopy.S,v 1.1 2018/02/04 21:52:16 skrll Exp $")
+RCSID("$NetBSD: bcopy.S,v 1.2 2020/04/11 05:12:52 ryo Exp $")
 #endif
 
 #if defined(MEMCOPY)
@@ -207,32 +207,60 @@
 #endif /* (STP_ALIGN > 8) */
 9:
 
+backward_copy1k:
+       /* while (len >= 1024) */
+       /* { src -= 1024; dst -= 1024; copy1024(dst, src); len -= 1024; } */
        cmp     LEN, #1024
-       bhs     backward_copy1k
-backward_less1k:
-       /* copy 16*n bytes */
-       and     TMP_D, LEN, #(1023-15)          /* len &= 1023; len &= ~15; */
-       adr     TMP_X, 8f
-       sub     LEN, LEN, TMP_D
-       sub     TMP_X, TMP_X, TMP_D, lsr #1     /* jump to (8f - len/2) */
-       br      TMP_X
-backward_copy1k:       /* copy 16*64 bytes */
+       blo     9f
+1:
        sub     LEN, LEN, #1024
        .rept   (1024 / 16)
        ldp     DATA0, DATA1, [SRC0, #-16]!     /* *--dst = *--src; */
        stp     DATA0, DATA1, [DST, #-16]!
        .endr
-8:
-       cbz     LEN, done
        cmp     LEN, #1024
-       bhs     backward_copy1k
-       cmp     LEN, #16
-       bhs     backward_less1k
+       bhs     1b
+9:
 
+       /* if (len & 512) { src -= 512; dst -= 512; copy512(dst, src); } */
+       tbz     LEN, #9, 1f
+       .rept   (512 / 16)
+       ldp     DATA0, DATA1, [SRC0, #-16]!
+       stp     DATA0, DATA1, [DST, #-16]!
+       .endr
+1:
+       /* if (len & 256) { src -= 256; dst -= 256; copy256(dst, src); } */
+       tbz     LEN, #8, 1f
+       .rept   (256 / 16)
+       ldp     DATA0, DATA1, [SRC0, #-16]!
+       stp     DATA0, DATA1, [DST, #-16]!
+       .endr
+1:
+       /* if (len & 128) { src -= 128; dst -= 128; copy128(dst, src); } */
+       tbz     LEN, #7, 1f
+       .rept   (128 / 16)
+       ldp     DATA0, DATA1, [SRC0, #-16]!
+       stp     DATA0, DATA1, [DST, #-16]!
+       .endr
+1:
+       /* if (len & 64) { src -= 64; dst -= 64; copy64(dst, src); } */
+       tbz     LEN, #6, 1f
+       .rept   (64 / 16)
+       ldp     DATA0, DATA1, [SRC0, #-16]!
+       stp     DATA0, DATA1, [DST, #-16]!
+       .endr
+1:
+       /* if (len & 32) { src -= 32; dst -= 32; copy32(dst, src); } */
+       tbz     LEN, #5, 1f
+       .rept   (32 / 16)
+       ldp     DATA0, DATA1, [SRC0, #-16]!
+       stp     DATA0, DATA1, [DST, #-16]!
+       .endr
+1:
        /* if (len & 16) { *--(uint128_t *)dst = *--(uint128_t *)src; } */
        tbz     LEN, #4, 1f
        ldp     DATA0, DATA1, [SRC0, #-16]!
-       ldp     DATA0, DATA1, [DST, #-16]!
+       stp     DATA0, DATA1, [DST, #-16]!
 1:
        /* if (len & 8) { *--(uint64_t *)dst = *--(uint64_t *)src; } */
        tbz     LEN, #3, 1f
@@ -271,14 +299,10 @@
        bcs     9f
 backward_tiny:
        /* copy 1-10 bytes */
-       adr     TMP_X, 8f
-       sub     TMP_X, TMP_X, LEN, lsl #3       /* jump to (8f - len*2) */
-       br      TMP_X
-       .rept   10
+1:     sub     LEN, LEN, #1
        ldrb    TMP_Xw, [SRC0, #-1]!
        strb    TMP_Xw, [DST, #-1]!
-       .endr
-8:
+       cbz     LEN, 1b
        ret
 9:
        /* length is small(<32), and src or dst may be unaligned */
@@ -548,14 +572,10 @@
        bcs     9f
 forward_tiny:
        /* copy 1-10 bytes */
-       adr     TMP_X, 8f
-       sub     TMP_X, TMP_X, LEN, lsl #3       /* jump to (8f - len*2) */
-       br      TMP_X
-       .rept   10
+1:     sub     LEN, LEN, #1
        ldrb    TMP_Xw, [SRC0], #1
        strb    TMP_Xw, [DST], #1
-       .endr
-8:
+       cbz     LEN, 1b
        ret
 9:
        /* length is small(<32), and src or dst may be unaligned */
@@ -938,28 +958,56 @@
 #endif /* (STP_ALIGN > 8) */
 9:
 
+forward_copy1k:
+       /* while (len >= 1024) */
+       /* { copy1024(dst, src); src += 1024; dst += 1024; len -= 1024; } */
        cmp     LEN, #1024
-       bhs     forward_copy1k
-forward_less1k:
-       /* copy 16*n bytes */
-       and     TMP_D, LEN, #(1023-15)          /* len &= 1023; len &= ~15; */
-       adr     TMP_X, 8f
-       sub     LEN, LEN, TMP_D
-       sub     TMP_X, TMP_X, TMP_D, lsr #1     /* jump to (8f - len/2) */
-       br      TMP_X
-forward_copy1k:        /* copy 16*64 bytes */
+       blo     9f
+1:
        sub     LEN, LEN, #1024
        .rept   (1024 / 16)
        ldp     DATA0, DATA1, [SRC0], #16       /* *dst++ = *src++; */
        stp     DATA0, DATA1, [DST], #16
        .endr
-8:
-       cbz     LEN, done
        cmp     LEN, #1024
-       bhs     forward_copy1k
-       cmp     LEN, #16
-       bhs     forward_less1k
+       bhs     1b
+9:
 
+       /* if (len & 512) { copy512(dst, src); src += 512; dst += 512; */
+       tbz     LEN, #9, 1f
+       .rept   (512 / 16)
+       ldp     DATA0, DATA1, [SRC0], #16
+       stp     DATA0, DATA1, [DST], #16
+       .endr
+1:
+       /* if (len & 256) { copy256(dst, src); src += 256; dst += 256; */
+       tbz     LEN, #8, 1f
+       .rept   (256 / 16)
+       ldp     DATA0, DATA1, [SRC0], #16
+       stp     DATA0, DATA1, [DST], #16
+       .endr
+1:
+       /* if (len & 128) { copy128(dst, src); src += 128; dst += 128; */
+       tbz     LEN, #7, 1f
+       .rept   (128 / 16)
+       ldp     DATA0, DATA1, [SRC0], #16
+       stp     DATA0, DATA1, [DST], #16
+       .endr
+1:
+       /* if (len & 64) { copy64(dst, src); src += 64; dst += 64; */
+       tbz     LEN, #6, 1f
+       .rept   (64 / 16)
+       ldp     DATA0, DATA1, [SRC0], #16
+       stp     DATA0, DATA1, [DST], #16
+       .endr
+1:
+       /* if (len & 32) { copy32(dst, src); src += 32; dst += 32; */
+       tbz     LEN, #5, 1f
+       .rept   (32 / 16)
+       ldp     DATA0, DATA1, [SRC0], #16
+       stp     DATA0, DATA1, [DST], #16
+       .endr
+1:
        /* if (len & 16) { *(uint128_t *)dst++ = *(uint128_t *)src++; } */
        tbz     LEN, #4, 1f
        ldp     DATA0, DATA1, [SRC0], #16
diff -r b183fd4509eb -r ca73623b9456 common/lib/libc/arch/aarch64/string/memset.S
--- a/common/lib/libc/arch/aarch64/string/memset.S      Sat Apr 11 01:51:14 2020 +0000
+++ b/common/lib/libc/arch/aarch64/string/memset.S      Sat Apr 11 05:12:52 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: memset.S,v 1.2 2017/08/29 15:00:23 ryo Exp $ */
+/* $NetBSD: memset.S,v 1.3 2020/04/11 05:12:52 ryo Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -158,18 +158,26 @@
        tbz     x15, #3, .Lzero_qword_aligned
        str     xzr, [x15], #8
 .Lzero_qword_aligned:
-       cbz     x7, .Lblock_aligned     /* less than 16 bytes? just branch */
-       adr     x6, .Lunrolled_end
-       sub     x6, x6, x7, lsl #2      /* backup to write the last N insn */
-       br      x6                      /* and do it */
+       cbz     x7, .Lblock_aligned     /* aligned? just branch */
 
-       /*
-        * The maximum size of DCZID_EL0:BS supported is 2048 bytes.
-        */
-       .rept (2048 / 16) - 1
+       /* align to DCZID_EL0:BS boundary */
+       tbz     x7, #0, 0f              /* fill 16byte? */
+       stp     xzr, xzr, [x15], #16
+0:
+       tbz     x7, #1, 1f              /* fill 32byte? */
+       stp     xzr, xzr, [x15], #16
        stp     xzr, xzr, [x15], #16
-       .endr
-.Lunrolled_end:
+1:
+       lsr     x7, x7, #2
+       cbz     x7, 9f
+.L64bytes_fill:
+       sub     x7, x7, #1
+       stp     xzr, xzr, [x15], #16
+       stp     xzr, xzr, [x15], #16
+       stp     xzr, xzr, [x15], #16
+       stp     xzr, xzr, [x15], #16
+       cbnz    x7, .L64bytes_fill
+9:
 
 /*
  * Now we are block aligned.



Home | Main Index | Thread Index | Old Index