1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* memset.S: optimised assembly memset
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Written by David Howells (dhowells@redhat.com)
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modify it under the terms of the GNU General Public License
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * as published by the Free Software Foundation; either version
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 2 of the License, or (at your option) any later version.
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        .text
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        .p2align	4
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng###############################################################################
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# void *memset(void *p, char ch, size_t count)
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# - NOTE: must not use any stack. exception detection performs function return
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#         to caller's fixup routine, aborting the remainder of the set
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#         GR4, GR7, GR8, and GR11 must be managed
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng###############################################################################
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        .globl		memset,__memset_end
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        .type		memset,@function
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmemset:
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	orcc.p		gr10,gr0,gr5,icc3		; GR5 = count
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andi		gr9,#0xff,gr9
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or.p		gr8,gr0,gr4			; GR4 = address
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# conditionally write a byte to 2b-align the address
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos.p	#1,gr6
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andicc		gr4,#1,gr0,icc0
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ckne		icc0,cc7
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstb.p		gr9,@(gr4,gr0)		,cc7,#1
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr6,gr5		,cc7,#1	; also set ICC3
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cadd.p		gr4,gr6,gr4		,cc7,#1
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# conditionally write a word to 4b-align the address
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andicc.p	gr4,#2,gr0,icc0
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#2,gr0,icc1
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos.p	#2,gr6
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ckne		icc0,cc7
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	slli.p		gr9,#8,gr12			; need to double up the pattern
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc1,cc5
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or.p		gr9,gr12,gr12
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcr		cc7,cc5,cc7
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csth.p		gr12,@(gr4,gr0)		,cc7,#1
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr6,gr5		,cc7,#1	; also set ICC3
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cadd.p		gr4,gr6,gr4		,cc7,#1
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# conditionally write a dword to 8b-align the address
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andicc.p	gr4,#4,gr0,icc0
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#4,gr0,icc1
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos.p	#4,gr6
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ckne		icc0,cc7
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	slli.p		gr12,#16,gr13			; need to quadruple-up the pattern
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc1,cc5
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or.p		gr13,gr12,gr12
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcr		cc7,cc5,cc7
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cst.p		gr12,@(gr4,gr0)		,cc7,#1
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr6,gr5		,cc7,#1	; also set ICC3
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cadd.p		gr4,gr6,gr4		,cc7,#1
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or.p		gr12,gr12,gr13			; need to octuple-up the pattern
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# the address is now 8b-aligned - loop around writing 64b chunks
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#8,gr7
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subi.p		gr4,#8,gr4			; store with update index does weird stuff
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#64,gr6
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#64,gr0,icc0
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng0:	cknc		icc0,cc7
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu		gr12,@(gr4,gr7)		,cc7,#1
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu		gr12,@(gr4,gr7)		,cc7,#1
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu		gr12,@(gr4,gr7)		,cc7,#1
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu		gr12,@(gr4,gr7)		,cc7,#1
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu		gr12,@(gr4,gr7)		,cc7,#1
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr6,gr5		,cc7,#1	; also set ICC3
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#64,gr0,icc0
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bnc		icc0,#2,0b
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# now do 32-byte remnant
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc.p	gr5,#32,gr0,icc0
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#32,gr6
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc0,cc7
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr6,gr5		,cc7,#1	; also set ICC3
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#16,gr6
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#16,gr0,icc0
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# now do 16-byte remnant
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc0,cc7
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr6,gr5		,cc7,#1	; also set ICC3
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# now do 8-byte remnant
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#8,gr0,icc1
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc1,cc7
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstdu.p		gr12,@(gr4,gr7)		,cc7,#1
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr7,gr5		,cc7,#1	; also set ICC3
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos.p	#4,gr7
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# now do 4-byte remnant
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc		gr5,#4,gr0,icc0
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi.p		gr4,#4,gr4
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc0,cc7
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstu.p		gr12,@(gr4,gr7)		,cc7,#1
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr7,gr5		,cc7,#1	; also set ICC3
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc.p	gr5,#2,gr0,icc1
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# now do 2-byte remnant
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#2,gr7
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi.p		gr4,#2,gr4
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc1,cc7
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csthu.p		gr12,@(gr4,gr7)		,cc7,#1
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	csubcc		gr5,gr7,gr5		,cc7,#1	; also set ICC3
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subicc.p	gr5,#1,gr0,icc0
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	beqlr		icc3,#0
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# now do 1-byte remnant
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#0,gr7
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addi.p		gr4,#2,gr4
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cknc		icc0,cc7
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cstb.p		gr12,@(gr4,gr0)		,cc7,#1
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bralr
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_end:
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.size		memset, __memset_end-memset
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng###############################################################################
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# clear memory in userspace
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# - return the number of bytes that could not be cleared (0 on complete success)
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# long __memset_user(void *p, size_t count)
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng###############################################################################
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        .globl		__memset_user, __memset_user_error_lr, __memset_user_error_handler
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng        .type		__memset_user,@function
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_user:
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	movsg		lr,gr11
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# abuse memset to do the dirty work
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or.p		gr9,gr9,gr10
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#0,gr9
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	call		memset
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_user_error_lr:
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmpl.p		@(gr11,gr0)
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	setlos		#0,gr8
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# deal any exception generated by memset
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# GR4  - memset's address tracking pointer
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# GR7  - memset's step value (index register for store insns)
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# GR8  - memset's original start address
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	# GR10 - memset's original count
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__memset_user_error_handler:
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add.p		gr4,gr7,gr4
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		gr8,gr10,gr8
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmpl.p		@(gr11,gr0)
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		gr8,gr4,gr8		; we return the amount left uncleared
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.size		__memset_user, .-__memset_user
183