Merge git://git.infradead.org/iommu-2.6
[linux-2.6] / arch / avr32 / lib / memset.S
1 /*
2  * Copyright (C) 2004-2006 Atmel Corporation
3  *
4  * Based on linux/arch/arm/lib/memset.S
5  *   Copyright (C) 1995-2000 Russell King
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * ASM optimised string functions
12  */
13 #include <asm/asm.h>
14
15         /*
16          * r12: void *b
17          * r11: int c
18          * r10: size_t len
19          *
20          * Returns b in r12
21          */
22         .text
23         .global memset
24         .type   memset, @function
25         .align  5
26 memset:
27         mov     r9, r12
28         mov     r8, r12
29         or      r11, r11, r11 << 8
30         andl    r9, 3, COH
31         brne    1f
32
33 2:      or      r11, r11, r11 << 16
34         sub     r10, 4
35         brlt    5f
36
37         /* Let's do some real work */
38 4:      st.w    r8++, r11
39         sub     r10, 4
40         brge    4b
41
42         /*
43          * When we get here, we've got less than 4 bytes to set. r10
44          * might be negative.
45          */
46 5:      sub     r10, -4
47         reteq   r12
48
49         /* Fastpath ends here, exactly 32 bytes from memset */
50
51         /* Handle unaligned count or pointer */
52         bld     r10, 1
53         brcc    6f
54         st.b    r8++, r11
55         st.b    r8++, r11
56         bld     r10, 0
57         retcc   r12
58 6:      st.b    r8++, r11
59         retal   r12
60
61         /* Handle unaligned pointer */
62 1:      sub     r10, 4
63         brlt    5b
64         add     r10, r9
65         lsl     r9, 1
66         add     pc, r9
67         st.b    r8++, r11
68         st.b    r8++, r11
69         st.b    r8++, r11
70         rjmp    2b
71
72         .size   memset, . - memset