[Top][All Lists]

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

Re: The progress of hacking guile and prolog

From: Stefan Israelsson Tampe
Subject: Re: The progress of hacking guile and prolog
Date: Fri, 5 Nov 2010 22:19:54 +0100
User-agent: KMail/1.13.5 (Linux/; KDE/4.4.4; x86_64; ; )

Ok, for the c generator, here are some code attached. I would 
just study this there is bit's still missing and you need to wait for me to
dig up the details. My point is to suggest  ideas for what can be done. 
I don't assume that this is it. But it's a nice playing ground.

So it is a hack, here is what I do.

(use modules (language glil compile-assembly))
(set! *compile-to-c* #t)
(define (f N) 
        (set! <c-dummy> '<c-code-tag>)   ;; This tagg!! initiate the compiler 
                                         ;; and c-fkn will use the
                                         ;; <c-code-tag> slot :-)
        (let loop ((I N) (X 0)) 
        (if (eq? I 0) 
        X  (loop 
        (- I 1) (+ X 1)))))
(generate-c-fkns "fkn")

Then in a sub-directory called cboost from the starting directory you find
fkn.c and a makefile. e.g.

========= : fkn.c
        gcc -shared -O2 -o -fPIC fkn.c

#include "cfkn.h"
#define LOCAL_REF(i)     fp[i]
#define LOCAL_SET(i,v)   fp[i] = (v)
void cfkn3676(SCM *fp, SCM **spp)
 /* setup of environment */
 SCM *objects, *free, program, *sp, sss[100];
 sp = sss;
 program = fp[-1];
 objects = SCM_I_VECTOR_WELTS (SCM_PROGRAM_OBJTABLE (program));    
 free    = SCM_PROGRAM_FREE_VARIABLES(program);
 /* compiled section */

goto L3668;
sp++; *sp = LOCAL_REF(1);
sp++; *sp = SCM_I_MAKINUM(0);
sp-=2; if(!scm_is_eq(sp[1],sp[2])) goto L3669;
sp++; *sp = LOCAL_REF(2);
sp++; *sp = LOCAL_REF(1);
sp++; *sp = LOCAL_REF(2);
LOCAL_SET(2,*sp)              ; sp--;
LOCAL_SET(1,*sp)              ; sp--;
goto LCASE3665;
sp++; *sp = LOCAL_REF(0);
sp++; *sp = SCM_I_MAKINUM(0);
LOCAL_SET(2,*sp)              ; sp--;
LOCAL_SET(1,*sp)              ; sp--;
goto LCASE3665;


void init_fkn.c()
   SCM cfkn3676_sym;

   cfkn3676_sym = scm_from_locale_symbol("cfkn3676");

   printf("loading fkn %s as adres %x.\n","cfkn3676",&cfkn3676);

   scm_define(cfkn3676_sym,SCM_PACK(((scm_t_bits) &cfkn3676) | 2));

So compileing and loading the shared library into guile you should be able 
to issue (f 1000000) and get a correct and fast result. 

I'm did not find my cfkn.h file but I'll send you the stuff I have. I modify
glil->assembly and add offload some bit's into an extra file into the same
directory also a vm-instruction is added to be able to start the c-code.

Have fun

Attachment: compile2c.tar.gz
Description: application/compressed-tar

reply via email to

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