From: EGUCHI Osamu Date: 1999-12-20T00:26:55+09:00 Subject: [ruby-list:19696] Re: build on alpha えぐち@エスアンドイー です。 >>> In message [ruby-list:19662] Re: build on alpha On Sun, 19 Dec 1999 10:36:21 +0900, tokoma@sco.bekkoame.ne.jp (中川 誠) said: 中川> 中川です。 中川> 中川> In message "[ruby-list:19595] Re: build on alpha" 中川> on 99/12/17, EGUCHI Osamu wrote: 中川> > で、見直したら bignum.c に sizeof(short) が残っています。(パッチ) 中川> 中川> このパッチを含めて ruby current(?) で試してみました。が、結果は変らずで 中川> す。トレースを添付します。 どうやら int ee; (3箇所)が問題の様です。 long ee; が要求されます。 また、ここのコードの最適化は大部昔に私がやったのですが、 まだメモリアクセスが削減できるので、それもパッチに含めます。 #なんかブランチコストの方が大きくなるマシンもありそうだけど、 #こういう性能指標って configure で見れないかなぁ、、、 中川> > それと、そろそろ ruby-dev に引越しませんか? ^^)l 中川> 中川> 単なる動作報告なので ruby-list で十分な気がしてます。1.5 へのパッチだか 中川> らといって遠慮することはないのではないでしょうか。 『64ビットプラットホームへの移植』というのは 十分 ruby-dev 的なネタだとは思いますが、、 中川> # ruby-list は流量が多いので ruby-dev へ、とかいうのはちょっとどうかな 中川> # と...。 流量が多い ruby-list の方が、 他に alpha を使っている人の目に触れる機会も多かろう という事で、問題なければこのまま ruby-list でもう少し続けましょう。 えぐち Index: bignum.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp/ruby/bignum.c,v retrieving revision 1.4 diff -d -u -r1.4 bignum.c --- bignum.c 1999/12/06 09:03:49 1.4 +++ bignum.c 1999/12/19 13:30:46 @@ -680,9 +680,11 @@ if (dd == 0) continue; n = 0; for (j = 0; j < RBIGNUM(y)->len; j++) { - int ee = n + dd * BDIGITS(y)[j]; - n = zds[i + j] + ee; - if (ee) zds[i + j] = BIGLO(n); + long ee = n + dd * BDIGITS(y)[j]; + if (ee) { + zds[i + j] = BIGLO(n); + n = zds[i + j] + ee; + } n = BIGDN(n); } if (n) { @@ -769,11 +771,13 @@ if (q) { i = 0; num = 0; t2 = 0; do { /* multiply and subtract */ - int ee; + long ee; t2 += (long)yds[i] * q; ee = num - BIGLO(t2); - num = zds[j - ny + i] + ee; - if (ee) zds[j - ny + i] = BIGLO(num); + if (ee) { + num = zds[j - ny + i] + ee; + zds[j - ny + i] = BIGLO(num); + } num = BIGDN(num); t2 = BIGDN(t2); } while (++i < ny); @@ -781,9 +785,11 @@ while (num) { /* "add back" required */ i = 0; num = 0; q--; do { - int ee = num + yds[i]; - num = (long) zds[j - ny + i] + ee; - if (ee) zds[j - ny + i] = BIGLO(num); + long ee = num + yds[i]; + if (ee) { + num = (long) zds[j - ny + i] + ee; + zds[j - ny + i] = BIGLO(num); + } num = BIGDN(num); } while (++i < ny); num--;