2011年6月29日水曜日

Conditional execution 再び

ノッポさんに「やるんだよ」と言われてはや半年.
ふと思い立って,frv なる CPU の conditional execution をまねて *.md 書いてみた.
まずは,条件実行つき mov 命令.
(define_insn "*cond_exec_mov"
  [(cond_exec
    (match_operator 0 "comparison_operator"
			[(match_operand 1 "int_mode_flags" "")
			 (const_int 0)])        ←ここら辺までが条件実行
    (set (match_operand:INT 2 "register_operand" "=r") ←ここら辺が mov 命令
	 (match_operand:INT 3 "liw_signed"       "")))]
  "TARGET_COND_EXEC"
  "mov_%b0 %3,%2"
  [(set_attr "timings" "11")]
)

でコンパイル結果は,
int hoge( int a, int b, int c, int d ){
    if( a > b ) a = c;
    else        a = d;
    return a;
}
  ↓↓↓↓↓↓
_hoge:
	cmp d1,d0
	mov_gt a0,d0
	mov_le a1,d0
	retf [],0
うっしゃあ.意外とあっさりと成功 ヘ(^∇^ヘ)ヘ(^∇^ヘ) ウヒョヒョ

よーし,パパ全命令に条件実行つけちゃうぞー.
てな訳でまずは add に足してみた.
(define_insn "*cond_exec_addsi"
  [(cond_exec
    (match_operator 0 "comparison_operator"
			[(match_operand 1 "int_mode_flags" "")
			 (const_int 0)])
      (set (match_operand:SI          2 "register_operand"  "=r") ←add命令
	   (plus:SI (match_operand:SI 3 "register_operand"  "%r")
		    (match_operand:SI 4 "nonmemory_operand" "")))
  )]
  "TARGET_COND_EXEC"
  "add_%b0 %4,%3,%2"
  [(set_attr "timings" "11")]
)

そのコンパイル結果は,
int hoge( int a, int b, int c, int d ){
    if( a > b ) a = b + c;
    else        a = c + d;
    return a;
}
  ↓↓↓↓↓↓
_hoge:
	cmp d1,d0
	bgt .L5
	add a1,a0,d0
	retf [],0
.L5:
	add a0,d1,d0
	retf [],0

ぐはぁっ
全然効いてないよ~(゜ーÅ)ほろり

理由がよくわからなかったので,gcc に -fdump-rtl-all オプションをつけて,最適化過程の全 RTL をダンプさせてみた.
if-then-else のブランチ命令から conditional-execution への変換は,ce3 なるステージで行われているらしいので,その直前の peephole2 ステージの RTL の,当該 add 命令の RTL を見てみる.
(insn 11 10 41 3 (parallel [
            (set (reg/v:SI 0 d0 [orig:58 a ] [58])
                (plus:SI (reg/v:SI 1 d1 [orig:61 b ] [61])
                    (reg/v:SI 4 a0 [orig:62 c ] [62])))
            (clobber (reg:CC 51 EPSW))
        ]) z.c:11 11 {addsi3}
大雑把に言って,(define_insn "*cond_exec_addsi"... のところに書いた (set ...) のパターンがここの (set ...) のパターンにマッチすれば,条件実行つき add に変換されるはずなんだけど,(clobber (reg:CC 51 EPSW)) ってのがあるせいでマッチできない.
(clobber (reg:CC 51 EPSW)) ってのは「add 命令実行したらフラグレジスタが更新されるよ」って意味なのであって当たり前なのだが,一方条件実行つき add にはフラグ更新機能はつけてはいけない.
しかし,パターンをマッチさせるには,通常 add 命令のフラグ更新をやめるか,条件付実行の add にフラグ更新をさせるか,のどちらかしかない (実際にはどっちも実 CPU の動作からウソを付くことになるので,おかしなコードを吐く可能性がある)

ARM とかどうやってんのかと思って見たら,元々通常 add 命令でフラグ更新する・しないが選択できるので,何の問題もないのね.

んー,困った.

2011年6月13日月曜日

gcc クロスコンパイラ ビルドコマンド

gcc のクロスコンパイル環境構築の一連のコマンド,何度メモをとってもどっかいってしまうので blog に貼り付けてしまう(笑)
# binutils
./configure --target=mn10300-unknown-elf \
--prefix=/home/yoshi/mcu/amgcc; \
make; make install

# gmp
./configure --prefix=/home/yoshi/mcu/amgcc ; make ; make install
# mpfr
./configure --prefix=/home/yoshi/mcu/amgcc \
--with-gmp=/home/yoshi/mcu/amgcc; \
make ; make install
# mpc
./configure --prefix=/home/yoshi/mcu/amgcc \
--with-gmp=/home/yoshi/mcu/amgcc \
--with-mpfr=/home/yoshi/mcu/amgcc; \
make ; make install

# newlib
cd gcc-4.6.0
ln -s ../newlib-1.19.0/newlib .
ln -s ../newlib-1.19.0/libgloss .

# gcc
set path = ( $path /home/yoshi/mcu/amgcc/bin )
setenv LD_LIBRARY_PATH /home/yoshi/mcu/amgcc/lib:$LD_LIBRARY_PATH

mkdir build
cd build
../configure --target=mn10300-unknown-elf \
--disable-libssp \
--prefix=/home/yoshi/mcu/amgcc \
--with-gmp=/home/yoshi/mcu/amgcc \
--with-mpfr=/home/yoshi/mcu/amgcc \
--with-mpc=/home/yoshi/mcu/amgcc; \
make
make install
以下ハマりポイント
・newlib 使わないとなんか失敗する
・--disable-libssp 指定しないと libssp のビルドに失敗する
・gcc で build とか適当に dir 掘って configure 等を実行しないとダメ

# gcc 4.5.3 あたりから gmp だの mpfr だの mpc だの,lib が要るようになってめんどくさい…

2011年6月4日土曜日

テンソン ワイマックス!

b-mobileSIM の有効期限が切れそうだったので,端末 0円キャンペーンをやっていた WiMAX に加入してみた.
# 5/31 まで! という言葉につられて入ったら,6月もしれっとキャンペーン続いてたけど

しばらくは b-mobile 買わずに WiMAX で運用してみるつもり.あわよくば eo 光をやめて WiMAX に統一するかもしれない (まぁ無理だろうけど).

というわけで今日届いたので,Desire とか IS01 とかつないでテンソン上がってきたwww
実質 100kbps 位しか出ていない b-mobile とはスピードが全然違うし,IS01 も外でも使えるようになった.さすが 40Mbps は伊達じゃないぜ!

で,最後にデスクトップ PC に USB 無線 LAN アダプタ挿してスピードテストしてみたら,

ゼロが2個くらい足りないような… (´・ω・`) ショボーン
一気にテンソンが下がった.

いや,38度くらい熱出してる状態で遊んでたから,単にナチュラルハイ状態だったのか?

----
1週間使ってみた感想.

○アンテナ1本でも,5Mbps でた.
×かさばる(笑) 会社の休憩時間に Desire で遊ぼうと思っても WM3500R も持って行かないといけない.
Desire と IS01 と WM3500R と 3台かばんに入れていくとかもう意味わかんない.
×WM3500R の電源 ON してから通信可能になるまで 1分近くかかるので,ぱっとメールチェックしたくてもできない.
△通信エリアの狭さが災いして,主な使用時間である電車通勤中は (自宅に近づくにつれw) けっこう通信が切れる.
△自分の使い方だと,モバイル端末では Web とかメールとか,テキストデータ中心の通信なので WiMAX の通信速度はオーバースペック.

と,自分の使い方においては,モバイル通信環境としてはメリットよりデメリットのほうが目立った.

では自宅の固定回線の置き換えは可能か? と言われると,速度は全然光より遅いけど,GB 単位のファイル転送とかしない限り速度は 5Mbps も出りゃ十分なので,コスト優先なら自宅の固定回線 + モバイル通信回線を WiMAX に置き換えるのは非常にありだと思う.

でもウチの場合固定電話回線も eo に乗り換えちゃったらから,eo 止めようがないんだよね.
というわけで,3ヶ月経ったら WiMAX 解約するつもり.まぁ端末代もタダだったしいいや.