blob: 6b7668f2889bec6cf135dffa80cf98460b8d410e [file] [log] [blame]
// Copyright 2022 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.
.file "gcc_loong64.S"
/*
* 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
* 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
fst.d $f24, $r3, 88
fst.d $f25, $r3, 96
fst.d $f26, $r3, 104
fst.d $f27, $r3, 112
fst.d $f28, $r3, 120
fst.d $f29, $r3, 128
fst.d $f30, $r3, 136
fst.d $f31, $r3, 144
move $r18, $r4 // save R4
move $r19, $r6
jirl $r1, $r5, 0 // call setg_gcc (clobbers R4)
jirl $r1, $r18, 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
fld.d $f24, $r3, 88
fld.d $f25, $r3, 96
fld.d $f26, $r3, 104
fld.d $f27, $r3, 112
fld.d $f28, $r3, 120
fld.d $f29, $r3, 128
fld.d $f30, $r3, 136
fld.d $f31, $r3, 144
ld.d $r1, $r3, 0
addi.d $r3, $r3, 160
jirl $r0, $r1, 0
#ifdef __ELF__
.section .note.GNU-stack,"",%progbits
#endif