C++ の Object::isNumber 呼べた - JIT
Object クラスのメンバ関数呼べた。
うまく動くはずなのになんで動かないんだろう?とずっと悩んでいた件も解決。
isNumber の call 後に第一引数 VM*(rdi) を restore し忘れていた。正確には rdi を参照している場合は restore が必要な事は理解していたのだが、,(vm-register 'ac) が rdi を参照する事を失念してた。
マクロっぽいものを書いてしまうと、参照・破壊するレジスタに注意しないとだめだ。引数系のレジスタはアセンブル時にチェックしても良いかもしれない。
(let* ([asm (assemble `((push rbp) (movq rbp rsp) (subq rsp 8) (movq rax ,(get-c-address 'Object::isNumber)) (movq rbx rdi) ;; save rdi (leaq rdi (& rbp 16)) ;; 1st argument : this pointer (movq (& rbp 16) ,(vm-make-fixnum 3)) (callq rax) ;; 3.isNumber? (movq rdi rbx) ;; restore rdi (movq rbx 1) (cmpq rax rbx) (je a) (movq ,(vm-register 'ac) ,(vm-make-fixnum 0)) ;; refer rdi (movq rax ,(vm-make-fixnum 0)) (leave) (retq) (label a) (movq ,(vm-register 'ac) ,(vm-make-fixnum 1)) ;; refer rdi (movq rax ,(vm-make-fixnum 1)) (leave) (retq)))] [proc (u8-list->c-procedure asm)]) (test-true (procedure? proc)) (test-eq 1 (proc)))
そういえば rbx に保持するのはまずいな。r10 か。