1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  linux/arch/m32r/lib/memset.S
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  Copyright (C) 2001,2002  Hiroyuki Kondo, and Hirokazu Takata
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  Copyright (C) 2004  Hirokazu Takata
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *  void *memset(void *dst, int val, int len);
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *        dst: r0
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *        val: r1
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *        len: r2
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *        ret: r0
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.text
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.global	memset
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef CONFIG_ISA_DUAL_ISSUE
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.align 4
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmemset:
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mv      r4, r0		    ||	cmpz	r2
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jc	r14
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #16
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnc	qword_align_check
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #4
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bc	byte_set
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_align_check:			/* len >= 4 */
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r3, r4, #3
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqz	r3, word_set
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r3, #-4
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	neg	r3, r3			/* r3 = -(r3 - 4) */
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengalign_word:
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	r1, @r4		    ||	addi	r4, #1
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-1		    ||	addi	r3, #-1
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r3, align_word
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #4
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bc	byte_set
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set:
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #8
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3		    ||	addi	r4, #-4
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #16
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3		    ||	addi	r2, #-4
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set_loop:
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4	    ||	addi	r2, #-4
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bgtz	r2, word_set_loop
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r2, byte_set_wrap
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmp	r14
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_align_check:			/* len >= 16 */
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r3, r4, #15
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r3, word_align_check
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set:
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #8
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3		    ||	addi	r4, #-4
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #16
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3		    ||	ldi	r5, #16
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set_loop:
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld	r3, @(4,r4)		/* cache line allocate */
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4	    ||	addi	r2, #-16
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4	    ||	cmpu	r2, r5
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnc	qword_set_loop	    ||  cmpz	r2
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jc	r14
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengset_remainder:
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #4
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bc	byte_set_wrap1
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-4
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bra	word_set_loop
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap:
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #4
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpz	r2
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jc	r14
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap1:
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #4
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if defined(CONFIG_ISA_M32R2)
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set:
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-1		    ||	stb	r1, @r4+
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r2, byte_set
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#elif defined(CONFIG_ISA_M32R)
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set:
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-1		    ||	stb	r1, @r4
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #1
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r2, byte_set
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#error unknown isa configuration
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengend_memset:
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmp	r14
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else /* not CONFIG_ISA_DUAL_ISSUE */
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.align 4
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmemset:
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mv      r4, r0
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqz	r2, end_memset
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #16
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnc	qword_align_check
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #4
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bc	byte_set
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_align_check:			/* len >= 4 */
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r3, r4, #3
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqz	r3, word_set
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r3, #-4
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	neg	r3, r3			/* r3 = -(r3 - 4) */
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengalign_word:
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	r1, @r4
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #1
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-1
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r3, #-1
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r3, align_word
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #4
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bc	byte_set
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set:
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #8
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #16
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-4
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #-4
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengword_set_loop:
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-4
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bgtz    r2, word_set_loop
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r2, byte_set_wrap
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmp	r14
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_align_check:			/* len >= 16 */
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r3, r4, #15
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r3, word_align_check
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set:
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #8
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll3	r3, r1, #16
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	r1, r3
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #-4
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengqword_set_loop:
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld	r3, @(4,r4)		/* cache line allocate */
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-16
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #16
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	r1, @+r4
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnc	qword_set_loop
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r2, set_remainder
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmp	r14
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengset_remainder:
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmpui	r2, #4
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bc	byte_set_wrap1
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-4
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bra	word_set_loop
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap:
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #4
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqz	r2, end_memset
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set_wrap1:
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #4
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengbyte_set:
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r2, #-1
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	r1, @r4
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi	r4, #1
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnez	r2, byte_set
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengend_memset:
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmp	r14
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* not CONFIG_ISA_DUAL_ISSUE */
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.end
179