[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: [MD:7362] Re: 整数のビット数



藤井です。

From: Hideyuki SHIRAI (白井秀行) <shirai@xxxxxxxxxxx>
Subject: Re: [MD:7362] Re: 整数のビット数
Date: Fri, 14 Jul 2006 19:30:34 +0900 (JST)
Message-ID: <20060714.193034.01368267.shirai.hideyuki@xxxxxxxxxxxxxxxxxxx>
> > > ということは、cygwin で実績があるから portable dumper とかは大丈
> > > 夫ということですな。じゃ、今のうちに
> > 
> > Cygwin 版と MSVC 版では Lisp_Object の内部構造が全く異なるので、Cygwin
> > 版での動作実績は全く参考にならないと考えてください。
> 
> はい、わかりました。(というか知りませんでした ^^;)
> 
> > また、Cygwin 版で整数のビット幅を 29bit にするためには portable dumper
> > 周りもかなり手を入れています。(整数のビット幅を 29bit にするためにやっ
> > た訳ではありませんが...)
> > 
> > 済みませんが、以下の変更は MSVC の時だけ有効になるようにしていただけな
> > いでしょうか?お願いします。
> 
> #ifndef VALBITS
> #if defined (MEADOW) || defined (_MSC_VER)
> #define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS)
> #else
> #define VALBITS (BITS_PER_EMACS_INT - (GCTYPEBITS + 1))
> #endif
> #endif /* no VALBITS */
> 
> #ifndef ARRAY_MARK_FLAG
> #if defined (MEADOW) || defined (_MSC_VER)
> #define ARRAY_MARK_FLAG ((EMACS_INT) ((EMACS_UINT) 1 << (VALBITS + GCTYPEBITS - 1)))
> #else
> #define ARRAY_MARK_FLAG ((EMACS_INT) ((EMACS_UINT) 1 << (VALBITS + GCTYPEBITS - 2)))
> #endif
> #endif /* no ARRAY_MARK_FLAG */
> 
> な風にしておきます。
> 
> ;; VC++ の判定方法が正しくなかったら指摘してね。

この変更が Cygwin 版で影響がでそうかどうかソースを見てみました。
ソースを見たところ以下のことが言えそうです。

  - この変更を Cygwin でも適用して良い。
  - むしろ適用しないと本当の意味で 29bit 整数に対応しているとは言えない。

# すみません、意見がコロっと変わってしまって。

29bit 整数に対応しているとは言えない根拠は以下の実験結果から分かります。
Cygwin 版ではメモリ上には 29bit 整数を格納する領域を持っているが、上限
は 28bit で設定されているという中途半端な状態になっている模様です。
(most-(positive|negative)-fixnum の値は VALBITS から算出されます)

実験結果(Meadow rev 4014 Cygwin 版)
------------------------------------
most-positive-fixnum
=> 134217727
most-negative-fixnum
=> -134217728
#xfffffff
=> 268435455
#x10000000
=> -268435456
------------------------------------

もうすこし様子を見て rev 4017 の ifdef をはずしたものをコミットします。
お手数おかけしてすみませんでした。> 白井さん

--
藤井 正行 / Masayuki FUJII