diff options
author | Roland McGrath <roland@gnu.org> | 2002-09-20 23:46:03 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-09-20 23:46:03 +0000 |
commit | b80a3db02e5163f5af236df7cce78bd65e8c6941 (patch) | |
tree | c3de7e027886be6c1fb6037314c2b95c320ac051 /sysdeps/powerpc/powerpc64/sysdep.h | |
parent | 7f4dce05c20b5461582a729ef64f26ecc93f365e (diff) | |
download | glibc-b80a3db02e5163f5af236df7cce78bd65e8c6941.tar.gz glibc-b80a3db02e5163f5af236df7cce78bd65e8c6941.tar.xz glibc-b80a3db02e5163f5af236df7cce78bd65e8c6941.zip |
* sysdeps/powerpc/sysdep.h: Remove powerpc32 specific macros.
* sysdeps/powerpc/powerpc32/sysdep.h: New file. Define powerpc32 specific macros copied from sysdeps/powerpc/sysdep.h. * sysdeps/powerpc/powerpc64/sysdep.h: New file. Define powerpc64 specific macros. * sysdeps/unix/powerpc/sysdep.h: Include <bits/wordsize.h>. [__WORDSIZE==64]: Include sysdeps/powerpc/powerpc64/sysdep.h. [!__WORDSIZE==64]: Include sysdeps/powerpc/powerpc32/sysdep.h.
Diffstat (limited to 'sysdeps/powerpc/powerpc64/sysdep.h')
-rw-r--r-- | sysdeps/powerpc/powerpc64/sysdep.h | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h new file mode 100644 index 0000000000..6a50517bf4 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/sysdep.h @@ -0,0 +1,233 @@ +/* Assembly macros for 64-bit PowerPC. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifdef __ASSEMBLER__ + +#include <sysdeps/powerpc/sysdep.h> + +#ifdef __ELF__ +/* If compiled for profiling, call `_mcount' at the start of each function. + see ppc-mcount.S for more details. */ +#ifdef PROF +/* The mcount code relies on a the return address being on the stack + to locate our caller and so it can restore it; so store one just + for its benefit. */ +#ifdef PIC +#ifdef SYSV_ELF_PROFILING +#define CALL_MCOUNT \ + .pushsection; \ + .section ".data"; \ + .align ALIGNARG(2); \ +0: .long 0; \ + .previous; \ + mflr r0; \ + std r0,16(r1); \ + ld r0,0b@got(r2); \ + bl JUMPTARGET(_mcount); +#else /* SYSV_ELF_PROFILING */ +#define CALL_MCOUNT \ + mflr r0; \ + std r0,16(r1); \ + bl JUMPTARGET(_mcount); +#endif /* SYSV_ELF_PROFILING */ +#else /* PIC */ +#ifdef SYSV_ELF_PROFILING +#define CALL_MCOUNT \ + .pushsection; \ + .section ".data"; \ + .align ALIGNARG(2); \ +0: .long 0; \ + .previous; \ + mflr r0; \ + std r0,16(r1); \ + ld r0,0b@got(r2); \ + bl JUMPTARGET(_mcount); +#else /* SYSV_ELF_PROFILING */ +#define CALL_MCOUNT \ + mflr r0; \ + std r0,16(r1); \ + bl JUMPTARGET(_mcount); +#endif /* SYSV_ELF_PROFILING */ +#endif /* PIC */ +#else /* PROF */ +#define CALL_MCOUNT /* Do nothing. */ +#endif /* PROF */ + +#define DOT_LABEL(X) .##X + +#define ENTRY(name) \ + .section ".text"; \ + .align ALIGNARG(2); \ + .globl DOT_LABEL(name); \ + .type DOT_LABEL(name),@function ; \ + .globl name; \ + .section ".opd","aw"; \ +name##: ; \ + .quad DOT_LABEL(name) ; \ + .quad .TOC.@tocbase, 0; \ + .previous; \ +DOT_LABEL(name): + + +#define EALIGN_W_0 /* No words to insert. */ +#define EALIGN_W_1 nop +#define EALIGN_W_2 nop;nop +#define EALIGN_W_3 nop;nop;nop +#define EALIGN_W_4 EALIGN_W_3;nop +#define EALIGN_W_5 EALIGN_W_4;nop +#define EALIGN_W_6 EALIGN_W_5;nop +#define EALIGN_W_7 EALIGN_W_6;nop + +/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes + past a 2^align boundary. */ +#ifdef PROF +#define EALIGN(name, alignt, words) \ + .section ".text"; \ + .globl DOT_LABEL(name); \ + .type DOT_LABEL(name),@function ; \ + .globl name; \ + .section ".opd","aw"; \ +name##: ; \ + .quad DOT_LABEL(name) ; \ + .quad .TOC.@tocbase, 0; \ + .previous; \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ +DOT_LABEL(name): \ + CALL_MCOUNT \ + b 0f; \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + 0: +#else /* PROF */ +#define EALIGN(name, alignt, words) \ + .section ".text"; \ + .globl DOT_LABEL(name); \ + .type DOT_LABEL(name),@function ; \ + .globl name; \ + .section ".opd","aw"; \ +name##: ; \ + .quad DOT_LABEL(name) ; \ + .quad .TOC.@tocbase, 0; \ + .previous; \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ +DOT_LABEL(name): +#endif + +/* Local labels stripped out by the linker. */ +#undef L +#define L(x) .L##x + +#define tostring(s) #s +#define stringify(s) tostring(s) +#define XGLUE(a,b) a##b +#define GLUE(a,b) XGLUE(a,b) +#define LT_LABEL(name) GLUE(.LT,name) +#define LT_LABELSUFFIX(name,suffix) GLUE(GLUE(.LT,name),suffix) + +/* Support Traceback tables */ +#define TB_ASM 0x000c000000000000 +#define TB_GLOBALLINK 0x0000800000000000 +#define TB_IS_EPROL 0x0000400000000000 +#define TB_HAS_TBOFF 0x0000200000000000 +#define TB_INT_PROC 0x0000100000000000 +#define TB_HAS_CTL 0x0000080000000000 +#define TB_TOCLESS 0x0000040000000000 +#define TB_FP_PRESENT 0x0000020000000000 +#define TB_LOG_ABORT 0x0000010000000000 +#define TB_INT_HANDL 0x0000008000000000 +#define TB_NAME_PRESENT 0x0000004000000000 +#define TB_USES_ALLOCA 0x0000002000000000 +#define TB_SAVES_CR 0x0000000200000000 +#define TB_SAVES_LR 0x0000000100000000 +#define TB_STORES_BC 0x0000000080000000 +#define TB_FIXUP 0x0000000040000000 +#define TB_FP_SAVED(fprs) (((fprs) & 0x3f) << 24) +#define TB_GPR_SAVED(gprs) (((fprs) & 0x3f) << 16) +#define TB_FIXEDPARMS(parms) (((parms) & 0xff) << 8) +#define TB_FLOATPARMS(parms) (((parms) & 0x7f) << 1) +#define TB_PARMSONSTK 0x0000000000000001 + +#define PPC_HIGHER(v) (((v) >> 32) & 0xffff) +#define TB_DEFAULT TB_ASM | TB_HAS_TBOFF | TB_NAME_PRESENT + +#define TRACEBACK(name) \ +LT_LABEL(name): ; \ + .long 0 ; \ + .quad TB_DEFAULT ; \ + .long LT_LABEL(name)-DOT_LABEL(name) ; \ + .short LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \ +LT_LABELSUFFIX(name,_name_start): ;\ + .ascii stringify(name) ; \ +LT_LABELSUFFIX(name,_name_end): ; \ + .align 2 ; + +#define TRACEBACK_MASK(name,mask) \ +LT_LABEL(name): ; \ + .long 0 ; \ + .quad TB_DEFAULT | mask ; \ + .long LT_LABEL(name)-DOT_LABEL(name) ; \ + .short LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \ +LT_LABELSUFFIX(name,_name_start): ;\ + .ascii stringify(name) ; \ +LT_LABELSUFFIX(name,_name_end): ; \ + .align 2 ; + +/* END generates Traceback tables */ +#undef END +#define END(name) \ + TRACEBACK(name) \ + ASM_SIZE_DIRECTIVE(name) + +/* This form supports more informative traceback tables */ +#define END_GEN_TB(name,mask) \ + TRACEBACK_MASK(name,mask) \ + ASM_SIZE_DIRECTIVE(name) + + +#define DO_CALL(syscall) \ + li 0,syscall; \ + sc + +/* ppc64 is always PIC */ +#define JUMPTARGET(name) DOT_LABEL(name) + +#define PSEUDO(name, syscall_name, args) \ + .section ".text"; \ + ENTRY (name) \ + DO_CALL (SYS_ify (syscall_name)); + +#define PSEUDO_RET \ + bnslr; \ + b JUMPTARGET(__syscall_error) + +#define ret PSEUDO_RET + +#undef PSEUDO_END +#define PSEUDO_END(name) \ + END (name) + +/* Label in text section. */ +/* ppc64 function descriptors which requires . notation */ +#define C_TEXT(name) .##name + +#endif /* __ELF__ */ + +#endif /* __ASSEMBLER__ */ |