1// Copyright 2016 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//go:build mips || mipsle
6
7.file "gcc_mipsx.S"
8
9/*
10 * void crosscall1(void (*fn)(void), void (*setg_gcc)(void *g), void *g)
11 *
12 * Calling into the gc tool chain, where all registers are caller save.
13 * Called from standard MIPS O32 ABI, where $16-$23, $30, and $f20-$f31
14 * are callee-save, so they must be saved explicitly, along with $31 (LR).
15 */
16.globl crosscall1
17.set noat
18crosscall1:
19#ifndef __mips_soft_float
20	addiu	$29, $29, -88
21#else
22	addiu	$29, $29, -40 // For soft-float, no need to make room for FP registers
23#endif
24	sw	$31, 0($29)
25	sw	$16, 4($29)
26	sw	$17, 8($29)
27	sw	$18, 12($29)
28	sw	$19, 16($29)
29	sw	$20, 20($29)
30	sw	$21, 24($29)
31	sw	$22, 28($29)
32	sw	$23, 32($29)
33	sw	$30, 36($29)
34
35#ifndef __mips_soft_float
36	sdc1	$f20, 40($29)
37	sdc1	$f22, 48($29)
38	sdc1	$f24, 56($29)
39	sdc1	$f26, 64($29)
40	sdc1	$f28, 72($29)
41	sdc1	$f30, 80($29)
42#endif
43	move	$20, $4 // save R4
44	move	$4, $6
45	jalr	$5	// call setg_gcc
46	jalr	$20	// call fn
47
48	lw	$16, 4($29)
49	lw	$17, 8($29)
50	lw	$18, 12($29)
51	lw	$19, 16($29)
52	lw	$20, 20($29)
53	lw	$21, 24($29)
54	lw	$22, 28($29)
55	lw	$23, 32($29)
56	lw	$30, 36($29)
57#ifndef __mips_soft_float
58	ldc1	$f20, 40($29)
59	ldc1	$f22, 48($29)
60	ldc1	$f24, 56($29)
61	ldc1	$f26, 64($29)
62	ldc1	$f28, 72($29)
63	ldc1	$f30, 80($29)
64#endif
65	lw	$31, 0($29)
66#ifndef __mips_soft_float
67	addiu	$29, $29, 88
68#else
69	addiu	$29, $29, 40
70#endif
71	jr	$31
72
73.set at
74
75#ifdef __ELF__
76.section .note.GNU-stack,"",%progbits
77#endif
78