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// See memclrNoHeapPointers Go doc for important implementation constraints.
8
9// void runtime·memclrNoHeapPointers(void*, uintptr)
10TEXT runtime·memclrNoHeapPointers<ABIInternal>(SB),NOSPLIT,$0-16
11	// X10 = ptr
12	// X11 = n
13
14	// If less than 8 bytes, do single byte zeroing.
15	MOV	$8, X9
16	BLT	X11, X9, check4
17
18	// Check alignment
19	AND	$7, X10, X5
20	BEQZ	X5, aligned
21
22	// Zero one byte at a time until we reach 8 byte alignment.
23	SUB	X5, X9, X5
24	SUB	X5, X11, X11
25align:
26	SUB	$1, X5
27	MOVB	ZERO, 0(X10)
28	ADD	$1, X10
29	BNEZ	X5, align
30
31aligned:
32	// X9 already contains $8
33	BLT	X11, X9, check4
34	MOV	$16, X9
35	BLT	X11, X9, zero8
36	MOV	$32, X9
37	BLT	X11, X9, zero16
38	MOV	$64, X9
39	BLT	X11, X9, zero32
40loop64:
41	MOV	ZERO, 0(X10)
42	MOV	ZERO, 8(X10)
43	MOV	ZERO, 16(X10)
44	MOV	ZERO, 24(X10)
45	MOV	ZERO, 32(X10)
46	MOV	ZERO, 40(X10)
47	MOV	ZERO, 48(X10)
48	MOV	ZERO, 56(X10)
49	ADD	$64, X10
50	SUB	$64, X11
51	BGE	X11, X9, loop64
52	BEQZ	X11, done
53
54check32:
55	MOV	$32, X9
56	BLT	X11, X9, check16
57zero32:
58	MOV	ZERO, 0(X10)
59	MOV	ZERO, 8(X10)
60	MOV	ZERO, 16(X10)
61	MOV	ZERO, 24(X10)
62	ADD	$32, X10
63	SUB	$32, X11
64	BEQZ	X11, done
65
66check16:
67	MOV	$16, X9
68	BLT	X11, X9, check8
69zero16:
70	MOV	ZERO, 0(X10)
71	MOV	ZERO, 8(X10)
72	ADD	$16, X10
73	SUB	$16, X11
74	BEQZ	X11, done
75
76check8:
77	MOV	$8, X9
78	BLT	X11, X9, check4
79zero8:
80	MOV	ZERO, 0(X10)
81	ADD	$8, X10
82	SUB	$8, X11
83	BEQZ	X11, done
84
85check4:
86	MOV	$4, X9
87	BLT	X11, X9, loop1
88zero4:
89	MOVB	ZERO, 0(X10)
90	MOVB	ZERO, 1(X10)
91	MOVB	ZERO, 2(X10)
92	MOVB	ZERO, 3(X10)
93	ADD	$4, X10
94	SUB	$4, X11
95
96loop1:
97	BEQZ	X11, done
98	MOVB	ZERO, 0(X10)
99	ADD	$1, X10
100	SUB	$1, X11
101	JMP	loop1
102
103done:
104	RET
105