RENESAS TOOL NEWS 2008年10月16日 : 081016/tn6
| M32Rファミリ用C/C++コンパイラパッケージ (M3T-CC32R)ご使用上のお願い
--float型の乗算と減算からなる演算式について-- |
M32Rファミリ用C/C++コンパイラパッケージ(M3T-CC32R)の使用上の注意事項を連絡
します。
- float型の乗算と減算からなる演算式に関する注意事項
1. 該当製品
M32Rファミリ用C/C++コンパイラパッケージ(M3T-CC32R)
V.4.00 Release 1 ~ V.5.01 Release 00
2. 内容
FMSUB命令の使用を許可するオプション -m32re5 および -fminst を使用し、
最適化オプションを使用してコンパイルする場合、float型の乗算と減算から
なる演算式に対し生成されたFMSUB命令のオペランドが正しくないことが
あります。
2.1 発生条件
次の(1)~(4)の全ての条件を満たす場合に発生することがあります。
(1) コンパイル時に -m32re5 および -fminst オプションを共に使用している。
(2) コンパイル時に使用している最適化オプションが次の(a)か(b)の
いずれかに該当する。
(a) -O, -O1, -O3, -O5, -O7のいずれかを使用している。
(b) -Ospace, -Otimeのいずれかを使用し、かつ、-O0, -O2, -O4, -O6 の
いずれも使用していない。
(3) 次の(a)と(b)からなるfloat型の演算がある。
(a) 2項ともにfloat型である乗算
(b) (a)の結果から別のfloat型の値を減算
(4) (3)(b)の演算は、一旦auto変数へ代入された(a)の結果を参照している。
2.2 発生例
ソースコード例(sample.c):
-------------------------------------------------------------------
float A, B, C;
float func(void)
{
float var;
float answer;
/* 途中省略 */
var = A * B; /* 発生条件(3)(a) */
answer = var - C; /* 発生条件(3)(b),(4) */
/* 途中省略 */
}
-------------------------------------------------------------------
上記のソースコード例の途中省略部分のコードによっては、
今回の問題に該当しない場合があります。
コマンドライン例:
-------------------------------------------------------------------
cc32R -c -O7 -m32re5 -fminst sample.c (発生条件(1)(2))
-------------------------------------------------------------------
ソースコード例では、answerを算出する正しい式は A * B - C になりますが、
今回の問題に該当すると、A - B * C を意味する”FMSUB A,B,C”という正しく
ない命令を生成します。
3. 回避策
内部制御オプション -Qa-Xs16 を指定してコンパイルしてください。
これにより、今回の問題に該当するFMSUB命令の生成を抑止できます。
コマンドライン例:
-------------------------------------------------------------------
cc32R -c -O7 -m32re5 -fminst -Qa-Xs16 sample.c
-------------------------------------------------------------------