RENESAS TOOL NEWS 2007年07月16日 : 070716/tn1
| SuperH RISC engineファミリ C/C++コンパイラパッケージ V.9
ご使用上のお願い |
SuperH RISC engine ファミリ C/C++コンパイラパッケージ V.9の使用上の注意事項
を連絡します。
- unsigned short型の変数とunsigned char型の変数の乗算をする場合の注意事項
(SHC-0072)
1. 該当製品
SuperH RISC engine ファミリ C/C++コンパイラパッケージ
V.9.01 Release 00
2. 内容
unsigned short型の変数とunsigned char型の変数の乗算をした場合に、その
乗算の結果が正しくない場合があります。
発生条件:以下の条件をすべて満たした時に発生することがあります。
(1) 最適化オプションで最適化レベルを1(optimize=1)としている。
(2) cpuオプションで cpu=sh1 以外を使用している。
(3) unsigned short型の変数とunsigned char型の変数の乗算が存在する。
例:
----------------------------------------------
unsigned char a = 0xff;
unsigned short b = 1;
int c;
main(){
c = a * b; // 発生条件(3)
}
----------------------------------------------
MOV.B @R5,R5 ; a R5 の1バイトゼロ拡張が行なわれない
MOV.W @R1,R1 ; b
MULU.W R5,R1
----------------------------------------------
回避策:以下のいずれかの方法で回避してください。
(1) 最適化レベルを0(optimize=0)またはdebug_only(optimize=debug_only)にす
る。
(2) cpuオプションでsh1(cpu=sh1)を使用する。
(3) 発生条件(3)のunsigned char型変数を明示的に1バイトのゼロで拡張する。
上記ソース例の場合、発生条件(3)の乗算式を以下のように変更することで
回避可能。
変更前: c = a * b;
変更後: c = (unsigned short)(a&0xff) * b;
3. 恒久対策
本内容は、SuperH RISC engine ファミリ C/C++コンパイラパッケージ
V.9.01 Release 01で改修する予定です。