整数定数 20bits の謎
CONSTI-PUSH の検討中。以下の記述が CONSTI の説明にある。
整数定数に使えるのは 2^20 (-524287〜524287) の範囲である。
SCM_VM_INSN_ARG マクロは以下の定義。
#define SCM_VM_INSN_ARG(obj) ((signed long)SCM_WORD(obj) >> 8)
残りは 24bits だなぁ、と言いつつ色々調べてたのですが解はそのページのコメント欄にあった模様。compile.scm とある。コメントでは_整数値が INSN_ARG に収まるかどうかを判定する関数 integer-fits-insn-arg? で_云々との事。
探してみると定義が以下。
(define (integer-fits-insn-arg? obj) (and (integer? obj) (exact? obj) (<= #x-7ffff obj #x7ffff)))
これ、どうやって探したのでしょうか。凄いなぁ。で、gosh で値を確認してみるに
gosh> #x-7ffff -524287 gosh> #x7ffff 524287 gosh>
との事。ちょっと微妙なカンジ。負の値ってビット的には逆なので一つ損してるような気がするのは気のせいなのかなぁ。