diff --git a/src/cmd/internal/obj/loong64/doc.go b/src/cmd/internal/obj/loong64/doc.go
index 19c9e05..80ded5f 100644
--- a/src/cmd/internal/obj/loong64/doc.go
+++ b/src/cmd/internal/obj/loong64/doc.go
@@ -6,6 +6,18 @@
Package loong64 implements an LoongArch64 assembler. Go assembly syntax is different from
GNU LoongArch64 syntax, but we can still follow the general rules to map between them.
+# Register Convention
+
+ Name | Alias | Meaning
+ -------------------------------------------------------------------------------------------------------------------
+ R0 | REGZERO | Constant zero
+ R1 | REGLINK | Return address
+ R3 | REGSP | Stack pointer
+ R12,R13,R14,R15 | | For plt and trampoline, use with caution in assembly code, save before calling function
+ R22 | REGG | Goroutine pointer
+ R29 | REGCTXT | Context for closures
+ R30 | REGTMP | Tmp register used by assembler
+
# Instructions mnemonics mapping rules
1. Bit widths represented by various instruction suffixes and prefixes
diff --git a/src/cmd/link/internal/loong64/asm.go b/src/cmd/link/internal/loong64/asm.go
index dfcf928..a87a93e 100644
--- a/src/cmd/link/internal/loong64/asm.go
+++ b/src/cmd/link/internal/loong64/asm.go
@@ -645,13 +645,6 @@
r := relocs.At(ri)
switch r.Type() {
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26), objabi.R_CALLLOONG64:
- if ldr.SymType(rs) == sym.SDYNIMPORT {
- // Nothing to do.
- // The plt symbol has not been added. If we add tramp
- // here, plt will not work.
- return
- }
-
var t int64
// ldr.SymValue(rs) == 0 indicates a cross-package jump to a function that is not yet
// laid out. Conservatively use a trampoline. This should be rare, as we lay out packages
@@ -720,7 +713,7 @@
tramp.SetSize(12) // 3 instructions
P := make([]byte, tramp.Size())
- o1 := uint32(0x1a00001e) // pcalau12i $r30, 0
+ o1 := uint32(0x1a00000f) // pcalau12i $r15, 0
ctxt.Arch.ByteOrder.PutUint32(P, o1)
r1, _ := tramp.AddRel(objabi.R_LOONG64_ADDR_HI)
r1.SetOff(0)
@@ -728,7 +721,7 @@
r1.SetSym(target)
r1.SetAdd(offset)
- o2 := uint32(0x02c003de) // addi.d $r30, $r30, 0
+ o2 := uint32(0x02c001ef) // addi.d $r15, $r15, 0
ctxt.Arch.ByteOrder.PutUint32(P[4:], o2)
r2, _ := tramp.AddRel(objabi.R_LOONG64_ADDR_LO)
r2.SetOff(4)
@@ -736,7 +729,7 @@
r2.SetSym(target)
r2.SetAdd(offset)
- o3 := uint32(0x4c0003c0) // jirl $r0, $r30, 0
+ o3 := uint32(0x4c0001e0) // jirl $r0, $r15, 0
ctxt.Arch.ByteOrder.PutUint32(P[8:], o3)
tramp.SetData(P)
@@ -746,21 +739,21 @@
tramp.SetSize(12) // 3 instructions
P := make([]byte, tramp.Size())
- o1 := uint32(0x1a00001e) // pcalau12i $r30, 0
+ o1 := uint32(0x1a00000f) // pcalau12i $r15, 0
ctxt.Arch.ByteOrder.PutUint32(P, o1)
r1, _ := tramp.AddRel(objabi.R_LOONG64_GOT_HI)
r1.SetOff(0)
r1.SetSiz(4)
r1.SetSym(target)
- o2 := uint32(0x28c003de) // ld.d $r30, $r30, 0
+ o2 := uint32(0x28c001ef) // ld.d $r15, $r15, 0
ctxt.Arch.ByteOrder.PutUint32(P[4:], o2)
r2, _ := tramp.AddRel(objabi.R_LOONG64_GOT_LO)
r2.SetOff(4)
r2.SetSiz(4)
r2.SetSym(target)
- o3 := uint32(0x4c0003c0) // jirl $r0, $r30, 0
+ o3 := uint32(0x4c0001e0) // jirl $r0, $r15, 0
ctxt.Arch.ByteOrder.PutUint32(P[8:], o3)
tramp.SetData(P)