]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/cgo/asm_ppc64x.s
8eb4a4215788656bbac898af8f8ffd2fbd36d67c
[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 // Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
11 // It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
12 TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
13         MOVD    _crosscall2_ptr(SB), R5
14 #ifdef GOARCH_ppc64
15         MOVD    $_crosscall2<>(SB), R6
16 #else
17         MOVD    $crosscall2(SB), R6
18 #endif
19         MOVD    R6, (R5)
20         RET
21
22 #ifdef GO_PPC64X_HAS_FUNCDESC
23 // _crosscall2<> is a function descriptor to the real crosscall2.
24 DATA    _crosscall2<>+0(SB)/8, $crosscall2(SB)
25 DATA    _crosscall2<>+8(SB)/8, $TOC(SB)
26 DATA    _crosscall2<>+16(SB)/8, $0
27 GLOBL   _crosscall2<>(SB), NOPTR, $24
28 #endif
29
30 // Called by C code generated by cmd/cgo.
31 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
32 // Saves C callee-saved registers and calls cgocallback with three arguments.
33 // fn is the PC of a func(a unsafe.Pointer) function.
34 // The value of R2 is saved on the new stack frame, and not
35 // the caller's frame due to issue #43228.
36 TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
37         // Start with standard C stack frame layout and linkage
38         MOVD    LR, R0
39         MOVD    R0, 16(R1)      // Save LR in caller's frame
40         MOVW    CR, R0          // Save CR in caller's frame
41         MOVW    R0, 8(R1)
42
43         BL      saveregs2<>(SB)
44
45         MOVDU   R1, (-288-3*8-FIXED_FRAME)(R1)
46         // Save the caller's R2
47         MOVD    R2, 24(R1)
48
49         // Initialize Go ABI environment
50         BL      runtime·reginit(SB)
51         BL      runtime·load_g(SB)
52
53 #ifdef GO_PPC64X_HAS_FUNCDESC
54         // Load the real entry address from the first slot of the function descriptor.
55         // The first argument fn might be null, that means dropm in pthread key destructor.
56         CMP     R3, $0
57         BEQ     nil_fn
58         MOVD    8(R3), R2
59         MOVD    (R3), R3
60 nil_fn:
61 #endif
62         MOVD    R3, FIXED_FRAME+0(R1)   // fn unsafe.Pointer
63         MOVD    R4, FIXED_FRAME+8(R1)   // a unsafe.Pointer
64         // Skip R5 = n uint32
65         MOVD    R6, FIXED_FRAME+16(R1)  // ctxt uintptr
66         BL      runtime·cgocallback(SB)
67
68         // Restore the caller's R2
69         MOVD    24(R1), R2
70         ADD     $(288+3*8+FIXED_FRAME), R1
71
72         BL      restoreregs2<>(SB)
73
74         MOVW    8(R1), R0
75         MOVFL   R0, $0xff
76         MOVD    16(R1), R0
77         MOVD    R0, LR
78         RET
79
80 TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0
81         // 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
82         MOVD    R14, -288(R1)
83         MOVD    R15, -280(R1)
84         MOVD    R16, -272(R1)
85         MOVD    R17, -264(R1)
86         MOVD    R18, -256(R1)
87         MOVD    R19, -248(R1)
88         MOVD    R20, -240(R1)
89         MOVD    R21, -232(R1)
90         MOVD    R22, -224(R1)
91         MOVD    R23, -216(R1)
92         MOVD    R24, -208(R1)
93         MOVD    R25, -200(R1)
94         MOVD    R26, -192(R1)
95         MOVD    R27, -184(R1)
96         MOVD    R28, -176(R1)
97         MOVD    R29, -168(R1)
98         MOVD    g, -160(R1)
99         MOVD    R31, -152(R1)
100         FMOVD   F14, -144(R1)
101         FMOVD   F15, -136(R1)
102         FMOVD   F16, -128(R1)
103         FMOVD   F17, -120(R1)
104         FMOVD   F18, -112(R1)
105         FMOVD   F19, -104(R1)
106         FMOVD   F20, -96(R1)
107         FMOVD   F21, -88(R1)
108         FMOVD   F22, -80(R1)
109         FMOVD   F23, -72(R1)
110         FMOVD   F24, -64(R1)
111         FMOVD   F25, -56(R1)
112         FMOVD   F26, -48(R1)
113         FMOVD   F27, -40(R1)
114         FMOVD   F28, -32(R1)
115         FMOVD   F29, -24(R1)
116         FMOVD   F30, -16(R1)
117         FMOVD   F31, -8(R1)
118
119         RET
120
121 TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0
122         // 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
123         MOVD    -288(R1), R14
124         MOVD    -280(R1), R15
125         MOVD    -272(R1), R16
126         MOVD    -264(R1), R17
127         MOVD    -256(R1), R18
128         MOVD    -248(R1), R19
129         MOVD    -240(R1), R20
130         MOVD    -232(R1), R21
131         MOVD    -224(R1), R22
132         MOVD    -216(R1), R23
133         MOVD    -208(R1), R24
134         MOVD    -200(R1), R25
135         MOVD    -192(R1), R26
136         MOVD    -184(R1), R27
137         MOVD    -176(R1), R28
138         MOVD    -168(R1), R29
139         MOVD    -160(R1), g
140         MOVD    -152(R1), R31
141         FMOVD   -144(R1), F14
142         FMOVD   -136(R1), F15
143         FMOVD   -128(R1), F16
144         FMOVD   -120(R1), F17
145         FMOVD   -112(R1), F18
146         FMOVD   -104(R1), F19
147         FMOVD   -96(R1), F20
148         FMOVD   -88(R1), F21
149         FMOVD   -80(R1), F22
150         FMOVD   -72(R1), F23
151         FMOVD   -64(R1), F24
152         FMOVD   -56(R1), F25
153         FMOVD   -48(R1), F26
154         FMOVD   -40(R1), F27
155         FMOVD   -32(R1), F28
156         FMOVD   -24(R1), F29
157         FMOVD   -16(R1), F30
158         FMOVD   -8(R1), F31
159
160         RET