SH C/C++コンパイラ V.9情報
SH C/C++コンパイラ V.9.04.00情報
新機能
以下のオプションを追加しました。
- aliasオプション
ANSI規格に基づいたポインタ指示先の型を考慮した最適化を行います。
- nouse_div_instオプション
SH-2AコアのDIVSおよびDIVU命令の出力を抑止します。
- float_orderオプション
浮動小数点演算式の演算順序変更の最適化を積極的に行います。
改修内容
- 下記の問題を改修しました。
2010年09月30日掲載「大量の関数呼び出しをインライン展開している場合の注意事項 (SHC-0081)
- C4000, C4098またはC4099インターナルエラーが発生する場合がある問題を改修しました。
- endian=littleオプションを使用し、かつビットフィールドメンバを持つ共用体を記述した場合、そのビットフィールドメンバのオフセットが正しくない場合がある問題を改修しました。
- cpu=sh2e, patch=7055, および pic=1 オプションをすべて使用した場合、BRAF命令の分岐先アドレスが正しくない場合がある問題を改修しました。
- #pragma align4を指定した関数の直後に#pragma align4を指定しない関数を記述したプログラムを、-align16または-align32オプションを使用してコンパイルした場合に、#pragma align4を指定しない関数の先頭アドレスが16バイトまたは32バイト整合されない問題を改修しました。
- 標準ライブラリ関数の以下の問題を改修しました。
(6-1)
strcpy()の第2引数に、"\0"を含む文字列定数を記述した場合に第1引数の文字列に"\0"を通常の文字としてコピーしてしまう問題
(6-2)
cpu=sh2e, sh2afpu, sh4またはsh4a オプションを使用し、かつexp() の引数に-1.48852e+9より小さい値を使用した場合、exp() の結果が 0 でなく負の無限大になる問題
(6-3)
ライブラリジェネレータで-reentオプションを使用した場合に、以下の標準関数がリエントラントにならない問題
- puts
- putchar
- printf
- vprintf
- gets
- getchar
- scanf
(6-4)
cout()を使用した場合に、渡す文字列の2文字目以降が出力されない問題
- C++言語を使用した場合の以下の問題を改修しました。
(7-1)
pack=1オプションまたは#pragma pack 1を使用した場合に、例外(データアドレスエラー)を発生するコードが生成される場合がある問題
(7-2)
以下の組み込み関数の第1引数にoffsetof()を使用した場合に誤ってC2237(E) Illegal constant expressionが出力される問題
- gbr_read_byte
- gbr_read_word
- gbr_read_long
- gbr_write_byte
- gbr_write_word
- gbr_write_long
- gbr_and_byte
- gbr_or_byte
- gbr_xor_byte
- gbr_tst_byte
- trapa
- trapa_svc
SH C/C++コンパイラ V.9.03.02情報
改修内容
- 下記の問題を改修しました。
2009年09月29日掲載「ループ内で、ループ帰納変数とループ不変変数からなる添え字式または乗算式を記述した場合の注意事項 (SHC-0080)
- C4098インターナルエラーが発生する場合がある問題を改修しました。
SH C/C++コンパイラ V.9.03.00情報
新機能
- const_volatileオプション
const_volatileオプションをサポートすることにより、const修飾かつvolatile修飾された初期値付き変数を、初期化データ領域と定数領域のどちらに割り付けるかを選択可能にしました。
- ビット操作組み込み関数
以下の組み込み関数を追加し、メモリ上のビット操作を必ずビット操作命令により行うようにしました(注)。
注:本コンパイラをSH-2AまたはSH2A-FPUコアMCU上で使用する場合。
bset()
メモリ上の指定ビットに1を設定
bclr()
メモリ上の指定ビットに0を設定
bcopy()
メモリ上のあるビットの値を別のビットにコピー
bnotcopy()
メモリ上のあるビットの値を別のビットに反転してコピー
改修内容
- 下記の問題を改修しました。
- 2009年03月02日掲載「SuperH RISC engine C/C++コンパイラパッケージ V.9の使用上のお願い」の1.〜5.
- 2009年03月31日掲載「SuperH RISC engine C/C++コンパイラパッケージ V.9の使用上のお願い」
- C4099またはC4098インターナルエラーが発生する場合がある問題を改修しました。
- 標準ライブラリ関数 sprintf() において、"%G"を使用した場合に出力桁数が正しくない場合がある問題を改修しました。
- リストファイル中のGBR相対MOV命令の命令コードが正しく表示されない場合がある問題を改修しました。
仕様変更
- インライン展開時のメモリ使用量による制限を解除しました。
これにより、これまでインライン展開されなかった関数がインライン展開される場合があります。
- 減算結果と0との大小比較において、減算結果がオーバーフローした場合(注)の判定が以前のバージョンと異なります。
注:言語仕様において判定結果は規定されていません。
-----------------------
Cソース:
-----------------------
int a,b;
f()
{
if (a-b < 0) { // a=0xfffffffe、b=0x7fffffffの場合
// V.9.02以前は真、V.9.03は偽
g();
}
}
-----------------------
- logic_gbrオプション指定時に、論理演算をGBR相対アクセス命令で行う最適化を強化しました。
-----------------------
Cソース:
-----------------------
char a,*b;
void func()
{
*b = 0;
a &= 1;
}
-----------------------
V.9.02以前で -gbr=user および -logic_gbrオプションを使用した場合:
-----------------------
MOV.L L11+2,R5 ; _b
MOV.L L11+6,R4 ; _a
MOV.L @R5,R2 ; b
MOV #0,R1 ; H'00000000
MOV.B R1,@R2 ; *(b)
MOV.B @R4,R0 ; a
AND #1,R0
RTS
MOV.B R0,@R4 ; a
-----------------------
V.9.03で -gbr=user および -logic_gbrオプションを使用した場合:
-----------------------
MOV.L L11+2,R5 ; _b
MOV #0,R6 ; H'00000000
MOV.L @R5,R2 ; b
MOV.L L11+6,R0 ; _a-(STARTOF $G0)
MOV.B R6,@R2 ; *(b)
RTS
AND.B #1,@(R0,GBR); a
-----------------------
SH C/C++コンパイラ V.9.02.00情報
新機能
- 以下のオプションを追加しました。
- stuff_gbr
#pragma gbr_baseまたは#pragma gbr_base1で宣言した変数をサイズに応じたセクションに配置します。
- align4
分岐命令の分岐先アドレスを4バイト整合します。
- cpp_noinline
C++でinline指定子付きの関数およびメンバ関数のインライン展開を抑止します。
- 拡張機能#pragma align4を追加しました。
分岐命令の分岐先アドレスを4バイト整合します。
SH C/C++コンパイラ V.9.01.01情報
改修内容
- 2007年08月30日掲載の下記の問題を改修しました。
unsigned short型の変数とunsigned char型の変数の乗算をする場合の注意事項(SHC-0072)
- 以下の標準ライブラリ関数の実行結果が正しくない場合がある問題を改修しました。
- sscanf()
- sqrtf() (SH-2Eのみ)
- asinf() (SH-2Eのみ)
- acosf() (SH-2Eのみ)
- C4098インターナルエラーが発生する場合がある問題を改修しました。
SH C/C++コンパイラ V.9.01.00情報
新機能
- 以下のオプションを追加しました。
- optimize=debug_onlyオプション
ローカル変数の情報を常に参照できるようにします。
- simple_float_convオプション
符号なし整数型と浮動小数点型の相互の型変換に対して、変換前の値の範囲チェックを省略したコードを生成します。
- CPUコアがSH-3, SH3-DSP, SH-4, SH-4A, および SH4AL-DSPであるMCUを使用する場合、多重割り込みやレジスタバンクを有効活用する処理をC言語で記述できるように 、#pragma interruptの仕様追加a、b、およびc、および組み込み関数の追加dを行いました。
- #pragma interrupt <関数名>(sr_rts):
レジスタバンク切り替えおよびRTS 命令を使用
- #pragma interrupt <関数名>(bank):
割り込みハンドリング関数を宣言
- #pragma interrupt <関数名>(rts):
RTS 命令を使用
- sr_jsr():
多重割り込みを許可した後に関数を呼び出す組み込み関数
- 以下の既存機能について、仕様追加および変更を行ないました。
- CPUコアがSH-2A,およびSH2A-FPUであるMCU使用時にdivision=cpu=inline および division=cpu=runtimeオプションを使用できるようにしました。
- CPUコアがSH-4であるMCU使用時にキャッシュブロックを操作するための組み込み関数ocbi(), ocbp(), および ocbwb()を、使用できるようにしました。
- #pragma inline宣言した関数を、inlineオプションに関係なくインライン展開するように変更しました。
- subcommandオプションとlistfileオプションを同時に使用した場合に、subcommandオプションで選択したファイルの内容をコンパイルリストに出力するよう変更しました。
- FPUを持たないCPUに対して、単精度の浮動小数点数用の数学関数sinf(), cosf(), tanf(), expf(), logf(), sqrtf(), およびatanf()のオブジェクトサイズを削減し、かつ演算速度および演算精度を向上しました。
改修内容
- 2007年03月22日掲載の「SH C/C++コンパイラパッケージ Ver.9 使用上の注意事項」で報告した3点の問題を改修しました。
- C4098、およびC4099インターナルエラーが発生する場合がある問題を改修しました。
SH C/C++コンパイラ V.9.00.03情報
新機能
以下の2つのウォーニングメッセージ表示を追加しました。
キャプションを入れてください。
表示 |
意味 |
C1402 (W) #pragma "識別子" ignored |
#pragma "識別子"指定を無視します。 |
C1800 (W) Variable "変数名" type mismatch in files |
変数の型がファイル間で異なっています。
file_inlineオプションの指定をやめてください。 |
改修内容
- 「SH C/C++コンパイラパッケージ Ver.9 使用上の注意事項」2005/11/16掲載分の11点の問題を改修しました。
- 「SH C/C++コンパイラパッケージ Ver.9 使用上の注意事項」2005/12/21掲載分の2点の問題を改修しました。
- 「SH C/C++コンパイラパッケージ Ver.9 使用上の注意事項」2006/3/28掲載分の12点の問題を改修しました。
- 「SH C/C++コンパイラパッケージ Ver.9 使用上の注意事項」2006/4/24掲載分の4点の問題を改修しました。
- 「SH C/C++コンパイラパッケージ Ver.9 使用上の注意事項」2005/9/14掲載分の1点の問題を改修しました。
- C4098、およびC4099インターナルエラーが発生する場合がある問題を改修しました。
- 組み込み関数ocbwb()を使用した場合にOCBWB命令のコードが正しくない問題を改修しました。
SH C/C++コンパイラ V.9.00.02情報
改修内容
2005年7月15日掲載の "SH C/C++コンパイラパッケージ Ver.9 ご使用上のお願い"で報告した8点の問題を改修しました。
SH C/C++コンパイラ V.9.00.01情報
新機能および改善
- 以下のオプションを追加しました。
- 未初期化変数のメモリ割り当て順の指定
bss_order={declaration|definition}
- 変数の配置指定
stuff[={bss|data|const}[,...]], およびnostuff
オプションの詳細については、「コンパイラ、アセンブラ、最適化リンケージエディタ コンパイラパッケージ V.9.00 ユーザーズマニュアル Rev.1.01」を参照してください。
- SH-2のリトルエンディアン方式によるデータ転送機能をサポートしました。ただし、リトルエンディアンをサポートしていないマイコンでは使用できません。
改修内容
改修内容につきましては、下のページを参照してください。
SH C/C++コンパイラ V.9.00.00情報
新CPUのサポート
SH-2A、SH2A-FPUをサポートしました。また、SH-2A、SH2A-FPUのTBRを活用する機能(tbrオプション、#pragma tbr) を追加しました。
言語仕様拡張・変更
- 以下の項目をANSI準拠しました。
- 配列のインデックス
int iarray[10], i=3;
i[iarray] = 0; /* iarray[i] = 0;と同じになります */
- unionのビットフィールド指定
union u {
int a:3;
};
- 定数演算
static int i=1||2/0; /* ゼロ除算をErrorからWarningに変更 */
- ライブラリ、マクロ追加
strtoul,FOPEN_MAX
- strict_ansiオプションを指定することにより、以下項目がANSI準拠になります。これにより、Ver.8までの結果と異なる場合があります。
- unsigned intとlong型演算
- 浮動小数点演算の結合則
- enable_registerオプションを指定することにより、register記憶クラスを指定した変数を優先的にレジスタに割り付けます。
組み込み向け機能強化
- SH-2A、SH2A-FPU向け組み込み関数の追加
飽和演算、TBR設定・参照
- C言語で記述できない命令の組み込み関数サポート
Tビット参照・設定、連結レジスタの中央切り出し、キャリー付き加算、ボロー付き減算、符号反転、1ビット除算、回転、シフト
制限値の緩和
以下の制限値を緩和しました。
- 繰り返し文(while文、do文、for文)、選択文(if文、switch文)の組み合わせによるネストの深さ:32レベル → 4096レベル
- 1関数内で指定可能なgotoラベルの数:511個 → 2147483646個
- switch文のネストの深さ:16レベル → 2048レベル
- 1つのswitch文内で指定可能なcaseラベルの数:511個 → 2147483646個
- 関数定義、関数呼び出しで指定可能引数:63個 → 2147483646個
- セクション名長:31バイト → 8192バイト
- 1ファイルあたりの#pragma sectionで指定できるセクション数:64個 → 2045個
メモリ空間配置指定の拡張
メモリ空間配置指定をより詳細に指定できます。
- abs16/abs20/abs28/abs32オプション
- #pragma abs16/abs20/abs28/abs32
変数の絶対アドレス指定(#pragma addressサポート)
外部変数アクセス最適化機能拡張(smapオプションサポート)
コンパイル対象ファイル内で定義された外部変数について外部変数アクセス最適化を実施します。mapオプションのようなリコンパイルは必要ありません。
数学関数ライブラリ精度向上
数学関数ライブラリの演算精度が向上しました。これにより、Ver.8までの結果と異なる場合があります。