Text file
src/runtime/memclr_mips64x.s
1 // Copyright 2015 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 //go:build mips64 || mips64le
6
7 #include "go_asm.h"
8 #include "textflag.h"
9
10 // See memclrNoHeapPointers Go doc for important implementation constraints.
11
12 // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr)
13 TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16
14 MOVV ptr+0(FP), R1
15 MOVV n+8(FP), R2
16 ADDV R1, R2, R4
17
18 // if less than 16 bytes or no MSA, do words check
19 SGTU $16, R2, R3
20 BNE R3, no_msa
21 MOVBU internal∕cpu·MIPS64X+const_offsetMIPS64XHasMSA(SB), R3
22 BEQ R3, R0, no_msa
23
24 VMOVB $0, W0
25
26 SGTU $128, R2, R3
27 BEQ R3, msa_large
28
29 AND $15, R2, R5
30 XOR R2, R5, R6
31 ADDVU R1, R6
32
33 msa_small:
34 VMOVB W0, (R1)
35 ADDVU $16, R1
36 SGTU R6, R1, R3
37 BNE R3, R0, msa_small
38 BEQ R5, R0, done
39 VMOVB W0, -16(R4)
40 JMP done
41
42 msa_large:
43 AND $127, R2, R5
44 XOR R2, R5, R6
45 ADDVU R1, R6
46
47 msa_large_loop:
48 VMOVB W0, (R1)
49 VMOVB W0, 16(R1)
50 VMOVB W0, 32(R1)
51 VMOVB W0, 48(R1)
52 VMOVB W0, 64(R1)
53 VMOVB W0, 80(R1)
54 VMOVB W0, 96(R1)
55 VMOVB W0, 112(R1)
56
57 ADDVU $128, R1
58 SGTU R6, R1, R3
59 BNE R3, R0, msa_large_loop
60 BEQ R5, R0, done
61 VMOVB W0, -128(R4)
62 VMOVB W0, -112(R4)
63 VMOVB W0, -96(R4)
64 VMOVB W0, -80(R4)
65 VMOVB W0, -64(R4)
66 VMOVB W0, -48(R4)
67 VMOVB W0, -32(R4)
68 VMOVB W0, -16(R4)
69 JMP done
70
71 no_msa:
72 // if less than 8 bytes, do one byte at a time
73 SGTU $8, R2, R3
74 BNE R3, check4
75
76 // Check alignment
77 AND $7, R1, R3
78 BEQ R3, aligned
79
80 // Zero one byte at a time until we reach 8 byte alignment.
81 MOVV $8, R5
82 SUBV R3, R5, R3
83 SUBV R3, R2, R2
84 align:
85 SUBV $1, R3
86 MOVB R0, (R1)
87 ADDV $1, R1
88 BNE R3, align
89
90 aligned:
91 SGTU $8, R2, R3
92 BNE R3, check4
93 SGTU $16, R2, R3
94 BNE R3, zero8
95 SGTU $32, R2, R3
96 BNE R3, zero16
97 SGTU $64, R2, R3
98 BNE R3, zero32
99 loop64:
100 MOVV R0, (R1)
101 MOVV R0, 8(R1)
102 MOVV R0, 16(R1)
103 MOVV R0, 24(R1)
104 MOVV R0, 32(R1)
105 MOVV R0, 40(R1)
106 MOVV R0, 48(R1)
107 MOVV R0, 56(R1)
108 ADDV $64, R1
109 SUBV $64, R2
110 SGTU $64, R2, R3
111 BEQ R0, R3, loop64
112 BEQ R2, done
113
114 check32:
115 SGTU $32, R2, R3
116 BNE R3, check16
117 zero32:
118 MOVV R0, (R1)
119 MOVV R0, 8(R1)
120 MOVV R0, 16(R1)
121 MOVV R0, 24(R1)
122 ADDV $32, R1
123 SUBV $32, R2
124 BEQ R2, done
125
126 check16:
127 SGTU $16, R2, R3
128 BNE R3, check8
129 zero16:
130 MOVV R0, (R1)
131 MOVV R0, 8(R1)
132 ADDV $16, R1
133 SUBV $16, R2
134 BEQ R2, done
135
136 check8:
137 SGTU $8, R2, R3
138 BNE R3, check4
139 zero8:
140 MOVV R0, (R1)
141 ADDV $8, R1
142 SUBV $8, R2
143 BEQ R2, done
144
145 check4:
146 SGTU $4, R2, R3
147 BNE R3, loop1
148 zero4:
149 MOVB R0, (R1)
150 MOVB R0, 1(R1)
151 MOVB R0, 2(R1)
152 MOVB R0, 3(R1)
153 ADDV $4, R1
154 SUBV $4, R2
155
156 loop1:
157 BEQ R1, R4, done
158 MOVB R0, (R1)
159 ADDV $1, R1
160 JMP loop1
161 done:
162 RET
163
164
View as plain text