Text file
src/runtime/cgo/gcc_aix_ppc64.S
1 // Copyright 2019 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 // +build ppc64
6 // +build aix
7
8 /*
9 * void crosscall_ppc64(void (*fn)(void), void *g)
10 *
11 * Calling into the gc tool chain, where all registers are caller save.
12 * Called from standard ppc64 C ABI, where r2, r14-r31, f14-f31 are
13 * callee-save, so they must be saved explicitly.
14 * AIX has a special assembly syntax and keywords that can be mixed with
15 * Linux assembly.
16 */
17 .toc
18 .csect .text[PR]
19 .globl crosscall_ppc64
20 .globl .crosscall_ppc64
21 .csect crosscall_ppc64[DS]
22 crosscall_ppc64:
23 .llong .crosscall_ppc64, TOC[tc0], 0
24 .csect .text[PR]
25 .crosscall_ppc64:
26 // Start with standard C stack frame layout and linkage
27 mflr 0
28 std 0, 16(1) // Save LR in caller's frame
29 std 2, 40(1) // Save TOC in caller's frame
30 bl saveregs
31 stdu 1, -296(1)
32
33 // Set up Go ABI constant registers
34 // Must match _cgo_reginit in runtime package.
35 xor 0, 0, 0
36
37 // Restore g pointer (r30 in Go ABI, which may have been clobbered by C)
38 mr 30, 4
39
40 // Call fn
41 mr 12, 3
42 mtctr 12
43 bctrl
44
45 addi 1, 1, 296
46 bl restoreregs
47 ld 2, 40(1)
48 ld 0, 16(1)
49 mtlr 0
50 blr
51
52 saveregs:
53 // Save callee-save registers
54 // O=-288; for R in {14..31}; do echo "\tstd\t$R, $O(1)"; ((O+=8)); done; for F in f{14..31}; do echo "\tstfd\t$F, $O(1)"; ((O+=8)); done
55 std 14, -288(1)
56 std 15, -280(1)
57 std 16, -272(1)
58 std 17, -264(1)
59 std 18, -256(1)
60 std 19, -248(1)
61 std 20, -240(1)
62 std 21, -232(1)
63 std 22, -224(1)
64 std 23, -216(1)
65 std 24, -208(1)
66 std 25, -200(1)
67 std 26, -192(1)
68 std 27, -184(1)
69 std 28, -176(1)
70 std 29, -168(1)
71 std 30, -160(1)
72 std 31, -152(1)
73 stfd 14, -144(1)
74 stfd 15, -136(1)
75 stfd 16, -128(1)
76 stfd 17, -120(1)
77 stfd 18, -112(1)
78 stfd 19, -104(1)
79 stfd 20, -96(1)
80 stfd 21, -88(1)
81 stfd 22, -80(1)
82 stfd 23, -72(1)
83 stfd 24, -64(1)
84 stfd 25, -56(1)
85 stfd 26, -48(1)
86 stfd 27, -40(1)
87 stfd 28, -32(1)
88 stfd 29, -24(1)
89 stfd 30, -16(1)
90 stfd 31, -8(1)
91
92 blr
93
94 restoreregs:
95 // O=-288; for R in {14..31}; do echo "\tld\t$R, $O(1)"; ((O+=8)); done; for F in {14..31}; do echo "\tlfd\t$F, $O(1)"; ((O+=8)); done
96 ld 14, -288(1)
97 ld 15, -280(1)
98 ld 16, -272(1)
99 ld 17, -264(1)
100 ld 18, -256(1)
101 ld 19, -248(1)
102 ld 20, -240(1)
103 ld 21, -232(1)
104 ld 22, -224(1)
105 ld 23, -216(1)
106 ld 24, -208(1)
107 ld 25, -200(1)
108 ld 26, -192(1)
109 ld 27, -184(1)
110 ld 28, -176(1)
111 ld 29, -168(1)
112 ld 30, -160(1)
113 ld 31, -152(1)
114 lfd 14, -144(1)
115 lfd 15, -136(1)
116 lfd 16, -128(1)
117 lfd 17, -120(1)
118 lfd 18, -112(1)
119 lfd 19, -104(1)
120 lfd 20, -96(1)
121 lfd 21, -88(1)
122 lfd 22, -80(1)
123 lfd 23, -72(1)
124 lfd 24, -64(1)
125 lfd 25, -56(1)
126 lfd 26, -48(1)
127 lfd 27, -40(1)
128 lfd 28, -32(1)
129 lfd 29, -24(1)
130 lfd 30, -16(1)
131 lfd 31, -8(1)
132
133 blr
134
View as plain text