1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 03:30:27 +02:00

Playing with the procedure call mechanism.

* src/objcodes.c (do-pair):  New experiment.
* src/vm_engine.h (ALIGN_AS_NON_IMMEDIATE):  New macro.
  (POP_LIST_ON_STACK):  New experimental macro.
* src/vm_engine.c (call):  In the procedure call case, I tried using the above
  macro.

git-archimport-id: lcourtes@laas.fr--2004-libre/guile-vm--revival--0.6--patch-8
This commit is contained in:
Ludovic Court`es 2005-05-03 15:13:42 +00:00 committed by Ludovic Courtès
parent f41cb00ce2
commit 135b32ee84
3 changed files with 107 additions and 0 deletions

View file

@ -241,6 +241,76 @@ do \
PUSH (l); \
} while (0)
/* Below is a (slightly broken) experiment to avoid calling `scm_cell' and to
allocate cells on the stack. This is a significant improvement for
programs which call a lot of procedures, since the procedure call
mechanism uses POP_LIST which normally uses `scm_cons'.
What it does is that it creates a list whose cells are allocated on the
VM's stack instead of being allocated on the heap via `scm_cell'. This is
much faster. However, if the callee does something like:
(lambda (. args)
(set! the-args args))
then terrible things may happen since the list of arguments may be
overwritten later on. */
/* Awful hack that aligns PTR so that it can be considered as a non-immediate
value by Guile. */
#define ALIGN_AS_NON_IMMEDIATE(_ptr) \
{ \
if ((scm_t_bits)(_ptr) & 6) \
{ \
size_t _incr; \
\
_incr = (scm_t_bits)(_ptr) & 6; \
_incr = (~_incr) & 7; \
(_ptr) += _incr; \
} \
}
#define POP_LIST_ON_STACK(n) \
do \
{ \
int i; \
if (n == 0) \
{ \
sp -= n; \
PUSH (SCM_EOL); \
} \
else \
{ \
SCM *list_head, *list; \
\
list_head = sp + 1; \
ALIGN_AS_NON_IMMEDIATE (list_head); \
list = list_head; \
\
sp -= n; \
for (i = 1; i <= n; i++) \
{ \
/* The cell's car and cdr. */ \
*(list) = sp[i]; \
*(list + 1) = PTR2SCM (list + 2); \
list += 2; \
} \
\
/* The last pair's cdr is '(). */ \
list--; \
*list = SCM_EOL; \
/* Push the SCM object that points */ \
/* to the first cell. */ \
PUSH (PTR2SCM (list_head)); \
} \
} \
while (0)
/* end of the experiment */
#define POP_LIST_MARK() \
do { \
SCM o; \