// 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. #include "textflag.h" // See memclrNoHeapPointers Go doc for important implementation constraints. // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT|NOFRAME,$0-16 MOVD ptr+0(FP), R4 MOVD n+8(FP), R5 CMPBGE R5, $32, clearge32 start: CMPBLE R5, $3, clear0to3 CMPBLE R5, $7, clear4to7 CMPBLE R5, $11, clear8to11 CMPBLE R5, $15, clear12to15 MOVD $0, 0(R4) MOVD $0, 8(R4) ADD $16, R4 SUB $16, R5 BR start clear0to3: CMPBEQ R5, $0, done CMPBNE R5, $1, clear2 MOVB $0, 0(R4) RET clear2: CMPBNE R5, $2, clear3 MOVH $0, 0(R4) RET clear3: MOVH $0, 0(R4) MOVB $0, 2(R4) RET clear4to7: CMPBNE R5, $4, clear5 MOVW $0, 0(R4) RET clear5: CMPBNE R5, $5, clear6 MOVW $0, 0(R4) MOVB $0, 4(R4) RET clear6: CMPBNE R5, $6, clear7 MOVW $0, 0(R4) MOVH $0, 4(R4) RET clear7: MOVW $0, 0(R4) MOVH $0, 4(R4) MOVB $0, 6(R4) RET clear8to11: CMPBNE R5, $8, clear9 MOVD $0, 0(R4) RET clear9: CMPBNE R5, $9, clear10 MOVD $0, 0(R4) MOVB $0, 8(R4) RET clear10: CMPBNE R5, $10, clear11 MOVD $0, 0(R4) MOVH $0, 8(R4) RET clear11: MOVD $0, 0(R4) MOVH $0, 8(R4) MOVB $0, 10(R4) RET clear12to15: CMPBNE R5, $12, clear13 MOVD $0, 0(R4) MOVW $0, 8(R4) RET clear13: CMPBNE R5, $13, clear14 MOVD $0, 0(R4) MOVW $0, 8(R4) MOVB $0, 12(R4) RET clear14: CMPBNE R5, $14, clear15 MOVD $0, 0(R4) MOVW $0, 8(R4) MOVH $0, 12(R4) RET clear15: MOVD $0, 0(R4) MOVW $0, 8(R4) MOVH $0, 12(R4) MOVB $0, 14(R4) RET clearge32: CMP R5, $4096 BLT clear256Bto4KB // For size >= 4KB, XC is loop unrolled 16 times (4KB = 256B * 16) clearge4KB: XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 CMP R5, $4096 BGE clearge4KB clear256Bto4KB: CMP R5, $256 BLT clear32to255 XC $256, 0(R4), 0(R4) ADD $256, R4 ADD $-256, R5 BR clear256Bto4KB clear32to255: CMPBEQ R5, $0, done CMPBLT R5, $32, start CMPBEQ R5, $32, clear32 CMPBLE R5, $64, clear33to64 CMP R5, $128 BLE clear65to128 CMP R5, $255 BLE clear129to255 clear32: VZERO V1 VST V1, 0(R4) VST V1, 16(R4) RET clear33to64: VZERO V1 VST V1, 0(R4) VST V1, 16(R4) ADD $-32, R5 VST V1, 0(R4)(R5) VST V1, 16(R4)(R5) RET clear65to128: VZERO V1 VST V1, 0(R4) VST V1, 16(R4) VST V1, 32(R4) VST V1, 48(R4) ADD $-64, R5 VST V1, 0(R4)(R5) VST V1, 16(R4)(R5) VST V1, 32(R4)(R5) VST V1, 48(R4)(R5) RET clear129to255: VZERO V1 VST V1, 0(R4) VST V1, 16(R4) VST V1, 32(R4) VST V1, 48(R4) VST V1, 64(R4) VST V1, 80(R4) VST V1, 96(R4) VST V1, 112(R4) ADD $-128, R5 VST V1, 0(R4)(R5) VST V1, 16(R4)(R5) VST V1, 32(R4)(R5) VST V1, 48(R4)(R5) VST V1, 64(R4)(R5) VST V1, 80(R4)(R5) VST V1, 96(R4)(R5) VST V1, 112(R4)(R5) RET done: RET