]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: save and restore R31 for crosscall1 on loong64
authorGuoqi Chen <chenguoqi@loongson.cn>
Thu, 4 Sep 2025 09:02:01 +0000 (17:02 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Sat, 6 Sep 2025 01:11:42 +0000 (18:11 -0700)
According to the Loong64 procedure call standard [1], R31 is a static
register and therefore needs to be saved and restored.

Also, the R2 (thread pointer) register has been removed here, as it is
not involved in allocation.

[1]: https://github.com/loongson/la-abi-specs/blob/release/lapcs.adoc

Change-Id: I02e5d4bedf131e491f1a262aa3cbc0896cbc9488
Reviewed-on: https://go-review.googlesource.com/c/go/+/700817
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/cgo/gcc_loong64.S

index c84a3715b256550543be9bbf382dfd4ecfd63a95..d2b062f49f9ce5a691c72712ca32095afb65c55c 100644 (file)
@@ -8,23 +8,23 @@
  * void crosscall1(void (*fn)(void), void (*setg_gcc)(void *g), void *g)
  *
  * Calling into the gc tool chain, where all registers are caller save.
- * Called from standard lp64d ABI, where $r1, $r3, $r23-$r30, and $f24-$f31
+ * Called from standard lp64d ABI, where $r1, $r3, $r22-$r31, and $f24-$f31
  * are callee-save, so they must be saved explicitly, along with $r1 (LR).
  */
 .globl crosscall1
 crosscall1:
        addi.d  $r3, $r3, -160
        st.d    $r1, $r3, 0
-       st.d    $r23, $r3, 8
-       st.d    $r24, $r3, 16
-       st.d    $r25, $r3, 24
-       st.d    $r26, $r3, 32
-       st.d    $r27, $r3, 40
-       st.d    $r28, $r3, 48
-       st.d    $r29, $r3, 56
-       st.d    $r30, $r3, 64
-       st.d    $r2, $r3, 72
-       st.d    $r22, $r3, 80
+       st.d    $r22, $r3, 8
+       st.d    $r23, $r3, 16
+       st.d    $r24, $r3, 24
+       st.d    $r25, $r3, 32
+       st.d    $r26, $r3, 40
+       st.d    $r27, $r3, 48
+       st.d    $r28, $r3, 56
+       st.d    $r29, $r3, 64
+       st.d    $r30, $r3, 72
+       st.d    $r31, $r3, 80
        fst.d   $f24, $r3, 88
        fst.d   $f25, $r3, 96
        fst.d   $f26, $r3, 104
@@ -40,16 +40,16 @@ crosscall1:
        jirl    $r1, $r5, 0     // call setg_gcc (clobbers R4)
        jirl    $r1, $r23, 0    // call fn
 
-       ld.d    $r23, $r3, 8
-       ld.d    $r24, $r3, 16
-       ld.d    $r25, $r3, 24
-       ld.d    $r26, $r3, 32
-       ld.d    $r27, $r3, 40
-       ld.d    $r28, $r3, 48
-       ld.d    $r29, $r3, 56
-       ld.d    $r30, $r3, 64
-       ld.d    $r2, $r3, 72
-       ld.d    $r22, $r3, 80
+       ld.d    $r22, $r3, 8
+       ld.d    $r23, $r3, 16
+       ld.d    $r24, $r3, 24
+       ld.d    $r25, $r3, 32
+       ld.d    $r26, $r3, 40
+       ld.d    $r27, $r3, 48
+       ld.d    $r28, $r3, 56
+       ld.d    $r29, $r3, 64
+       ld.d    $r30, $r3, 72
+       ld.d    $r31, $r3, 80
        fld.d   $f24, $r3, 88
        fld.d   $f25, $r3, 96
        fld.d   $f26, $r3, 104