マクロアセンブラっぽくなってきた
VM Instruction の REFER_LOCAL_PUSH_CONSTANT を定義。
macro-xxx はヘルパー的なマクロ。このマクロのおかげで細かいミスが減らせるはず。
VM Instruction の定義は quasiquote でやってるけど、これが正しいのかは、もう少し進んでみないと分からない。
ひょっとしたら手続きとして定義した方が良いのかも。
(define (REFER_LOCAL_PUSH_CONSTANT index constant) `((movq rcx ,(vm-register 'sp)) (movq rdx ,(vm-make-fixnum index)) (movq rax ,(vm-register 'fp)) ,@(macro-to-fixnum 'rdx) ,@(macro-refer-local 'rax 'rax 'rdx) ,@(macro-push 'rcx 'rax) (movq ,(vm-register 'sp) rcx) (movq rcx ,constant) (movq ,(vm-register 'ac) rcx))) (define (macro-to-fixnum reg) `((sarq ,reg 2) ; reg = reg >> 2 (movslq ,reg ,(register64->32 reg)))) ; reg = reg32 (with sign) (define (macro-refer-local dest-reg fp-reg index-reg) `((movq ,dest-reg (& ,fp-reg ,index-reg 8)))) (define (macro-push sp-reg value-reg) `((movq (& ,sp-reg) ,value-reg) (addq ,sp-reg 8)))