]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/cgo/asm_ppc64x.s
fea749670b828c07421168d7e1733da6b6a341ed
[gostls13.git] / src / runtime / cgo / asm_ppc64x.s
1 // Copyright 2014 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 ppc64 || ppc64le
6
7 #include "textflag.h"
8 #include "asm_ppc64x.h"
9
10 // Called by C code generated by cmd/cgo.
11 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
12 // Saves C callee-saved registers and calls cgocallback with three arguments.
13 // fn is the PC of a func(a unsafe.Pointer) function.
14 // The value of R2 is saved on the new stack frame, and not
15 // the caller's frame due to issue #43228.
16 TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
17         // Start with standard C stack frame layout and linkage
18         MOVD    LR, R0
19         MOVD    R0, 16(R1)      // Save LR in caller's frame
20         MOVW    CR, R0          // Save CR in caller's frame
21         MOVW    R0, 8(R1)
22
23         BL      saveregs2<>(SB)
24
25         MOVDU   R1, (-288-3*8-FIXED_FRAME)(R1)
26         // Save the caller's R2
27         MOVD    R2, 24(R1)
28
29         // Initialize Go ABI environment
30         BL      runtime·reginit(SB)
31         BL      runtime·load_g(SB)
32
33 #ifdef GO_PPC64X_HAS_FUNCDESC
34         // Load the real entry address from the first slot of the function descriptor.
35         MOVD    8(R3), R2
36         MOVD    (R3), R3
37 #endif
38         MOVD    R3, FIXED_FRAME+0(R1)   // fn unsafe.Pointer
39         MOVD    R4, FIXED_FRAME+8(R1)   // a unsafe.Pointer
40         // Skip R5 = n uint32
41         MOVD    R6, FIXED_FRAME+16(R1)  // ctxt uintptr
42         BL      runtime·cgocallback(SB)
43
44         // Restore the caller's R2
45         MOVD    24(R1), R2
46         ADD     $(288+3*8+FIXED_FRAME), R1
47
48         BL      restoreregs2<>(SB)
49
50         MOVW    8(R1), R0
51         MOVFL   R0, $0xff
52         MOVD    16(R1), R0
53         MOVD    R0, LR
54         RET
55
56 TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0
57         // O=-288; for R in R{14..31}; do echo "\tMOVD\t$R, $O(R1)"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$F, $O(R1)"; ((O+=8)); done
58         MOVD    R14, -288(R1)
59         MOVD    R15, -280(R1)
60         MOVD    R16, -272(R1)
61         MOVD    R17, -264(R1)
62         MOVD    R18, -256(R1)
63         MOVD    R19, -248(R1)
64         MOVD    R20, -240(R1)
65         MOVD    R21, -232(R1)
66         MOVD    R22, -224(R1)
67         MOVD    R23, -216(R1)
68         MOVD    R24, -208(R1)
69         MOVD    R25, -200(R1)
70         MOVD    R26, -192(R1)
71         MOVD    R27, -184(R1)
72         MOVD    R28, -176(R1)
73         MOVD    R29, -168(R1)
74         MOVD    g, -160(R1)
75         MOVD    R31, -152(R1)
76         FMOVD   F14, -144(R1)
77         FMOVD   F15, -136(R1)
78         FMOVD   F16, -128(R1)
79         FMOVD   F17, -120(R1)
80         FMOVD   F18, -112(R1)
81         FMOVD   F19, -104(R1)
82         FMOVD   F20, -96(R1)
83         FMOVD   F21, -88(R1)
84         FMOVD   F22, -80(R1)
85         FMOVD   F23, -72(R1)
86         FMOVD   F24, -64(R1)
87         FMOVD   F25, -56(R1)
88         FMOVD   F26, -48(R1)
89         FMOVD   F27, -40(R1)
90         FMOVD   F28, -32(R1)
91         FMOVD   F29, -24(R1)
92         FMOVD   F30, -16(R1)
93         FMOVD   F31, -8(R1)
94
95         RET
96
97 TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0
98         // O=-288; for R in R{14..31}; do echo "\tMOVD\t$O(R1), $R"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$O(R1), $F"; ((O+=8)); done
99         MOVD    -288(R1), R14
100         MOVD    -280(R1), R15
101         MOVD    -272(R1), R16
102         MOVD    -264(R1), R17
103         MOVD    -256(R1), R18
104         MOVD    -248(R1), R19
105         MOVD    -240(R1), R20
106         MOVD    -232(R1), R21
107         MOVD    -224(R1), R22
108         MOVD    -216(R1), R23
109         MOVD    -208(R1), R24
110         MOVD    -200(R1), R25
111         MOVD    -192(R1), R26
112         MOVD    -184(R1), R27
113         MOVD    -176(R1), R28
114         MOVD    -168(R1), R29
115         MOVD    -160(R1), g
116         MOVD    -152(R1), R31
117         FMOVD   -144(R1), F14
118         FMOVD   -136(R1), F15
119         FMOVD   -128(R1), F16
120         FMOVD   -120(R1), F17
121         FMOVD   -112(R1), F18
122         FMOVD   -104(R1), F19
123         FMOVD   -96(R1), F20
124         FMOVD   -88(R1), F21
125         FMOVD   -80(R1), F22
126         FMOVD   -72(R1), F23
127         FMOVD   -64(R1), F24
128         FMOVD   -56(R1), F25
129         FMOVD   -48(R1), F26
130         FMOVD   -40(R1), F27
131         FMOVD   -32(R1), F28
132         FMOVD   -24(R1), F29
133         FMOVD   -16(R1), F30
134         FMOVD   -8(R1), F31
135
136         RET