えぐち@エスアンドイー です。

>>> In message [ruby-dev:8444] Re: BIGDN
    On Tue, 30 Nov 1999 00:28:00 +0900, Toyofuku <toyofuku / juice.or.jp> said:

豊福>   豊福です。
豊福> 
豊福> [ruby-dev8:8441] まつもとさん
豊福> > |  bignum.c の
豊福> > |    #define BIGDN(x) (((x)<0) ? ~((~(x))>>BITSPERDIG) : (x)>>BITSPERDIG)
豊福> > |は
豊福> > |    ((x)>>BITSPERDIG)
豊福> > |と結果が違うときあるんでしたっけ。
豊福> > 
豊福> > おぼろげな記憶によれば >> 演算子の挙動は符号の扱いについて処
豊福> > 理系依存の部分があるのに対応するためだと思いました。

[ruby-dev:3097] bignum of ruby11b9_28
からのスレッドですね、 HPUX-10.x が該当するらしいです。

豊福> [ruby-dev:546] えぐちさん
豊福> | Date: Fri, 26 Sep 97 17:40:40 +0900
豊福> | bigsub()
豊福> | 	+ ループの底の if を同義の演算に変形
豊福> | 	  パイプラインのストールを防ぐため
豊福> 
豊福> というのを読んで(今頃古いメールをじっくり読ん
豊福> でる私 (^_^;)config 時に BIGDN(x) を設定すれば
豊福> 少しでも Bignum が速くなるかなと思った次第でした。

この文脈で、自分の名前が出て来るとドッキッとしますね。^^;;
#チューニングしてバグいれたか!  と思うらしい>わたし

さて、BIGDN() がブランチを生成する可能性が気になるのであれば、
configure で処理系による差を RSHIFT() というマクロで吸収しているので、 
BIGDN(x) の定義も RSHIFT(x,BITSPERDIG) が良いと思います。

パッチをつけますが
もし取り込む場合は、 HPUX-10.x でのテストお願いします。

	えぐち

Index: bignum.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/bignum.c,v retrieving revision 1.2 diff -d -u -r1.2 bignum.c --- bignum.c 1999/08/13 05:45:02 1.2 +++ bignum.c 1999/11/30 02:45:59 @@ -20,7 +20,7 @@ #define BIGRAD (1L << BITSPERDIG) #define DIGSPERINT ((unsigned int)(sizeof(long)/sizeof(short))) #define BIGUP(x) ((unsigned long)(x) << BITSPERDIG) -#define BIGDN(x) (((x)<0) ? ~((~(x))>>BITSPERDIG) : (x)>>BITSPERDIG) +#define BIGDN(x) RSHIFT(x,BITSPERDIG) #define BIGLO(x) ((USHORT)((x) & (BIGRAD-1))) static VALUE