Yuichi Yoshida
oxy****@kmc*****
2005年 9月 4日 (日) 13:53:32 JST
吉田です。 SigSchemeの開発お疲れさまです。 >> 太田です。 >> >> そろそろScmObjInternalを8byteに圧縮してしまおうかと思います。 >> ただ、少し悩んでいる所が有るので投げてみます。 >> >> まず方針として基本的に、下位3bitをオブジェクト情報に割り当てます。 >> 32bitマシンの場合はこんな感じですかね。(以下話は32bitマシン上の話としています) >> >> ScmObjInternal *obj; >> ScmObjInternal*: [ -- 29 bit -- ] [ABC] (car部) >> ScmObjInternal*: [ -- 29 bit -- ] [XYZ] (cdr部) >> >> 王道ですが、最下位ビット(C と Z)が立っている時は即値と見なします。 >> [-- 29bit --][001]や[-- 29bit --][101]等の値は全て即値と見なされます。 >> 逆に、即値でない場合は次のようになります。 >> >> 後残っているのはA,B,X,Yの部分です。ここにgcのデータ(marked or unmarked) >> とScmObjの型情報(Cons? String? Port?)が入ります。まずAにgc用のデータを >> 割り当てたとして、残りB,X,Yの部分に型情報を詰め込む必要が有ります。 >> >> しかし現在 ScmObjType は15種類有って、少なくとも4bit必要です。どう考えて >> も足りませんね...これを解決する為に僕が思い付いたのは、次の2つの方法です。 ソースを追いかけているわけではないので、検討外れのことを聞くかもしれませんが、 この場合の即値というのは29bitの部分がそれぞれ別の即値という意味なのか (つまりScmObjInternalは二つまでの即値を格納することができる)、 ScmObjInternal全体で一つの即値という意味なのかどちらでしょう。 もし、ScmObjInternal全体で一つの即値なら C=gcのmark、Z=即値フラグ、ABXY=型とすれば4bit確保できるなぁと思ったのですが。 もし二つ即値を格納できるようにしたとしても、 数値のリストではなくて、ただの数値単体の場合はやっぱり8byte必要なので、 それほどメリットは大きくないかなぁと思います。 # もちろんプロファイルしないと断定はできませんが ---- 吉田 悠一 oxy****@kmc***** http://mono.kmc.gr.jp/~oxy/