| // Copyright 2026 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 "go_asm.h" | |
| #include "textflag.h" | |
| #include "funcdata.h" | |
| TEXT ·secretEraseRegisters(SB),NOFRAME|NOSPLIT,$0-0 | |
| MOVV R0, R4 | |
| MOVV R0, R29 | |
| JMP ·secretEraseRegistersMcall(SB) | |
| // Mcall requires an argument in R4 and does not have a | |
| // stack frame to spill into. Additionally, there is no stack | |
| // to spill the link register into. This function deliberately | |
| // doesn't clear R4 and R29, and Mcall uses R29 as a link register. | |
| TEXT ·secretEraseRegistersMcall(SB),NOFRAME|NOSPLIT,$0-0 | |
| MOVBU internal∕cpu·Loong64+const_offsetLOONG64HasLASX(SB), R5 | |
| BNE R5, eraseLasx | |
| MOVBU internal∕cpu·Loong64+const_offsetLOONG64HasLSX(SB), R5 | |
| BNE R5, eraseLsx | |
| // floating-point registers | |
| MOVV R0, F0 | |
| MOVV R0, F1 | |
| MOVV R0, F2 | |
| MOVV R0, F3 | |
| MOVV R0, F4 | |
| MOVV R0, F5 | |
| MOVV R0, F6 | |
| MOVV R0, F7 | |
| MOVV R0, F8 | |
| MOVV R0, F9 | |
| MOVV R0, F10 | |
| MOVV R0, F11 | |
| MOVV R0, F12 | |
| MOVV R0, F13 | |
| MOVV R0, F14 | |
| MOVV R0, F15 | |
| MOVV R0, F16 | |
| MOVV R0, F17 | |
| MOVV R0, F18 | |
| MOVV R0, F19 | |
| MOVV R0, F20 | |
| MOVV R0, F21 | |
| MOVV R0, F22 | |
| MOVV R0, F23 | |
| MOVV R0, F24 | |
| MOVV R0, F25 | |
| MOVV R0, F26 | |
| MOVV R0, F27 | |
| MOVV R0, F28 | |
| MOVV R0, F29 | |
| MOVV R0, F30 | |
| MOVV R0, F31 | |
| JMP eraseInt | |
| // lsx registers | |
| eraseLsx: | |
| VXORV V0, V0 | |
| VXORV V1, V1 | |
| VXORV V2, V2 | |
| VXORV V4, V3 | |
| VXORV V4, V4 | |
| VXORV V5, V5 | |
| VXORV V6, V6 | |
| VXORV V7, V7 | |
| VXORV V8, V8 | |
| VXORV V9, V9 | |
| VXORV V10, V10 | |
| VXORV V11, V11 | |
| VXORV V12, V12 | |
| VXORV V13, V13 | |
| VXORV V14, V14 | |
| VXORV V15, V15 | |
| VXORV V16, V16 | |
| VXORV V17, V17 | |
| VXORV V18, V18 | |
| VXORV V19, V19 | |
| VXORV V20, V20 | |
| VXORV V21, V21 | |
| VXORV V22, V22 | |
| VXORV V23, V23 | |
| VXORV V24, V24 | |
| VXORV V25, V25 | |
| VXORV V26, V26 | |
| VXORV V27, V27 | |
| VXORV V28, V28 | |
| VXORV V29, V29 | |
| VXORV V30, V30 | |
| VXORV V31, V31 | |
| JMP eraseInt | |
| // lasx registers | |
| eraseLasx: | |
| XVXORV X0, X0 | |
| XVXORV X1, X1 | |
| XVXORV X2, X2 | |
| XVXORV X3, X3 | |
| XVXORV X4, X4 | |
| XVXORV X5, X5 | |
| XVXORV X6, X6 | |
| XVXORV X7, X7 | |
| XVXORV X8, X8 | |
| XVXORV X9, X9 | |
| XVXORV X10, X10 | |
| XVXORV X11, X11 | |
| XVXORV X12, X12 | |
| XVXORV X13, X13 | |
| XVXORV X14, X14 | |
| XVXORV X15, X15 | |
| XVXORV X16, X16 | |
| XVXORV X17, X17 | |
| XVXORV X18, X18 | |
| XVXORV X19, X19 | |
| XVXORV X20, X20 | |
| XVXORV X21, X21 | |
| XVXORV X22, X22 | |
| XVXORV X23, X23 | |
| XVXORV X24, X24 | |
| XVXORV X25, X25 | |
| XVXORV X26, X26 | |
| XVXORV X27, X27 | |
| XVXORV X28, X28 | |
| XVXORV X29, X29 | |
| XVXORV X30, X30 | |
| XVXORV X31, X31 | |
| eraseInt: | |
| // integer registers | |
| // R1 = link pointer (return address) | |
| // R2 = TP | |
| // R3 = stack pointer | |
| // R4 | |
| // R22 = g | |
| // R29 used for extra link register in mcall where we can't spill | |
| XOR R5, R5 | |
| XOR R6, R6 | |
| XOR R7, R7 | |
| XOR R8, R8 | |
| XOR R9, R9 | |
| XOR R10, R10 | |
| XOR R11, R11 | |
| XOR R12, R12 | |
| XOR R13, R13 | |
| XOR R14, R14 | |
| XOR R15, R15 | |
| XOR R16, R16 | |
| XOR R17, R17 | |
| XOR R18, R18 | |
| XOR R19, R19 | |
| XOR R20, R20 | |
| XOR R21, R21 | |
| XOR R23, R23 | |
| XOR R24, R24 | |
| XOR R25, R25 | |
| XOR R26, R26 | |
| XOR R27, R27 | |
| XOR R28, R28 | |
| XOR R30, R30 | |
| XOR R31, R31 | |
| // misc registers | |
| MOVV R0, FCC0 | |
| MOVV R0, FCC1 | |
| MOVV R0, FCC2 | |
| MOVV R0, FCC3 | |
| MOVV R0, FCC4 | |
| MOVV R0, FCC5 | |
| MOVV R0, FCC6 | |
| MOVV R0, FCC7 | |
| MOVV R0, FCSR0 | |
| RET |