1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "textflag.h"
6
7// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
8TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT|NOFRAME,$0-16
9	MOVD	ptr+0(FP), R4
10	MOVD	n+8(FP), R5
11
12start:
13	CMPBLE	R5, $3, clear0to3
14	CMPBLE	R5, $7, clear4to7
15	CMPBLE	R5, $11, clear8to11
16	CMPBLE	R5, $15, clear12to15
17	CMP	R5, $32
18	BGE	clearmt32
19	MOVD	$0, 0(R4)
20	MOVD	$0, 8(R4)
21	ADD	$16, R4
22	SUB	$16, R5
23	BR	start
24
25clear0to3:
26	CMPBEQ	R5, $0, done
27	CMPBNE	R5, $1, clear2
28	MOVB	$0, 0(R4)
29	RET
30clear2:
31	CMPBNE	R5, $2, clear3
32	MOVH	$0, 0(R4)
33	RET
34clear3:
35	MOVH	$0, 0(R4)
36	MOVB	$0, 2(R4)
37	RET
38
39clear4to7:
40	CMPBNE	R5, $4, clear5
41	MOVW	$0, 0(R4)
42	RET
43clear5:
44	CMPBNE	R5, $5, clear6
45	MOVW	$0, 0(R4)
46	MOVB	$0, 4(R4)
47	RET
48clear6:
49	CMPBNE	R5, $6, clear7
50	MOVW	$0, 0(R4)
51	MOVH	$0, 4(R4)
52	RET
53clear7:
54	MOVW	$0, 0(R4)
55	MOVH	$0, 4(R4)
56	MOVB	$0, 6(R4)
57	RET
58
59clear8to11:
60	CMPBNE	R5, $8, clear9
61	MOVD	$0, 0(R4)
62	RET
63clear9:
64	CMPBNE	R5, $9, clear10
65	MOVD	$0, 0(R4)
66	MOVB	$0, 8(R4)
67	RET
68clear10:
69	CMPBNE	R5, $10, clear11
70	MOVD	$0, 0(R4)
71	MOVH	$0, 8(R4)
72	RET
73clear11:
74	MOVD	$0, 0(R4)
75	MOVH	$0, 8(R4)
76	MOVB	$0, 10(R4)
77	RET
78
79clear12to15:
80	CMPBNE	R5, $12, clear13
81	MOVD	$0, 0(R4)
82	MOVW	$0, 8(R4)
83	RET
84clear13:
85	CMPBNE	R5, $13, clear14
86	MOVD	$0, 0(R4)
87	MOVW	$0, 8(R4)
88	MOVB	$0, 12(R4)
89	RET
90clear14:
91	CMPBNE	R5, $14, clear15
92	MOVD	$0, 0(R4)
93	MOVW	$0, 8(R4)
94	MOVH	$0, 12(R4)
95	RET
96clear15:
97	MOVD	$0, 0(R4)
98	MOVW	$0, 8(R4)
99	MOVH	$0, 12(R4)
100	MOVB	$0, 14(R4)
101	RET
102
103clearmt32:
104	CMP	R5, $256
105	BLT	clearlt256
106	XC	$256, 0(R4), 0(R4)
107	ADD	$256, R4
108	ADD	$-256, R5
109	BR	clearmt32
110clearlt256:
111	CMPBEQ	R5, $0, done
112	ADD	$-1, R5
113	EXRL	$memclr_exrl_xc<>(SB), R5
114done:
115	RET
116
117// DO NOT CALL - target for exrl (execute relative long) instruction.
118TEXT memclr_exrl_xc<>(SB),NOSPLIT|NOFRAME,$0-0
119	XC	$1, 0(R4), 0(R4)
120	MOVD	$0, 0(R0)
121	RET
122
123