4.2.4.7 組み込み関数

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

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

また,ldsr()/stsr()に対し,ハードウエアにないレジスタ番号を指定した場合は,エラーとします。

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

表 4.19

アセンブラ命令

アセンブラ命令

機能

組み込み関数

di

割り込み制御

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

割り込みレベルの制御

long    NUM;
void*   ADDR注1;
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

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

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

符号なし乗算結果の上位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注2, a);
ldsr

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

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

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

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

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

long    regID;
long    selID;
unsigned long   __stsr_rh(regID注2, selID注2);
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注3

アトミック・ロード

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

ストア

long    *a;
long    b;
void    __stcw(a, b);
synce

例外同期化

void __synce(void);
synci

命令パイプライン同期化

void __synci(void);
syncm

メモリ同期化

void __syncm(void);
syncp

パイプライン同期化

void __syncp(void);

注 1.

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

注 2.

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

注 3.

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

注意

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