| // 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 | |
| start: | |
| CMPBLE R5, $3, clear0to3 | |
| CMPBLE R5, $7, clear4to7 | |
| CMPBLE R5, $11, clear8to11 | |
| CMPBLE R5, $15, clear12to15 | |
| CMP R5, $32 | |
| BGE clearmt32 | |
| 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 | |
| clearmt32: | |
| CMP R5, $256 | |
| BLT clearlt256 | |
| XC $256, 0(R4), 0(R4) | |
| ADD $256, R4 | |
| ADD $-256, R5 | |
| BR clearmt32 | |
| clearlt256: | |
| CMPBEQ R5, $0, done | |
| ADD $-1, R5 | |
| EXRL $memclr_exrl_xc<>(SB), R5 | |
| done: | |
| RET | |
| // DO NOT CALL - target for exrl (execute relative long) instruction. | |
| TEXT memclr_exrl_xc<>(SB),NOSPLIT|NOFRAME,$0-0 | |
| XC $1, 0(R4), 0(R4) | |
| MOVD $0, 0(R0) | |
| RET | |