ยปCore Development>Code coverage>Modules/_ctypes/libffi/src/sh/ffi.c

Python code coverage for Modules/_ctypes/libffi/src/sh/ffi.c

#countcontent
1n/a/* -----------------------------------------------------------------------
2n/a ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima
3n/a Copyright (c) 2008 Red Hat, Inc.
4n/a
5n/a SuperH Foreign Function Interface
6n/a
7n/a Permission is hereby granted, free of charge, to any person obtaining
8n/a a copy of this software and associated documentation files (the
9n/a ``Software''), to deal in the Software without restriction, including
10n/a without limitation the rights to use, copy, modify, merge, publish,
11n/a distribute, sublicense, and/or sell copies of the Software, and to
12n/a permit persons to whom the Software is furnished to do so, subject to
13n/a the following conditions:
14n/a
15n/a The above copyright notice and this permission notice shall be included
16n/a in all copies or substantial portions of the Software.
17n/a
18n/a THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19n/a EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20n/a MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21n/a NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22n/a HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23n/a WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24n/a OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25n/a DEALINGS IN THE SOFTWARE.
26n/a ----------------------------------------------------------------------- */
27n/a
28n/a#include <ffi.h>
29n/a#include <ffi_common.h>
30n/a
31n/a#include <stdlib.h>
32n/a
33n/a#define NGREGARG 4
34n/a#if defined(__SH4__)
35n/a#define NFREGARG 8
36n/a#endif
37n/a
38n/a#if defined(__HITACHI__)
39n/a#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
40n/a#else
41n/a#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
42n/a#endif
43n/a
44n/a/* If the structure has essentially an unique element, return its type. */
45n/astatic int
46n/asimple_type (ffi_type *arg)
47n/a{
48n/a if (arg->type != FFI_TYPE_STRUCT)
49n/a return arg->type;
50n/a else if (arg->elements[1])
51n/a return FFI_TYPE_STRUCT;
52n/a
53n/a return simple_type (arg->elements[0]);
54n/a}
55n/a
56n/astatic int
57n/areturn_type (ffi_type *arg)
58n/a{
59n/a unsigned short type;
60n/a
61n/a if (arg->type != FFI_TYPE_STRUCT)
62n/a return arg->type;
63n/a
64n/a type = simple_type (arg->elements[0]);
65n/a if (! arg->elements[1])
66n/a {
67n/a switch (type)
68n/a {
69n/a case FFI_TYPE_SINT8:
70n/a case FFI_TYPE_UINT8:
71n/a case FFI_TYPE_SINT16:
72n/a case FFI_TYPE_UINT16:
73n/a case FFI_TYPE_SINT32:
74n/a case FFI_TYPE_UINT32:
75n/a return FFI_TYPE_INT;
76n/a
77n/a default:
78n/a return type;
79n/a }
80n/a }
81n/a
82n/a /* gcc uses r0/r1 pair for some kind of structures. */
83n/a if (arg->size <= 2 * sizeof (int))
84n/a {
85n/a int i = 0;
86n/a ffi_type *e;
87n/a
88n/a while ((e = arg->elements[i++]))
89n/a {
90n/a type = simple_type (e);
91n/a switch (type)
92n/a {
93n/a case FFI_TYPE_SINT32:
94n/a case FFI_TYPE_UINT32:
95n/a case FFI_TYPE_INT:
96n/a case FFI_TYPE_FLOAT:
97n/a return FFI_TYPE_UINT64;
98n/a
99n/a default:
100n/a break;
101n/a }
102n/a }
103n/a }
104n/a
105n/a return FFI_TYPE_STRUCT;
106n/a}
107n/a
108n/a/* ffi_prep_args is called by the assembly routine once stack space
109n/a has been allocated for the function's arguments */
110n/a
111n/avoid ffi_prep_args(char *stack, extended_cif *ecif)
112n/a{
113n/a register unsigned int i;
114n/a register int tmp;
115n/a register unsigned int avn;
116n/a register void **p_argv;
117n/a register char *argp;
118n/a register ffi_type **p_arg;
119n/a int greg, ireg;
120n/a#if defined(__SH4__)
121n/a int freg = 0;
122n/a#endif
123n/a
124n/a tmp = 0;
125n/a argp = stack;
126n/a
127n/a if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
128n/a {
129n/a *(void **) argp = ecif->rvalue;
130n/a argp += 4;
131n/a ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
132n/a }
133n/a else
134n/a ireg = 0;
135n/a
136n/a /* Set arguments for registers. */
137n/a greg = ireg;
138n/a avn = ecif->cif->nargs;
139n/a p_argv = ecif->avalue;
140n/a
141n/a for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
142n/a {
143n/a size_t z;
144n/a
145n/a z = (*p_arg)->size;
146n/a if (z < sizeof(int))
147n/a {
148n/a if (greg++ >= NGREGARG)
149n/a continue;
150n/a
151n/a z = sizeof(int);
152n/a switch ((*p_arg)->type)
153n/a {
154n/a case FFI_TYPE_SINT8:
155n/a *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
156n/a break;
157n/a
158n/a case FFI_TYPE_UINT8:
159n/a *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
160n/a break;
161n/a
162n/a case FFI_TYPE_SINT16:
163n/a *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
164n/a break;
165n/a
166n/a case FFI_TYPE_UINT16:
167n/a *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
168n/a break;
169n/a
170n/a case FFI_TYPE_STRUCT:
171n/a *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
172n/a break;
173n/a
174n/a default:
175n/a FFI_ASSERT(0);
176n/a }
177n/a argp += z;
178n/a }
179n/a else if (z == sizeof(int))
180n/a {
181n/a#if defined(__SH4__)
182n/a if ((*p_arg)->type == FFI_TYPE_FLOAT)
183n/a {
184n/a if (freg++ >= NFREGARG)
185n/a continue;
186n/a }
187n/a else
188n/a#endif
189n/a {
190n/a if (greg++ >= NGREGARG)
191n/a continue;
192n/a }
193n/a *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
194n/a argp += z;
195n/a }
196n/a#if defined(__SH4__)
197n/a else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
198n/a {
199n/a if (freg + 1 >= NFREGARG)
200n/a continue;
201n/a freg = (freg + 1) & ~1;
202n/a freg += 2;
203n/a memcpy (argp, *p_argv, z);
204n/a argp += z;
205n/a }
206n/a#endif
207n/a else
208n/a {
209n/a int n = (z + sizeof (int) - 1) / sizeof (int);
210n/a#if defined(__SH4__)
211n/a if (greg + n - 1 >= NGREGARG)
212n/a continue;
213n/a#else
214n/a if (greg >= NGREGARG)
215n/a continue;
216n/a#endif
217n/a greg += n;
218n/a memcpy (argp, *p_argv, z);
219n/a argp += n * sizeof (int);
220n/a }
221n/a }
222n/a
223n/a /* Set arguments on stack. */
224n/a greg = ireg;
225n/a#if defined(__SH4__)
226n/a freg = 0;
227n/a#endif
228n/a p_argv = ecif->avalue;
229n/a
230n/a for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
231n/a {
232n/a size_t z;
233n/a
234n/a z = (*p_arg)->size;
235n/a if (z < sizeof(int))
236n/a {
237n/a if (greg++ < NGREGARG)
238n/a continue;
239n/a
240n/a z = sizeof(int);
241n/a switch ((*p_arg)->type)
242n/a {
243n/a case FFI_TYPE_SINT8:
244n/a *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
245n/a break;
246n/a
247n/a case FFI_TYPE_UINT8:
248n/a *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
249n/a break;
250n/a
251n/a case FFI_TYPE_SINT16:
252n/a *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
253n/a break;
254n/a
255n/a case FFI_TYPE_UINT16:
256n/a *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
257n/a break;
258n/a
259n/a case FFI_TYPE_STRUCT:
260n/a *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
261n/a break;
262n/a
263n/a default:
264n/a FFI_ASSERT(0);
265n/a }
266n/a argp += z;
267n/a }
268n/a else if (z == sizeof(int))
269n/a {
270n/a#if defined(__SH4__)
271n/a if ((*p_arg)->type == FFI_TYPE_FLOAT)
272n/a {
273n/a if (freg++ < NFREGARG)
274n/a continue;
275n/a }
276n/a else
277n/a#endif
278n/a {
279n/a if (greg++ < NGREGARG)
280n/a continue;
281n/a }
282n/a *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
283n/a argp += z;
284n/a }
285n/a#if defined(__SH4__)
286n/a else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
287n/a {
288n/a if (freg + 1 < NFREGARG)
289n/a {
290n/a freg = (freg + 1) & ~1;
291n/a freg += 2;
292n/a continue;
293n/a }
294n/a memcpy (argp, *p_argv, z);
295n/a argp += z;
296n/a }
297n/a#endif
298n/a else
299n/a {
300n/a int n = (z + sizeof (int) - 1) / sizeof (int);
301n/a if (greg + n - 1 < NGREGARG)
302n/a {
303n/a greg += n;
304n/a continue;
305n/a }
306n/a#if (! defined(__SH4__))
307n/a else if (greg < NGREGARG)
308n/a {
309n/a greg = NGREGARG;
310n/a continue;
311n/a }
312n/a#endif
313n/a memcpy (argp, *p_argv, z);
314n/a argp += n * sizeof (int);
315n/a }
316n/a }
317n/a
318n/a return;
319n/a}
320n/a
321n/a/* Perform machine dependent cif processing */
322n/affi_status ffi_prep_cif_machdep(ffi_cif *cif)
323n/a{
324n/a int i, j;
325n/a int size, type;
326n/a int n, m;
327n/a int greg;
328n/a#if defined(__SH4__)
329n/a int freg = 0;
330n/a#endif
331n/a
332n/a cif->flags = 0;
333n/a
334n/a greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
335n/a STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
336n/a
337n/a#if defined(__SH4__)
338n/a for (i = j = 0; i < cif->nargs && j < 12; i++)
339n/a {
340n/a type = (cif->arg_types)[i]->type;
341n/a switch (type)
342n/a {
343n/a case FFI_TYPE_FLOAT:
344n/a if (freg >= NFREGARG)
345n/a continue;
346n/a freg++;
347n/a cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
348n/a j++;
349n/a break;
350n/a
351n/a case FFI_TYPE_DOUBLE:
352n/a if ((freg + 1) >= NFREGARG)
353n/a continue;
354n/a freg = (freg + 1) & ~1;
355n/a freg += 2;
356n/a cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
357n/a j++;
358n/a break;
359n/a
360n/a default:
361n/a size = (cif->arg_types)[i]->size;
362n/a n = (size + sizeof (int) - 1) / sizeof (int);
363n/a if (greg + n - 1 >= NGREGARG)
364n/a continue;
365n/a greg += n;
366n/a for (m = 0; m < n; m++)
367n/a cif->flags += FFI_TYPE_INT << (2 * j++);
368n/a break;
369n/a }
370n/a }
371n/a#else
372n/a for (i = j = 0; i < cif->nargs && j < 4; i++)
373n/a {
374n/a size = (cif->arg_types)[i]->size;
375n/a n = (size + sizeof (int) - 1) / sizeof (int);
376n/a if (greg >= NGREGARG)
377n/a continue;
378n/a else if (greg + n - 1 >= NGREGARG)
379n/a n = NGREGARG - greg;
380n/a greg += n;
381n/a for (m = 0; m < n; m++)
382n/a cif->flags += FFI_TYPE_INT << (2 * j++);
383n/a }
384n/a#endif
385n/a
386n/a /* Set the return type flag */
387n/a switch (cif->rtype->type)
388n/a {
389n/a case FFI_TYPE_STRUCT:
390n/a cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
391n/a break;
392n/a
393n/a case FFI_TYPE_VOID:
394n/a case FFI_TYPE_FLOAT:
395n/a case FFI_TYPE_DOUBLE:
396n/a case FFI_TYPE_SINT64:
397n/a case FFI_TYPE_UINT64:
398n/a cif->flags += (unsigned) cif->rtype->type << 24;
399n/a break;
400n/a
401n/a default:
402n/a cif->flags += FFI_TYPE_INT << 24;
403n/a break;
404n/a }
405n/a
406n/a return FFI_OK;
407n/a}
408n/a
409n/aextern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
410n/a unsigned, unsigned, unsigned *, void (*fn)(void));
411n/a
412n/avoid ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
413n/a{
414n/a extended_cif ecif;
415n/a UINT64 trvalue;
416n/a
417n/a ecif.cif = cif;
418n/a ecif.avalue = avalue;
419n/a
420n/a /* If the return value is a struct and we don't have a return */
421n/a /* value address then we need to make one */
422n/a
423n/a if (cif->rtype->type == FFI_TYPE_STRUCT
424n/a && return_type (cif->rtype) != FFI_TYPE_STRUCT)
425n/a ecif.rvalue = &trvalue;
426n/a else if ((rvalue == NULL) &&
427n/a (cif->rtype->type == FFI_TYPE_STRUCT))
428n/a {
429n/a ecif.rvalue = alloca(cif->rtype->size);
430n/a }
431n/a else
432n/a ecif.rvalue = rvalue;
433n/a
434n/a switch (cif->abi)
435n/a {
436n/a case FFI_SYSV:
437n/a ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
438n/a fn);
439n/a break;
440n/a default:
441n/a FFI_ASSERT(0);
442n/a break;
443n/a }
444n/a
445n/a if (rvalue
446n/a && cif->rtype->type == FFI_TYPE_STRUCT
447n/a && return_type (cif->rtype) != FFI_TYPE_STRUCT)
448n/a memcpy (rvalue, &trvalue, cif->rtype->size);
449n/a}
450n/a
451n/aextern void ffi_closure_SYSV (void);
452n/a#if defined(__SH4__)
453n/aextern void __ic_invalidate (void *line);
454n/a#endif
455n/a
456n/affi_status
457n/affi_prep_closure_loc (ffi_closure* closure,
458n/a ffi_cif* cif,
459n/a void (*fun)(ffi_cif*, void*, void**, void*),
460n/a void *user_data,
461n/a void *codeloc)
462n/a{
463n/a unsigned int *tramp;
464n/a unsigned int insn;
465n/a
466n/a if (cif->abi != FFI_SYSV)
467n/a return FFI_BAD_ABI;
468n/a
469n/a tramp = (unsigned int *) &closure->tramp[0];
470n/a /* Set T bit if the function returns a struct pointed with R2. */
471n/a insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT
472n/a ? 0x0018 /* sett */
473n/a : 0x0008 /* clrt */);
474n/a
475n/a#ifdef __LITTLE_ENDIAN__
476n/a tramp[0] = 0xd301d102;
477n/a tramp[1] = 0x0000412b | (insn << 16);
478n/a#else
479n/a tramp[0] = 0xd102d301;
480n/a tramp[1] = 0x412b0000 | insn;
481n/a#endif
482n/a *(void **) &tramp[2] = (void *)codeloc; /* ctx */
483n/a *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
484n/a
485n/a closure->cif = cif;
486n/a closure->fun = fun;
487n/a closure->user_data = user_data;
488n/a
489n/a#if defined(__SH4__)
490n/a /* Flush the icache. */
491n/a __ic_invalidate(codeloc);
492n/a#endif
493n/a
494n/a return FFI_OK;
495n/a}
496n/a
497n/a/* Basically the trampoline invokes ffi_closure_SYSV, and on
498n/a * entry, r3 holds the address of the closure.
499n/a * After storing the registers that could possibly contain
500n/a * parameters to be passed into the stack frame and setting
501n/a * up space for a return value, ffi_closure_SYSV invokes the
502n/a * following helper function to do most of the work.
503n/a */
504n/a
505n/a#ifdef __LITTLE_ENDIAN__
506n/a#define OFS_INT8 0
507n/a#define OFS_INT16 0
508n/a#else
509n/a#define OFS_INT8 3
510n/a#define OFS_INT16 2
511n/a#endif
512n/a
513n/aint
514n/affi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
515n/a unsigned long *pgr, unsigned long *pfr,
516n/a unsigned long *pst)
517n/a{
518n/a void **avalue;
519n/a ffi_type **p_arg;
520n/a int i, avn;
521n/a int ireg, greg = 0;
522n/a#if defined(__SH4__)
523n/a int freg = 0;
524n/a#endif
525n/a ffi_cif *cif;
526n/a
527n/a cif = closure->cif;
528n/a avalue = alloca(cif->nargs * sizeof(void *));
529n/a
530n/a /* Copy the caller's structure return value address so that the closure
531n/a returns the data directly to the caller. */
532n/a if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG)
533n/a {
534n/a rvalue = (void *) *pgr++;
535n/a ireg = 1;
536n/a }
537n/a else
538n/a ireg = 0;
539n/a
540n/a cif = closure->cif;
541n/a greg = ireg;
542n/a avn = cif->nargs;
543n/a
544n/a /* Grab the addresses of the arguments from the stack frame. */
545n/a for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
546n/a {
547n/a size_t z;
548n/a
549n/a z = (*p_arg)->size;
550n/a if (z < sizeof(int))
551n/a {
552n/a if (greg++ >= NGREGARG)
553n/a continue;
554n/a
555n/a z = sizeof(int);
556n/a switch ((*p_arg)->type)
557n/a {
558n/a case FFI_TYPE_SINT8:
559n/a case FFI_TYPE_UINT8:
560n/a avalue[i] = (((char *)pgr) + OFS_INT8);
561n/a break;
562n/a
563n/a case FFI_TYPE_SINT16:
564n/a case FFI_TYPE_UINT16:
565n/a avalue[i] = (((char *)pgr) + OFS_INT16);
566n/a break;
567n/a
568n/a case FFI_TYPE_STRUCT:
569n/a avalue[i] = pgr;
570n/a break;
571n/a
572n/a default:
573n/a FFI_ASSERT(0);
574n/a }
575n/a pgr++;
576n/a }
577n/a else if (z == sizeof(int))
578n/a {
579n/a#if defined(__SH4__)
580n/a if ((*p_arg)->type == FFI_TYPE_FLOAT)
581n/a {
582n/a if (freg++ >= NFREGARG)
583n/a continue;
584n/a avalue[i] = pfr;
585n/a pfr++;
586n/a }
587n/a else
588n/a#endif
589n/a {
590n/a if (greg++ >= NGREGARG)
591n/a continue;
592n/a avalue[i] = pgr;
593n/a pgr++;
594n/a }
595n/a }
596n/a#if defined(__SH4__)
597n/a else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
598n/a {
599n/a if (freg + 1 >= NFREGARG)
600n/a continue;
601n/a if (freg & 1)
602n/a pfr++;
603n/a freg = (freg + 1) & ~1;
604n/a freg += 2;
605n/a avalue[i] = pfr;
606n/a pfr += 2;
607n/a }
608n/a#endif
609n/a else
610n/a {
611n/a int n = (z + sizeof (int) - 1) / sizeof (int);
612n/a#if defined(__SH4__)
613n/a if (greg + n - 1 >= NGREGARG)
614n/a continue;
615n/a#else
616n/a if (greg >= NGREGARG)
617n/a continue;
618n/a#endif
619n/a greg += n;
620n/a avalue[i] = pgr;
621n/a pgr += n;
622n/a }
623n/a }
624n/a
625n/a greg = ireg;
626n/a#if defined(__SH4__)
627n/a freg = 0;
628n/a#endif
629n/a
630n/a for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
631n/a {
632n/a size_t z;
633n/a
634n/a z = (*p_arg)->size;
635n/a if (z < sizeof(int))
636n/a {
637n/a if (greg++ < NGREGARG)
638n/a continue;
639n/a
640n/a z = sizeof(int);
641n/a switch ((*p_arg)->type)
642n/a {
643n/a case FFI_TYPE_SINT8:
644n/a case FFI_TYPE_UINT8:
645n/a avalue[i] = (((char *)pst) + OFS_INT8);
646n/a break;
647n/a
648n/a case FFI_TYPE_SINT16:
649n/a case FFI_TYPE_UINT16:
650n/a avalue[i] = (((char *)pst) + OFS_INT16);
651n/a break;
652n/a
653n/a case FFI_TYPE_STRUCT:
654n/a avalue[i] = pst;
655n/a break;
656n/a
657n/a default:
658n/a FFI_ASSERT(0);
659n/a }
660n/a pst++;
661n/a }
662n/a else if (z == sizeof(int))
663n/a {
664n/a#if defined(__SH4__)
665n/a if ((*p_arg)->type == FFI_TYPE_FLOAT)
666n/a {
667n/a if (freg++ < NFREGARG)
668n/a continue;
669n/a }
670n/a else
671n/a#endif
672n/a {
673n/a if (greg++ < NGREGARG)
674n/a continue;
675n/a }
676n/a avalue[i] = pst;
677n/a pst++;
678n/a }
679n/a#if defined(__SH4__)
680n/a else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
681n/a {
682n/a if (freg + 1 < NFREGARG)
683n/a {
684n/a freg = (freg + 1) & ~1;
685n/a freg += 2;
686n/a continue;
687n/a }
688n/a avalue[i] = pst;
689n/a pst += 2;
690n/a }
691n/a#endif
692n/a else
693n/a {
694n/a int n = (z + sizeof (int) - 1) / sizeof (int);
695n/a if (greg + n - 1 < NGREGARG)
696n/a {
697n/a greg += n;
698n/a continue;
699n/a }
700n/a#if (! defined(__SH4__))
701n/a else if (greg < NGREGARG)
702n/a {
703n/a greg += n;
704n/a pst += greg - NGREGARG;
705n/a continue;
706n/a }
707n/a#endif
708n/a avalue[i] = pst;
709n/a pst += n;
710n/a }
711n/a }
712n/a
713n/a (closure->fun) (cif, rvalue, avalue, closure->user_data);
714n/a
715n/a /* Tell ffi_closure_SYSV how to perform return type promotions. */
716n/a return return_type (cif->rtype);
717n/a}