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
18 crosscall1:
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
View as plain text