// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build mips || mipsle #include "textflag.h" #ifdef GOARCH_mips #define MOVWHI MOVWL #define MOVWLO MOVWR #else #define MOVWHI MOVWR #define MOVWLO MOVWL #endif // See memclrNoHeapPointers Go doc for important implementation constraints. // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-8 MOVW n+4(FP), R2 MOVW ptr+0(FP), R1 SGTU $4, R2, R3 ADDU R2, R1, R4 BNE R3, small_zero ptr_align: AND $3, R1, R3 BEQ R3, setup SUBU R1, R0, R3 AND $3, R3 // R3 contains number of bytes needed to align ptr MOVWHI R0, 0(R1) // MOVWHI will write zeros up to next word boundary SUBU R3, R2 ADDU R3, R1 setup: AND $31, R2, R6 AND $3, R2, R5 SUBU R6, R4, R6 // end pointer for 32-byte chunks SUBU R5, R4, R5 // end pointer for 4-byte chunks large: BEQ R1, R6, words MOVW R0, 0(R1) MOVW R0, 4(R1) MOVW R0, 8(R1) MOVW R0, 12(R1) MOVW R0, 16(R1) MOVW R0, 20(R1) MOVW R0, 24(R1) MOVW R0, 28(R1) ADDU $32, R1 JMP large words: BEQ R1, R5, tail MOVW R0, 0(R1) ADDU $4, R1 JMP words tail: BEQ R1, R4, ret MOVWLO R0, -1(R4) ret: RET small_zero: BEQ R1, R4, ret MOVB R0, 0(R1) ADDU $1, R1 JMP small_zero