gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gcl-devel] GCL and source inlining


From: Camm Maguire
Subject: [Gcl-devel] GCL and source inlining
Date: Fri, 15 Jun 2007 21:10:09 -0400
User-agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.3 (Unebigory ōmae) APEL/10.3 Emacs/21.2 (i386-debian-linux-gnu) MULE/5.0 (SAKAKI)

Greetings!  Thanks to the suggestion of R. Boyer, GCL now stores a
string containing the compressed source for each compiled function it
loads in memory.  This now allows inlining to work:
=============================================================================
>(defun foo (x) x)

FOO

>(defun bar (x) (declare (inline foo)) (foo x))

BAR

>(defun baz (x)  (foo x))

BAZ

>(compile 'foo)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.
;; Loading /tmp/gazonk_22733_1.o
 ;; start address -T 0xa08798 ;; Finished loading /tmp/gazonk_22733_1.o
#<compiled-function FOO>
NIL
NIL

>(disassemble 'baz)
*** output flushed ***
>(disassemble 'baz nil)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.

#include "gazonk_22733_1.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function BAZ    */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        {object V3 = (/* FOO */(*LnkLI0)((V2)));VMR1
        (V3);}
        return Cnil;
}
static object  LnkTLI0(object first,...){object V1;va_list 
ap;va_start(ap,first);V1=(object )call_proc_new(((object)VV[0]),0,0,(void 
**)(void *)&LnkLI0,1,first,ap);va_end(ap);return V1;} /* FOO */
#(#(FOO
    (%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'BAZ 0 1 0)
           (ADD-HASH 'BAZ '((T) T) '((FOO (T) T))
USER
LISPLAMBDA!,DECLAR,OPTIMIZ,SAFETY        ,BLOCKBAFOO-
               '/tmp/gazonk_22733_1.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[2]={
#define Cdata VV[1]
(void *)(LI1)
};
#define VV (VVi)
static object  LnkTLI0(object,...);
static object  (*LnkLI0)() = (object (*)()) LnkTLI0;
NIL

>(disassemble 'bar nil)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.

#include "gazonk_22733_1.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function BAR    */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(FOO X)*/
        {object V3;
        V3= (V2);
        {object V4 = (V3);VMR1
        (V4);}}
        /* END (FOO X)*/
        return Cnil;
}
#(#((%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'BAR 0 1 0)
           (ADD-HASH 'BAR '((T) T) '((FOO (T) T))
LISPLAMBDA!!,DECLAR,OPTIMIZ,SAFETY,INLINE!FOO  ,BLOCKBA/-
               '/tmp/gazonk_22733_1.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[1]={
#define Cdata VV[0]
(void *)(LI1)
};
#define VV (VVi)
NIL

>(declaim (inline foo))

NIL

>(disassemble 'baz nil)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.

#include "gazonk_22733_1.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function BAZ    */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(FOO X)*/
        {object V3;
        V3= (V2);
        {object V4 = (V3);VMR1
        (V4);}}
        /* END (FOO X)*/
        return Cnil;
}
#(#((%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'BAZ 0 1 0)
           (ADD-HASH 'BAZ '((T) T) '((FOO (T) T))
USER
LISPLAMBDA!,DECLAR,OPTIMIZ,SAFETY        ,BLOCKBAFOO-
               '/tmp/gazonk_22733_1.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[1]={
#define Cdata VV[0]
(void *)(LI1)
};
#define VV (VVi)
NIL

>
============================================================================= 

This also facilitates a significant simplification in the compiler.
Instead of writing several C inlines, a type propagator, and
compiler-macro, etc. for each function, all of these can be reduced to
primitives via trial source inlining, whether such inlining is
actually used or not.  Needless to say, the compiler does not yet have
a well-defined tiny set of opaque primitives and maybe never will
have, but many performance critical compiler macros have been
replaced.  External symbols in lisp or explicitly declared declaimed
symbols are potentially inlineable.  Inlining is skipped if *speed* is
0, inlined source is computed (for type propagation purposes) but not
used if 3 minus the *space* setting exceeds some measure of the inline
size.  Type checking in the source is elided if the ambient safety is
0.  C comments delineate the action:

=============================================================================
COMPILER>(disassemble '(lambda (x) (declare (optimize (safety 1)))(endp x)) nil)

;; Compiling /tmp/gazonk_22733_3.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_3.o.

#include "gazonk_22733_3.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(ENDP X)*/
        {register object V3;
        V3= (V2);
        if(!(listp((V3)))){
        goto T5;}
        goto T3;
        goto T5;
T5:;
        V3= (VFUN_NARGS=4,(/* CHECK-TYPE-SYMBOL 
*/(*LnkLI2)(((object)VV[0]),(V3),((object)VV[1]),Cnil)));
        goto T3;
T3:;
        {object V4;
        V4= (V3);
        {object V5 = (((V4))==Cnil?Ct:Cnil);VMR1
        (V5);}}}
        /* END (ENDP X)*/
        return Cnil;
}
static object  LnkTLI2(object first,...){object V1;va_list 
ap;va_start(ap,first);V1=(object )call_vproc_new(((object)VV[2]),0,0,(void 
**)(void *)&LnkLI2,first,ap);va_end(ap);return V1;} /* CHECK-TYPE-SYMBOL */
#(#(X LIST CHECK-TYPE-SYMBOL
    (%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'CMP-ANON 0 1 0)
           (ADD-HASH 'CMP-ANON '((T) BOOLEAN) '((ENDP (LIST) BOOLEAN))COMPILER
LISPLAMBDA!,DECLAR,OPTIMIZ,SAFETY        ,BLOCKCMP-ANO,ENDP-
               '/tmp/gazonk_22733_3.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[4]={
#define Cdata VV[3]
(void *)(LI1)
};
#define VV (VVi)
static object  LnkTLI2(object,...);
static object  (*LnkLI2)() = (object (*)()) LnkTLI2;
NIL

COMPILER>(disassemble '(lambda (x) (endp x)) nil)

;; Compiling /tmp/gazonk_22733_3.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_3.o.

#include "gazonk_22733_3.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(ENDP X)*/
        {register object V3;
        V3= (V2);
        {object V4 = (((V3))==Cnil?Ct:Cnil);VMR1
        (V4);}}
        /* END (ENDP X)*/
        return Cnil;
}
#(#((%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'CMP-ANON 0 1 0)
           (ADD-HASH 'CMP-ANON '((T) BOOLEAN) '((ENDP (LIST) BOOLEAN))COMPILER
LISPLAMBDA!,DECLAR,OPTIMIZ,SAFETY        ,BLOCKCMP-ANO,ENDP-
               '/tmp/gazonk_22733_3.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[1]={
#define Cdata VV[0]
(void *)(LI1)
};
#define VV (VVi)
NIL

COMPILER>(disassemble '(lambda (x) (endp nil)) nil)

;; Compiling /tmp/gazonk_22733_3.lsp.
; (DEFUN CMP-ANON ...) is being compiled.
;; Warning: The variable X is not used.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_3.o.

#include "gazonk_22733_3.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(ENDP NIL)*/
        {object V3 = Ct;VMR1
        (V3);}
        /* END (ENDP NIL)*/
        return Cnil;
}
#(#((%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'CMP-ANON 0 1 0)
           (ADD-HASH 'CMP-ANON '((T) BOOLEAN) '((ENDP (LIST) BOOLEAN))COMPILER
LISPLAMBDA,DECLAR,OPTIMIZ,SAFETY ,BLOCKCMP-ANO,ENDP
               '/tmp/gazonk_22733_3.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[1]={
#define Cdata VV[0]
(void *)(LI1)
};
#define VV (VVi)
NIL

>(disassemble '(lambda (x y) (member x y)) nil)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.

#include "gazonk_22733_1.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V3,V4)

object V3;object V4;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(MEMBER X Y)*/
        {register object V5;
        object V6;
        V5= (V3);
        V6= (V4);
        {register fixnum V7;
        if(!(eql_is_eq((V5)))){
        goto T4;}
        V7= (fixnum)0;
        goto T2;
        goto T4;
T4:;
        V7= (fixnum)2;
        goto T2;
T2:;
        {register object V8;
        V8= (V6);
        goto T7;
T7:;
        /*(ENDP LIST)*/
        {register object V9;
        V9= (V8);
        if(((V9))==Cnil){
        goto T10;}}
        /* END (ENDP LIST)*/
        {register fixnum V10;
        register object V11;
        register object V12;
        V10= V7;
        V11= (V5);
        {register object V13;
        V13= CMPcar((V8));
        V12= (V13);}switch(V10){
        case 0:
        goto T20;
T20:;
        if(!(((V11))==((V12)))){
        goto T13;}
        goto T15;
        case 2:
        goto T21;
T21:;
        if(!(eql((V11),(V12)))){
        goto T13;}
        goto T15;
        goto T13;}
        goto T13;}
        goto T15;
T15:;
        {object V14 = (V8);VMR1
        (V14);}
        goto T13;
T13:;
        {register object V15;
        V15= CMPcdr((V8));
        V8= (V15);}
        goto T7;
        goto T10;
T10:;
        {object V16 = Cnil;VMR1
        (V16);}
        {object V17 = Cnil;VMR1
        (V17);}}}}
        /* END (MEMBER X Y)*/
        return Cnil;
}

>(disassemble '(lambda (x y)(declare (optimize (safety 1))) (member x y)) nil)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.

#include "gazonk_22733_1.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V3,V4)

object V3;object V4;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(MEMBER X Y)*/
        {register object V5;
        register object V6;
        V5= (V3);
        V6= (V4);
        if(((/* PROPER-LISTP */(*LnkLI2)((V6))))==Cnil){
        goto T5;}
        goto T3;
        goto T5;
T5:;
        V6= (VFUN_NARGS=4,(/* CHECK-TYPE-SYMBOL 
*/(*LnkLI3)(((object)VV[0]),(V6),((object)VV[1]),Cnil)));
        goto T3;
T3:;
        {object V7;
        V7= (V6);
        {register fixnum V8;
        if(!(eql_is_eq((V5)))){
        goto T10;}
        V8= (fixnum)0;
        goto T8;
        goto T10;
T10:;
        V8= (fixnum)2;
        goto T8;
T8:;
        {register object V9;
        V9= (V7);
        goto T13;
T13:;
        /*(ENDP LIST)*/
        {register object V10;
        V10= (V9);
        if(((V10))==Cnil){
        goto T16;}}
        /* END (ENDP LIST)*/
        {register fixnum V11;
        register object V12;
        register object V13;
        V11= V8;
        V12= (V5);
        {register object V14;
        V14= CMPcar((V9));
        V13= (V14);}switch(V11){
        case 0:
        goto T26;
T26:;
        if(!(((V12))==((V13)))){
        goto T19;}
        goto T21;
        case 2:
        goto T27;
T27:;
        if(!(eql((V12),(V13)))){
        goto T19;}
        goto T21;
        goto T19;}
        goto T19;}
        goto T21;
T21:;
        {object V15 = (V9);VMR1
        (V15);}
        goto T19;
T19:;
        {register object V16;
        V16= CMPcdr((V9));
        V9= (V16);}
        goto T13;
        goto T16;
T16:;
        {object V17 = Cnil;VMR1
        (V17);}
        {object V18 = Cnil;VMR1
        (V18);}}}}}
        /* END (MEMBER X Y)*/
        return Cnil;
}
static object  LnkTLI3(object first,...){object V1;va_list 
ap;va_start(ap,first);V1=(object )call_vproc_new(((object)VV[3]),0,0,(void 
**)(void *)&LnkLI3,first,ap);va_end(ap);return V1;} /* CHECK-TYPE-SYMBOL */
static object  LnkTLI2(object first,...){object V1;va_list 
ap;va_start(ap,first);V1=(object )call_proc_new(((object)VV[2]),0,0,(void 
**)(void *)&LnkLI2,1,first,ap);va_end(ap);return V1;} /* PROPER-LISTP */
#(#(LIST PROPER-LIST PROPER-LISTP CHECK-TYPE-SYMBOL
    (%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'CMP-ANON 0 2 0)
           (ADD-HASH 'CMP-ANON '((T T) PROPER-LIST)
               '((MEMBER (T PROPER-LIST *) PROPER-LIST))
USERCOMPILERCMP-ANON   ,MEMBER-.
               '/tmp/gazonk_22733_1.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[5]={
#define Cdata VV[4]
(void *)(LI1)
};
#define VV (VVi)
static object  LnkTLI3(object,...);
static object  (*LnkLI3)() = (object (*)()) LnkTLI3;
static object  LnkTLI2(object,...);
static object  (*LnkLI2)() = (object (*)()) LnkTLI2;
NIL

>(disassemble '(lambda (x y)(declare (optimize (safety 1))) (member x y :test 
>'eq)) nil)

;; Compiling /tmp/gazonk_22733_1.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_1.o.

#include "gazonk_22733_1.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V3,V4)

object V3;object V4;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(MEMBER X Y TEST 'EQ)*/
        {register object V5;
        register object V6;
        V5= (V3);
        V6= (V4);
        if(((/* PROPER-LISTP */(*LnkLI6)((V6))))==Cnil){
        goto T5;}
        goto T3;
        goto T5;
T5:;
        V6= (VFUN_NARGS=4,(/* CHECK-TYPE-SYMBOL 
*/(*LnkLI7)(((object)VV[4]),(V6),((object)VV[5]),Cnil)));
        goto T3;
T3:;
        {object V7;
        V7= (V6);
        {register object V8;
        V8= (V7);
        goto T9;
T9:;
        /*(ENDP LIST)*/
        {register object V9;
        V9= (V8);
        if(((V9))==Cnil){
        goto T12;}}
        /* END (ENDP LIST)*/
        {register object V10;
        register object V11;
        V10= (V5);
        {register object V12;
        V12= CMPcar((V8));
        V11= (V12);}
        if(!(((V10))==((V11)))){
        goto T15;}}
        {object V13 = (V8);VMR1
        (V13);}
        goto T15;
T15:;
        {register object V14;
        V14= CMPcdr((V8));
        V8= (V14);}
        goto T9;
        goto T12;
T12:;
        {object V15 = Cnil;VMR1
        (V15);}
        {object V16 = Cnil;VMR1
        (V16);}}}}
        /* END (MEMBER X Y TEST 'EQ)*/
        return Cnil;
}
static object  LnkTLI7(object first,...){object V1;va_list 
ap;va_start(ap,first);V1=(object )call_vproc_new(((object)VV[7]),0,0,(void 
**)(void *)&LnkLI7,first,ap);va_end(ap);return V1;} /* CHECK-TYPE-SYMBOL */
static object  LnkTLI6(object first,...){object V1;va_list 
ap;va_start(ap,first);V1=(object )call_proc_new(((object)VV[6]),0,0,(void 
**)(void *)&LnkLI6,1,first,ap);va_end(ap);return V1;} /* PROPER-LISTP */
#(#(TEST EQ KEY TEST-NOT LIST PROPER-LIST PROPER-LISTP
    CHECK-TYPE-SYMBOL
    (%INIT
     . #((LET ((*DISABLE-RECOMPILE* T))
           (MFSFUN 'CMP-ANON 0 2 0)
           (ADD-HASH 'CMP-ANON '((T T) PROPER-LIST)
               '((MEMBER (T PROPER-LIST *) PROPER-LIST))
USER
KEYWORDTES,QUOTE,EQ
               '/tmp/gazonk_22733_1.lsp))
         (DO-RECOMPILE)))))
static object LI1();
#define VMB1
#define VMS1
#define VMV1
#define VMR1(VMT1) return(VMT1);
#define VM1 0
static void * VVi[9]={
#define Cdata VV[8]
(void *)(LI1)
};
#define VV (VVi)
static object  LnkTLI7(object,...);
static object  (*LnkLI7)() = (object (*)()) LnkTLI7;
static object  LnkTLI6(object,...);
static object  (*LnkLI6)() = (object (*)()) LnkTLI6;
NIL

>
=============================================================================

Many of the functions are written with &rest and apply, unlike the
compiler macros which could make use of explicit argument counting.
The &rest args are mostly done with :dynamic-extent with apply binding
directly to the rest arg where appropriate.  But GCL can also count
some list lengths and change the apply to a funcall:

=============================================================================
COMPILER>(untrace)(disassemble '(lambda (x) (mapc '+ x x)) nil)

NIL

COMPILER>
;; Compiling /tmp/gazonk_22733_3.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_3.o.

#include "gazonk_22733_3.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V2)

object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(MAPC '+ X X)*/
        {register object V3;
        object V4;
        register object V5;
        V3= (V2);
        V4= (V2);
        V5= 
        !1? Cnil : (alloca_val=alloca((1)*sizeof(struct cons)+sizeof(object)),
        ({object _b=(void *)alloca_val;if (((unsigned long)_b)&sizeof(_b)) _b++;
        {register struct cons *_p=(void *)_b;
        _p->c_car=(V4);_p->c_cdr=(object)(_p+1);_p++;
        _p[-1].c_cdr=Cnil;}_b;}));
        {register object V6;
        register object V7;
        /*(LIST-LENGTH L)*/
        {register object V9;
        V9= (V5);
        /*(ENDP (SETQ L (CDR L)))*/
        {object V10;
        V9= CMPcdr(Cnil);
        V10= (V9);}
        /* END (ENDP (SETQ L (CDR L)))*/
        V8= (fixnum)1;}
        /* END (LIST-LENGTH L)*/
        V7= 
        !V8? Cnil : (alloca_val=alloca((V8)*sizeof(struct cons)+sizeof(object)),
        ({object _b=(void *)alloca_val;if (((unsigned long)_b)&sizeof(_b)) _b++;
        {register struct cons *_p=(void *)_b;
        {struct cons *_e=_p+(V8-1);
        for (;_p<_e;_p++) {_p->c_car=Cnil;_p->c_cdr=(object)(_p+1);}} 
_p->c_car=_p->c_cdr=Cnil;}_b;}));
        V6= (V3);
        goto T8;
T8:;
        /*(ENDP L1)*/
        {register object V11;
        V11= (V3);
        if(((V11))==Cnil){
        goto T11;}}
        /* END (ENDP L1)*/
        /*(MEMBER-IF 'ENDP L)*/
        {register object V12;
        V12= (V5);
        /*(MEMBER ITEM LIST TEST 'FUNCALL KEY KEY)*/
        {register object V13;
        V13= (V12);
        {register object V14;
        V14= (V13);
        goto T20;
T20:;
        /*(ENDP LIST)*/
        {register object V11;
        V11= (V14);
        if(((V11))==Cnil){
        goto T23;}}
        /* END (ENDP LIST)*/
        {register object V15;
        {register object V16;
        V16= CMPcar((V14));
        V15= (V16);}
        /*(ENDP G2127)*/
        {register object V17;
        V17= (V15);
        if(!(((V17))==Cnil)){
        goto T26;}}
        /* END (ENDP G2127)*/}
        if(((V14))==Cnil){
        goto T16;}
        goto T17;
        goto T26;
T26:;
        {register object V18;
        V18= CMPcdr((V14));
        V14= (V18);}
        goto T20;
        goto T23;
T23:;
        goto T16;
        goto T16;}}
        /* END (MEMBER ITEM LIST TEST 'FUNCALL KEY KEY)*/}
        /* END (MEMBER-IF 'ENDP L)*/
        goto T17;
T17:;
        goto T11;
        goto T16;
T16:;
        {register object V19;
        register object V20;
        V19= (V7);
        V20= (V5);
        goto T38;
T38:;
        /*(ENDP L)*/
        {register object V11;
        V11= (V20);
        if(((V11))==Cnil){
        goto T41;}}
        /* END (ENDP L)*/
        {register object V21;
        register object V22;
        V21= (V19);
        {register object V23;
        register object V24;
        V23= (V20);
        V24= CMPcdr(CMPcar((V23)));
        {register object V25;
        V25= CMPcar(CMPcar((V23)));
        (void)((((V23))->c.c_car=((V24)),((V23))));
        V22= (V25);}}
        (void)((((V21))->c.c_car=((V22)),((V21))));}
        {register object V26;
        register object V27;
        V26= CMPcdr((V19));
        V27= CMPcdr((V20));
        V19= (V26);
        V20= (V27);}
        goto T38;
        goto T41;
T41:;
        goto T36;
        goto T36;}
        goto T36;
T36:;
        {register object V28;
        register object V29;
        register object V30;
        {register object V31;
        V31= CMPcar((V3));
        V3= CMPcdr((V3));
        V28= (V31);}
        V29= (V7);
        V30= CMPcar((V29));
        (void)(immnum_plus((V28),(V30)));}
        goto T8;
        goto T11;
T11:;
        {object V32 = (V6);VMR1
        (V32);}
        {object V33 = Cnil;VMR1
        (V33);}}}
        /* END (MAPC '+ X X)*/
        return Cnil;
}

COMPILER>(disassemble '(lambda (x) (mapc '+ x x x x x x)) nil)

