マクロアセンブラっぽくなってきた

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)))