ruby-trunk-changes r54199 - r54207

今日は主に整数の乗算の処理の最適化がありました。

naruse: r54199 2016-03-20 04:48:26 +0900

rb_big_cmp() と rb_big_eq() で normalize した Bignum と Fixnum だと常に Bignum のほうが大きいことを折り込んで不要な比較を削ったりしています。

naruse: r54200 2016-03-20 18:47:20 +0900

time.c の数値オブジェクトの演算を行う add()/sub()/mul() などの関数で C の数値のオブジェクト化の時に不要な FIXABLE() のチェックを削っています。その後の XXX2NUM() のマクロ群から呼ばれる関数内に含まれているので不要でした。

nobu: r54201 2016-03-20 18:53:50 +0900

fix_gt(), fix_ge(), fix_lt(), fix_le() などの Fixnum の比較関数で第2引数が Bignum だった時の比較に不要な型変換があったので rb_big_cmp() にまかせるようにして、結果も FIX2INT() で int に戻して符号判定するのではなく INT2FIX(+1) や INT2FIX(-1) で Fixnum を作ってそれとの比較をするようにしています。

nobu: r54202 2016-03-20 19:09:14 +0900

rb_big_cmp() で SIGNED_VALUE にキャストした Fixnum の VALUE の値はそのまま比較できるので FIX2LONG() での long への変換を省略する最適化を行っています。

naruse: r54203 2016-03-20 20:10:43 +0900

Fixnum どうしの積を計算するための関数 rb_fix_mul_fix() を導入して VM 命令 opt_mul や関数 fix_mul(), time.c の mul() などで利用するようにしています。またそこで long よりもビット幅が大きな型(つまり long x long をしても桁があふれない整数型)を DLONG として定義して、rb_fix_mul_fix() で DLONG が定義されていればそれを使って分岐をなくす最適化を施しています。

nobu: r54204 2016-03-20 20:26:17 +0900

r54203 で time.c の mul() で rb_fix_mul_fix() を呼び出しているところで return が抜けていたのを修正しています。

usa: r54205 2016-03-20 21:18:28 +0900

同じく r54203 で rb_int128t2big() の宣言が int128_t が存在しない時にもされてしまっていたので HAVE_INT128_T が定義されている時だけ宣言するように移動しています。

naruse: r54206 2016-03-21 03:28:21 +0900

r54203 で DLONG が定義されなかった時のパスの変数名の typo 修正。

svn: r54207 2016-03-21 03:28:22 +0900

version.h の日付更新。