4.2.6.7 組み込み関数

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

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

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

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

表 4.18

アセンブラ命令 (1)

アセンブラ命令

機能

組み込み関数

di

割り込み制御

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

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

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

-

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    a, b;
long    __satadd(a, b);
satsub

飽和減算

long    a, b;
long    __satsub(a, b);
bsh

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

long    a;
long    __bsh(a);
bsw

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

long    a;
long    __bsw(a);
hsw

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

long    a;
long    __hsw(a);
mul

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

long    a, b;
long    __mul32(a, b);
mulu

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

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

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

long    a;
long    __sch0l(a);
sch0r

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

long    a;
long    __sch0r(a);
sch1l

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

long    a;
long    __sch1l(a);
sch1r

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

long    a;
long    __sch1r(a);
ldsr

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

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

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

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

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

long    regID;
unsigned long   __stsr(regID注3);
stsr

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

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

比較と交換

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

ビット・クリア

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

ビット・セット

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

ビット・ノット

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

アトミック・ロード

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

ストア

long    *a;
long    b;
void    __stcw(a, b);【V1.04.00以前】
long    __stcw(a, 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

デバッグ・プッシュ

long regID1;
long regID2;
void __dbpush(regID1, regID2);
dbtag

デバッグ・タグ

long a;
void __dbtag(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.19

アセンブラ命令 (2)

アセンブラ命令

機能

組み込み関数

clip.b

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

long a;
long __clipb(a);
clip.bu

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

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

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

long a;
long __cliph(a);
clip.hu

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

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

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

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

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

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

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

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

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

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