^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) .macro GET_FRONT_BITS rx y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifdef __cskyLE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) lsri \rx, \y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) lsli \rx, \y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .macro GET_AFTER_BITS rx y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #ifdef __cskyLE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) lsli \rx, \y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) lsri \rx, \y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* void *memcpy(void *dest, const void *src, size_t n); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ENTRY(memcpy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mov r7, r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) bt .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) mov r6, r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) andi r6, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) cmpnei r6, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) jbt .L_dest_not_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) mov r6, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) andi r6, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) cmpnei r6, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) jbt .L_dest_aligned_but_src_not_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .L0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) jbt .L_aligned_and_len_less_16bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) subi sp, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) stw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .L_aligned_and_len_larger_16bytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ldw r1, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ldw r5, (r3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ldw r8, (r3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) stw r1, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ldw r1, (r3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) stw r5, (r7, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) stw r8, (r7, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) stw r1, (r7, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) subi r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) addi r3, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) addi r7, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) jbf .L_aligned_and_len_larger_16bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ldw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) addi sp, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) cmpnei r4, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) jbf .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .L_aligned_and_len_less_16bytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) bt .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .L1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ldw r1, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) stw r1, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) subi r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) addi r3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) addi r7, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) jbf .L1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) br .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .L_return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .L_copy_by_byte: /* len less than 4 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) cmpnei r4, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) jbf .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .L4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ldb r1, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) stb r1, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) addi r3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) addi r7, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) decne r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) jbt .L4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * If dest is not aligned, just copying some bytes makes the dest align.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * Afther that, we judge whether the src is aligned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .L_dest_not_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) mov r5, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) rsub r5, r5, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) abs r5, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) cmplt r5, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) bt .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) mov r5, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) sub r5, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) cmphs r5, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) bf .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) mov r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .L5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ldb r1, (r3, 0) /* makes the dest align. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) stb r1, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) addi r5, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) subi r4, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) addi r3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) addi r7, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) cmpnei r5, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) jbt .L5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) jbt .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) mov r6, r3 /* judge whether the src is aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) andi r6, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) cmpnei r6, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) jbf .L0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* Judge the number of misaligned, 1, 2, 3? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .L_dest_aligned_but_src_not_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) mov r5, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) rsub r5, r5, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) abs r5, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) cmplt r5, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) bt .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) bclri r3, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) bclri r3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ldw r1, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) addi r3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) cmpnei r6, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) bf .L_dest_aligned_but_src_not_aligned_2bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) cmpnei r6, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) bf .L_dest_aligned_but_src_not_aligned_3bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .L_dest_aligned_but_src_not_aligned_1byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) mov r5, r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) sub r5, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) cmphs r5, r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) bf .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) bf .L11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .L10: /* If the len is less than 16 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) GET_FRONT_BITS r1 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) mov r5, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ldw r6, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mov r1, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) GET_AFTER_BITS r6 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) or r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) stw r5, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) subi r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) addi r3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) addi r7, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) bf .L10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) subi r3, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) br .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .L11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) subi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) stw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) stw r9, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) stw r10, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) stw r11, (sp, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .L12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ldw r5, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) ldw r11, (r3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ldw r8, (r3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ldw r9, (r3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) GET_FRONT_BITS r1 8 /* little or big endian? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) mov r10, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) GET_AFTER_BITS r5 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) or r5, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) GET_FRONT_BITS r10 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) mov r1, r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) GET_AFTER_BITS r11 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) or r11, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) GET_FRONT_BITS r1 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) mov r10, r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) GET_AFTER_BITS r8 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) or r8, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) GET_FRONT_BITS r10 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) mov r1, r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) GET_AFTER_BITS r9 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) or r9, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) stw r5, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) stw r11, (r7, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) stw r8, (r7, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) stw r9, (r7, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) subi r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) addi r3, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) addi r7, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) jbf .L12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) ldw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) ldw r9, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) ldw r10, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) ldw r11, (sp, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) addi sp , 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) bf .L10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) subi r3, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) br .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) .L_dest_aligned_but_src_not_aligned_2bytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) bf .L21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) .L20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) GET_FRONT_BITS r1 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) mov r5, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) ldw r6, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) mov r1, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) GET_AFTER_BITS r6 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) or r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) stw r5, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) subi r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) addi r3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) addi r7, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) bf .L20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) subi r3, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) br .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .L21: /* n > 16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) subi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) stw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) stw r9, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) stw r10, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) stw r11, (sp, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) .L22:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ldw r5, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) ldw r11, (r3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) ldw r8, (r3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) ldw r9, (r3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) GET_FRONT_BITS r1 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) mov r10, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) GET_AFTER_BITS r5 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) or r5, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) GET_FRONT_BITS r10 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) mov r1, r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) GET_AFTER_BITS r11 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) or r11, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) GET_FRONT_BITS r1 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) mov r10, r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) GET_AFTER_BITS r8 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) or r8, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) GET_FRONT_BITS r10 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) mov r1, r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) GET_AFTER_BITS r9 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) or r9, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) stw r5, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) stw r11, (r7, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) stw r8, (r7, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) stw r9, (r7, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) subi r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) addi r3, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) addi r7, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) jbf .L22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) ldw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ldw r9, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ldw r10, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) ldw r11, (sp, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) addi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) bf .L20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) subi r3, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) br .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .L_dest_aligned_but_src_not_aligned_3bytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) bf .L31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .L30:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) GET_FRONT_BITS r1 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) mov r5, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ldw r6, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) mov r1, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) GET_AFTER_BITS r6 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) or r5, r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) stw r5, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) subi r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) addi r3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) addi r7, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) bf .L30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) subi r3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) br .L_copy_by_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .L31:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) subi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) stw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) stw r9, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) stw r10, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) stw r11, (sp, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .L32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) ldw r5, (r3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) ldw r11, (r3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) ldw r8, (r3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ldw r9, (r3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) GET_FRONT_BITS r1 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) mov r10, r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) GET_AFTER_BITS r5 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) or r5, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) GET_FRONT_BITS r10 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) mov r1, r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) GET_AFTER_BITS r11 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) or r11, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) GET_FRONT_BITS r1 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) mov r10, r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) GET_AFTER_BITS r8 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) or r8, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) GET_FRONT_BITS r10 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) mov r1, r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) GET_AFTER_BITS r9 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) or r9, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) stw r5, (r7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) stw r11, (r7, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) stw r8, (r7, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) stw r9, (r7, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) subi r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) addi r3, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) addi r7, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) cmplti r4, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) jbf .L32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ldw r8, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) ldw r9, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ldw r10, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ldw r11, (sp, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) addi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) cmplti r4, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) bf .L30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) subi r3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) br .L_copy_by_byte