Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / arc64 / memset.S
blob88c8e09fc89ab14a4fe8b32f91074ca522061b8e
1 /*
2    Copyright (c) 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 #include <sys/asm.h>
33 ; This file contains variants of the same function with different
34 ; instructions.  The generic one, the implementation that comes the
35 ; last after the #else macro, is the most commented.
37 ; Using 128-bit memory operations
38 #if defined (__ARC64_M128__)
40 ENTRY (memset)
41         ;; Assemble 128b token
42         bmsk_s  r1, r1, 7
43         lsl8    r3, r1
44         or_s    r1, r1, r3
45         lsl16   r3, r1
46         or      r6, r1, r3
47         addhl   r6, r6, r6
48         movl    r7, r6
50         lsrl.f  r5, r2, 6
51         beq.d   @.L_write_63_bytes
52         movl    r4, r0
53 .L_write_64_bytes:
54         stdl.ab r6r7, [r4, +16]
55         stdl.ab r6r7, [r4, +16]
56         stdl.ab r6r7, [r4, +16]
57         dbnz.d  r5, @.L_write_64_bytes
58         stdl.ab r6r7, [r4, +16]
59         bmsk_s  r2, r2, 5
61 .L_write_63_bytes:
62         bbit0.d r2, 3, @1f
63         lsr     r3, r2, 4
64         stl.ab  r6, [r4, 8]
66         bbit0.d r2, 2, @1f
67         xor     r3, r3, 3
68         st.ab   r6, [r4, 4]
70         bbit0   r2, 1, @1f
71         sth.ab  r6, [r4, 2]
73         bbit0   r2, 0, @1f
74         stb.ab  r6, [r4, 1]
76         bi      [r3]
77         stdl.ab r6r7,[r4, 16]
78         stdl.ab r6r7,[r4, 16]
79         stdl.ab r6r7,[r4, 16]
81         j_s     [blink]
83 .L_write_1_bytes:
84         breq    r2, 0, @.L_return
85         dbnz.d  r2, @.
86         stb.ab  r1, [r4, +1]
87 .L_return:
88         j_s     [blink]
89 ENDFUNC (memset)
91 ; The generic 64-bit implementation without any frills.
92 #elif defined (__ARC64_ARCH64__) || defined (__ARC64_LL64__)
94 #if defined (__ARC64_ARCH32__)
95 # define MOVH  mov      r7,r6
96 #elif defined (__ARC64_ARCH64__)
97 # define MOVH  addhl    r6,r6,r6
98 #else
99 # error Please use either 32-bit or 64-bit version of arc64 compiler
100 #endif
102 ; R0: dest
103 ; R1: ch
104 ; R2: count
105 ; ret (R0): dest
106 ENTRY (memset)
107         ;; Assemble the bytes to 64bit words
108         bmsk_s  r1, r1, 7               ; treat it like unsigned char
109         lsl8    r3, r1
110         or_s    r1, r1, r3
111         lsl16   r3, r1
112         or      r6, r1, r3
113         MOVH
115         LSRP.f  r5, r2, 5               ; counter for 32-byte chunks
116         beq.d   @.L_write_31_bytes
117         MOVP    r4, r0                  ; work on a copy of "r0"
118 .L_write_32_bytes:
119         ST64.ab r6, [r4, +8]
120         ST64.ab r6, [r4, +8]
121         ST64.ab r6, [r4, +8]
122         dbnz.d  r5, @.L_write_32_bytes
123         ST64.ab r6, [r4, +8]
124         bmsk_s  r2, r2, 4
126 .L_write_31_bytes:
127         bbit0.d r2, 2, @1f
128         lsr     r3, r2, 3
129         st.ab   r6, [r4, 4]
131         bbit0.d r2, 1, @1f
132         xor     r3, r3, 3
133         sth.ab  r6, [r4, 2]
135         bbit0   r2, 0, @1f
136         stb.ab  r6, [r4, 1]
138         bi      [r3]
139         ST64.ab r6,[r4, 8]
140         ST64.ab r6,[r4, 8]
141         ST64.ab r6,[r4, 8]
143         j_s     [blink]
144 ENDFUNC (memset)
146 #elif defined (__ARC64_ARCH32__)
147 ENTRY (memset)
148         ;; Assemble the bytes to 32bit words
149         bmsk_s  r1, r1, 7               ; treat it like unsigned char
150         lsl8    r3, r1
151         or_s    r1, r1, r3
152         lsl16   r3, r1
153         or      r6, r1, r3
155         lsr.f   r5, r2, 4               ; counter for 16-byte chunks
156         beq.d   @.L_write_15_bytes
157         mov     r4, r0                  ; work on a copy of "r0"
158 .L_write_16_bytes:
159         st.ab   r6, [r4, 4]
160         st.ab   r6, [r4, 4]
161         st.ab   r6, [r4, 4]
162         dbnz.d  r5, @.L_write_16_bytes
163         st.ab   r6, [r4, 4]
164         bmsk_s  r2, r2, 3
166 .L_write_15_bytes:
167         bbit0.d r2, 1, @1f
168         lsr     r3, r2, 2
169         sth.ab  r6, [r4, 2]
171         bbit0.d r2, 0, @1f
172         xor     r3, r3, 3
173         stb.ab  r6, [r4, 1]
175         bi      [r3]
176         st.ab   r6,[r4, 4]
177         st.ab   r6,[r4, 4]
178         st.ab   r6,[r4, 4]
180         j_s     [blink]
181 ENDFUNC (memset)
182 #else
183 # error Unknown configuration
184 #endif