// Avoid unintentionally clobbering g using R22.
delete(register, "R22")
register["g"] = loong64.REG_R22
- register["RSB"] = loong64.REG_R31
registerPrefix := map[string]bool{
"F": true,
"FCSR": true,
{"R27", "R27"},
{"R28", "R28"},
{"R29", "R29"},
- {"R30", "R30"},
{"R3", "R3"},
+ {"R30", "R30"},
+ {"R31", "R31"},
{"R4", "R4"},
{"R5", "R5"},
{"R6", "R6"},
{"R9", "R9"},
{"a(FP)", "a(FP)"},
{"g", "g"},
- {"RSB", "R31"},
{"ret+8(FP)", "ret+8(FP)"},
{"runtime·abort(SB)", "runtime.abort(SB)"},
{"·AddUint32(SB)", "\"\".AddUint32(SB)"},
movf := "MOVD"
add := "ADDV"
sub := "SUBV"
- r31 := "RSB"
regsize := 8
// Add integer registers r4-r21 r23-r29 r31
// R0 (zero), R30 (REGTMP), R2 (tp), R3 (SP), R22 (g), R1 (LR) are special,
var l = layout{sp: "R3", stack: regsize} // add slot to save PC of interrupted instruction (in LR)
- for i := 4; i <= 29; i++ {
- if i == 22 {
- continue // R3 is REGSP R22 is g
+ for i := 4; i <= 31; i++ {
+ if i == 22 || i == 30 {
+ continue
}
reg := fmt.Sprintf("R%d", i)
l.add(mov, reg, regsize)
}
- l.add(mov, r31, regsize)
// Add floating point registers F0-F31.
for i := 0; i <= 31; i++ {
}
// In case we are panicking from external C code
- sigpanicPC := uint64(abi.FuncPCABIInternal(sigpanic))
- c.set_r31(sigpanicPC >> 32 << 32) // RSB register
c.set_r22(uint64(uintptr(unsafe.Pointer(gp))))
- c.set_pc(sigpanicPC)
+ c.set_pc(uint64(abi.FuncPCABIInternal(sigpanic)))
}
func (c *sigctxt) pushCall(targetPC, resumePC uintptr) {