^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/lib/csumpartialcopygeneric.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1995-2001 Russell King
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/assembler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * unsigned int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * csum_partial_copy_xxx(const char *src, char *dst, int len, int sum, )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * r0 = src, r1 = dst, r2 = len, r3 = sum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Returns : r0 = checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Note that 'tst' and 'teq' preserve the carry flag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) src .req r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) dst .req r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) len .req r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) sum .req r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) .Lzero: mov r0, sum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) load_regs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * Align an unaligned destination pointer. We know that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * we have >= 8 bytes here, so we don't need to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * the length. Note that the source pointer hasn't been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * aligned yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .Ldst_unaligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) tst dst, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) beq .Ldst_16bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) load1b ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) sub len, len, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) adcs sum, sum, ip, put_byte_1 @ update checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) strb ip, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) tst dst, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) reteq lr @ dst is now 32bit aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .Ldst_16bit: load2b r8, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) sub len, len, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) adcs sum, sum, r8, put_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) strb r8, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) adcs sum, sum, ip, put_byte_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) strb ip, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ret lr @ dst is now 32bit aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * Handle 0 to 7 bytes, with any alignment of source and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * destination pointers. Note that when we get here, C = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .Lless8: teq len, #0 @ check for zero count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) beq .Lzero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* we must have at least one byte. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) tst dst, #1 @ dst 16-bit aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) beq .Lless8_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* Align dst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) load1b ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) sub len, len, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) adcs sum, sum, ip, put_byte_1 @ update checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) strb ip, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) tst len, #6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) beq .Lless8_byteonly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 1: load2b r8, ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) sub len, len, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) adcs sum, sum, r8, put_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) strb r8, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) adcs sum, sum, ip, put_byte_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) strb ip, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .Lless8_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) tst len, #6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) bne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .Lless8_byteonly:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) tst len, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) beq .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) load1b r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) adcs sum, sum, r8, put_byte_0 @ update checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) strb r8, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) b .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) FN_ENTRY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) save_regs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) mov sum, #-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) cmp len, #8 @ Ensure that we have at least
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) blo .Lless8 @ 8 bytes to copy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) adds sum, sum, #0 @ C = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) tst dst, #3 @ Test destination alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) blne .Ldst_unaligned @ align destination, return here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * Ok, the dst pointer is now 32bit aligned, and we know
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * that we must have more than 4 bytes to copy. Note
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * that C contains the carry from the dst alignment above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) tst src, #3 @ Test source alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) bne .Lsrc_not_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* Routine for src & dst aligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) bics ip, len, #15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) beq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 1: load4l r4, r5, r6, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) stmia dst!, {r4, r5, r6, r7}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) adcs sum, sum, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) adcs sum, sum, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) sub ip, ip, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) teq ip, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) bne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 2: ands ip, len, #12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) tst ip, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) beq 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) load2l r4, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) stmia dst!, {r4, r5}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) tst ip, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 3: load1l r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) str r4, [dst], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 4: ands len, len, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) beq .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) load1l r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) tst len, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) mov r5, r4, get_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) beq .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) adcs sum, sum, r4, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mov r5, r4, get_byte_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) mov r5, r4, get_byte_2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .Lexit: tst len, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) strbne r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) andne r5, r5, #255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) adcsne sum, sum, r5, put_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * If the dst pointer was not 16-bit aligned, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * need to rotate the checksum here to get around
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * the inefficient byte manipulations in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * architecture independent code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) .Ldone: adc r0, sum, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ldr sum, [sp, #0] @ dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) tst sum, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) movne r0, r0, ror #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) load_regs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .Lsrc_not_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) adc sum, sum, #0 @ include C from dst alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) and ip, src, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) bic src, src, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) load1l r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) cmp ip, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) beq .Lsrc2_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) bhi .Lsrc3_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) mov r4, r5, lspull #8 @ C = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) bics ip, len, #15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) beq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 1: load4l r5, r6, r7, r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) orr r4, r4, r5, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) mov r5, r5, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) orr r5, r5, r6, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) mov r6, r6, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) orr r6, r6, r7, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) mov r7, r7, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) orr r7, r7, r8, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) stmia dst!, {r4, r5, r6, r7}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) adcs sum, sum, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) adcs sum, sum, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) mov r4, r8, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) sub ip, ip, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) teq ip, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) bne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 2: ands ip, len, #12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) tst ip, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) beq 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) load2l r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) orr r4, r4, r5, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) mov r5, r5, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) orr r5, r5, r6, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) stmia dst!, {r4, r5}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) mov r4, r6, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) tst ip, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 3: load1l r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) orr r4, r4, r5, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) str r4, [dst], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) mov r4, r5, lspull #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 4: ands len, len, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) beq .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) mov r5, r4, get_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) tst len, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) beq .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) adcs sum, sum, r4, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) mov r5, r4, get_byte_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) mov r5, r4, get_byte_2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) b .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .Lsrc2_aligned: mov r4, r5, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) adds sum, sum, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) bics ip, len, #15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) beq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 1: load4l r5, r6, r7, r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) orr r4, r4, r5, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) mov r5, r5, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) orr r5, r5, r6, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) mov r6, r6, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) orr r6, r6, r7, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) mov r7, r7, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) orr r7, r7, r8, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) stmia dst!, {r4, r5, r6, r7}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) adcs sum, sum, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) adcs sum, sum, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) mov r4, r8, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) sub ip, ip, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) teq ip, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) bne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 2: ands ip, len, #12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) tst ip, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) beq 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) load2l r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) orr r4, r4, r5, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) mov r5, r5, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) orr r5, r5, r6, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) stmia dst!, {r4, r5}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) mov r4, r6, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) tst ip, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 3: load1l r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) orr r4, r4, r5, lspush #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) str r4, [dst], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) mov r4, r5, lspull #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 4: ands len, len, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) beq .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) mov r5, r4, get_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) tst len, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) beq .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) mov r5, r4, get_byte_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) tst len, #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) beq .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) load1b r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) b .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .Lsrc3_aligned: mov r4, r5, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) adds sum, sum, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) bics ip, len, #15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) beq 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 1: load4l r5, r6, r7, r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) orr r4, r4, r5, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) mov r5, r5, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) orr r5, r5, r6, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) mov r6, r6, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) orr r6, r6, r7, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) mov r7, r7, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) orr r7, r7, r8, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) stmia dst!, {r4, r5, r6, r7}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) adcs sum, sum, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) adcs sum, sum, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) mov r4, r8, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) sub ip, ip, #16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) teq ip, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) bne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 2: ands ip, len, #12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) tst ip, #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) beq 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) load2l r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) orr r4, r4, r5, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) mov r5, r5, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) orr r5, r5, r6, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) stmia dst!, {r4, r5}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) adcs sum, sum, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) mov r4, r6, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) tst ip, #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) beq 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 3: load1l r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) orr r4, r4, r5, lspush #8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) str r4, [dst], #4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) mov r4, r5, lspull #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 4: ands len, len, #3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) beq .Ldone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) mov r5, r4, get_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) tst len, #2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) beq .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) adcs sum, sum, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) load1l r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) mov r5, r4, get_byte_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) strb r5, [dst], #1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) adcs sum, sum, r4, lspush #24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) mov r5, r4, get_byte_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) b .Lexit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) FN_EXIT