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