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