// Copyright 2014 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. #include "textflag.h" // void runtime·memclrNoHeapPointers(void*, uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16 MOVD ptr+0(FP), R0 MOVD n+8(FP), R1 // If size is less than 16 bytes, use tail_zero to zero what remains CMP $16, R1 BLT tail_zero // Get buffer offset into 16 byte aligned address for better performance ANDS $15, R0, ZR BNE unaligned_to_16 aligned_to_16: LSR $4, R1, R2 zero_by_16: STP.P (ZR, ZR), 16(R0) SUBS $1, R2, R2 BNE zero_by_16 ANDS $15, R1, R1 BEQ ending // Zero buffer with size=R1 < 16 tail_zero: TBZ $3, R1, tail_zero_4 MOVD.P ZR, 8(R0) tail_zero_4: TBZ $2, R1, tail_zero_2 MOVW.P ZR, 4(R0) tail_zero_2: TBZ $1, R1, tail_zero_1 MOVH.P ZR, 2(R0) tail_zero_1: TBZ $0, R1, ending MOVB ZR, (R0) ending: RET unaligned_to_16: MOVD R0, R2 head_loop: MOVBU.P ZR, 1(R0) ANDS $15, R0, ZR BNE head_loop // Adjust length for what remains SUB R2, R0, R3 SUB R3, R1 // If size is less than 16 bytes, use tail_zero to zero what remains CMP $16, R1 BLT tail_zero B aligned_to_16