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