From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Israelsson Tampe Newsgroups: gmane.lisp.guile.devel Subject: Re: The progress of hacking guile and prolog Date: Fri, 5 Nov 2010 22:19:54 +0100 Message-ID: <201011052219.54556.stefan.itampe@gmail.com> References: <201010212223.23822.stefan.itampe@gmail.com> <87bp66q8g5.fsf@gnu.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_6TH1MdCKiNlhHhQ" X-Trace: dough.gmane.org 1288993617 22929 80.91.229.12 (5 Nov 2010 21:46:57 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Fri, 5 Nov 2010 21:46:57 +0000 (UTC) To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Fri Nov 05 22:46:53 2010 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PEU7U-0005oT-HX for guile-devel@m.gmane.org; Fri, 05 Nov 2010 22:46:52 +0100 Original-Received: from localhost ([127.0.0.1]:39037 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PEU7S-0007nO-Ks for guile-devel@m.gmane.org; Fri, 05 Nov 2010 17:46:46 -0400 Original-Received: from [140.186.70.92] (port=49472 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PEU7K-0007mw-91 for guile-devel@gnu.org; Fri, 05 Nov 2010 17:46:39 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PETiV-0003sr-A8 for guile-devel@gnu.org; Fri, 05 Nov 2010 17:21:00 -0400 Original-Received: from mail-fx0-f41.google.com ([209.85.161.41]:57670) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PETiU-0003sd-Rn for guile-devel@gnu.org; Fri, 05 Nov 2010 17:20:59 -0400 Original-Received: by fxm2 with SMTP id 2so2824857fxm.0 for ; Fri, 05 Nov 2010 14:20:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:subject:date :user-agent:references:in-reply-to:mime-version:content-type :message-id; bh=S48EskUA1lvigBtmk5y4xRQz78vALcovf5jIP0jHD7c=; b=srpy1UVmbZBWAcsGU6VmaT4dOozzU++Ls6yLFNKjFq8KAZB4w+rJGG7yB61PlSgr8I 9HI+UB9yfbvNLD5QdZwd2XDjPp0qTu1Z+SJ8BTxShzWIBRy4uzjIzcgyHk4igviFLTYx IKS6nmJlCQTum1E6mnjecoxDu7kuu4Va82CfA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:references:in-reply-to:mime-version :content-type:message-id; b=p2g7sE7PzKDs/mcd5rNyyTHo58dl2Mh9AvozKBbtU8KJeA/3XZVJt5shnJtwZrXHHJ 9mP6wWFu2zIpWpow0F+HIh9reQ4/Un8wLlN/IVV+AYRZe+sGuZSGHf93sdn772ivGCxi 0FlxFFlct1uI+FehegTLgADGb8T7Lmfzo2yKo= Original-Received: by 10.223.97.78 with SMTP id k14mr1418379fan.36.1288992057549; Fri, 05 Nov 2010 14:20:57 -0700 (PDT) Original-Received: from linux-s4gz.localnet (1-1-1-39a.veo.vs.bostream.se [82.182.254.46]) by mx.google.com with ESMTPS id 14sm869665fas.44.2010.11.05.14.20.54 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 05 Nov 2010 14:20:55 -0700 (PDT) User-Agent: KMail/1.13.5 (Linux/2.6.34.7-0.3-desktop; KDE/4.4.4; x86_64; ; ) In-Reply-To: <87bp66q8g5.fsf@gnu.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:11122 Archived-At: --Boundary-00=_6TH1MdCKiNlhHhQ Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: 7bit 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! ') ;; This tagg!! initiate the compiler ;; and c-fkn will use the ;; 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. Makefile: ========= libguile-fkn.so : fkn.c gcc -shared -O2 -o libguile-fkn.so -fPIC fkn.c 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 */ LCASE3666: goto L3668; LCASE3665: 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); RETURN; L3669: sp++; *sp = LOCAL_REF(1); SUB1; sp++; *sp = LOCAL_REF(2); ADD1; LOCAL_SET(2,*sp) ; sp--; LOCAL_SET(1,*sp) ; sp--; goto LCASE3665; L3668: 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 Stefan --Boundary-00=_6TH1MdCKiNlhHhQ Content-Type: application/x-compressed-tar; name="compile2c.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="compile2c.tar.gz" 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 ZBMnlgDIAAA= --Boundary-00=_6TH1MdCKiNlhHhQ--