blob: 62ad4bcb841aa70811a637c3621d80190ed0c352 [file] [log] [blame]
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +05301/*
2 * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <linux/linkage.h>
10
11#undef PREALLOC_NOT_AVAIL
12
Vineet Gupta86effd02016-09-19 16:42:25 -070013ENTRY_CFI(memset)
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +053014 prefetchw [r0] ; Prefetch the write location
15 mov.f 0, r2
16;;; if size is zero
17 jz.d [blink]
18 mov r3, r0 ; don't clobber ret val
19
20;;; if length < 8
21 brls.d.nt r2, 8, .Lsmallchunk
22 mov.f lp_count,r2
23
24 and.f r4, r0, 0x03
25 rsub lp_count, r4, 4
26 lpnz @.Laligndestination
27 ;; LOOP BEGIN
28 stb.ab r1, [r3,1]
29 sub r2, r2, 1
30.Laligndestination:
31
32;;; Destination is aligned
33 and r1, r1, 0xFF
34 asl r4, r1, 8
35 or r4, r4, r1
36 asl r5, r4, 16
37 or r5, r5, r4
38 mov r4, r5
39
40 sub3 lp_count, r2, 8
41 cmp r2, 64
42 bmsk.hi r2, r2, 5
43 mov.ls lp_count, 0
44 add3.hi r2, r2, 8
45
46;;; Convert len to Dwords, unfold x8
47 lsr.f lp_count, lp_count, 6
Vineet Gupta262137b2015-07-20 12:05:03 +030048
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +053049 lpnz @.Lset64bytes
50 ;; LOOP START
Vineet Gupta262137b2015-07-20 12:05:03 +030051#ifdef PREALLOC_NOT_AVAIL
52 prefetchw [r3, 64] ;Prefetch the next write location
53#else
54 prealloc [r3, 64]
55#endif
56#ifdef CONFIG_ARC_HAS_LL64
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +053057 std.ab r4, [r3, 8]
58 std.ab r4, [r3, 8]
59 std.ab r4, [r3, 8]
60 std.ab r4, [r3, 8]
61 std.ab r4, [r3, 8]
62 std.ab r4, [r3, 8]
63 std.ab r4, [r3, 8]
64 std.ab r4, [r3, 8]
Vineet Gupta262137b2015-07-20 12:05:03 +030065#else
66 st.ab r4, [r3, 4]
67 st.ab r4, [r3, 4]
68 st.ab r4, [r3, 4]
69 st.ab r4, [r3, 4]
70 st.ab r4, [r3, 4]
71 st.ab r4, [r3, 4]
72 st.ab r4, [r3, 4]
73 st.ab r4, [r3, 4]
74 st.ab r4, [r3, 4]
75 st.ab r4, [r3, 4]
76 st.ab r4, [r3, 4]
77 st.ab r4, [r3, 4]
78 st.ab r4, [r3, 4]
79 st.ab r4, [r3, 4]
80 st.ab r4, [r3, 4]
81 st.ab r4, [r3, 4]
82#endif
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +053083.Lset64bytes:
84
85 lsr.f lp_count, r2, 5 ;Last remaining max 124 bytes
86 lpnz .Lset32bytes
87 ;; LOOP START
88 prefetchw [r3, 32] ;Prefetch the next write location
Vineet Gupta262137b2015-07-20 12:05:03 +030089#ifdef CONFIG_ARC_HAS_LL64
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +053090 std.ab r4, [r3, 8]
91 std.ab r4, [r3, 8]
92 std.ab r4, [r3, 8]
93 std.ab r4, [r3, 8]
Vineet Gupta262137b2015-07-20 12:05:03 +030094#else
95 st.ab r4, [r3, 4]
96 st.ab r4, [r3, 4]
97 st.ab r4, [r3, 4]
98 st.ab r4, [r3, 4]
99 st.ab r4, [r3, 4]
100 st.ab r4, [r3, 4]
101 st.ab r4, [r3, 4]
102 st.ab r4, [r3, 4]
103#endif
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +0530104.Lset32bytes:
105
106 and.f lp_count, r2, 0x1F ;Last remaining 31 bytes
107.Lsmallchunk:
108 lpnz .Lcopy3bytes
109 ;; LOOP START
110 stb.ab r1, [r3, 1]
111.Lcopy3bytes:
112
113 j [blink]
114
Vineet Gupta86effd02016-09-19 16:42:25 -0700115END_CFI(memset)
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +0530116
Vineet Gupta86effd02016-09-19 16:42:25 -0700117ENTRY_CFI(memzero)
Claudiu Zissulescu1f7e3dc2014-11-21 13:39:25 +0530118 ; adjust bzero args to memset args
119 mov r2, r1
120 b.d memset ;tail call so need to tinker with blink
121 mov r1, 0
Vineet Gupta86effd02016-09-19 16:42:25 -0700122END_CFI(memzero)