added arch includes for printf_fp (based on 2.2.5)
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11650 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
/* On some machines the mpn function from GNU MP use a file called
|
||||
"asm-syntax.h" to define macros for assembly source code to use. */
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
/* Bounded-pointer definitions for PowerPC assembler.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Greg McGary <[email protected]>
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in the GNU MP 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. */
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
|
||||
/* Byte offsets of BP components. */
|
||||
# define oVALUE 0
|
||||
# define oLOW 4
|
||||
# define oHIGH 8
|
||||
|
||||
/* Don't check bounds, just convert the BP register to its simple
|
||||
pointer value. */
|
||||
|
||||
# define DISCARD_BOUNDS(rBP) \
|
||||
lwz rBP, oVALUE(rBP)
|
||||
|
||||
/* Check low bound, with the side effect that the BP register is converted
|
||||
its simple pointer value. Move the high bound into a register for
|
||||
later use. */
|
||||
|
||||
# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH) \
|
||||
lwz rHIGH, oHIGH(rBP); \
|
||||
lwz rLOW, oLOW(rBP); \
|
||||
lwz rBP, oVALUE(rBP); \
|
||||
twllt rBP, rLOW
|
||||
|
||||
/* Check the high bound, which is in a register, using the given
|
||||
conditional trap instruction. */
|
||||
|
||||
# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc) \
|
||||
TWLcc rVALUE, rHIGH
|
||||
|
||||
/* Check the high bound, which is stored at the return-value's high
|
||||
bound slot, using the given conditional trap instruction. */
|
||||
|
||||
# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc) \
|
||||
lwz rHIGH, oHIGH(rRTN); \
|
||||
TWLcc rVALUE, rHIGH
|
||||
|
||||
/* Check both bounds, with the side effect that the BP register is
|
||||
converted to its simple pointer value. */
|
||||
|
||||
# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH) \
|
||||
CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH); \
|
||||
twlge rBP, rHIGH
|
||||
|
||||
/* Check bounds on a memory region of given length, with the side
|
||||
effect that the BP register is converted to its simple pointer
|
||||
value. */
|
||||
|
||||
# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH) \
|
||||
CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
|
||||
sub rHIGH, rHIGH, rLENGTH; \
|
||||
twlgt rBP, rHIGH
|
||||
|
||||
# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH) \
|
||||
CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
|
||||
subi rHIGH, rHIGH, LENGTH; \
|
||||
twlgt rBP, rHIGH
|
||||
|
||||
/* Store a pointer value register into the return-value's pointer
|
||||
value slot. */
|
||||
|
||||
# define STORE_RETURN_VALUE(rVALUE) \
|
||||
stw rVALUE, oVALUE(rRTN)
|
||||
|
||||
/* Store a low and high bounds into the return-value's pointer bounds
|
||||
slots. */
|
||||
|
||||
# define STORE_RETURN_BOUNDS(rLOW, rHIGH) \
|
||||
stw rLOW, oLOW(rRTN); \
|
||||
stw rHIGH, oHIGH(rRTN)
|
||||
|
||||
/* Stuff zero value/low/high into the BP addressed by rRTN. */
|
||||
|
||||
# define RETURN_NULL_BOUNDED_POINTER \
|
||||
li r4, 0; \
|
||||
STORE_RETURN_VALUE (r4); \
|
||||
STORE_RETURN_BOUNDS (r4, r4)
|
||||
|
||||
#else
|
||||
|
||||
# define DISCARD_BOUNDS(rBP)
|
||||
# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH)
|
||||
# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc)
|
||||
# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc)
|
||||
# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH)
|
||||
# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH)
|
||||
# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH)
|
||||
# define STORE_RETURN_VALUE(rVALUE)
|
||||
# define STORE_RETURN_BOUNDS(rLOW, rHIGH)
|
||||
|
||||
# define RETURN_NULL_BOUNDED_POINTER li rRTN, 0
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
/* Copyright (C) 1999, 2001 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__
|
||||
|
||||
/* 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
|
||||
|
||||
|
||||
#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. */
|
||||
#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__ */
|
||||
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
Reference in New Issue
Block a user