Yoshinori Sato
ysato****@users*****
2003年 10月 2日 (木) 00:00:17 JST
At Mon, 29 Sep 2003 14:07:20 -0400 (EDT), Kazu Hirata wrote: > > こんにちは。 > > include/asm-h8300/bitop.h の中でよく現れる > > ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3)) > > や > > (1UL << (nr & 7)) & something > > という式を最適化する patch を gcc-3.4 に入れてみました。結果、 > test_bit() では > > shar.l er0 <- er0 = nr >> 3; > shar.l er0 > shar.l er0 > sub.l er2,er2 <- er2 = (nr >> 3) & 3; > mov.b r0l,r2l > and #3,r2l > and #252,r0l <- er0 = (nr >> 3) & ~3; > sub.l er2,er0 > add.l er6,er0 > adds #2,er0 > adds #1,er0 > mov.b @er0,r2l > sub.l er0,er0 > mov.b r2l,r0l > sub.l er2,er2 > mov.b r4l,r2l > and #7,r2l > mov.b r2l,r2l > ble .L58 > .L57: > shlr.l er0 <- test の前に shift > add.b #-1,r2l > bne .L57 > .L58: > btst #0,r0l <- 固定 bit の test > bne .L18 > > が > > shar.l er2 > shar.l er2 > shar.l er2 > xor #3,r2l <- xor のみで array index の調整 > add.l er6,er2 > mov.b @er2,r2l > btst r5l,r2l <- 可変 bit の test > bne .L18 > > まで凝縮されました。gcc-3.4 の正式 release は恐らく来年の初頭になって > しまうと思いますが、とりあえずご報告まで。 > かなり改善されますね。あちこちで使っているので、ものすごく有効だと 思います。 これだけ効率が悪いということは、元の書き方がまずいのか。 #今まで最適化された方に近いコードが生成されていると思っていました。 #思った通りのコードを生成させるのは難しい… 以下余談。 ここで計算しているのは、ビット列の指定されたビットが存在するオフセット アドレスです。 そんな事ならもっと簡単になるだろうと思われそうですが、 ・kernel内部でビット列をlongの値として扱うことがある。 ・ビット操作命令はbyte長しかない。 ・困ったことに変更処理はatomicでないといけない。 ・さらに困ったことにbigendian。 という制限にまとめて襲われているので、こんな形になっています。 #atomicじゃなくてもいい方を論理演算にしたら軽くなるかな? #32以下のときば計算減らすとか… -- Yoshinori Sato <ysato****@users*****>