1/* PowerPC asm definitions for GNU C.
2
3Copyright (C) 2002-2020 Free Software Foundation, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24<http://www.gnu.org/licenses/>.  */
25
26/* Under winnt, 1) gas supports the following as names and 2) in particular
27   defining "toc" breaks the FUNC_START macro as ".toc" becomes ".2" */
28
29#define r0	0
30#define sp	1
31#define toc	2
32#define r3	3
33#define r4	4
34#define r5	5
35#define r6	6
36#define r7	7
37#define r8	8
38#define r9	9
39#define r10	10
40#define r11	11
41#define r12	12
42#define r13	13
43#define r14	14
44#define r15	15
45#define r16	16
46#define r17	17
47#define r18	18
48#define r19     19
49#define r20	20
50#define r21	21
51#define r22	22
52#define r23	23
53#define r24	24
54#define r25	25
55#define r26	26
56#define r27	27
57#define r28	28
58#define r29	29
59#define r30	30
60#define r31	31
61
62#define cr0	0
63#define cr1	1
64#define cr2	2
65#define cr3	3
66#define cr4	4
67#define cr5	5
68#define cr6	6
69#define cr7	7
70
71#define f0	0
72#define f1	1
73#define f2	2
74#define f3	3
75#define f4	4
76#define f5	5
77#define f6	6
78#define f7	7
79#define f8	8
80#define f9	9
81#define f10	10
82#define f11	11
83#define f12	12
84#define f13	13
85#define f14	14
86#define f15	15
87#define f16	16
88#define f17	17
89#define f18	18
90#define f19	19
91#define f20	20
92#define f21	21
93#define f22	22
94#define f23	23
95#define f24	24
96#define f25	25
97#define f26	26
98#define f27	27
99#define f28	28
100#define f29	29
101#define f30	30
102#define f31	31
103
104#ifdef __VSX__
105#define f32	32
106#define f33	33
107#define f34	34
108#define f35	35
109#define f36	36
110#define f37	37
111#define f38	38
112#define f39	39
113#define f40	40
114#define f41	41
115#define f42	42
116#define f43	43
117#define f44	44
118#define f45	45
119#define f46	46
120#define f47	47
121#define f48	48
122#define f49	49
123#define f50	50
124#define f51	51
125#define f52	52
126#define f53	53
127#define f54	54
128#define f55	55
129#define f56	56
130#define f57	57
131#define f58	58
132#define f59	59
133#define f60	60
134#define f61	61
135#define f62	62
136#define f63	63
137#endif
138
139#ifdef __ALTIVEC__
140#define v0	0
141#define v1	1
142#define v2	2
143#define v3	3
144#define v4	4
145#define v5	5
146#define v6	6
147#define v7	7
148#define v8	8
149#define v9	9
150#define v10	10
151#define v11	11
152#define v12	12
153#define v13	13
154#define v14	14
155#define v15	15
156#define v16	16
157#define v17	17
158#define v18	18
159#define v19	19
160#define v20	20
161#define v21	21
162#define v22	22
163#define v23	23
164#define v24	24
165#define v25	25
166#define v26	26
167#define v27	27
168#define v28	28
169#define v29	29
170#define v30	30
171#define v31	31
172#endif
173
174#ifdef __VSX__
175#define vs0	0
176#define vs1	1
177#define vs2	2
178#define vs3	3
179#define vs4	4
180#define vs5	5
181#define vs6	6
182#define vs7	7
183#define vs8	8
184#define vs9	9
185#define vs10	10
186#define vs11	11
187#define vs12	12
188#define vs13	13
189#define vs14	14
190#define vs15	15
191#define vs16	16
192#define vs17	17
193#define vs18	18
194#define vs19	19
195#define vs20	20
196#define vs21	21
197#define vs22	22
198#define vs23	23
199#define vs24	24
200#define vs25	25
201#define vs26	26
202#define vs27	27
203#define vs28	28
204#define vs29	29
205#define vs30	30
206#define vs31	31
207#define vs32	32
208#define vs33	33
209#define vs34	34
210#define vs35	35
211#define vs36	36
212#define vs37	37
213#define vs38	38
214#define vs39	39
215#define vs40	40
216#define vs41	41
217#define vs42	42
218#define vs43	43
219#define vs44	44
220#define vs45	45
221#define vs46	46
222#define vs47	47
223#define vs48	48
224#define vs49	49
225#define vs50	50
226#define vs51	51
227#define vs52	52
228#define vs53	53
229#define vs54	54
230#define vs55	55
231#define vs56	56
232#define vs57	57
233#define vs58	58
234#define vs59	59
235#define vs60	60
236#define vs61	61
237#define vs62	62
238#define vs63	63
239#endif
240
241/*
242 * Macros to glue together two tokens.
243 */
244
245#ifdef __STDC__
246#define XGLUE(a,b) a##b
247#else
248#define XGLUE(a,b) a/**/b
249#endif
250
251#define GLUE(a,b) XGLUE(a,b)
252
253/*
254 * Macros to begin and end a function written in assembler.  If -mcall-aixdesc
255 * or -mcall-nt, create a function descriptor with the given name, and create
256 * the real function with one or two leading periods respectively.
257 */
258
259#if defined(__powerpc64__) && _CALL_ELF == 2
260
261/* Defining "toc" above breaks @toc in assembler code.  */
262#undef toc
263
264#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
265#ifdef __PCREL__
266#define JUMP_TARGET(name) GLUE(FUNC_NAME(name),@notoc)
267#define FUNC_START(name) \
268	.type FUNC_NAME(name),@function; \
269	.globl FUNC_NAME(name); \
270FUNC_NAME(name): \
271	.localentry FUNC_NAME(name),1
272#else
273#define JUMP_TARGET(name) FUNC_NAME(name)
274#define FUNC_START(name) \
275	.type FUNC_NAME(name),@function; \
276	.globl FUNC_NAME(name); \
277FUNC_NAME(name): \
2780:	addis 2,12,(.TOC.-0b)@ha; \
279	addi 2,2,(.TOC.-0b)@l; \
280	.localentry FUNC_NAME(name),.-FUNC_NAME(name)
281#endif /* !__PCREL__ */
282
283#define HIDDEN_FUNC(name) \
284  FUNC_START(name) \
285  .hidden FUNC_NAME(name);
286
287#define FUNC_END(name) \
288	.size FUNC_NAME(name),.-FUNC_NAME(name)
289
290#elif defined (__powerpc64__)
291
292#define FUNC_NAME(name) GLUE(.,name)
293#define JUMP_TARGET(name) FUNC_NAME(name)
294#define FUNC_START(name) \
295	.section ".opd","aw"; \
296name: \
297	.quad GLUE(.,name); \
298	.quad .TOC.@tocbase; \
299	.quad 0; \
300	.previous; \
301	.type GLUE(.,name),@function; \
302	.globl name; \
303	.globl GLUE(.,name); \
304GLUE(.,name):
305
306#define HIDDEN_FUNC(name) \
307  FUNC_START(name) \
308  .hidden name;	\
309  .hidden GLUE(.,name);
310
311#define FUNC_END(name) \
312GLUE(.L,name): \
313	.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
314
315#elif defined(_CALL_AIXDESC)
316
317#ifdef _RELOCATABLE
318#define DESC_SECTION ".got2"
319#else
320#define DESC_SECTION ".got1"
321#endif
322
323#define FUNC_NAME(name) GLUE(.,name)
324#define JUMP_TARGET(name) FUNC_NAME(name)
325#define FUNC_START(name) \
326	.section DESC_SECTION,"aw"; \
327name: \
328	.long GLUE(.,name); \
329	.long _GLOBAL_OFFSET_TABLE_; \
330	.long 0; \
331	.previous; \
332	.type GLUE(.,name),@function; \
333	.globl name; \
334	.globl GLUE(.,name); \
335GLUE(.,name):
336
337#define HIDDEN_FUNC(name) \
338  FUNC_START(name) \
339  .hidden name; \
340  .hidden GLUE(.,name);
341
342#define FUNC_END(name) \
343GLUE(.L,name): \
344	.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
345
346#else
347
348#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
349#if defined __PIC__ || defined __pic__
350#define JUMP_TARGET(name) FUNC_NAME(name@plt)
351#else
352#define JUMP_TARGET(name) FUNC_NAME(name)
353#endif
354#define FUNC_START(name) \
355	.type FUNC_NAME(name),@function; \
356	.globl FUNC_NAME(name); \
357FUNC_NAME(name):
358
359#define HIDDEN_FUNC(name) \
360  FUNC_START(name) \
361  .hidden FUNC_NAME(name);
362
363#define FUNC_END(name) \
364GLUE(.L,name): \
365	.size FUNC_NAME(name),GLUE(.L,name)-FUNC_NAME(name)
366#endif
367
368#ifdef IN_GCC
369/* For HAVE_GAS_CFI_DIRECTIVE.  */
370#include "auto-host.h"
371
372#ifdef HAVE_GAS_CFI_DIRECTIVE
373# define CFI_STARTPROC			.cfi_startproc
374# define CFI_ENDPROC			.cfi_endproc
375# define CFI_OFFSET(reg, off)		.cfi_offset reg, off
376# define CFI_DEF_CFA_REGISTER(reg)	.cfi_def_cfa_register reg
377# define CFI_RESTORE(reg)		.cfi_restore reg
378#else
379# define CFI_STARTPROC
380# define CFI_ENDPROC
381# define CFI_OFFSET(reg, off)
382# define CFI_DEF_CFA_REGISTER(reg)
383# define CFI_RESTORE(reg)
384#endif
385#endif
386
387#if defined(__ELF__) && defined(__linux__) && !defined(__powerpc64__)
388	.section .note.GNU-stack
389	.previous
390#endif
391