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//go:build mips || mipsle
6
7#include "textflag.h"
8
9#ifdef GOARCH_mips
10#define MOVWHI  MOVWL
11#define MOVWLO  MOVWR
12#else
13#define MOVWHI  MOVWR
14#define MOVWLO  MOVWL
15#endif
16
17// See memclrNoHeapPointers Go doc for important implementation constraints.
18
19// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
20TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-8
21	MOVW	n+4(FP), R2
22	MOVW	ptr+0(FP), R1
23
24	SGTU	$4, R2, R3
25	ADDU	R2, R1, R4
26	BNE	R3, small_zero
27
28ptr_align:
29	AND	$3, R1, R3
30	BEQ	R3, setup
31	SUBU	R1, R0, R3
32	AND	$3, R3		// R3 contains number of bytes needed to align ptr
33	MOVWHI	R0, 0(R1)	// MOVWHI will write zeros up to next word boundary
34	SUBU	R3, R2
35	ADDU	R3, R1
36
37setup:
38	AND	$31, R2, R6
39	AND	$3, R2, R5
40	SUBU	R6, R4, R6	// end pointer for 32-byte chunks
41	SUBU	R5, R4, R5	// end pointer for 4-byte chunks
42
43large:
44	BEQ	R1, R6, words
45	MOVW	R0, 0(R1)
46	MOVW	R0, 4(R1)
47	MOVW	R0, 8(R1)
48	MOVW	R0, 12(R1)
49	MOVW	R0, 16(R1)
50	MOVW	R0, 20(R1)
51	MOVW	R0, 24(R1)
52	MOVW	R0, 28(R1)
53	ADDU	$32, R1
54	JMP	large
55
56words:
57	BEQ	R1, R5, tail
58	MOVW	R0, 0(R1)
59	ADDU	$4, R1
60	JMP	words
61
62tail:
63	BEQ	R1, R4, ret
64	MOVWLO	R0, -1(R4)
65
66ret:
67	RET
68
69small_zero:
70	BEQ	R1, R4, ret
71	MOVB	R0, 0(R1)
72	ADDU	$1, R1
73	JMP	small_zero
74