Cygwin: Add new APIs tc[gs]etwinsize()
[newlib-cygwin.git] / newlib / libc / machine / arm / aeabi_memset-thumb2.S
bloba1b8f053229cf8ec2b6132253b90948c0f43c870
1 /*
2  * Copyright (c) 2015 ARM Ltd
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. The name of the company may not be used to endorse or promote
14  *    products derived from this software without specific prior written
15  *    permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
29 #include "arm_asm.h"
31         .thumb
32         .syntax unified
33         .global __aeabi_memset
34         .type   __aeabi_memset, %function
35         .fnstart
36         .cfi_sections .debug_frame
37         .cfi_startproc
38         ASM_ALIAS __aeabi_memset4 __aeabi_memset
39         ASM_ALIAS __aeabi_memset8 __aeabi_memset
40 __aeabi_memset:
41         prologue 4 6
42         lsls    r4, r0, #30
43         beq     10f
44         subs    r4, r1, #1
45         cmp     r1, #0
46         beq     9f
47         uxtb    r5, r2
48         mov     r3, r0
49         b       2f
51         subs    r1, r4, #1
52         cbz     r4, 9f
53         mov     r4, r1
55         strb    r5, [r3], #1
56         lsls    r1, r3, #30
57         bne     1b
59         cmp     r4, #3
60         bls     7f
61         uxtb    r5, r2
62         orr     r5, r5, r5, lsl #8
63         cmp     r4, #15
64         orr     r5, r5, r5, lsl #16
65         bls     5f
66         mov     r6, r4
67         add     r1, r3, #16
69         subs    r6, r6, #16
70         cmp     r6, #15
71         str     r5, [r1, #-16]
72         str     r5, [r1, #-12]
73         str     r5, [r1, #-8]
74         str     r5, [r1, #-4]
75         add     r1, r1, #16
76         bhi     4b
77         sub     r1, r4, #16
78         bic     r1, r1, #15
79         and     r4, r4, #15
80         adds    r1, r1, #16
81         cmp     r4, #3
82         add     r3, r3, r1
83         bls     7f
85         mov     r6, r3
86         mov     r1, r4
88         subs    r1, r1, #4
89         cmp     r1, #3
90         str     r5, [r6], #4
91         bhi     6b
92         subs    r1, r4, #4
93         bic     r1, r1, #3
94         adds    r1, r1, #4
95         add     r3, r3, r1
96         and     r4, r4, #3
98         cbz     r4, 9f
99         uxtb    r2, r2
100         add     r4, r4, r3
102         strb    r2, [r3], #1
103         cmp     r3, r4
104         bne     8b
106         .cfi_remember_state
107         epilogue 4 6
109         .cfi_restore_state
110         mov     r4, r1
111         mov     r3, r0
112         b       3b
113         .cfi_endproc
114         .cantunwind
115         .fnend
116         .size __aeabi_memset, . - __aeabi_memset