«  | トップページ |  »

2004年5月17日 (月)



------

longを使わない処理を試してみる。

usTimerLeft += (unsigned short)(((long)usIntervalCenter * (0x400 - iRLRate)) >> 10);

;*** File HANDLER.C , Line 419 ; expression statement
   MOV.W #1024:16,R0
MOV.W @_iRLRate:16,R1
SUB.W R1,R0
EXTS.L ER0
MOV.W @_usIntervalCenter:16,R1
EXTU.L ER1
JSR @$MULL$3:16
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
SHAR.L ER0
MOV.W @_usTimerLeft:16,R1
ADD.W R0,R1
MOV.W R1,@_usTimerLeft:16


に対して、longを使わない場合。

usTimerLeft += (unsigned short)((usIntervalCenter * (0x400 - iRLRate)) >> 10);

;*** File HANDLER.C , Line 420 ; expression statement
MOV.W #1024:16,R0
MOV.W @_iRLRate:16,R1
SUB.W R1,R0
MOV.W @_usIntervalCenter:16,E0
MULXU.W E0,ER0
MOV.B R0H,R0L
SUB.B R0H,R0H
SHLR.W R0
SHLR.W R0
MOV.W @_usTimerLeft:16,R1
ADD.W R0,R1
MOV.W R1,@_usTimerLeft:16

うーん、やっぱり、longを使わないとうまくいかないのか。
掛け算の結果は、うまく32ビットレジスタに入っているけれど、そこから下位16ビットのみの処理になっているようだ...
C言語的には下位16ビットのみの処理が正しいような気がするが、アセンブラならうまくかけそうだ。

どうしても速度を求めるなら、ここはアセンブラになりそうだ。

|

«  | トップページ |  »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: :

«  | トップページ |  »