]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/cgo/asm_mipsx.s
Revert "runtime/cgo: store M for C-created thread in pthread key"
[gostls13.git] / src / runtime / cgo / asm_mipsx.s
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 #include "textflag.h"
8
9 // Called by C code generated by cmd/cgo.
10 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
11 // Saves C callee-saved registers and calls cgocallback with three arguments.
12 // fn is the PC of a func(a unsafe.Pointer) function.
13 TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
14         /*
15          * We still need to save all callee save register as before, and then
16          *  push 3 args for fn (R4, R5, R7), skipping R6.
17          * Also note that at procedure entry in gc world, 4(R29) will be the
18          *  first arg.
19          */
20
21         // Space for 9 caller-saved GPR + LR + 6 caller-saved FPR.
22         // O32 ABI allows us to smash 16 bytes argument area of caller frame.
23 #ifndef GOMIPS_softfloat
24         SUBU    $(4*14+8*6-16), R29
25 #else
26         SUBU    $(4*14-16), R29 // For soft-float, no FPR.
27 #endif
28         MOVW    R4, (4*1)(R29)  // fn unsafe.Pointer
29         MOVW    R5, (4*2)(R29)  // a unsafe.Pointer
30         MOVW    R7, (4*3)(R29)  // ctxt uintptr
31         MOVW    R16, (4*4)(R29)
32         MOVW    R17, (4*5)(R29)
33         MOVW    R18, (4*6)(R29)
34         MOVW    R19, (4*7)(R29)
35         MOVW    R20, (4*8)(R29)
36         MOVW    R21, (4*9)(R29)
37         MOVW    R22, (4*10)(R29)
38         MOVW    R23, (4*11)(R29)
39         MOVW    g, (4*12)(R29)
40         MOVW    R31, (4*13)(R29)
41 #ifndef GOMIPS_softfloat
42         MOVD    F20, (4*14)(R29)
43         MOVD    F22, (4*14+8*1)(R29)
44         MOVD    F24, (4*14+8*2)(R29)
45         MOVD    F26, (4*14+8*3)(R29)
46         MOVD    F28, (4*14+8*4)(R29)
47         MOVD    F30, (4*14+8*5)(R29)
48 #endif
49         JAL     runtimeĀ·load_g(SB)
50
51         JAL     runtimeĀ·cgocallback(SB)
52
53         MOVW    (4*4)(R29), R16
54         MOVW    (4*5)(R29), R17
55         MOVW    (4*6)(R29), R18
56         MOVW    (4*7)(R29), R19
57         MOVW    (4*8)(R29), R20
58         MOVW    (4*9)(R29), R21
59         MOVW    (4*10)(R29), R22
60         MOVW    (4*11)(R29), R23
61         MOVW    (4*12)(R29), g
62         MOVW    (4*13)(R29), R31
63 #ifndef GOMIPS_softfloat
64         MOVD    (4*14)(R29), F20
65         MOVD    (4*14+8*1)(R29), F22
66         MOVD    (4*14+8*2)(R29), F24
67         MOVD    (4*14+8*3)(R29), F26
68         MOVD    (4*14+8*4)(R29), F28
69         MOVD    (4*14+8*5)(R29), F30
70
71         ADDU    $(4*14+8*6-16), R29
72 #else
73         ADDU    $(4*14-16), R29
74 #endif
75         RET