1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * "memset" implementation for SH4
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1999  Niibe Yutaka
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (c) 2009  STMicroelectronics Limited
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Author: Stuart Menefy <stuart.menefy:st.com>
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *            void *memset(void *s, int c, size_t n);
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/linkage.h>
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengENTRY(memset)
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	#12,r0
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add	r6,r4
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp/gt	r6,r0
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bt/s	40f		! if it's too small, set a byte at once
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov	r4,r0
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and	#3,r0
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp/eq	#0,r0
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bt/s	2f		! It's aligned
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 sub	r0,r6
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	dt	r0
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bf/s	1b
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov.b	r5,@-r4
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng2:				! make VVVV
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	extu.b	r5,r5
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	swap.b	r5,r0		!   V0
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r0,r5		!   VV
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	swap.w	r5,r0		! VV00
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r0,r5		! VVVV
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	! Check if enough bytes need to be copied to be worth the big loop
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	#0x40, r0	! (MT)
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp/gt	r6,r0		! (MT)  64 > len => slow loop
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bt/s	22f
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov	r6,r0
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	! align the dst to the cache block size if necessary
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	r4, r3
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	#~(0x1f), r1
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and	r3, r1
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp/eq	r3, r1
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bt/s	11f		! dst is already aligned
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 sub	r1, r3		! r3-r1 -> r3
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	shlr2	r3		! number of loops
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng10:	mov.l	r5,@-r4
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	dt	r3
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bf/s	10b
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add	#-4, r6
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng11:	! dst is 32byte aligned
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	r6,r2
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	#-5,r0
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	shld	r0,r2		! number of loops
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add	#-32, r4
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	r5, r0
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng12:
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	movca.l	r0,@r4
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(4, r4)
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(8, r4)
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(12,r4)
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(16,r4)
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(20,r4)
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add	#-0x20, r6
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(24,r4)
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	dt	r2
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@(28,r4)
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bf/s	12b
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add	#-32, r4
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add	#32, r4
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	#8, r0
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp/ge	r0, r6
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bf	40f
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	r6,r0
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng22:
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	shlr2	r0
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	shlr	r0		! r0 = r6 >> 3
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng3:
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	dt	r0
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov.l	r5,@-r4		! set 8-byte at once
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bf/s	3b
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov.l	r5,@-r4
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	!
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov	#7,r0
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and	r0,r6
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	! fill bytes (length may be zero)
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng40:	tst	r6,r6
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bt	5f
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng4:
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	dt	r6
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bf/s	4b
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov.b	r5,@-r4
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng5:
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	rts
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov	r4,r0
108