github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/runtime/cgo/gcc_loong64.S (about) 1 // Copyright 2022 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 /* 6 * void crosscall1(void (*fn)(void), void (*setg_gcc)(void *g), void *g) 7 * 8 * Calling into the gc tool chain, where all registers are caller save. 9 * Called from standard lp64d ABI, where $r1, $r3, $r23-$r30, and $f24-$f31 10 * are callee-save, so they must be saved explicitly, along with $r1 (LR). 11 */ 12 .globl crosscall1 13 crosscall1: 14 addi.d $r3, $r3, -160 15 st.d $r1, $r3, 0 16 st.d $r23, $r3, 8 17 st.d $r24, $r3, 16 18 st.d $r25, $r3, 24 19 st.d $r26, $r3, 32 20 st.d $r27, $r3, 40 21 st.d $r28, $r3, 48 22 st.d $r29, $r3, 56 23 st.d $r30, $r3, 64 24 st.d $r2, $r3, 72 25 st.d $r22, $r3, 80 26 fst.d $f24, $r3, 88 27 fst.d $f25, $r3, 96 28 fst.d $f26, $r3, 104 29 fst.d $f27, $r3, 112 30 fst.d $f28, $r3, 120 31 fst.d $f29, $r3, 128 32 fst.d $f30, $r3, 136 33 fst.d $f31, $r3, 144 34 35 move $r18, $r4 // save R4 36 move $r19, $r6 37 jirl $r1, $r5, 0 // call setg_gcc (clobbers R4) 38 jirl $r1, $r18, 0 // call fn 39 40 ld.d $r23, $r3, 8 41 ld.d $r24, $r3, 16 42 ld.d $r25, $r3, 24 43 ld.d $r26, $r3, 32 44 ld.d $r27, $r3, 40 45 ld.d $r28, $r3, 48 46 ld.d $r29, $r3, 56 47 ld.d $r30, $r3, 64 48 ld.d $r2, $r3, 72 49 ld.d $r22, $r3, 80 50 fld.d $f24, $r3, 88 51 fld.d $f25, $r3, 96 52 fld.d $f26, $r3, 104 53 fld.d $f27, $r3, 112 54 fld.d $f28, $r3, 120 55 fld.d $f29, $r3, 128 56 fld.d $f30, $r3, 136 57 fld.d $f31, $r3, 144 58 ld.d $r1, $r3, 0 59 addi.d $r3, $r3, 160 60 jirl $r0, $r1, 0 61 62 63 #ifdef __ELF__ 64 .section .note.GNU-stack,"",%progbits 65 #endif