190075Sobrien/* PowerPC asm definitions for GNU C.  */
290075Sobrien/* Under winnt, 1) gas supports the following as names and 2) in particular
390075Sobrien   defining "toc" breaks the FUNC_START macro as ".toc" becomes ".2" */
490075Sobrien
590075Sobrien#define r0	0
690075Sobrien#define sp	1
790075Sobrien#define toc	2
890075Sobrien#define r3	3
990075Sobrien#define r4	4
1090075Sobrien#define r5	5
1190075Sobrien#define r6	6
1290075Sobrien#define r7	7
1390075Sobrien#define r8	8
1490075Sobrien#define r9	9
1590075Sobrien#define r10	10
1690075Sobrien#define r11	11
1790075Sobrien#define r12	12
1890075Sobrien#define r13	13
1990075Sobrien#define r14	14
2090075Sobrien#define r15	15
2190075Sobrien#define r16	16
2290075Sobrien#define r17	17
2390075Sobrien#define r18	18
2490075Sobrien#define r19     19
2590075Sobrien#define r20	20
2690075Sobrien#define r21	21
2790075Sobrien#define r22	22
2890075Sobrien#define r23	23
2990075Sobrien#define r24	24
3090075Sobrien#define r25	25
3190075Sobrien#define r26	26
3290075Sobrien#define r27	27
3390075Sobrien#define r28	28
3490075Sobrien#define r29	29
3590075Sobrien#define r30	30
3690075Sobrien#define r31	31
3790075Sobrien
3890075Sobrien#define cr0	0
3990075Sobrien#define cr1	1
4090075Sobrien#define cr2	2
4190075Sobrien#define cr3	3
4290075Sobrien#define cr4	4
4390075Sobrien#define cr5	5
4490075Sobrien#define cr6	6
4590075Sobrien#define cr7	7
4690075Sobrien
4790075Sobrien#define f0	0
4890075Sobrien#define f1	1
4990075Sobrien#define f2	2
5090075Sobrien#define f3	3
5190075Sobrien#define f4	4
5290075Sobrien#define f5	5
5390075Sobrien#define f6	6
5490075Sobrien#define f7	7
5590075Sobrien#define f8	8
5690075Sobrien#define f9	9
5790075Sobrien#define f10	10
5890075Sobrien#define f11	11
5990075Sobrien#define f12	12
6090075Sobrien#define f13	13
6190075Sobrien#define f14	14
6290075Sobrien#define f15	15
6390075Sobrien#define f16	16
6490075Sobrien#define f17	17
6590075Sobrien#define f18	18
6690075Sobrien#define f19     19
6790075Sobrien#define f20	20
6890075Sobrien#define f21	21
6990075Sobrien#define f22	22
7090075Sobrien#define f23	23
7190075Sobrien#define f24	24
7290075Sobrien#define f25	25
7390075Sobrien#define f26	26
7490075Sobrien#define f27	27
7590075Sobrien#define f28	28
7690075Sobrien#define f29	29
7790075Sobrien#define f30	30
7890075Sobrien#define f31	31
7990075Sobrien
8090075Sobrien/*
8190075Sobrien * Macros to glue together two tokens.
8290075Sobrien */
8390075Sobrien
8490075Sobrien#ifdef __STDC__
8590075Sobrien#define XGLUE(a,b) a##b
8690075Sobrien#else
8790075Sobrien#define XGLUE(a,b) a/**/b
8890075Sobrien#endif
8990075Sobrien
9090075Sobrien#define GLUE(a,b) XGLUE(a,b)
9190075Sobrien
9290075Sobrien/*
9390075Sobrien * Macros to begin and end a function written in assembler.  If -mcall-aixdesc
9490075Sobrien * or -mcall-nt, create a function descriptor with the given name, and create
9590075Sobrien * the real function with one or two leading periods respectively.
9690075Sobrien */
9790075Sobrien
98132718Skan#if defined (__powerpc64__)
9990075Sobrien#define FUNC_NAME(name) GLUE(.,name)
10090075Sobrien#define JUMP_TARGET(name) FUNC_NAME(name)
10190075Sobrien#define FUNC_START(name) \
102132718Skan	.section ".opd","aw"; \
10390075Sobrienname: \
104132718Skan	.quad GLUE(.,name); \
105132718Skan	.quad .TOC.@tocbase; \
106132718Skan	.quad 0; \
10790075Sobrien	.previous; \
10890075Sobrien	.type GLUE(.,name),@function; \
10990075Sobrien	.globl name; \
11090075Sobrien	.globl GLUE(.,name); \
11190075SobrienGLUE(.,name):
11290075Sobrien
11390075Sobrien#define FUNC_END(name) \
11490075SobrienGLUE(.L,name): \
11590075Sobrien	.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
11690075Sobrien
117132718Skan#elif defined(_CALL_AIXDESC)
118132718Skan
119132718Skan#ifdef _RELOCATABLE
120132718Skan#define DESC_SECTION ".got2"
121132718Skan#else
122132718Skan#define DESC_SECTION ".got1"
123132718Skan#endif
124132718Skan
12590075Sobrien#define FUNC_NAME(name) GLUE(.,name)
12696263Sobrien#define JUMP_TARGET(name) FUNC_NAME(name)
12790075Sobrien#define FUNC_START(name) \
128132718Skan	.section DESC_SECTION,"aw"; \
12990075Sobrienname: \
130132718Skan	.long GLUE(.,name); \
131132718Skan	.long _GLOBAL_OFFSET_TABLE_; \
132132718Skan	.long 0; \
13390075Sobrien	.previous; \
13490075Sobrien	.type GLUE(.,name),@function; \
13590075Sobrien	.globl name; \
13690075Sobrien	.globl GLUE(.,name); \
13790075SobrienGLUE(.,name):
13890075Sobrien
13990075Sobrien#define FUNC_END(name) \
14090075SobrienGLUE(.L,name): \
14190075Sobrien	.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
14290075Sobrien
14390075Sobrien#else
144132718Skan
14590075Sobrien#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
14690075Sobrien#if defined __PIC__ || defined __pic__
14790075Sobrien#define JUMP_TARGET(name) FUNC_NAME(name@plt)
14890075Sobrien#else
14990075Sobrien#define JUMP_TARGET(name) FUNC_NAME(name)
15090075Sobrien#endif
15190075Sobrien#define FUNC_START(name) \
15290075Sobrien	.type FUNC_NAME(name),@function; \
15390075Sobrien	.globl FUNC_NAME(name); \
15490075SobrienFUNC_NAME(name):
15590075Sobrien
15690075Sobrien#define FUNC_END(name) \
15790075SobrienGLUE(.L,name): \
15890075Sobrien	.size FUNC_NAME(name),GLUE(.L,name)-FUNC_NAME(name)
15990075Sobrien#endif
16090075Sobrien
161132718Skan#if defined __linux__ && !defined __powerpc64__
162132718Skan	.section .note.GNU-stack
163132718Skan	.previous
164132718Skan#endif
165