^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) * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) ENTRY_CFI(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) mov_s r4,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) or r12,r0,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) bmsk.f r12,r12,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) extb_s r1,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) asl r3,r1,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) beq.d .Laligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) or_s r1,r1,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) brls r2,SMALL,.Ltiny
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) add r3,r2,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) stb r1,[r3,-1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) bclr_s r3,r3,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) stw r1,[r3,-2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) bmsk.f r12,r0,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) add_s r2,r2,r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) sub.ne r2,r2,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) stb.ab r1,[r4,1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) and r4,r4,-2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) stw.ab r1,[r4,2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) and r4,r4,-4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .Laligned: ; This code address should be aligned for speed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) asl r3,r1,16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) lsr.f lp_count,r2,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) or_s r1,r1,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) lpne .Loop_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) st.ab r1,[r4,4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .Loop_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) j_s [blink]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .balign 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .Ltiny:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) mov.f lp_count,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) lpne .Ltiny_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) stb.ab r1,[r4,1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .Ltiny_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) j_s [blink]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) END_CFI(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ; memzero: @r0 = mem, @r1 = size_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ; memset: @r0 = mem, @r1 = char, @r2 = size_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ENTRY_CFI(memzero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ; adjust bzero args to memset args
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) mov r2, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) mov r1, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) b memset ;tail call so need to tinker with blink
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) END_CFI(memzero)