Skip to content

Instantly share code, notes, and snippets.

@NalaGinrut
Last active December 21, 2015 04:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NalaGinrut/6248540 to your computer and use it in GitHub Desktop.
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.
(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))
@NalaGinrut
Copy link
Author

(emit-from-rtl test)
==>

.globl  .type self1180, @function
self1180:
kentry1181:
        nop
kargs1182:
        mov %ax,%ax
        add %cx,%ax
ktail1189:
        mov %ax,%ax
        ret

        nop
        nop

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment