Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / arc / memset-archs.S
blob1204cc0d7c77f6900224cda4ece5e45a2c87101f
1 /*
2    Copyright (c) 2015-2024, Synopsys, Inc. All rights reserved.
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions are met:
7    1) Redistributions of source code must retain the above copyright notice,
8    this list of conditions and the following disclaimer.
10    2) Redistributions in binary form must reproduce the above copyright notice,
11    this list of conditions and the following disclaimer in the documentation
12    and/or other materials provided with the distribution.
14    3) Neither the name of the Synopsys, Inc., nor the names of its contributors
15    may be used to endorse or promote products derived from this software
16    without specific prior written permission.
18    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28    POSSIBILITY OF SUCH DAMAGE.
31 /* This implementation is optimized for performance.  For code size a generic
32    implementation of this function from newlib/libc/string/memset.c will be
33    used.  */
34 #if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) \
35     && !defined (__ARC_RF16__)
37 #include "asm.h"
39 #ifdef __ARCHS__
41 #define USE_PREFETCH
43 #ifdef USE_PREFETCH
44 #define PREWRITE(A,B)   prefetchw [(A),(B)]
45 #else
46 #define PREWRITE(A,B)   prealloc [(A),(B)]
47 #endif
49 ENTRY (memset)
50         prefetchw [r0]          ; Prefetch the write location
51         mov.f   0, r2
52 ; if size is zero
53         jz.d    [blink]
54         mov     r3, r0          ; don't clobber ret val
56 ; if length < 8
57         brls.d.nt       r2, 8, .Lsmallchunk
58         mov.f   lp_count,r2
60         and.f   r4, r0, 0x03
61         rsub    lp_count, r4, 4
62         lpnz    @.Laligndestination
63         ; LOOP BEGIN
64         stb.ab  r1, [r3,1]
65         sub     r2, r2, 1
66 .Laligndestination:
68 ; Destination is aligned
69         and     r1, r1, 0xFF
70         asl     r4, r1, 8
71         or      r4, r4, r1
72         asl     r5, r4, 16
73         or      r5, r5, r4
74         mov     r4, r5
76         sub3    lp_count, r2, 8
77         cmp     r2, 64
78         bmsk.hi r2, r2, 5
79         mov.ls  lp_count, 0
80         add3.hi r2, r2, 8
82 ; Convert len to Dwords, unfold x8
83         lsr.f   lp_count, lp_count, 6
84         lpnz    @.Lset64bytes
85         ; LOOP START
86         PREWRITE (r3, 64)       ;Prefetch the next write location
87 #ifdef __ARC_LL64__
88         std.ab  r4, [r3, 8]
89         std.ab  r4, [r3, 8]
90         std.ab  r4, [r3, 8]
91         std.ab  r4, [r3, 8]
92         std.ab  r4, [r3, 8]
93         std.ab  r4, [r3, 8]
94         std.ab  r4, [r3, 8]
95         std.ab  r4, [r3, 8]
96 #else
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         st.ab   r4, [r3, 4]
104         st.ab   r4, [r3, 4]
105         st.ab   r4, [r3, 4]
106         st.ab   r4, [r3, 4]
107         st.ab   r4, [r3, 4]
108         st.ab   r4, [r3, 4]
109         st.ab   r4, [r3, 4]
110         st.ab   r4, [r3, 4]
111         st.ab   r4, [r3, 4]
112         st.ab   r4, [r3, 4]
113 #endif
114 .Lset64bytes:
116         lsr.f   lp_count, r2, 5 ;Last remaining  max 124 bytes
117         lpnz    .Lset32bytes
118         ; LOOP START
119         prefetchw [r3, 32]      ;Prefetch the next write location
120 #ifdef __ARC_LL64__
121         std.ab  r4, [r3, 8]
122         std.ab  r4, [r3, 8]
123         std.ab  r4, [r3, 8]
124         std.ab  r4, [r3, 8]
125 #else
126         st.ab   r4, [r3, 4]
127         st.ab   r4, [r3, 4]
128         st.ab   r4, [r3, 4]
129         st.ab   r4, [r3, 4]
130         st.ab   r4, [r3, 4]
131         st.ab   r4, [r3, 4]
132         st.ab   r4, [r3, 4]
133         st.ab   r4, [r3, 4]
134 #endif
135 .Lset32bytes:
137         and.f   lp_count, r2, 0x1F ;Last remaining 31 bytes
138 .Lsmallchunk:
139         lpnz    .Lcopy3bytes
140         ; LOOP START
141         stb.ab  r1, [r3, 1]
142 .Lcopy3bytes:
144         j       [blink]
146 ENDFUNC (memset)
147 #endif /* __ARCHS__ */
149 #endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */