[Uclinux-h8-devel] bitop.h 関連での gcc の最適化

Back to archive index

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*****>



Uclinux-h8-devel メーリングリストの案内
Back to archive index