BNUMNE 命令

もう少しメモ。
昨晩エントリにて shiro さんからフォロー頂いた。曰く

条件「不」成立時にジャンプする、ということにしておくと、if test then X else Y のコンパイル結果において、条件分岐直後に X が、その後に Y が来る、という順番が保たれるので読みやすいのです。

との事。例えば以下か。

gosh> (disasm (lambda (x y) (if (= x y) #t #f)))
main_code (name=#f, code=0x80f8ec0, size=7, const=0, stack=1):
args: #f
     0 LREF1-PUSH               ; x
     1 LREF0                    ; y
     2 BNUMNE 6                 ; (= x y)
     4 CONST-RET #t
     6 CONSTF-RET
#<undef>
gosh>

確かに。以下のケイスだとこうなる。

gosh> (disasm (lambda (x y) (if (not (= x y)) #t #f)))
main_code (name=#f, code=0x80f8c80, size=7, const=0, stack=1):
args: #f
     0 LREF1-PUSH               ; x
     1 LREF0                    ; y
     2 BNUMNE 5                 ; (= x y)
     4 CONSTF-RET
     5 CONST-RET #t
#<undef>
gosh> 

逆になってますな。ただ上記のケイスだと先に

(if (= x y) #f #t)

にしといて中間コードに変換してるのかな。多分そうだろな。もしかすると中間コードに翻訳時にこうした最適化 (?) を行なってるのかもしれませんが。
このあたりの意図を作者本人からお伺いできるのは本当に凄いコトだな。本当にいつもありがとうございます。

そういえば

コンテンツだけ投入して行程表にデータ投入しとらんな。とりあえず BNUMNE だけでなく、一連の比較演算なナニも一緒にヤる方向でナニ。