xref: /aosp_15_r20/external/libffi/src/powerpc/ffi_powerpc.h (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan /* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan    ffi_powerpc.h - Copyright (C) 2013 IBM
3*1fd5a2e1SPrashanth Swaminathan                    Copyright (C) 2011 Anthony Green
4*1fd5a2e1SPrashanth Swaminathan                    Copyright (C) 2011 Kyle Moffett
5*1fd5a2e1SPrashanth Swaminathan                    Copyright (C) 2008 Red Hat, Inc
6*1fd5a2e1SPrashanth Swaminathan                    Copyright (C) 2007, 2008 Free Software Foundation, Inc
7*1fd5a2e1SPrashanth Swaminathan                    Copyright (c) 1998 Geoffrey Keating
8*1fd5a2e1SPrashanth Swaminathan 
9*1fd5a2e1SPrashanth Swaminathan    PowerPC Foreign Function Interface
10*1fd5a2e1SPrashanth Swaminathan 
11*1fd5a2e1SPrashanth Swaminathan    Permission is hereby granted, free of charge, to any person obtaining
12*1fd5a2e1SPrashanth Swaminathan    a copy of this software and associated documentation files (the
13*1fd5a2e1SPrashanth Swaminathan    ``Software''), to deal in the Software without restriction, including
14*1fd5a2e1SPrashanth Swaminathan    without limitation the rights to use, copy, modify, merge, publish,
15*1fd5a2e1SPrashanth Swaminathan    distribute, sublicense, and/or sell copies of the Software, and to
16*1fd5a2e1SPrashanth Swaminathan    permit persons to whom the Software is furnished to do so, subject to
17*1fd5a2e1SPrashanth Swaminathan    the following conditions:
18*1fd5a2e1SPrashanth Swaminathan 
19*1fd5a2e1SPrashanth Swaminathan    The above copyright notice and this permission notice shall be included
20*1fd5a2e1SPrashanth Swaminathan    in all copies or substantial portions of the Software.
21*1fd5a2e1SPrashanth Swaminathan 
22*1fd5a2e1SPrashanth Swaminathan    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
23*1fd5a2e1SPrashanth Swaminathan    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24*1fd5a2e1SPrashanth Swaminathan    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25*1fd5a2e1SPrashanth Swaminathan    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
26*1fd5a2e1SPrashanth Swaminathan    OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27*1fd5a2e1SPrashanth Swaminathan    ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28*1fd5a2e1SPrashanth Swaminathan    OTHER DEALINGS IN THE SOFTWARE.
29*1fd5a2e1SPrashanth Swaminathan    ----------------------------------------------------------------------- */
30*1fd5a2e1SPrashanth Swaminathan 
31*1fd5a2e1SPrashanth Swaminathan enum {
32*1fd5a2e1SPrashanth Swaminathan   /* The assembly depends on these exact flags.  */
33*1fd5a2e1SPrashanth Swaminathan   /* These go in cr7 */
34*1fd5a2e1SPrashanth Swaminathan   FLAG_RETURNS_SMST     = 1 << (31-31), /* Used for FFI_SYSV small structs.  */
35*1fd5a2e1SPrashanth Swaminathan   FLAG_RETURNS_NOTHING  = 1 << (31-30),
36*1fd5a2e1SPrashanth Swaminathan   FLAG_RETURNS_FP       = 1 << (31-29),
37*1fd5a2e1SPrashanth Swaminathan   FLAG_RETURNS_VEC      = 1 << (31-28),
38*1fd5a2e1SPrashanth Swaminathan 
39*1fd5a2e1SPrashanth Swaminathan   /* These go in cr6 */
40*1fd5a2e1SPrashanth Swaminathan   FLAG_RETURNS_64BITS   = 1 << (31-27),
41*1fd5a2e1SPrashanth Swaminathan   FLAG_RETURNS_128BITS  = 1 << (31-26),
42*1fd5a2e1SPrashanth Swaminathan 
43*1fd5a2e1SPrashanth Swaminathan   FLAG_COMPAT           = 1 << (31- 8), /* Not used by assembly */
44*1fd5a2e1SPrashanth Swaminathan 
45*1fd5a2e1SPrashanth Swaminathan   /* These go in cr1 */
46*1fd5a2e1SPrashanth Swaminathan   FLAG_ARG_NEEDS_COPY   = 1 << (31- 7), /* Used by sysv code */
47*1fd5a2e1SPrashanth Swaminathan   FLAG_ARG_NEEDS_PSAVE  = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */
48*1fd5a2e1SPrashanth Swaminathan   FLAG_FP_ARGUMENTS     = 1 << (31- 6), /* cr1.eq; specified by ABI */
49*1fd5a2e1SPrashanth Swaminathan   FLAG_4_GPR_ARGUMENTS  = 1 << (31- 5),
50*1fd5a2e1SPrashanth Swaminathan   FLAG_RETVAL_REFERENCE = 1 << (31- 4),
51*1fd5a2e1SPrashanth Swaminathan   FLAG_VEC_ARGUMENTS    = 1 << (31- 3),
52*1fd5a2e1SPrashanth Swaminathan };
53*1fd5a2e1SPrashanth Swaminathan 
54*1fd5a2e1SPrashanth Swaminathan typedef union
55*1fd5a2e1SPrashanth Swaminathan {
56*1fd5a2e1SPrashanth Swaminathan   float f;
57*1fd5a2e1SPrashanth Swaminathan   double d;
58*1fd5a2e1SPrashanth Swaminathan } ffi_dblfl;
59*1fd5a2e1SPrashanth Swaminathan 
60*1fd5a2e1SPrashanth Swaminathan #if defined(__FLOAT128_TYPE__)
61*1fd5a2e1SPrashanth Swaminathan typedef _Float128 float128;
62*1fd5a2e1SPrashanth Swaminathan #elif defined(__FLOAT128__)
63*1fd5a2e1SPrashanth Swaminathan typedef __float128 float128;
64*1fd5a2e1SPrashanth Swaminathan #else
65*1fd5a2e1SPrashanth Swaminathan typedef __int128 float128;
66*1fd5a2e1SPrashanth Swaminathan #endif
67*1fd5a2e1SPrashanth Swaminathan 
68*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_closure_SYSV (void);
69*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_go_closure_sysv (void);
70*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *,
71*1fd5a2e1SPrashanth Swaminathan 			      unsigned, void *, int);
72*1fd5a2e1SPrashanth Swaminathan 
73*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi);
74*1fd5a2e1SPrashanth Swaminathan ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *);
75*1fd5a2e1SPrashanth Swaminathan ffi_status FFI_HIDDEN ffi_prep_closure_loc_sysv (ffi_closure *,
76*1fd5a2e1SPrashanth Swaminathan 						 ffi_cif *,
77*1fd5a2e1SPrashanth Swaminathan 						 void (*) (ffi_cif *, void *,
78*1fd5a2e1SPrashanth Swaminathan 							   void **, void *),
79*1fd5a2e1SPrashanth Swaminathan 						 void *, void *);
80*1fd5a2e1SPrashanth Swaminathan int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_cif *,
81*1fd5a2e1SPrashanth Swaminathan 					void (*) (ffi_cif *, void *,
82*1fd5a2e1SPrashanth Swaminathan 						  void **, void *),
83*1fd5a2e1SPrashanth Swaminathan 					void *, void *, unsigned long *,
84*1fd5a2e1SPrashanth Swaminathan 					ffi_dblfl *, unsigned long *);
85*1fd5a2e1SPrashanth Swaminathan 
86*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, void (*) (void), void *,
87*1fd5a2e1SPrashanth Swaminathan 				 unsigned long, void *, long);
88*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_closure_LINUX64 (void);
89*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_go_closure_linux64 (void);
90*1fd5a2e1SPrashanth Swaminathan 
91*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi);
92*1fd5a2e1SPrashanth Swaminathan ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *);
93*1fd5a2e1SPrashanth Swaminathan ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int,
94*1fd5a2e1SPrashanth Swaminathan 						unsigned int);
95*1fd5a2e1SPrashanth Swaminathan void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const);
96*1fd5a2e1SPrashanth Swaminathan ffi_status FFI_HIDDEN ffi_prep_closure_loc_linux64 (ffi_closure *, ffi_cif *,
97*1fd5a2e1SPrashanth Swaminathan 						    void (*) (ffi_cif *, void *,
98*1fd5a2e1SPrashanth Swaminathan 							      void **, void *),
99*1fd5a2e1SPrashanth Swaminathan 						    void *, void *);
100*1fd5a2e1SPrashanth Swaminathan int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *,
101*1fd5a2e1SPrashanth Swaminathan 					   void (*) (ffi_cif *, void *,
102*1fd5a2e1SPrashanth Swaminathan 						     void **, void *),
103*1fd5a2e1SPrashanth Swaminathan 					   void *, void *,
104*1fd5a2e1SPrashanth Swaminathan 					   unsigned long *, ffi_dblfl *,
105*1fd5a2e1SPrashanth Swaminathan 					   float128 *);
106