xref: /aosp_15_r20/external/libffi/src/mips/ffitarget.h (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan /* -----------------------------------------------------------------*-C-*-
2*1fd5a2e1SPrashanth Swaminathan    ffitarget.h - Copyright (c) 2012  Anthony Green
3*1fd5a2e1SPrashanth Swaminathan                  Copyright (c) 1996-2003  Red Hat, Inc.
4*1fd5a2e1SPrashanth Swaminathan    Target configuration macros for MIPS.
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,
18*1fd5a2e1SPrashanth Swaminathan    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*1fd5a2e1SPrashanth Swaminathan    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20*1fd5a2e1SPrashanth Swaminathan    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21*1fd5a2e1SPrashanth Swaminathan    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22*1fd5a2e1SPrashanth Swaminathan    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23*1fd5a2e1SPrashanth Swaminathan    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24*1fd5a2e1SPrashanth Swaminathan    DEALINGS IN THE SOFTWARE.
25*1fd5a2e1SPrashanth Swaminathan 
26*1fd5a2e1SPrashanth Swaminathan    ----------------------------------------------------------------------- */
27*1fd5a2e1SPrashanth Swaminathan 
28*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_TARGET_H
29*1fd5a2e1SPrashanth Swaminathan #define LIBFFI_TARGET_H
30*1fd5a2e1SPrashanth Swaminathan 
31*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_H
32*1fd5a2e1SPrashanth Swaminathan #error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
33*1fd5a2e1SPrashanth Swaminathan #endif
34*1fd5a2e1SPrashanth Swaminathan 
35*1fd5a2e1SPrashanth Swaminathan #ifdef __linux__
36*1fd5a2e1SPrashanth Swaminathan # include <asm/sgidefs.h>
37*1fd5a2e1SPrashanth Swaminathan #elif defined(__rtems__)
38*1fd5a2e1SPrashanth Swaminathan /*
39*1fd5a2e1SPrashanth Swaminathan  * Subprogram calling convention - copied from sgidefs.h
40*1fd5a2e1SPrashanth Swaminathan  */
41*1fd5a2e1SPrashanth Swaminathan #define _MIPS_SIM_ABI32		1
42*1fd5a2e1SPrashanth Swaminathan #define _MIPS_SIM_NABI32	2
43*1fd5a2e1SPrashanth Swaminathan #define _MIPS_SIM_ABI64		3
44*1fd5a2e1SPrashanth Swaminathan #elif !defined(__OpenBSD__)
45*1fd5a2e1SPrashanth Swaminathan # include <sgidefs.h>
46*1fd5a2e1SPrashanth Swaminathan #endif
47*1fd5a2e1SPrashanth Swaminathan 
48*1fd5a2e1SPrashanth Swaminathan #  ifndef _ABIN32
49*1fd5a2e1SPrashanth Swaminathan #    define _ABIN32 _MIPS_SIM_NABI32
50*1fd5a2e1SPrashanth Swaminathan #  endif
51*1fd5a2e1SPrashanth Swaminathan #  ifndef _ABI64
52*1fd5a2e1SPrashanth Swaminathan #    define _ABI64 _MIPS_SIM_ABI64
53*1fd5a2e1SPrashanth Swaminathan #  endif
54*1fd5a2e1SPrashanth Swaminathan #  ifndef _ABIO32
55*1fd5a2e1SPrashanth Swaminathan #    define _ABIO32 _MIPS_SIM_ABI32
56*1fd5a2e1SPrashanth Swaminathan #  endif
57*1fd5a2e1SPrashanth Swaminathan 
58*1fd5a2e1SPrashanth Swaminathan #if !defined(_MIPS_SIM)
59*1fd5a2e1SPrashanth Swaminathan # error -- something is very wrong --
60*1fd5a2e1SPrashanth Swaminathan #else
61*1fd5a2e1SPrashanth Swaminathan #  if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64))
62*1fd5a2e1SPrashanth Swaminathan #    define FFI_MIPS_N32
63*1fd5a2e1SPrashanth Swaminathan #  else
64*1fd5a2e1SPrashanth Swaminathan #    if (_MIPS_SIM==_ABIO32 && defined(_ABIO32))
65*1fd5a2e1SPrashanth Swaminathan #      define FFI_MIPS_O32
66*1fd5a2e1SPrashanth Swaminathan #    else
67*1fd5a2e1SPrashanth Swaminathan #     error -- this is an unsupported platform --
68*1fd5a2e1SPrashanth Swaminathan #    endif
69*1fd5a2e1SPrashanth Swaminathan #  endif
70*1fd5a2e1SPrashanth Swaminathan #endif
71*1fd5a2e1SPrashanth Swaminathan 
72*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_MIPS_O32
73*1fd5a2e1SPrashanth Swaminathan /* O32 stack frames have 32bit integer args */
74*1fd5a2e1SPrashanth Swaminathan #  define FFI_SIZEOF_ARG    4
75*1fd5a2e1SPrashanth Swaminathan #else
76*1fd5a2e1SPrashanth Swaminathan /* N32 and N64 frames have 64bit integer args */
77*1fd5a2e1SPrashanth Swaminathan #  define FFI_SIZEOF_ARG    8
78*1fd5a2e1SPrashanth Swaminathan #  if _MIPS_SIM == _ABIN32
79*1fd5a2e1SPrashanth Swaminathan #    define FFI_SIZEOF_JAVA_RAW  4
80*1fd5a2e1SPrashanth Swaminathan #  endif
81*1fd5a2e1SPrashanth Swaminathan #endif
82*1fd5a2e1SPrashanth Swaminathan 
83*1fd5a2e1SPrashanth Swaminathan #define FFI_FLAG_BITS 2
84*1fd5a2e1SPrashanth Swaminathan 
85*1fd5a2e1SPrashanth Swaminathan /* SGI's strange assembler requires that we multiply by 4 rather
86*1fd5a2e1SPrashanth Swaminathan    than shift left by FFI_FLAG_BITS */
87*1fd5a2e1SPrashanth Swaminathan 
88*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_D   FFI_TYPE_DOUBLE
89*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_F   FFI_TYPE_FLOAT
90*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_DD  FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE
91*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_FF  FFI_TYPE_FLOAT * 4 +  FFI_TYPE_FLOAT
92*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_FD  FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT
93*1fd5a2e1SPrashanth Swaminathan #define FFI_ARGS_DF  FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE
94*1fd5a2e1SPrashanth Swaminathan 
95*1fd5a2e1SPrashanth Swaminathan /* Needed for N32 structure returns */
96*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_SMALLSTRUCT  FFI_TYPE_UINT8
97*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8
98*1fd5a2e1SPrashanth Swaminathan 
99*1fd5a2e1SPrashanth Swaminathan #if 0
100*1fd5a2e1SPrashanth Swaminathan /* The SGI assembler can't handle this.. */
101*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT
102*1fd5a2e1SPrashanth Swaminathan /* (and so on) */
103*1fd5a2e1SPrashanth Swaminathan #else
104*1fd5a2e1SPrashanth Swaminathan /* ...so we calculate these by hand! */
105*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_D      61
106*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_F      45
107*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DD     253
108*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FF     173
109*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FD     237
110*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DF     189
111*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_SMALL  93
112*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_SMALL2 109
113*1fd5a2e1SPrashanth Swaminathan 
114*1fd5a2e1SPrashanth Swaminathan /* and for n32 soft float, add 16 * 2^4 */
115*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_D_SOFT      317
116*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_F_SOFT      301
117*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DD_SOFT     509
118*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FF_SOFT     429
119*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_FD_SOFT     493
120*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_DF_SOFT     445
121*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_STRUCT_SOFT        16
122*1fd5a2e1SPrashanth Swaminathan #endif
123*1fd5a2e1SPrashanth Swaminathan 
124*1fd5a2e1SPrashanth Swaminathan #ifdef LIBFFI_ASM
125*1fd5a2e1SPrashanth Swaminathan #define v0 $2
126*1fd5a2e1SPrashanth Swaminathan #define v1 $3
127*1fd5a2e1SPrashanth Swaminathan #define a0 $4
128*1fd5a2e1SPrashanth Swaminathan #define a1 $5
129*1fd5a2e1SPrashanth Swaminathan #define a2 $6
130*1fd5a2e1SPrashanth Swaminathan #define a3 $7
131*1fd5a2e1SPrashanth Swaminathan #define a4 $8
132*1fd5a2e1SPrashanth Swaminathan #define a5 $9
133*1fd5a2e1SPrashanth Swaminathan #define a6 $10
134*1fd5a2e1SPrashanth Swaminathan #define a7 $11
135*1fd5a2e1SPrashanth Swaminathan #define t0 $8
136*1fd5a2e1SPrashanth Swaminathan #define t1 $9
137*1fd5a2e1SPrashanth Swaminathan #define t2 $10
138*1fd5a2e1SPrashanth Swaminathan #define t3 $11
139*1fd5a2e1SPrashanth Swaminathan #define t4 $12
140*1fd5a2e1SPrashanth Swaminathan #define t5 $13
141*1fd5a2e1SPrashanth Swaminathan #define t6 $14
142*1fd5a2e1SPrashanth Swaminathan #define t7 $15
143*1fd5a2e1SPrashanth Swaminathan #define t8 $24
144*1fd5a2e1SPrashanth Swaminathan #define t9 $25
145*1fd5a2e1SPrashanth Swaminathan #define ra $31
146*1fd5a2e1SPrashanth Swaminathan 
147*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_MIPS_O32
148*1fd5a2e1SPrashanth Swaminathan # define REG_L	lw
149*1fd5a2e1SPrashanth Swaminathan # define REG_S	sw
150*1fd5a2e1SPrashanth Swaminathan # define SUBU	subu
151*1fd5a2e1SPrashanth Swaminathan # define ADDU	addu
152*1fd5a2e1SPrashanth Swaminathan # define SRL	srl
153*1fd5a2e1SPrashanth Swaminathan # define LI	li
154*1fd5a2e1SPrashanth Swaminathan #else /* !FFI_MIPS_O32 */
155*1fd5a2e1SPrashanth Swaminathan # define REG_L	ld
156*1fd5a2e1SPrashanth Swaminathan # define REG_S	sd
157*1fd5a2e1SPrashanth Swaminathan # define SUBU	dsubu
158*1fd5a2e1SPrashanth Swaminathan # define ADDU	daddu
159*1fd5a2e1SPrashanth Swaminathan # define SRL	dsrl
160*1fd5a2e1SPrashanth Swaminathan # define LI 	dli
161*1fd5a2e1SPrashanth Swaminathan # if (_MIPS_SIM==_ABI64)
162*1fd5a2e1SPrashanth Swaminathan #  define LA dla
163*1fd5a2e1SPrashanth Swaminathan #  define EH_FRAME_ALIGN 3
164*1fd5a2e1SPrashanth Swaminathan #  define FDE_ADDR_BYTES .8byte
165*1fd5a2e1SPrashanth Swaminathan # else
166*1fd5a2e1SPrashanth Swaminathan #  define LA la
167*1fd5a2e1SPrashanth Swaminathan #  define EH_FRAME_ALIGN 2
168*1fd5a2e1SPrashanth Swaminathan #  define FDE_ADDR_BYTES .4byte
169*1fd5a2e1SPrashanth Swaminathan # endif /* _MIPS_SIM==_ABI64 */
170*1fd5a2e1SPrashanth Swaminathan #endif /* !FFI_MIPS_O32 */
171*1fd5a2e1SPrashanth Swaminathan #else /* !LIBFFI_ASM */
172*1fd5a2e1SPrashanth Swaminathan # ifdef __GNUC__
173*1fd5a2e1SPrashanth Swaminathan #  ifdef FFI_MIPS_O32
174*1fd5a2e1SPrashanth Swaminathan /* O32 stack frames have 32bit integer args */
175*1fd5a2e1SPrashanth Swaminathan typedef unsigned int     ffi_arg __attribute__((__mode__(__SI__)));
176*1fd5a2e1SPrashanth Swaminathan typedef signed   int     ffi_sarg __attribute__((__mode__(__SI__)));
177*1fd5a2e1SPrashanth Swaminathan #else
178*1fd5a2e1SPrashanth Swaminathan /* N32 and N64 frames have 64bit integer args */
179*1fd5a2e1SPrashanth Swaminathan typedef unsigned int     ffi_arg __attribute__((__mode__(__DI__)));
180*1fd5a2e1SPrashanth Swaminathan typedef signed   int     ffi_sarg __attribute__((__mode__(__DI__)));
181*1fd5a2e1SPrashanth Swaminathan #  endif
182*1fd5a2e1SPrashanth Swaminathan # else
183*1fd5a2e1SPrashanth Swaminathan #  ifdef FFI_MIPS_O32
184*1fd5a2e1SPrashanth Swaminathan /* O32 stack frames have 32bit integer args */
185*1fd5a2e1SPrashanth Swaminathan typedef __uint32_t ffi_arg;
186*1fd5a2e1SPrashanth Swaminathan typedef __int32_t ffi_sarg;
187*1fd5a2e1SPrashanth Swaminathan #  else
188*1fd5a2e1SPrashanth Swaminathan /* N32 and N64 frames have 64bit integer args */
189*1fd5a2e1SPrashanth Swaminathan typedef __uint64_t ffi_arg;
190*1fd5a2e1SPrashanth Swaminathan typedef __int64_t ffi_sarg;
191*1fd5a2e1SPrashanth Swaminathan #  endif
192*1fd5a2e1SPrashanth Swaminathan # endif /* __GNUC__ */
193*1fd5a2e1SPrashanth Swaminathan 
194*1fd5a2e1SPrashanth Swaminathan typedef enum ffi_abi {
195*1fd5a2e1SPrashanth Swaminathan   FFI_FIRST_ABI = 0,
196*1fd5a2e1SPrashanth Swaminathan   FFI_O32,
197*1fd5a2e1SPrashanth Swaminathan   FFI_N32,
198*1fd5a2e1SPrashanth Swaminathan   FFI_N64,
199*1fd5a2e1SPrashanth Swaminathan   FFI_O32_SOFT_FLOAT,
200*1fd5a2e1SPrashanth Swaminathan   FFI_N32_SOFT_FLOAT,
201*1fd5a2e1SPrashanth Swaminathan   FFI_N64_SOFT_FLOAT,
202*1fd5a2e1SPrashanth Swaminathan   FFI_LAST_ABI,
203*1fd5a2e1SPrashanth Swaminathan 
204*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_MIPS_O32
205*1fd5a2e1SPrashanth Swaminathan #ifdef __mips_soft_float
206*1fd5a2e1SPrashanth Swaminathan   FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT
207*1fd5a2e1SPrashanth Swaminathan #else
208*1fd5a2e1SPrashanth Swaminathan   FFI_DEFAULT_ABI = FFI_O32
209*1fd5a2e1SPrashanth Swaminathan #endif
210*1fd5a2e1SPrashanth Swaminathan #else
211*1fd5a2e1SPrashanth Swaminathan # if _MIPS_SIM==_ABI64
212*1fd5a2e1SPrashanth Swaminathan #  ifdef __mips_soft_float
213*1fd5a2e1SPrashanth Swaminathan   FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT
214*1fd5a2e1SPrashanth Swaminathan #  else
215*1fd5a2e1SPrashanth Swaminathan   FFI_DEFAULT_ABI = FFI_N64
216*1fd5a2e1SPrashanth Swaminathan #  endif
217*1fd5a2e1SPrashanth Swaminathan # else
218*1fd5a2e1SPrashanth Swaminathan #  ifdef __mips_soft_float
219*1fd5a2e1SPrashanth Swaminathan   FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT
220*1fd5a2e1SPrashanth Swaminathan #  else
221*1fd5a2e1SPrashanth Swaminathan   FFI_DEFAULT_ABI = FFI_N32
222*1fd5a2e1SPrashanth Swaminathan #  endif
223*1fd5a2e1SPrashanth Swaminathan # endif
224*1fd5a2e1SPrashanth Swaminathan #endif
225*1fd5a2e1SPrashanth Swaminathan } ffi_abi;
226*1fd5a2e1SPrashanth Swaminathan 
227*1fd5a2e1SPrashanth Swaminathan #define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag; unsigned mips_nfixedargs
228*1fd5a2e1SPrashanth Swaminathan #define FFI_TARGET_SPECIFIC_VARIADIC
229*1fd5a2e1SPrashanth Swaminathan #endif /* !LIBFFI_ASM */
230*1fd5a2e1SPrashanth Swaminathan 
231*1fd5a2e1SPrashanth Swaminathan /* ---- Definitions for closures ----------------------------------------- */
232*1fd5a2e1SPrashanth Swaminathan 
233*1fd5a2e1SPrashanth Swaminathan #define FFI_CLOSURES 1
234*1fd5a2e1SPrashanth Swaminathan #define FFI_GO_CLOSURES 1
235*1fd5a2e1SPrashanth Swaminathan #define FFI_NATIVE_RAW_API 0
236*1fd5a2e1SPrashanth Swaminathan 
237*1fd5a2e1SPrashanth Swaminathan #if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32)
238*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 20
239*1fd5a2e1SPrashanth Swaminathan #else
240*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 56
241*1fd5a2e1SPrashanth Swaminathan #endif
242*1fd5a2e1SPrashanth Swaminathan 
243*1fd5a2e1SPrashanth Swaminathan #endif
244*1fd5a2e1SPrashanth Swaminathan 
245