[svn:parrot] r42084 - trunk/src/call

chromatic at svn.parrot.org chromatic at svn.parrot.org
Sat Oct 24 20:19:33 UTC 2009


Author: chromatic
Date: Sat Oct 24 20:19:32 2009
New Revision: 42084
URL: https://trac.parrot.org/parrot/changeset/42084

Log:
[PCC] Replaced vtable calls to FIA when passing and returning with macro
accessors.  This allows direct looping over the FIA array, which produces at
least a 3.207% speed improvement on the fib.pir benchmark.

Modified:
   trunk/src/call/args.c

Modified: trunk/src/call/args.c
==============================================================================
--- trunk/src/call/args.c	Sat Oct 24 20:19:28 2009	(r42083)
+++ trunk/src/call/args.c	Sat Oct 24 20:19:32 2009	(r42084)
@@ -23,6 +23,7 @@
 #include "args.str"
 #include "../pmc/pmc_key.h"
 #include "../pmc/pmc_callsignature.h"
+#include "../pmc/pmc_fixedintegerarray.h"
 
 /* HEADERIZER HFILE: include/parrot/call.h */
 
@@ -479,9 +480,10 @@
 {
     ASSERT_ARGS(Parrot_pcc_build_sig_object_from_op)
     PMC            *call_object;
-    INTVAL          arg_index;
-    INTVAL          arg_count  = VTABLE_elements(interp, raw_sig);
     PMC            *ctx        = CURRENT_CONTEXT(interp);
+    INTVAL         *int_array;
+    INTVAL          arg_count;
+    INTVAL          arg_index;
 
     if (PMC_IS_NULL(signature))
         call_object = pmc_new(interp, enum_class_CallSignature);
@@ -490,10 +492,11 @@
 
     /* this macro is much, much faster than the VTABLE STRING comparisons */
     SETATTR_CallSignature_arg_flags(interp, call_object, raw_sig);
+    GETATTR_FixedIntegerArray_size(interp, raw_sig, arg_count);
+    GETATTR_FixedIntegerArray_int_array(interp, raw_sig, int_array);
 
     for (arg_index = 0; arg_index < arg_count; arg_index++) {
-        INTVAL arg_flags = VTABLE_get_integer_keyed_int(interp,
-                    raw_sig, arg_index);
+        INTVAL arg_flags = int_array[arg_index];
 
         const INTVAL constant  = PARROT_ARG_CONSTANT_ISSET(arg_flags);
         const INTVAL raw_index = raw_args[arg_index + 2];
@@ -705,11 +708,12 @@
 {
     ASSERT_ARGS(Parrot_pcc_build_sig_object_returns_from_op)
     PMC            *call_object;
-    INTVAL          arg_index;
-    INTVAL          arg_count   = VTABLE_elements(interp, raw_sig);
+    INTVAL         *int_array;
     PMC            *ctx         = CURRENT_CONTEXT(interp);
     PMC            *returns     = pmc_new(interp, enum_class_CallSignatureReturns);
     INTVAL          returns_pos = 0;
+    INTVAL          arg_index;
+    INTVAL          arg_count;
 
     if (PMC_IS_NULL(signature))
         call_object = pmc_new(interp, enum_class_CallSignature);
@@ -730,10 +734,12 @@
     SETATTR_CallSignature_return_flags(interp, call_object, raw_sig);
     SETATTR_CallSignature_results(interp, call_object, returns);
 
+    GETATTR_FixedIntegerArray_size(interp, raw_sig, arg_count);
+    GETATTR_FixedIntegerArray_int_array(interp, raw_sig, int_array);
+
     for (arg_index = 0; arg_index < arg_count; arg_index++) {
         STRING * const signature = CONST_STRING(interp, "signature");
-        INTVAL arg_flags = VTABLE_get_integer_keyed_int(interp,
-                    raw_sig, arg_index);
+        const INTVAL arg_flags = int_array[arg_index];
         const INTVAL raw_index = raw_args[arg_index + 2];
 
         /* Returns store a pointer to the register, so they can pass
@@ -1496,50 +1502,54 @@
         ARGIN(PMC *raw_sig), ARGIN(void *return_info), ARGIN(struct pcc_get_funcs *accessor))
 {
     ASSERT_ARGS(fill_results)
-    PMC    *ctx = CURRENT_CONTEXT(interp);
-    PMC    *named_used_list = PMCNULL;
-    PMC    *named_return_list = PMCNULL;
-    INTVAL  return_count    = VTABLE_elements(interp, raw_sig);
-    INTVAL  result_count;
-    INTVAL  positional_returns = 0; /* initialized by a loop later */
-    INTVAL  i = 0;                  /* used by the initialization loop */
-    INTVAL  return_index    = 0;
-    INTVAL  return_subindex = 0;
-    INTVAL  result_index    = 0;
-    INTVAL  positional_index = 0;
-    INTVAL  named_count    = 0;
-    INTVAL  err_check      = 0;
+    INTVAL *return_array;
     PMC    *result_list;
     PMC    *result_sig;
+    PMC    *ctx                = CURRENT_CONTEXT(interp);
+    PMC    *named_used_list    = PMCNULL;
+    PMC    *named_return_list  = PMCNULL;
+    INTVAL  return_index       = 0;
+    INTVAL  return_subindex    = 0;
+    INTVAL  result_index       = 0;
+    INTVAL  positional_index   = 0;
+    INTVAL  named_count        = 0;
+    INTVAL  err_check          = 0;
+    INTVAL  positional_returns = 0; /* initialized by a loop later */
+    INTVAL  i                  = 0; /* used by the initialization loop */
+    INTVAL  return_count;
+    INTVAL  result_count;
 
     /* Check if we should be throwing errors. This is configured separately
      * for parameters and return values. */
     if (PARROT_ERRORS_test(interp, PARROT_ERRORS_RESULT_COUNT_FLAG))
-            err_check = 1;
+        err_check = 1;
+
+    GETATTR_FixedIntegerArray_size(interp, raw_sig, return_count);
 
     /* A null call object is fine if there are no returns and no results. */
-    if (PMC_IS_NULL(call_object)) { /* No results to be filled. */
+    if (PMC_IS_NULL(call_object)) {
         /* If the return_count is 0, then there are no return values waiting to
          * fill the results, so no error. */
-        if (return_count > 0) {
-            if (err_check)
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "too few returns: 0 passed, %d expected",
-                        return_count);
-        }
+        if (return_count > 0 && (err_check))
+            Parrot_ex_throw_from_c_args(interp, NULL,
+                EXCEPTION_INVALID_OPERATION,
+                "too few returns: 0 passed, %d expected", return_count);
+
         return;
     }
 
     GETATTR_CallSignature_results(interp, call_object, result_list);
     GETATTR_CallSignature_return_flags(interp, call_object, result_sig);
+
     result_count = PMC_IS_NULL(result_list) ? 0 : VTABLE_elements(interp, result_list);
     PARROT_ASSERT(PMC_IS_NULL(result_list) || !PMC_IS_NULL(result_sig));
 
-    /* the call obj doesn't have the returns as positionals, so instead we loop
-     * over raw_sig and count the number of returns before the first named return.
-     */
+    GETATTR_FixedIntegerArray_int_array(interp, raw_sig, return_array);
+
+    /* the call obj doesn't have the returns as positionals.
+     * instead count number of returns before first named return */
     for (i = 0; i < return_count; i++) {
-        INTVAL flags = VTABLE_get_integer_keyed_int(interp, raw_sig, i);
+        INTVAL flags = return_array[i];
         if (flags & PARROT_ARG_NAME)
             break;
 
@@ -1599,7 +1609,7 @@
                 if (return_index >= return_count)
                     break; /* no more returns */
 
-                return_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, return_index);
+                return_flags = return_array[return_index];
 
                 if (return_flags & PARROT_ARG_NAME)
                     break; /* stop at named returns */
@@ -1659,7 +1669,7 @@
 
         /* We have a positional return, fill the result with it. */
         if (return_index < positional_returns) {
-            INTVAL return_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, return_index);
+            INTVAL return_flags = return_array[return_index];
             INTVAL constant     = PARROT_ARG_CONSTANT_ISSET(return_flags);
 
             /* Fill a named result with a positional return. */
@@ -1813,7 +1823,7 @@
         INTVAL  return_flags;
         INTVAL  constant;
 
-        return_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, return_index);
+        return_flags = return_array[return_index];
 
         /* All remaining returns must be named. */
         if (!(return_flags & PARROT_ARG_NAME))
@@ -1833,7 +1843,7 @@
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
                     "named returns must have a value");
 
-        return_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, return_index);
+        return_flags = return_array[return_index];
 
         if (PMC_IS_NULL(named_return_list)) /* Only created if needed. */
             named_return_list = pmc_new(interp,
@@ -1956,8 +1966,7 @@
                     INTVAL next_result_flags;
 
                     if (result_index + 1 < result_count) {
-                        next_result_flags = VTABLE_get_integer_keyed_int(interp,
-                                raw_sig, result_index + 1);
+                        next_result_flags = return_array[result_index + 1];
                         if (next_result_flags & PARROT_ARG_OPT_FLAG) {
                             result_index++;
                             VTABLE_set_integer_keyed_int(interp, result_list, result_index, 1);


More information about the parrot-commits mailing list