Retro68/gcc/newlib/libc/machine/hppa/DEFS.h
2012-03-27 01:51:53 +02:00

179 lines
4.4 KiB
C

/*
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "pcc_prefix.s"
#define BLANK
#define BANNER(str) BLANK .VERSION str
#define ENTRY(Name) BLANK M_ENTRY (Name,PROF_/**/Name)
#define ENTRYC(Name) BLANK M_ENTRYC(Name,PROF_/**/Name)
#define EXIT(Name) BLANK M_EXIT (Name,PROF_/**/Name)
#define EXITC(Name) BLANK M_EXITC (Name,PROF_/**/Name)
#if 0
#define TEXT_SEGMENT \
.SPACE $TEXT$ !\
.SUBSPA $CODE$
#define RO_SEGMENT \
.SPACE $TEXT$ !\
.SUBSPA $lit$
#define DATA_SEGMENT \
.SPACE $PRIVATE$ !\
.SUBSPA $data$
#define BSS_SEGMENT \
.SPACE $PRIVATE$ !\
.SUBSPA $bss$
#else
#define TEXT_SEGMENT .text
#define RO_SEGMENT .rodata
#define DATA_SEGMENT .data
#define BSS_SEGMENT .bss
#endif
#ifdef PROF
;
; All four argument registers are saved into caller save registers
; and restored after the call to _mcount. This is possible because
; the mcount routine does not modify them, so we can. Mcount takes
; 3 arguments; the first argument is the incoming 'rp', the second
; is the starting address of the profiled routine, and the third is
; the address of the PROF label (which is where mcount stores the
; profile data).
;
#define M_ENTRY(name,prof) \
TEXT_SEGMENT !\
.label name !\
.PROC !\
.CALLINFO CALLER,SAVE_RP !\
.ENTRY !\
stw rp,-20(sp) !\
ldo 48(sp),sp !\
or arg0,r0,r19 !\
or arg1,r0,r20 !\
or arg2,r0,r21 !\
or arg3,r0,r22 !\
or rp,r0,arg0 !\
ldil L%name,r1 !\
ldo R%name(r1),arg1 !\
addil L%prof-$global$,dp !\
bl _mcount,rp !\
ldo R%prof-$global$(r1),arg2 !\
ldw -68(sp),rp !\
ldo -48(sp),sp !\
or r19,r0,arg0 !\
or r20,r0,arg1 !\
or r21,r0,arg2 !\
or r22,r0,arg3 !\
#define M_ENTRYC(name,prof) \
TEXT_SEGMENT !\
.label name !\
.PROC !\
.CALLINFO CALLER,SAVE_RP !\
.ENTRY !\
stw rp,-20(sp) !\
ldo 128(sp),sp !\
or arg0,r0,r19 !\
or arg1,r0,r20 !\
or arg2,r0,r21 !\
or arg3,r0,r22 !\
or rp,r0,arg0 !\
ldil L%name,r1 !\
ldo R%name(r1),arg1 !\
addil L%prof-$global$,dp !\
bl _mcount,rp !\
ldo R%prof-$global$(r1),arg2 !\
ldw -148(sp),rp !\
or r19,r0,arg0 !\
or r20,r0,arg1 !\
or r21,r0,arg2 !\
or r22,r0,arg3 !\
;
; The HPUX profiler uses a word for each entrypoint to store the profiling
; information. The setup code passes the address to the _mcount routine.
; The EXIT macro defines a label (PROF_foo), and a word of storage.
;
#define M_EXIT(name,prof) \
bv,n r0(rp) !\
.EXIT !\
.PROCEND !\
.EXPORT name,ENTRY !\
DATA_SEGMENT !\
.label prof !\
.WORD 0 !\
.IMPORT $global$,DATA !\
.IMPORT _mcount,CODE
#define M_EXITC(name,prof) \
bv r0(rp) !\
ldo -128(sp),sp !\
.EXIT !\
.PROCEND !\
.EXPORT name,ENTRY !\
DATA_SEGMENT !\
.label prof !\
.WORD 0 !\
.IMPORT $global$,DATA !\
.IMPORT _mcount,CODE
#else /* NOT profiling */
#define M_ENTRY(name,prof) \
TEXT_SEGMENT !\
.label name !\
.PROC !\
.CALLINFO !\
.ENTRY
#define M_ENTRYC(name,prof) \
TEXT_SEGMENT !\
.label name !\
.PROC !\
.CALLINFO CALLER,SAVE_RP !\
.ENTRY !\
stw rp,-20(sp) !\
ldo 128(sp),sp
#define M_EXIT(name,prof) \
bv,n r0(rp) !\
.EXIT !\
.PROCEND !\
.EXPORT name,ENTRY
#define M_EXITC(name,prof) \
ldw -148(sp),rp !\
bv r0(rp) !\
ldo -128(sp),sp !\
.EXIT !\
.PROCEND !\
.EXPORT name,ENTRY
#define ENTRY(Name) BLANK M_ENTRY (Name,PROF_/**/Name)
#define ENTRYC(Name) BLANK M_ENTRYC(Name,PROF_/**/Name)
#define EXIT(Name) BLANK M_EXIT (Name,PROF_/**/Name)
#define EXITC(Name) BLANK M_EXITC (Name,PROF_/**/Name)
#endif