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