;; Compiling /tmp/gazonk_22733_3.lsp.
;; End of Pass 1.  
;; End of Pass 2.  
;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3, 
(Debug quality ignored)
;; Finished compiling /tmp/gazonk_22733_3.o.

#include "gazonk_22733_3.h"
void init_code(){do_init((void *)VV);}
/*      local entry for function CMP-ANON       */

static object LI1(V2)

register object V2;
{        VMB1 VMS1 VMV1
        goto TTL;
TTL:;
        /*(MAPC '+ X X X X X X)*/
        {register object V3;
        object V4;
        object V5;
        object V6;
        object V7;
        object V8;
        register object V9;
        V3= (V2);
        V4= (V2);
        V5= (V2);
        V6= (V2);
        V7= (V2);
        V8= (V2);
        V9= 
        !5? Cnil : (alloca_val=alloca((5)*sizeof(struct cons)+sizeof(object)),
        ({object _b=(void *)alloca_val;if (((unsigned long)_b)&sizeof(_b)) _b++;
        {register struct cons *_p=(void *)_b;
        _p->c_car=(V4);_p->c_cdr=(object)(_p+1);_p++;
        _p->c_car=(V5);_p->c_cdr=(object)(_p+1);_p++;
        _p->c_car=(V6);_p->c_cdr=(object)(_p+1);_p++;
        _p->c_car=(V7);_p->c_cdr=(object)(_p+1);_p++;
        _p->c_car=(V8);_p->c_cdr=(object)(_p+1);_p++;
        _p[-1].c_cdr=Cnil;}_b;}));
        {register object V10;
        register object V11;
        /*(LIST-LENGTH L)*/
        {register object V13;
        V13= (V9);
        /*(ENDP (SETQ L (CDR L)))*/
        {object V14;
        V13= CMPcdr((V13));
        V14= (V13);
        if(!(((V14))==Cnil)){
        goto T5;}}
        /* END (ENDP (SETQ L (CDR L)))*/
        V12= make_fixnum(1);
        goto T3;
        goto T5;
T5:;
        /*(ENDP (SETQ L (CDR L)))*/
        {object V14;
        V13= CMPcdr((V13));
        V14= (V13);
        if(!(((V14))==Cnil)){
        goto T10;}}
        /* END (ENDP (SETQ L (CDR L)))*/
        V12= make_fixnum(2);
        goto T3;
        goto T10;
T10:;
        /*(ENDP (SETQ L (CDR L)))*/
        {object V14;
        V13= CMPcdr((V13));
        V14= (V13);
        if(!(((V14))==Cnil)){
        goto T15;}}
        /* END (ENDP (SETQ L (CDR L)))*/
        V12= make_fixnum(3);
        goto T3;
        goto T15;
T15:;
        /*(ENDP (SETQ L (CDR L)))*/
        {object V14;
        V13= CMPcdr((V13));
        V14= (V13);
        if(!(((V14))==Cnil)){
        goto T20;}}
        /* END (ENDP (SETQ L (CDR L)))*/
        V12= make_fixnum(4);
        goto T3;
        goto T20;
T20:;
        {fixnum V15;
        {object V16;
        V16= (V13);
        if(((V16))!=Cnil){
        goto T26;}
        V15= (fixnum)0;
        goto T24;
        goto T26;
T26:;
        {register fixnum V17;
        register object V18;
        register object V19;
        V17= (fixnum)1;
        V19= CMPcdr((V16));
        V18= (V16);
        goto T31;
T31:;
        V20 = V17;
        if((V20)>=((fixnum)268435455)){
        goto T34;}
        if(!(((V18))==((V19)))){
        goto T39;}
        V15= V17;
        goto T24;
        goto T39;
T39:;
        /*(ENDP F)*/
        {register object V21;
        V21= (V19);
        if(!(((V21))==Cnil)){
        goto T42;}}
        /* END (ENDP F)*/
        V22 = V17;
        V23 = V17;
        V15= (fixnum)((fixnum)-((fixnum)(V22)+(V23)))+((fixnum)1);
        goto T24;
        goto T42;
T42:;
        /*(ENDP (CDR F))*/
        {register object V21;
        V21= CMPcdr((V19));
        if(!(((V21))==Cnil)){
        goto T37;}}
        /* END (ENDP (CDR F))*/
        V24 = V17;
        V25 = V17;
        V15= (fixnum)-((fixnum)(V24)+(V25));
        goto T24;
        goto T37;
T37:;
        {register fixnum V26;
        register object V27;
        register object V28;
        V29 = V17;
        V26= (fixnum)(V29)+((fixnum)1);
        V27= CMPcdr((V18));
        V28= CMPcddr((V19));
        V17= V26;
        V18= (V27);
        V19= (V28);}
        goto T31;
        goto T34;
T34:;
        V15= (fixnum)-268435455;
        goto T24;
        V15= fix(Cnil);
        goto T24;}}
        goto T24;
T24:;
        V30 = V15;
        if(!((V30)<=((fixnum)0))){
        goto T58;}
        V31 = V15;
        V12= CMPmake_fixnum(((fixnum)4)+((fixnum)-(V31)));
        goto T3;
        goto T58;
T58:;
        V12= Cnil;}}
        /* END (LIST-LENGTH L)*/
        goto T3;
T3:;
        V11= (VFUN_NARGS=1,(/* MAKE-LIST */(*LnkLI7)(V12)));
        V10= (V3);
        goto T61;
T61:;
        /*(ENDP L1)*/
        {register object V32;
        V32= (V3);
        if(((V32))==Cnil){
        goto T64;}}
        /* END (ENDP L1)*/
        /*(MEMBER-IF 'ENDP L)*/
        {register object V33;
        V33= (V9);
        /*(MEMBER ITEM LIST TEST 'FUNCALL KEY KEY)*/
        {register object V34;
        V34= (V33);
        {register object V35;
        V35= (V34);
        goto T73;
T73:;
        /*(ENDP LIST)*/
        {register object V32;
        V32= (V35);
        if(((V32))==Cnil){
        goto T76;}}
        /* END (ENDP LIST)*/
        {register object V36;
        {register object V37;
        V37= CMPcar((V35));
        V36= (V37);}
        /*(ENDP G2127)*/
        {register object V21;
        V21= (V36);
        if(!(((V21))==Cnil)){
        goto T79;}}
        /* END (ENDP G2127)*/}
        if(((V35))==Cnil){
        goto T69;}
        goto T70;
        goto T79;
T79:;
        {register object V38;
        V38= CMPcdr((V35));
        V35= (V38);}
        goto T73;
        goto T76;
T76:;
        goto T69;
        goto T69;}}
        /* END (MEMBER ITEM LIST TEST 'FUNCALL KEY KEY)*/}
        /* END (MEMBER-IF 'ENDP L)*/
        goto T70;
T70:;
        goto T64;
        goto T69;
T69:;
        {register object V39;
        register object V40;
        V39= (V11);
        V40= (V9);
        goto T91;
T91:;
        /*(ENDP L)*/
        {register object V32;
        V32= (V40);
        if(((V32))==Cnil){
        goto T94;}}
        /* END (ENDP L)*/
        {register object V41;
        register object V42;
        V41= (V39);
        {register object V43;
        register object V44;
        V43= (V40);
        V44= CMPcdr(CMPcar((V43)));
        {register object V45;
        V45= CMPcar(CMPcar((V43)));
        (void)((((V43))->c.c_car=((V44)),((V43))));
        V42= (V45);}}
        (void)((((V41))->c.c_car=((V42)),((V41))));}
        {register object V46;
        register object V47;
        V46= CMPcdr((V39));
        V47= CMPcdr((V40));
        V39= (V46);
        V40= (V47);}
        goto T91;
        goto T94;
T94:;
        goto T89;
        goto T89;}
        goto T89;
T89:;
        base[0]= ((object)VV[0]);
        {register object V49;
        V49= CMPcar((V3));
        V3= CMPcdr((V3));
        base[1]= (V49);}
        {object V48;
        V48= (V11);
         vs_top=base+2;
         while(V48!=Cnil)
         {vs_push((V48)->c.c_car);V48=(V48)->c.c_cdr;}
        vs_base=base+1;}
        super_funcall_no_event(base[0]);
        vs_top=sup;
        goto T61;
        goto T64;
T64:;
        {object V50 = (V10);VMR1
        (V50);}
        {object V51 = Cnil;VMR1
        (V51);}}}
        /* END (MAPC '+ X X X X X X)*/
        base[0]=base[0];
        return Cnil;
}

=============================================================================

The odd thing is that this inlining actually saves space, at least in
my measurements.  Still have to work out a way to elide unused
closures from the C output, etc.

There are probably many things I've forgotten to mention.  Please feel
free to ask questions if interested.

Take care,
-- 
Camm Maguire                                            address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah




reply via email to

[Prev in Thread] Current Thread [Next in Thread]