1/* Copyright (C) 1999, 2001 Free Software Foundation, Inc.
2   This file is part of the GNU C Library.
3
4   The GNU C Library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Lesser General Public
6   License as published by the Free Software Foundation; either
7   version 2.1 of the License, or (at your option) any later version.
8
9   The GNU C Library is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library; if not, write to the Free
16   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17   02111-1307 USA.  */
18
19#include_next <sysdep.h>
20
21#ifdef __ASSEMBLER__
22
23/* Symbolic names for the registers.  The only portable way to write asm
24   code is to use number but this produces really unreadable code.
25   Therefore these symbolic names.  */
26
27/* Integer registers.  */
28#define r0	0
29#define r1	1
30#define r2	2
31#define r3	3
32#define r4	4
33#define r5	5
34#define r6	6
35#define r7	7
36#define r8	8
37#define r9	9
38#define r10	10
39#define r11	11
40#define r12	12
41#define r13	13
42#define r14	14
43#define r15	15
44#define r16	16
45#define r17	17
46#define r18	18
47#define r19	19
48#define r20	20
49#define r21	21
50#define r22	22
51#define r23	23
52#define r24	24
53#define r25	25
54#define r26	26
55#define r27	27
56#define r28	28
57#define r29	29
58#define r30	30
59#define r31	31
60
61/* Floating-point registers.  */
62#define fp0	0
63#define fp1	1
64#define fp2	2
65#define fp3	3
66#define fp4	4
67#define fp5	5
68#define fp6	6
69#define fp7	7
70#define fp8	8
71#define fp9	9
72#define fp10	10
73#define fp11	11
74#define fp12	12
75#define fp13	13
76#define fp14	14
77#define fp15	15
78#define fp16	16
79#define fp17	17
80#define fp18	18
81#define fp19	19
82#define fp20	20
83#define fp21	21
84#define fp22	22
85#define fp23	23
86#define fp24	24
87#define fp25	25
88#define fp26	26
89#define fp27	27
90#define fp28	28
91#define fp29	29
92#define fp30	30
93#define fp31	31
94
95/* Condition code registers.  */
96#define cr0	0
97#define cr1	1
98#define cr2	2
99#define cr3	3
100#define cr4	4
101#define cr5	5
102#define cr6	6
103#define cr7	7
104
105
106#ifdef __ELF__
107
108/* This seems to always be the case on PPC.  */
109#define ALIGNARG(log2) log2
110/* For ELF we need the `.type' directive to make shared libs work right.  */
111#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
112#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
113
114/* If compiled for profiling, call `_mcount' at the start of each function.  */
115#ifdef	PROF
116/* The mcount code relies on a the return address being on the stack
117   to locate our caller and so it can restore it; so store one just
118   for its benefit.  */
119#ifdef PIC
120#define CALL_MCOUNT							      \
121  .pushsection;								      \
122  .section ".data";    							      \
123  .align ALIGNARG(2);							      \
1240:.long 0;								      \
125  .previous;								      \
126  mflr  r0;								      \
127  stw   r0,4(r1);	       						      \
128  bl    _GLOBAL_OFFSET_TABLE_@local-4;					      \
129  mflr  r11;								      \
130  lwz   r0,0b@got(r11);							      \
131  bl    JUMPTARGET(_mcount);
132#else  /* PIC */
133#define CALL_MCOUNT							      \
134  .section ".data";							      \
135  .align ALIGNARG(2);							      \
1360:.long 0;								      \
137  .previous;								      \
138  mflr  r0;								      \
139  lis   r11,0b@ha;		       					      \
140  stw   r0,4(r1);	       						      \
141  addi  r0,r11,0b@l;							      \
142  bl    JUMPTARGET(_mcount);
143#endif /* PIC */
144#else  /* PROF */
145#define CALL_MCOUNT		/* Do nothing.  */
146#endif /* PROF */
147
148#define	ENTRY(name)							      \
149  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
150  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
151  .align ALIGNARG(2);							      \
152  C_LABEL(name)								      \
153  CALL_MCOUNT
154
155#define EALIGN_W_0  /* No words to insert.  */
156#define EALIGN_W_1  nop
157#define EALIGN_W_2  nop;nop
158#define EALIGN_W_3  nop;nop;nop
159#define EALIGN_W_4  EALIGN_W_3;nop
160#define EALIGN_W_5  EALIGN_W_4;nop
161#define EALIGN_W_6  EALIGN_W_5;nop
162#define EALIGN_W_7  EALIGN_W_6;nop
163
164/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
165   past a 2^align boundary.  */
166#ifdef PROF
167#define EALIGN(name, alignt, words)					      \
168  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
169  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
170  .align ALIGNARG(2);							      \
171  C_LABEL(name)								      \
172  CALL_MCOUNT								      \
173  b 0f;									      \
174  .align ALIGNARG(alignt);						      \
175  EALIGN_W_##words;							      \
176  0:
177#else /* PROF */
178#define EALIGN(name, alignt, words)					      \
179  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
180  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
181  .align ALIGNARG(alignt);						      \
182  EALIGN_W_##words;							      \
183  C_LABEL(name)
184#endif
185
186#undef	END
187#define END(name)							      \
188  ASM_SIZE_DIRECTIVE(name)
189
190#define DO_CALL(syscall)				      		      \
191    li 0,syscall;						              \
192    sc
193
194#ifdef PIC
195#define JUMPTARGET(name) name##@plt
196#else
197#define JUMPTARGET(name) name
198#endif
199
200#define PSEUDO(name, syscall_name, args)				      \
201  .section ".text";							      \
202  ENTRY (name)								      \
203    DO_CALL (SYS_ify (syscall_name));
204
205#define PSEUDO_RET							      \
206    bnslr;								      \
207    b JUMPTARGET(__syscall_error)
208#define ret PSEUDO_RET
209
210#undef	PSEUDO_END
211#define	PSEUDO_END(name)						      \
212  END (name)
213
214/* Local labels stripped out by the linker.  */
215#undef L
216#define L(x) .L##x
217
218/* Label in text section.  */
219#define C_TEXT(name) name
220
221#endif /* __ELF__ */
222
223
224#endif	/* __ASSEMBLER__ */
225