目次

ニュース

日記カテゴリ

書庫

ソフトウェア処理見直してこの処理400us以下でなんとかせーっていう仰せがあって、たとえば判定処理を行うときにshortよりlongのほうが速いっていうけどどのくらい違うんだろう?

あと、unsignedとsignedとどっちが効率的?ってことを考えて、アセンブラ出力を出してやってみた。

残念ながら今回対象はSH-2マイコンなので、intelとはまた違うかもしれません。

?

テスト用のC言語のソース

/* 32bit 符号無し比較 */

unsigned long bigU32(unsigned long a, unsigned long b){
?if ( a > b ) {
??return a;
?} else {
??return b;
?}
}

/* 32bit 符号付き比較 */

long bigS32(long a, long b){
?if ( a > b ) {
??return a;
?} else {
??return b;
?}
}

?

/* 16bit 符号無し比較 */

unsigned short bigU16(unsigned short a, unsigned short b){
?if ( a > b ) {
??return a;
?} else {
??return b;
?}
}

/* 16bit 符号無し比較 */

short bigS16(short a, short b){
?if ( a > b ) {
??return a;
?} else {
??return b;
?}
}

?

そして、出てきたもの。

レジスタのR4が第1引数、R5が第2引数、で戻り値がR0に設定されます。

P?? 00000000????????????? _bigU32:???????????????????????? ; function: bigU32
?????????????????????????????????????????????????????????? ; frame size=0
??? 00000000 3456?????????????????? CMP/HI????? R5,R4
??? 00000002 8B01?????????????????? BF????????? L256
??? 00000004 000B?????????????????? RTS
??? 00000006 6043?????????????????? MOV???????? R4,R0
??? 00000008????????????? L256:????????????????????????????
??? 00000008 6053?????????????????? MOV???????? R5,R0
??? 0000000A????????????? L257:????????????????????????????
??? 0000000A 000B?????????????????? RTS
??? 0000000C 0009?????????????????? NOP
??? 0000000E????????????? _bigS32:???????????????????????? ; function: bigS32
?????????????????????????????????????????????????????????? ; frame size=0
??? 0000000E 3457?????????????????? CMP/GT????? R5,R4
??? 00000010 8B01?????????????????? BF????????? L259
??? 00000012 000B?????????????????? RTS
??? 00000014 6043?????????????????? MOV???????? R4,R0
??? 00000016????????????? L259:????????????????????????????
??? 00000016 6053?????????????????? MOV???????? R5,R0
??? 00000018????????????? L260:????????????????????????????
??? 00000018 000B?????????????????? RTS
??? 0000001A 0009?????????????????? NOP
??? 0000001C????????????? _bigU16:???????????????????????? ; function: bigU16
?????????????????????????????????????????????????????????? ; frame size=0
??? 0000001C 634D?????????????????? EXTU.W????? R4,R3
??? 0000001E 625D?????????????????? EXTU.W????? R5,R2
??? 00000020 3327?????????????????? CMP/GT????? R2,R3
??? 00000022 8B01?????????????????? BF????????? L262
??? 00000024 000B?????????????????? RTS
??? 00000026 6043?????????????????? MOV???????? R4,R0
??? 00000028????????????? L262:????????????????????????????
??? 00000028 6053?????????????????? MOV???????? R5,R0
??? 0000002A????????????? L263:????????????????????????????
??? 0000002A 000B?????????????????? RTS
??? 0000002C 0009?????????????????? NOP
??? 0000002E????????????? _bigS16:???????????????????????? ; function: bigS16
?????????????????????????????????????????????????????????? ; frame size=0
??? 0000002E 634F?????????????????? EXTS.W????? R4,R3
??? 00000030 625F?????????????????? EXTS.W????? R5,R2
??? 00000032 3327?????????????????? CMP/GT????? R2,R3
??? 00000034 8B01?????????????????? BF????????? L265
??? 00000036 000B?????????????????? RTS
??? 00000038 6043?????????????????? MOV???????? R4,R0
??? 0000003A????????????? L265:????????????????????????????
??? 0000003A 6053?????????????????? MOV???????? R5,R0
??? 0000003C????????????? L266:????????????????????????????
??? 0000003C 000B?????????????????? RTS
??? 0000003E 0009?????????????????? NOP

