1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* -----------------------------------------------------------------------
2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   asm.h - Copyright (c) 1998 Geoffrey Keating
3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   PowerPC Assembly glue.
5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Permission is hereby granted, free of charge, to any person obtaining
7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   a copy of this software and associated documentation files (the
8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ``Software''), to deal in the Software without restriction, including
9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   without limitation the rights to use, copy, modify, merge, publish,
10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   distribute, sublicense, and/or sell copies of the Software, and to
11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   permit persons to whom the Software is furnished to do so, subject to
12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   the following conditions:
13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   The above copyright notice and this permission notice shall be included
15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   in all copies or substantial portions of the Software.
16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   OTHER DEALINGS IN THE SOFTWARE.
24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ----------------------------------------------------------------------- */
25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ASM_GLOBAL_DIRECTIVE .globl
27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define C_SYMBOL_NAME(name) name
30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Macro for a label.  */
31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef	__STDC__
32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define C_LABEL(name)		name##:
33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define C_LABEL(name)		name/**/:
35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* This seems to always be the case on PPC.  */
38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ALIGNARG(log2) log2
39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* For ELF we need the `.type' directive to make shared libs work right.  */
40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* If compiled for profiling, call `_mcount' at the start of each function.  */
44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef	PROF
45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* The mcount code relies on a the return address being on the stack
46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   to locate our caller and so it can restore it; so store one just
47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   for its benefit.  */
48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PIC
49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define CALL_MCOUNT							      \
50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .pushsection;								      \
51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .section ".data";							      \
52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .align ALIGNARG(2);							      \
53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project0:.long 0;								      \
54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .previous;								      \
55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  mflr  %r0;								      \
56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  stw   %r0,4(%r1);							      \
57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  bl    _GLOBAL_OFFSET_TABLE_@local-4;					      \
58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  mflr  %r11;								      \
59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  lwz   %r0,0b@got(%r11);						      \
60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  bl    JUMPTARGET(_mcount);
61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else  /* PIC */
62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define CALL_MCOUNT							      \
63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .section ".data";							      \
64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .align ALIGNARG(2);							      \
65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project0:.long 0;								      \
66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .previous;								      \
67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  mflr  %r0;								      \
68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  lis   %r11,0b@ha;							      \
69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  stw   %r0,4(%r1);							      \
70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  addi  %r0,%r11,0b@l;							      \
71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  bl    JUMPTARGET(_mcount);
72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif /* PIC */
73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else  /* PROF */
74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define CALL_MCOUNT		/* Do nothing.  */
75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif /* PROF */
76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define	ENTRY(name)							      \
78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .align ALIGNARG(2);							      \
81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  C_LABEL(name)								      \
82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  CALL_MCOUNT
83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_0  /* No words to insert.  */
85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_1  nop
86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_2  nop;nop
87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_3  nop;nop;nop
88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_4  EALIGN_W_3;nop
89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_5  EALIGN_W_4;nop
90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_6  EALIGN_W_5;nop
91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_7  EALIGN_W_6;nop
92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   past a 2^align boundary.  */
95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PROF
96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN(name, alignt, words)					      \
97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .align ALIGNARG(2);							      \
100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  C_LABEL(name)								      \
101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  CALL_MCOUNT								      \
102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  b 0f;									      \
103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .align ALIGNARG(alignt);						      \
104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  EALIGN_W_##words;							      \
105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  0:
106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else /* PROF */
107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN(name, alignt, words)					      \
108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  .align ALIGNARG(alignt);						      \
111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  EALIGN_W_##words;							      \
112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  C_LABEL(name)
113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define END(name)							      \
116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ASM_SIZE_DIRECTIVE(name)
117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
118a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PIC
119a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define JUMPTARGET(name) name##@plt
120a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
121a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define JUMPTARGET(name) name
122a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
123a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
124a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Local labels stripped out by the linker.  */
125a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define L(x) .L##x
126