Last active
December 21, 2015 04:19
-
-
Save NalaGinrut/6248540 to your computer and use it in GitHub Desktop.
very naive AOT half-baked compiler for unfinished Guile brand new Register VM.
It's only a toy since the RTL branch is still is very experimental.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(use-modules (ice-9 match)) | |
(define test | |
'((begin-program self1180 ()) | |
(label kentry1181) | |
(begin-kw-arity (x y) () #f () #f 3 #f) | |
(label kargs1182) | |
(add 1 1 2) | |
(label ktail1189) | |
(return 1) | |
(end-arity) | |
(end-program))) | |
(define *regs* | |
'("ax" "cx")) | |
(define (reg-get n) | |
(list-ref *regs* (1- n))) | |
(define (emit-begin-program name) | |
(format #t ".globl~8t.type ~a, @function~%" name) | |
(format #t "~a:~%" name)) | |
(define (emit-label id) | |
(format #t "~a:~%" id)) | |
(define (emit-nop) | |
(format #t "~8tnop~%")) | |
;; very naive add asm only support registers | |
(define (emit-add/0 src1 src2) | |
(format #t "~8tmov %~a,%ax~%" (reg-get src1)) | |
(format #t "~8tadd %~a,%ax~%" (reg-get src2))) | |
;; return from register | |
(define (emit-return/0 regn) | |
(format #t "~8tmov %~a,%ax~%" (reg-get regn)) | |
(format #t "~8tret~%~%")) | |
(define (fetch-and-emit e) | |
(match e | |
(('begin-program name rest) (emit-begin-program name)) | |
(('label id) (emit-label id)) | |
(('begin-kw-arity a b c d e arity f) (emit-nop)) | |
(('add target src1 src2) (emit-add/0 src1 src2)) | |
(('return val) (emit-return/0 val)) | |
(('end-arity) (emit-nop)) | |
(('end-program) (emit-nop)) | |
(else (error "invalid instruction!" e)))) | |
(define (emit-from-rtl rtl) | |
(for-each fetch-and-emit rtl)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
(emit-from-rtl test)
==>