From b80a3db02e5163f5af236df7cce78bd65e8c6941 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 20 Sep 2002 23:46:03 +0000 Subject: [PATCH] * 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 . [__WORDSIZE==64]: Include sysdeps/powerpc/powerpc64/sysdep.h. [!__WORDSIZE==64]: Include sysdeps/powerpc/powerpc32/sysdep.h. --- ChangeLog | 11 ++ sysdeps/powerpc/{ => powerpc32}/sysdep.h | 96 +------------ sysdeps/powerpc/powerpc64/sysdep.h | 233 +++++++++++++++++++++++++++++++ sysdeps/powerpc/sysdep.h | 109 +-------------- sysdeps/unix/powerpc/sysdep.h | 10 +- 5 files changed, 258 insertions(+), 201 deletions(-) copy sysdeps/powerpc/{ => powerpc32}/sysdep.h (70%) create mode 100644 sysdeps/powerpc/powerpc64/sysdep.h diff --git a/ChangeLog b/ChangeLog index 0678bff373..136c079f66 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2002-09-20 Steven Munroe + + * 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 . + [__WORDSIZE==64]: Include sysdeps/powerpc/powerpc64/sysdep.h. + [!__WORDSIZE==64]: Include sysdeps/powerpc/powerpc32/sysdep.h. + 2002-09-19 Bruno Haible * intl/dcigettext.c (DCIGETTEXT): Restore errno only right before diff --git a/sysdeps/powerpc/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h similarity index 70% copy from sysdeps/powerpc/sysdep.h copy to sysdeps/powerpc/powerpc32/sysdep.h index 350fd1e3b1..9179746790 100644 --- a/sysdeps/powerpc/sysdep.h +++ b/sysdeps/powerpc/powerpc32/sysdep.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1999, 2001 Free Software Foundation, Inc. +/* Assembly macros for 32-bit PowerPC. + Copyright (C) 1999, 2001, 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 @@ -18,98 +19,12 @@ #ifdef __ASSEMBLER__ -/* Symbolic names for the registers. The only portable way to write asm - code is to use number but this produces really unreadable code. - Therefore these symbolic names. */ - -/* Integer registers. */ -#define r0 0 -#define r1 1 -#define r2 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 -#define r21 21 -#define r22 22 -#define r23 23 -#define r24 24 -#define r25 25 -#define r26 26 -#define r27 27 -#define r28 28 -#define r29 29 -#define r30 30 -#define r31 31 - -/* Floating-point registers. */ -#define fp0 0 -#define fp1 1 -#define fp2 2 -#define fp3 3 -#define fp4 4 -#define fp5 5 -#define fp6 6 -#define fp7 7 -#define fp8 8 -#define fp9 9 -#define fp10 10 -#define fp11 11 -#define fp12 12 -#define fp13 13 -#define fp14 14 -#define fp15 15 -#define fp16 16 -#define fp17 17 -#define fp18 18 -#define fp19 19 -#define fp20 20 -#define fp21 21 -#define fp22 22 -#define fp23 23 -#define fp24 24 -#define fp25 25 -#define fp26 26 -#define fp27 27 -#define fp28 28 -#define fp29 29 -#define fp30 30 -#define fp31 31 - -/* Condition code registers. */ -#define cr0 0 -#define cr1 1 -#define cr2 2 -#define cr3 3 -#define cr4 4 -#define cr5 5 -#define cr6 6 -#define cr7 7 - +#include #ifdef __ELF__ -/* This seems to always be the case on PPC. */ -#define ALIGNARG(log2) log2 -/* For ELF we need the `.type' directive to make shared libs work right. */ -#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; -#define ASM_SIZE_DIRECTIVE(name) .size name,.-name - -/* If compiled for profiling, call `_mcount' at the start of each function. */ +/* If compiled for profiling, call `_mcount' at the start of each + function. */ #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 @@ -218,5 +133,4 @@ #endif /* __ELF__ */ - #endif /* __ASSEMBLER__ */ 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 + +#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__ */ diff --git a/sysdeps/powerpc/sysdep.h b/sysdeps/powerpc/sysdep.h index 350fd1e3b1..cd0485e070 100644 --- a/sysdeps/powerpc/sysdep.h +++ b/sysdeps/powerpc/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1999, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2001, 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 @@ -109,113 +109,6 @@ #define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; #define ASM_SIZE_DIRECTIVE(name) .size name,.-name -/* If compiled for profiling, call `_mcount' at the start of each function. */ -#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 -#define CALL_MCOUNT \ - .pushsection; \ - .section ".data"; \ - .align ALIGNARG(2); \ -0:.long 0; \ - .previous; \ - mflr r0; \ - stw r0,4(r1); \ - bl _GLOBAL_OFFSET_TABLE_@local-4; \ - mflr r11; \ - lwz r0,0b@got(r11); \ - bl JUMPTARGET(_mcount); -#else /* PIC */ -#define CALL_MCOUNT \ - .section ".data"; \ - .align ALIGNARG(2); \ -0:.long 0; \ - .previous; \ - mflr r0; \ - lis r11,0b@ha; \ - stw r0,4(r1); \ - addi r0,r11,0b@l; \ - bl JUMPTARGET(_mcount); -#endif /* PIC */ -#else /* PROF */ -#define CALL_MCOUNT /* Do nothing. */ -#endif /* PROF */ - -#define ENTRY(name) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(2); \ - C_LABEL(name) \ - CALL_MCOUNT - -#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) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(2); \ - C_LABEL(name) \ - CALL_MCOUNT \ - b 0f; \ - .align ALIGNARG(alignt); \ - EALIGN_W_##words; \ - 0: -#else /* PROF */ -#define EALIGN(name, alignt, words) \ - ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ - ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ - .align ALIGNARG(alignt); \ - EALIGN_W_##words; \ - C_LABEL(name) -#endif - -#undef END -#define END(name) \ - ASM_SIZE_DIRECTIVE(name) - -#define DO_CALL(syscall) \ - li 0,syscall; \ - sc - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -#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) - -/* Local labels stripped out by the linker. */ -#undef L -#define L(x) .L##x - -/* Label in text section. */ -#define C_TEXT(name) name - #endif /* __ELF__ */ diff --git a/sysdeps/unix/powerpc/sysdep.h b/sysdeps/unix/powerpc/sysdep.h index b4ec23a037..90c1e49e89 100644 --- a/sysdeps/unix/powerpc/sysdep.h +++ b/sysdeps/unix/powerpc/sysdep.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1991, 92, 93, 95, 96, 97, 99 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 95, 96, 97, 1999, 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 @@ -17,4 +18,9 @@ 02111-1307 USA. */ #include -#include +#include +#if __WORDSIZE == 64 +#include +#else +#include +#endif -- 2.11.4.GIT