github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/memclr_riscv64.s (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "textflag.h" 6 7 // See memclrNoHeapPointers Go doc for important implementation constraints. 8 9 // void runtime·memclrNoHeapPointers(void*, uintptr) 10 TEXT runtime·memclrNoHeapPointers<ABIInternal>(SB),NOSPLIT,$0-16 11 // X10 = ptr 12 // X11 = n 13 14 // If less than 8 bytes, do single byte zeroing. 15 MOV $8, X9 16 BLT X11, X9, check4 17 18 // Check alignment 19 AND $3, X10, X5 20 BEQZ X5, aligned 21 22 // Zero one byte at a time until we reach 8 byte alignment. 23 SUB X5, X11, X11 24 align: 25 ADD $-1, X5 26 MOVB ZERO, 0(X10) 27 ADD $1, X10 28 BNEZ X5, align 29 30 aligned: 31 MOV $8, X9 32 BLT X11, X9, check4 33 MOV $16, X9 34 BLT X11, X9, zero8 35 MOV $32, X9 36 BLT X11, X9, zero16 37 MOV $64, X9 38 BLT X11, X9, zero32 39 loop64: 40 MOV ZERO, 0(X10) 41 MOV ZERO, 8(X10) 42 MOV ZERO, 16(X10) 43 MOV ZERO, 24(X10) 44 MOV ZERO, 32(X10) 45 MOV ZERO, 40(X10) 46 MOV ZERO, 48(X10) 47 MOV ZERO, 56(X10) 48 ADD $64, X10 49 ADD $-64, X11 50 BGE X11, X9, loop64 51 BEQZ X11, done 52 53 check32: 54 MOV $32, X9 55 BLT X11, X9, check16 56 zero32: 57 MOV ZERO, 0(X10) 58 MOV ZERO, 8(X10) 59 MOV ZERO, 16(X10) 60 MOV ZERO, 24(X10) 61 ADD $32, X10 62 ADD $-32, X11 63 BEQZ X11, done 64 65 check16: 66 MOV $16, X9 67 BLT X11, X9, check8 68 zero16: 69 MOV ZERO, 0(X10) 70 MOV ZERO, 8(X10) 71 ADD $16, X10 72 ADD $-16, X11 73 BEQZ X11, done 74 75 check8: 76 MOV $8, X9 77 BLT X11, X9, check4 78 zero8: 79 MOV ZERO, 0(X10) 80 ADD $8, X10 81 ADD $-8, X11 82 BEQZ X11, done 83 84 check4: 85 MOV $4, X9 86 BLT X11, X9, loop1 87 zero4: 88 MOVB ZERO, 0(X10) 89 MOVB ZERO, 1(X10) 90 MOVB ZERO, 2(X10) 91 MOVB ZERO, 3(X10) 92 ADD $4, X10 93 ADD $-4, X11 94 95 loop1: 96 BEQZ X11, done 97 MOVB ZERO, 0(X10) 98 ADD $1, X10 99 ADD $-1, X11 100 JMP loop1 101 102 done: 103 RET