Text file
src/runtime/secret_loong64.s
1 // Copyright 2026 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 "go_asm.h"
6 #include "textflag.h"
7 #include "funcdata.h"
8
9 TEXT ·secretEraseRegisters(SB),NOFRAME|NOSPLIT,$0-0
10 MOVV R0, R4
11 MOVV R0, R29
12 JMP ·secretEraseRegistersMcall(SB)
13
14 // Mcall requires an argument in R4 and does not have a
15 // stack frame to spill into. Additionally, there is no stack
16 // to spill the link register into. This function deliberately
17 // doesn't clear R4 and R29, and Mcall uses R29 as a link register.
18 TEXT ·secretEraseRegistersMcall(SB),NOFRAME|NOSPLIT,$0-0
19 MOVBU internal∕cpu·Loong64+const_offsetLOONG64HasLASX(SB), R5
20 BNE R5, eraseLasx
21 MOVBU internal∕cpu·Loong64+const_offsetLOONG64HasLSX(SB), R5
22 BNE R5, eraseLsx
23
24 // floating-point registers
25 MOVV R0, F0
26 MOVV R0, F1
27 MOVV R0, F2
28 MOVV R0, F3
29 MOVV R0, F4
30 MOVV R0, F5
31 MOVV R0, F6
32 MOVV R0, F7
33 MOVV R0, F8
34 MOVV R0, F9
35 MOVV R0, F10
36 MOVV R0, F11
37 MOVV R0, F12
38 MOVV R0, F13
39 MOVV R0, F14
40 MOVV R0, F15
41 MOVV R0, F16
42 MOVV R0, F17
43 MOVV R0, F18
44 MOVV R0, F19
45 MOVV R0, F20
46 MOVV R0, F21
47 MOVV R0, F22
48 MOVV R0, F23
49 MOVV R0, F24
50 MOVV R0, F25
51 MOVV R0, F26
52 MOVV R0, F27
53 MOVV R0, F28
54 MOVV R0, F29
55 MOVV R0, F30
56 MOVV R0, F31
57 JMP eraseInt
58
59 // lsx registers
60 eraseLsx:
61 VXORV V0, V0
62 VXORV V1, V1
63 VXORV V2, V2
64 VXORV V4, V3
65 VXORV V4, V4
66 VXORV V5, V5
67 VXORV V6, V6
68 VXORV V7, V7
69 VXORV V8, V8
70 VXORV V9, V9
71 VXORV V10, V10
72 VXORV V11, V11
73 VXORV V12, V12
74 VXORV V13, V13
75 VXORV V14, V14
76 VXORV V15, V15
77 VXORV V16, V16
78 VXORV V17, V17
79 VXORV V18, V18
80 VXORV V19, V19
81 VXORV V20, V20
82 VXORV V21, V21
83 VXORV V22, V22
84 VXORV V23, V23
85 VXORV V24, V24
86 VXORV V25, V25
87 VXORV V26, V26
88 VXORV V27, V27
89 VXORV V28, V28
90 VXORV V29, V29
91 VXORV V30, V30
92 VXORV V31, V31
93 JMP eraseInt
94
95 // lasx registers
96 eraseLasx:
97 XVXORV X0, X0
98 XVXORV X1, X1
99 XVXORV X2, X2
100 XVXORV X3, X3
101 XVXORV X4, X4
102 XVXORV X5, X5
103 XVXORV X6, X6
104 XVXORV X7, X7
105 XVXORV X8, X8
106 XVXORV X9, X9
107 XVXORV X10, X10
108 XVXORV X11, X11
109 XVXORV X12, X12
110 XVXORV X13, X13
111 XVXORV X14, X14
112 XVXORV X15, X15
113 XVXORV X16, X16
114 XVXORV X17, X17
115 XVXORV X18, X18
116 XVXORV X19, X19
117 XVXORV X20, X20
118 XVXORV X21, X21
119 XVXORV X22, X22
120 XVXORV X23, X23
121 XVXORV X24, X24
122 XVXORV X25, X25
123 XVXORV X26, X26
124 XVXORV X27, X27
125 XVXORV X28, X28
126 XVXORV X29, X29
127 XVXORV X30, X30
128 XVXORV X31, X31
129
130 eraseInt:
131 // integer registers
132 // R1 = link pointer (return address)
133 // R2 = TP
134 // R3 = stack pointer
135 // R4
136 // R22 = g
137 // R29 used for extra link register in mcall where we can't spill
138
139 XOR R5, R5
140 XOR R6, R6
141 XOR R7, R7
142 XOR R8, R8
143 XOR R9, R9
144 XOR R10, R10
145 XOR R11, R11
146 XOR R12, R12
147 XOR R13, R13
148 XOR R14, R14
149 XOR R15, R15
150 XOR R16, R16
151 XOR R17, R17
152 XOR R18, R18
153 XOR R19, R19
154 XOR R20, R20
155 XOR R21, R21
156 XOR R23, R23
157 XOR R24, R24
158 XOR R25, R25
159 XOR R26, R26
160 XOR R27, R27
161 XOR R28, R28
162 XOR R30, R30
163 XOR R31, R31
164
165 // misc registers
166 MOVV R0, FCC0
167 MOVV R0, FCC1
168 MOVV R0, FCC2
169 MOVV R0, FCC3
170 MOVV R0, FCC4
171 MOVV R0, FCC5
172 MOVV R0, FCC6
173 MOVV R0, FCC7
174 MOVV R0, FCSR0
175 RET
176
View as plain text