ソフトウェア処理見直してこの処理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