RENESAS TOOL NEWS 2007年07月16日 : 070716/tn4
| M16Cシリーズ用Cコンパイラパッケージ
ご使用上のお願い
--右シフト演算に関する注意事項-- |
M16Cシリーズ用Cコンパイラパッケージの使用上の注意事項を連絡します。
1. 該当製品
M16Cシリーズ*用Cコンパイラパッケージ (M3T-NC30WA)
V.4.00 Release 1 ~ V.5.44 Release 00
*M16C/60, /30, /20, /10, /Tiny, およびR8C/Tinyシリーズの総称です。
2. 内容
最適化のコンパイルオプションを選択し、32ビットデータを11~15ビット
の範囲で右シフトをした結果を直接16ビット長の変数に格納、あるいはキャスト
した場合にSystem Errorが発生する場合があります。
3. 発生条件
以下の条件すべてに該当する場合に発生することがあります。
(1) プログラムの実行速度の高速化やROM容量を最小にする最適化オプション
(-O, -OR, -OR_MAX)のいずれかを使用している。
(2) 32ビット長のデータを11~15ビットの範囲で右シフトをしている。
(3) 上記(2)の実行結果を直接16ビット長の変数に格納、あるいはキャストし
ている。
(4) 上記(2)のシフト対象および(3)の格納先がコンパイラによりレジスタに
割り当てられている。
発生例
------------------------------------------------------------------------
int i;
long l;
i = (int)( l >> 15 );
------------------------------------------------------------------------
4. 回避策
32ビット長データの右シフト結果を、直接16ビット長の変数へ格納、または
キャストせずに、一旦32ビット長の変数に代入した後に16ビット長の変数
へ格納してください。
例)項目3. 発生例の場合の回避方法
------------------------------------------------------------------------
int i;
long l, ll;
ll = l >> 15; /* 一旦32ビット長の変数に代入する */
i = (int)ll;
------------------------------------------------------------------------
5. 恒久対策
次期バージョン V.5.45 Release 00 で改修する予定です。