public inbox for libffi-discuss@sourceware.org
 help / color / mirror / Atom feed
From: Richard Henderson <rth@twiddle.net>
To: libffi-discuss@sourceware.org
Subject: [PATCH 03/10] arm: Deref ffi_put_arg arguments
Date: Wed, 29 Oct 2014 20:06:00 -0000	[thread overview]
Message-ID: <1414613147-10917-4-git-send-email-rth@twiddle.net> (raw)
In-Reply-To: <1414613147-10917-1-git-send-email-rth@twiddle.net>

---
 src/arm/ffi.c | 88 ++++++++++++++++++++++++++---------------------------------
 1 file changed, 38 insertions(+), 50 deletions(-)

diff --git a/src/arm/ffi.c b/src/arm/ffi.c
index 7d86e94..5e5ad0a 100644
--- a/src/arm/ffi.c
+++ b/src/arm/ffi.c
@@ -56,58 +56,46 @@ ffi_align (ffi_type *ty, void *p)
 }
 
 static size_t
-ffi_put_arg (ffi_type **arg_type, void **arg, char *stack)
+ffi_put_arg (ffi_type *ty, void *src, void *dst)
 {
-  register char *argp = stack;
-  register ffi_type **p_arg = arg_type;
-  register void **p_argv = arg;
-  register size_t z = (*p_arg)->size;
+  size_t z = ty->size;
 
-  if (z < sizeof (int))
+  switch (ty->type)
     {
-      z = sizeof (int);
-      switch ((*p_arg)->type)
-	{
-	case FFI_TYPE_SINT8:
-	  *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
-	  break;
-
-	case FFI_TYPE_UINT8:
-	  *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv);
-	  break;
-
-	case FFI_TYPE_SINT16:
-	  *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
-	  break;
+    case FFI_TYPE_SINT8:
+      *(UINT32 *)dst = *(SINT8 *)src;
+      break;
+    case FFI_TYPE_UINT8:
+      *(UINT32 *)dst = *(UINT8 *)src;
+      break;
+    case FFI_TYPE_SINT16:
+      *(UINT32 *)dst = *(SINT16 *)src;
+      break;
+    case FFI_TYPE_UINT16:
+      *(UINT32 *)dst = *(UINT16 *)src;
+      break;
 
-	case FFI_TYPE_UINT16:
-	  *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv);
-	  break;
+    case FFI_TYPE_INT:
+    case FFI_TYPE_SINT32:
+    case FFI_TYPE_UINT32:
+    case FFI_TYPE_POINTER:
+    case FFI_TYPE_FLOAT:
+      *(UINT32 *)dst = *(UINT32 *)src;
+      break;
 
-	case FFI_TYPE_STRUCT:
-	  memcpy (argp, *p_argv, (*p_arg)->size);
-	  break;
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_DOUBLE:
+      *(UINT64 *)dst = *(UINT64 *)src;
+      break;
 
-	default:
-	  FFI_ASSERT (0);
-	}
-    }
-  else if (z == sizeof (int))
-    {
-      if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	*(float *) argp = *(float *) (*p_argv);
-      else
-	*(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
-    }
-  else if (z == sizeof (double) && (*p_arg)->type == FFI_TYPE_DOUBLE)
-    {
-      *(double *) argp = *(double *) (*p_argv);
-    }
-  else
-    {
-      memcpy (argp, *p_argv, z);
+    case FFI_TYPE_STRUCT:
+    default:
+      memcpy (dst, src, z);
+      break;
     }
-  return z;
+
+  return ALIGN (z, 4);
 }
 
 /* ffi_prep_args is called by the assembly routine once stack space
@@ -138,7 +126,7 @@ ffi_prep_args_SYSV (char *stack, extended_cif *ecif, float *vfp_space)
        (i != 0); i--, p_arg++, p_argv++)
     {
       argp = ffi_align (*p_arg, argp);
-      argp += ffi_put_arg (p_arg, p_argv, argp);
+      argp += ffi_put_arg (*p_arg, *p_argv, argp);
     }
 
   return 0;
@@ -182,7 +170,7 @@ ffi_prep_args_VFP (char *stack, extended_cif * ecif, float *vfp_space)
       if (vi < ecif->cif->vfp_nargs && is_vfp_type)
 	{
 	  char *vfp_slot = (char *) (vfp_space + ecif->cif->vfp_args[vi++]);
-	  ffi_put_arg (p_arg, p_argv, vfp_slot);
+	  ffi_put_arg (*p_arg, *p_argv, vfp_slot);
 	  continue;
 	}
       /* Try allocating in core registers. */
@@ -195,7 +183,7 @@ ffi_prep_args_VFP (char *stack, extended_cif * ecif, float *vfp_space)
 	     area to place the argument.  */
 	  if (tregp + size <= eo_regp)
 	    {
-	      regp = tregp + ffi_put_arg (p_arg, p_argv, tregp);
+	      regp = tregp + ffi_put_arg (*p_arg, *p_argv, tregp);
 	      done_with_regs = (regp == argp);
 	      // ensure we did not write into the stack area
 	      FFI_ASSERT (regp <= argp);
@@ -208,7 +196,7 @@ ffi_prep_args_VFP (char *stack, extended_cif * ecif, float *vfp_space)
 	    {
 	      stack_used = 1;
 	      done_with_regs = 1;
-	      argp = tregp + ffi_put_arg (p_arg, p_argv, tregp);
+	      argp = tregp + ffi_put_arg (*p_arg, *p_argv, tregp);
 	      FFI_ASSERT (eo_regp < argp);
 	      continue;
 	    }
@@ -216,7 +204,7 @@ ffi_prep_args_VFP (char *stack, extended_cif * ecif, float *vfp_space)
       /* Base case, arguments are passed on the stack */
       stack_used = 1;
       argp = ffi_align (*p_arg, argp);
-      argp += ffi_put_arg (p_arg, p_argv, argp);
+      argp += ffi_put_arg (*p_arg, *p_argv, argp);
     }
   /* Indicate the VFP registers used. */
   return ecif->cif->vfp_used;
-- 
1.9.3

  parent reply	other threads:[~2014-10-29 20:06 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-29 20:05 [PATCH 00/10] Go closures for arm Richard Henderson
2014-10-29 20:06 ` [PATCH 04/10] arm: Rewrite vfp_type_p Richard Henderson
2014-10-29 20:06 ` [PATCH 05/10] arm: Rewrite ffi_call Richard Henderson
2014-10-29 20:06 ` Richard Henderson [this message]
2014-10-29 20:06 ` [PATCH 07/10] arm: Remove internal FFI_TYPE constants Richard Henderson
2014-10-29 20:06 ` [PATCH 02/10] arm: Deref ffi_align argument Richard Henderson
2014-10-29 20:06 ` [PATCH 08/10] arm: Add support for complex types Richard Henderson
2014-10-29 20:06 ` [PATCH 10/10] arm: Add support for Go closures Richard Henderson
2014-10-29 20:06 ` [PATCH 01/10] arm: Reindent arm/ffi.c Richard Henderson
2014-10-29 20:06 ` [PATCH 06/10] arm: Rewrite ffi_closure Richard Henderson
2014-10-29 20:06 ` [PATCH 09/10] arm: Add argument space for the hidden struct return pointer Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1414613147-10917-4-git-send-email-rth@twiddle.net \
    --to=rth@twiddle.net \
    --cc=libffi-discuss@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).