// 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 |