Everything
4.2.6.7 組み込み関数

CC-RHでは,アセンブラ命令の一部を“組み込み関数”としてCソースに記述することができます。ただし,“アセンブラ命令そのもの”を記述するのではなく,CC-RHで用意した関数の形式で記述します。

組み込み関数の引数に暗黙の型変換が不可能な型の引数が指定された場合は,警告を出力し,強制的に型変換して組み込み関数のコードを生成します。

また,ldsr/stsr に対し,ハードウエアにないレジスタ番号を指定した場合の動作は,各デバイスのユーザーズマニュアルを参照してください。

以下に,関数として記述できる命令を示します。

表 4.20

アセンブラ命令 (1)

アセンブラ命令

機能

組み込み関数

di

割り込み制御

void __DI(void);
ei
void __EI(void);
-

割り込みレベルの制御注1

void __set_il_rh(long NUM, void* ADDR注2);
 

-

NUM : 1~16

  movhi highw1(ADDR), r0, rX
  ld.b  loww(ADDR)[rX], rY
  andi  0x00F0, rY, rY
  ori   (優先順位 - 1), rY, rY
  st.b  loww(ADDR)[rX]

-

NUM : 0

  movhi highw1(ADDR), r0, rX
  clr1  7, loww(ADDR)[rX]

-

NUM : -1

  movhi highw1(ADDR), r0, rX
  set1  7, loww(ADDR)[rX]

-

NUM : -2

  movhi highw1(ADDR), r0, rX
  clr1  6, loww(ADDR)[rX]

-

NUM : -3

  movhi highw1(ADDR), r0, rX
  set1  6, loww(ADDR)[rX]

-

NUM : -4以下,および17以上

  範囲外エラー
nop

ノー・オペレーション

void __nop(void);
halt

プロセッサの停止

void __halt(void);
satadd

飽和加算

long __satadd(long a, long b);
satsub

飽和減算

long __satsub(long a, long b);
bsh

ハーフワード・データのバイト・スワップ

long __bsh(long a);
bsw

ワード・データのバイト・スワップ

long __bsw(long a);
hsw

ワード・データのハーフワード・スワップ

long __hsw(long a);
mul

符号つき64ビット乗算結果の上位32ビットを変数に代入する命令

long __mul32(long a, long b);
mulu

符号なし64ビット乗算結果の上位32ビットを変数に代入する命令

unsigned long __mul32u(unsigned long a, unsigned long b);
sch0l

MSB側からのビット(0)検索

long __sch0l(long a);
sch0r

LSB側からのビット(0)検索

long __sch0r(long a);
sch1l

MSB側からのビット(1)検索

long __sch1l(long a);
sch1r

LSB側からのビット(1)検索

long __sch1r(long a);
ldsr

システム・レジスタへのロード

void __ldsr(long regID注3, unsigned long a);
ldsr

システム・レジスタへのロード

void __ldsr_rh(long regID注3, long selID注3, unsigned long a);
stsr

システム・レジスタの内容のストア

unsigned long __stsr(long regID注3);
stsr

システム・レジスタの内容のストア

unsigned long __stsr_rh(long regID注3, long selID注3);
caxi

比較と交換

long __caxi(long *a, long b, long c);
clr1

ビット・クリア

void __clr1(unsigned char *a, long bit);
set1

ビット・セット

void __set1(unsigned char *a, long bit);
not1

ビット・ノット

void __not1(unsigned char *a, long bit);
ldl.w注4

アトミック・ロード

long __ldlw(long *a);
stc.w注4

ストア

void __stcw(long *a, long b);【V1.04.00以前】
long __stcw(long *a, long b);【V1.05.00以降】
synce

例外同期化

void __synce(void);
synci

命令パイプライン同期化

void __synci(void);
syncm

メモリ同期化

void __syncm(void);
syncp

パイプライン同期化

void __syncp(void);
dbcp

デバッグ・チェックポイント

void __dbcp(void);
dbpush

デバッグ・プッシュ

void __dbpush(long regID1, long regID2);
dbtag

デバッグ・タグ

void __dbtag(long a);

注 1.

__set_il_rh関数は,-Xcpu={g3m|g3k|g3mh|g3kh}オプション指定時のみ使用可能です。

注 2.

ADDRには割り込み制御レジスタのアドレスを指定してください。

注 3.

regIDにはシステム・レジスタ番号(0~31)を,selIDには0~31を指定してください。

注 4.

-Xcpu=g3kオプション使用時は警告を出力します。

注意

組み込み関数と同名の関数を定義して使用することはできません。
同名の関数を呼び出そうとしても,コンパイラが用意している組み込み関数処理を優先します。

 

-Xcpu=g4mhオプション指定時は,次の組み込み関数も使用できます。

表 4.21

アセンブラ命令 (2)

アセンブラ命令

機能

組み込み関数

clip.b

符号付きワード・データの飽和処理付きバイト・データ変換

long __clipb(long a);
clip.bu

符号無しワード・データの飽和処理付きバイト・データ変換

unsigned long __clipbu(unsigned long a);
clip.h

符号付きワード・データの飽和処理付きハーフワード・データ変換

long __cliph(long a);
clip.hu

符号無しワード・データの飽和処理付きハーフワード・データ変換

unsigned long __cliphu(unsigned long a);
ldl.bu

アトミックなバイト・データ操作を開始するロード

long __ldlbu(unsigned char* a);
ldl.hu

アトミックなハーフワード・データ操作を開始するロード

long __ldlhu(unsigned short* a);
stc.b

バイト・データ操作がアトミックに完了した場合にストアする条件付きストア

long __stcb(unsigned char* a, unsigned char b);
stc.h

ハーフワード・データ操作がアトミックに完了した場合にストアする条件付きストア

long __stch(unsigned short* a, unsigned short b);