微妙なんだけれど、比較演算をするときには、shortは符号拡張が行われて内部的には32bitで演算されているようです。longの場合はそのまま演算されるのでロスがない、と。

unsignedとsignedには命令数に差は出ませんでした。個人的にはsignedが速いんじゃないかと思っていたのですが。。

投稿日時 : 2007年6月1日 16:48
Feedback
  • # re: longとshortとどっちが速い?
    とっちゃん
    Posted @ 2007/06/01 18:02
    ニ、ニーモニック読めねーw


    int(unsigned?) に符号拡張されてるんではないでしょうか?

    SH-2 のコンパイラがどう扱ってるかは分らんですが、
    原則 int = レジスタと同じビット数(ただし、16(15?)bit以上)というのが普通ですのでw

    unsigned な比較と signed な比較でどっちが早いかだと、個人的には unsigned かな?とおもったりw

    この辺は、CPU のマニュアル見ねーと分らんですね。
    比較命令はクロック数1という事もないだろうしw

    って、8bit時代の知識じゃついていけねーですよww
  • # re: longとshortとどっちが速い?
    ながせ
    Posted @ 2007/06/01 20:38
    >とっちゃん
    CMP/HIもCMP/GTどっちとも実行ステート1です。

    signedが速いんじゃないか、っていうのは比較演算を加算で比較できるので過去にCPU(っていうほどじゃない演算ユニット)を設計したときに思ったのです^-^;
  • # re: longとshortとどっちが速い?
    とっちゃん
    Posted @ 2007/06/01 20:56
    >実行ステート1
    おー。1クロックでいくのか...
    スペックが30年近く前のままだからわからんw

    CPUの仕様がわからんので憶測ですが、unsigned でもキャリーフラグをセットしてくれるなら、加算でできませんか?

    #演算回路なんてもうすっかり忘れ去ってる...w
  • # re: longとshortとどっちが速い?
    ながせ
    Posted @ 2007/06/01 21:23
    たしかに。。
    キャリーを自分で立てればunsignedも1clockでいけそう。
    するとunsignedもよいかなぁー。
  • # re: longとshortとどっちが速い?
    とっちゃん
    Posted @ 2007/06/01 21:43
    今の自分の頭回路では、比較は引き算で-0+なんですがw

    昔はアセンブラコードで最適化とかやったんだよなぁw
    この PUSH/POP は必要ないな...とかw
    レジスタうまいこと使い回してとか...w
    あの頃のクロックも貴重品だったからなw

    1クロックでも早く、1ビットでも少なく...
    今じゃ考えられんなwww

    今じゃ下手なこと考えるより、コンパイラ様におまかせ~のほうが速いコード出してくれるしw
  • # re: longとshortとどっちが速い?
    ながせ
    Posted @ 2007/06/01 23:20
    signed演算だと、引き算は1の補数を加算すると演算できる形になるから。。

    ってほとんど旧情報1種の世界だなぁ。
  • # re: longとshortとどっちが速い?
    とっちゃん
    Posted @ 2007/06/02 11:29
    >signed演算だと、引き算は1の補数を加算すると演算できる形になるから。。

    これと、キャリーフラグのセットのどっちが重いかって世界だなw

    もうついて行けねーっす。そんな、ピーキーな世界には...w
  • # re: longとshortとどっちが速い?
    ながせ
    Posted @ 2007/06/02 22:03
    するってーと、キャリーフラグは最上位ビットのAND回路で実現できるわけだから、CPUクロックを通さなくてもいけそうかしら?

    あとは演算ビット数の問題っていうかFlipFlopの容量の問題かな。

    # すでに、ソフトウェアじゃなくなってる。。。
タイトル
名前
Url
コメント 

Blog 利用状況

コミュニティ

プロファイル