4.2.6 組み込み関数

CC-RXでは、アセンブラ命令の一部を“組み込み関数”としてCソースに記述することができます。ただし、“アセンブラ命令そのもの”を記述するのではなく、RXで用意した関数の形式で記述します。これらの関数を使用した場合、出力コードは通常の関数呼び出しを行わず、対応するアセンブラを出力します。

表 4.26

組み込み関数の一覧

 

項目

仕様

機能

ユーザモードの制限*1

1

最大値・最小値

signed long max(signed long data1, signed long data2)

最大値の選択

signed long __max(signed long data1, signed long data2) 【V2.05.00以降】

2

signed long min(signed long data1, signed long data2)

最小値の選択

signed long __min(signed long data1, signed long data2) 【V2.05.00以降】

3

バイト並べ替え

unsigned long revl(unsigned long data)

ロングワードデー
タをバイトリバー


unsigned long __revl(unsigned long data) 【V2.05.00以降】

4

unsigned long revw(unsigned long data)

ロングワードデー
タをワード毎にバ
イトリバース

unsigned long __revw(unsigned long data) 【V2.05.00以降】

5

データ交換

void xchg(signed long *data1, signed long *data2)

データ交換

void __xchg(signed long *data1, signed long *data2) 【V2.05.00以降】

6

積和演算

long long rmpab(long long init, unsigned long count, signed char *addr1, signed char *addr2)

積和演算(バイト)

long long __rmpab(long long init, unsigned long count, signed char *addr1, signed char *addr2) 【V2.05.00以降】

7

long long rmpaw(long long init, unsigned long count, short *addr1, short *addr2)

積和演算(ワード)

long long __rmpaw(long long init, unsigned long count, short *addr1, short *addr2) 【V2.05.00以降】

8

long long rmpal(long long init, unsigned long count, long *addr1, long *addr2)

積和演算(ロング
ワード)

long long __rmpal(long long init, unsigned long count, long *addr1, long *addr2) 【V2.05.00以降】

9

回転

unsigned long rolc(unsigned long data)

キャリーを含めて
1ビット左回転

unsigned long __rolc(unsigned long data) 【V2.05.00以降】

10

unsigned long rorc(unsigned long data)

キャリーを含めて
1ビット右回転

unsigned long __rorc(unsigned long data) 【V2.05.00以降】

11

unsigned long rotl(unsigned long data, unsigned long num)

左回転

unsigned long __rotl(unsigned long data, unsigned long num) 【V2.05.00以降】

12

unsigned long rotr (unsigned long data, unsigned long num)

右回転

unsigned long __rotr(unsigned long data, unsigned long num) 【V2.05.00以降】

13

特殊命令

void brk(void)

BRK命令例外

void __brk(void) 【V2.05.00以降】

14

void int_exception(signed long num)

INT命令例外

void __int_exception(signed long num) 【V2.05.00以降】

15

void wait(void)

プログラム実行停

×

void __wait(void) 【V2.05.00以降】

16

void nop(void)

NOP命令に展開

void __nop(void) 【V2.05.00以降】

17

プロセッサ割り込み優先レベル(IPL)

void set_ipl(signed long level)

割り込み優先レベ
ルの設定

×

void __set_ipl(signed long level) 【V2.05.00以降】

18

unsigned char get_ipl(void)

割り込み優先レベ
ルの参照

unsigned char __get_ipl(void) 【V2.05.00以降】

19

プロセッサステータスワード(PSW)

void set_psw(unsigned long data)

PSWの設定

void __set_psw(unsigned long data) 【V2.05.00以降】

20

unsigned long get_psw(void)

PSWの参照

unsigned long __get_psw(void) 【V2.05.00以降】

21

浮動小数点ステータスワード(FPSW)

void set_fpsw(unsigned long data)

FPSWの設定

void __set_fpsw(unsigned long data) 【V2.05.00以降】

22

unsigned long get_fpsw(void)

FPSWの参照

unsigned long __get_fpsw(void) 【V2.05.00以降】

23

ユーザスタック

ポインタ(USP)

void set_usp(void *data)

USPの設定

void __set_usp(void *data) 【V2.05.00以降】

24

void *get_usp(void)

USPの参照

void *__get_usp(void) 【V2.05.00以降】

25

割り込みスタック

ポインタ(ISP)

void set_isp(void *data)

ISPの設定

void __set_isp(void *data) 【V2.05.00以降】

26

void *get_isp(void)

ISPの参照

void *__get_isp(void) 【V2.05.00以降】

27

割り込みテーブルレジスタ(INTB)

void set_intb (void *data)

INTBの設定

void __set_intb(void *data) 【V2.05.00以降】

28

void *get_intb(void)

INTBの参照

void *__get_intb(void) 【V2.05.00以降】

29

バックアップPSW(BPSW)

void set_bpsw(unsigned long data)

BPSWの設定

void __set_bpsw(unsigned long data) 【V2.05.00以降】

30

unsigned long get_bpsw(void)

BPSWの参照

unsigned long __get_bpsw(void) 【V2.05.00以降】

31

バックアップPC(BPC)

void set_bpc(void *data)

BPCの設定

void __set_bpc(void *data) 【V2.05.00以降】

32

void *get_bpc(void)

BPCの参照

void *__get_bpc(void) 【V2.05.00以降】

33

高速割り込み

ベクタレジスタ(FINTV)

void set_fintv(void *data)

FINTVの設定

void __set_fintv(void *data) 【V2.05.00以降】

34

void *get_fintv(void)

FINTVの参照

void *__get_fintv(void) 【V2.05.00以降】

35

有効桁64bitの乗算

signed long long emul(signed long data1, signed long data2)

有効桁64bitの符
号付き乗算

signed long long __emul(signed long data1, signed long data2) 【V2.05.00以降】

36

unsigned long long emulu(unsigned long data1, unsigned long data2)

有効桁64bitの符
号なし乗算

unsigned long long __emulu(unsigned long data1, unsigned long data2) 【V2.05.00以降】

37

プロセッサモード(PM)

void chg_pmusr(void)

ユーザモードへの
切り換え

void __chg_pmusr(void) 【V2.05.00以降】

38

アキュムレータ(ACC)

void set_acc(signed long long data)

ACCの設定

void __set_acc(signed long long data) 【V2.05.00以降】

39

signed long long get_acc(void)

ACCの参照

signed long long __get_acc(void) 【V2.05.00以降】

40

割り込み許可ビットの制御

void setpsw_i(void)

割り込み許可ビッ
トを1に設定

void __setpsw_i(void) 【V2.05.00以降】

41

void clrpsw_i(void)

割り込み許可ビッ
トを0に設定

void __clrpsw_i(void) 【V2.05.00以降】

42

積和演算

long macl(short *data1, short *data2, unsigned long count)

2byteデータの積
和演算

long __macl(short *data1, short *data2, unsigned long count) 【V2.05.00以降】

43

short macw1(short *data1, short *data2, unsigned long count)

short macw2(short *data1, short *data2, unsigned long count)

定小数点データ向
けの積和演算

short __macw1(short *data1, short *data2, unsigned long count) 【V2.05.00以降】

short __macw2(short *data1, short *data2, unsigned long count) 【V2.05.00以降】

44

例外ベクタテーブルレジスタ(EXTB)

void set_extb(void *data)

EXTBの設定

void __set_extb(void *data) 【V2.05.00以降】

45

void * get_extb(void)

EXTBの参照

void *__get_extb(void) 【V2.05.00以降】

46

ビット操作

void __bclr(unsigned char *data, unsigned long bit) 【V2.05.00以降】

1ビットクリア

47

void __bset(unsigned char *data, unsigned long bit) 【V2.05.00以降】

1ビットセット

48

void __bnot(unsigned char *data, unsigned long bit) 【V2.05.00以降】

1ビット反転

注 1.

RXのプロセッサモードがユーザモードの場合に制限があるものを示します。
×印の関数は特権命令例外が発生するため、ユーザモードでは使用しないでください。
△印の関数はユーザモードで実行しても効果はありません。

 

signed long max(signed long data1, signed long data2)
signed long __max(signed long data1, signed long data2) 【V2.05.00以降】

[機能]

2つの入力値のうち大きい方を選択します(MAX命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

data1 入力値1

data2 入力値2

[リターン値]

data1とdata2のうち大きい方の値

[例]

#include < machine.h>
extern signed long ret,in1,in2;
void main(void)
{
    ret = max(in1,in2);// in1とin2のうち大きい方の値をretに設定します。
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

signed long min(signed long data1, signed long data2)
signed long __min(signed long data1, signed long data2) 【V2.05.00以降】

[機能]

2つの入力値のうち小さい方を選択します(MIN命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

data1 入力値1

data2 入力値2

[リターン値]

data1とdata2のうち小さい方の値

[例]

#include < machine.h>
extern signed long ret,in1,in2;
void main(void)
{
    ret = min(in1,in2); // in1とin2のうち小さい方の値をretに設定します。
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long revl(unsigned long data)
unsigned long __revl(unsigned long data) 【V2.05.00以降】

[機能]

4バイトデータのバイト並び順をリバースします(REVL命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

data バイト並びをリバースするデータ

[リターン値]

dataのバイト並びをリバースした値

[例]

#include <machine.h>
extern unsigned long ret,indata=0x12345678;
void main(void)
{
    ret = revl(indata);// ret=0x78563412となる
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long revw(unsigned long data)
unsigned long __revw(unsigned long data) 【V2.05.00以降】

[機能]

4バイトデータの上位2バイトと下位2バイトでそれぞれのバイト並びをリバースします(REVW命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

data バイト並びをリバースするデータ

[リターン値]

dataの上位2バイトと下位2バイトでそれぞれのバイト並びをリバースした

[例]

#include <machine.h>
extern unsigned long ret,indata=0x12345678;
void main(void)
{
    ret = revw(indata);// ret=0x34127856 となる
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void xchg(signed long *data1, signed long *data2)
void __xchg(signed long *data1, signed long *data2) 【V2.05.00以降】

[機能]

引数が指す領域の内容を入れ替えます(XCHG命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

*data1 入力値1

*data2 入力値2

[リターン値]

[例]

#include <machine.h>
extern signed long *in1,*in2;
void main(void)
{
    xchg (in1,in2);// アドレスin1、アドレスin2のデータを交換します。
}

[備考]

生成されるXCHG命令は、data2が指す位置のメモリオペランドを持ちます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

long long rmpab(long long init, unsigned long count, signed char *addr1, signed char *addr2)
long long __rmpab(long long init, unsigned long count, signed char *addr1, signed char *addr2) 【V2.05.00以降】

[機能]

初期値をinit、回数をcount、乗数の格納されている先頭アドレスをaddr1、addr2として積和演算を行います(RMPA.B命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

init 初期値

count 積和演算の回数

*addr1 乗数1の先頭アドレス

*addr2 乗数2の先頭アドレス

[リターン値]

init + S(data1[n] * data2[n]) の下位64ビットの結果 (n=0, 1, …, const-1)

[例]

#include <machine.h>
extern signed char data1[8],data2[8];
long long sum;
void main(void)
{
    sum=rmpab(0, 8, data1, data2);// 0を初期値とし、配列data1,data2の
                              // 乗算結果を加算してsumに設定する
}

[備考]

RMPA命令は80bitの範囲で結果を計算しますが、本組み込み関数では64bit範囲のみ扱います。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

long long rmpaw(long long init, unsigned long count, short *addr1, short *addr2)
long long __rmpaw(long long init, unsigned long count, short *addr1, short *addr2) 【V2.05.00以降】

[機能]

初期値をinit、回数をcount、乗数の格納されている先頭アドレスをaddr1、addr2として積和演算を行います(RMPA.W命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

init 初期値

count  積和演算の回数

*addr1 乗数1の先頭アドレス

*addr2 乗数2の先頭アドレス

[リターン値]

init + S(data1[n] * data2[n]) の下位64ビットの結果 (n=0, 1, …, const-1)

[例]

#include <machine.h>
extern signed short data1[8],data2[8];
long long sum;
void main(void)
{
    sum=rmpaw(0, 8, data1, data2); // 0を初期値とし、配列data1,data2の
                               // 乗算結果を加算してsumに設定する
}

[備考]

RMPA命令は80bitの範囲で結果を計算しますが、本組み込み関数では64bit範囲のみ扱います。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

long long rmpal(long long init, unsigned long count, long *addr1, long *addr2)
long long __rmpal(long long init, unsigned long count, long *addr1, long *addr2) 【V2.05.00以降】

[機能]

初期値をinit、回数をcount、乗数の格納されている先頭アドレスをaddr1、addr2として積和演算を行います(RMPA.L命令に展開します)。

[ヘッダ]

<machine.h>

[引数]

init 初期値

count 積和演算の回数

*addr1 乗数1の先頭アドレス

*addr2 乗数2の先頭アドレス

[リターン値]

init + S(data1[n] * data2[n]) の下位64ビットの結果 (n=0, 1, …, const-1)

[例]

#include <machine.h>
extern signed long data1[8],data2[8];
long long sum;
void main(void)
{
    sum=rmpal(0, 8, data1, data2); // 0を初期値とし、配列data1,data2の
                               // 乗算結果を加算してsumに設定する
}

[備考]

RMPA命令は80bitの範囲で結果を計算しますが、本組み込み関数では64bit範囲のみ扱います。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long rolc(unsigned long data)
unsigned long __rolc(unsigned long data) 【V2.05.00以降】

[機能]

Cフラグを含めて1ビット左回転した結果を返します(ROLC命令に展開します)。オペランドの外へ出たビットをCフラグに反映します。

[ヘッダ]

<machine.h>

[引数]

data 左回転するデータ

[リターン値]

dataをCフラグを含めて左に1ビット回転した結果

[例]

#include <machine.h>
extern unsigned long ret,indata;
void main(void)
{
    ret = rolc(indata);// indataをCフラグを含めて1ビット左回転し
                   // retに設定します。
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long rorc(unsigned long data)
unsigned long __rorc(unsigned long data) 【V2.05.00以降】

[機能]

Cフラグを含めて1ビット右回転した結果を返します(RORC命令に展開します)。 オペランドの外へ出たビットをCフラグに反映します。

[ヘッダ]

<machine.h>

[引数]

data 右回転するデータ

[リターン値]

dataをCフラグを含めて右に1ビット回転した結果

[例]

#include <machine.h>
extern unsigned long ret,indata;
void main(void)
{
    ret = rorc(indata);// indataをCフラグを含めて1ビット右回転し
                   // retに設定します。
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long rotl(unsigned long data, unsigned long num)
unsigned long __rotl(unsigned long data, unsigned long num) 【V2.05.00以降】

[機能]

任意ビット左回転した結果を返します(ROTL命令に展開します)。オペランドの外へ出たビットをCフラグに反映します。

[ヘッダ]

<machine.h>

[引数]

data 左回転するデータ

num 回転するビット数

[リターン値]

dataを左にnumビット回転した結果

[例]

#include <machine.h>
extern unsigned long ret,indata;
void main(void)
{
    ret = rotl(indata, 31); // indataを31ビット左回転し
                        // retに設定します。
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long rotr (unsigned long data, unsigned long num)
unsigned long __rotr(unsigned long data, unsigned long num) 【V2.05.00以降】

[機能]

任意ビット右回転した結果を返します(ROTR命令に展開します)。オペランドの外へ出たビットをCフラグに反映します。

[ヘッダ]

<machine.h>

[引数]

data 右回転するデータ

num 回転するビット数

[リターン値]

dataを右にnumビット回転した結果

[例]

#include <machine.h>
extern unsigned long ret,indata;
void main(void)
{
    ret = rotr(indata, 31); // indataを31ビット右回転し
                        // retに設定します。
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void brk(void)
void __brk(void) 【V2.05.00以降】

[機能]

BRK命令に展開します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    brk();// BRK命令
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void int_exception(signed long num)
void __int_exception(signed long num) 【V2.05.00以降】

[機能]

INT num 命令に展開します。

[ヘッダ]

<machine.h>

[引数]

num INT命令番号

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    int_exception(10);// INT #10 命令
}

[備考]

numに設定できる数は、0〜255の整数のみです。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void wait(void)
void __wait(void) 【V2.05.00以降】

[機能]

WAIT命令に展開します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    wait();// WAIT命令
}

[備考]

本関数はRXのプロセッサモードがユーザモードの場合は実行しないでください。実行すると、WAIT命令の仕様により、RXの特権命令例外が発生します。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void nop(void)
void __nop(void) 【V2.05.00以降】

[機能]

NOP命令に展開します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    nop();// NOP命令
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_ipl(signed long level)
void __set_ipl(signed long level) 【V2.05.00以降】

[機能]

割り込みマスクレベルを変更します。

[ヘッダ]

<machine.h>

[引数]

level 設定する割り込みマスクレベル

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    set_ipl(7);// PSW.IPL に7を設定
}

[備考]

デフォルトではlevelには0〜15の値が、-patch=rx610を指定した場合は0〜7の値がそれぞれ指定できます。

levelが定数のとき、範囲外の値を指定した場合はエラーとなります。

本関数はRXのプロセッサモードがユーザモードの場合は使用しないでください。実行すると、MVTIPL命令の仕様により、RXの特権命令例外が発生します。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned char get_ipl(void)
unsigned char __get_ipl(void) 【V2.05.00以降】

[機能]

割り込みマスクレベルを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

割り込みマスクレベル

[例]

#include <machine.h>
extern unsigned char level;
void main(void)
{
    level=get_ipl();// PSW.IPLの値を取得しlevelに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_psw(unsigned long data)
void __set_psw(unsigned long data) 【V2.05.00以降】

[機能]

PSWを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern unsigned long data;
void main(void)
{
    set_psw(data);// PSWにdataの値を設定
}

[備考]

RXの命令セット仕様のため、PSWのPMビットの書き込みは無視されます。また、RXのプロセッサモードがユーザモードの場合は、PSWのIPL[3:0]、PM、U、Iビットへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long get_psw(void)
unsigned long __get_psw(void) 【V2.05.00以降】

[機能]

PSWを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

PSWの値

[例]

#include <machine.h>
extern unsigned long ret;
void main(void)
{
    ret=get_psw();// PSWの値を取得し、retに設定
}

[備考]

最適化の作用により、get_pswの呼び出し箇所とは違うタイミングでPSWレジスタの値が取得される場合があります。このため、何らかの演算後に、本関数の戻り値に含まれるC,Z,SおよびOフラグのいずれかを利用するコードを記述した場合、その動作は保証しません。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_fpsw(unsigned long data)
void __set_fpsw(unsigned long data) 【V2.05.00以降】

[機能]

FPSWを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern unsigned long data;
void main(void)
{
    set_fpsw(data);// FPSWにdataの値を設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long get_fpsw(void)
unsigned long __get_fpsw(void) 【V2.05.00以降】

[機能]

FPSWを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

FPSWの値

[例]

#include <machine.h>
extern unsigned long ret;
void main(void)
{
    ret=get_fpsw();// FPSWの値を取得し、retに設定
}

[備考]

最適化の作用により、get_fpswの呼び出し箇所とは違うタイミングでFPSWレジスタの値が取得される場合があります。このため、何らかの演算後に、本関数の戻り値に含まれるCV,CO,CZ,CU,CX,CE,FV,FO,FZ,FU,FXおよびFSフラグのいずれかを利用するコードを記述した場合、その動作は保証しません。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_usp(void *data)
void __set_usp(void *data) 【V2.05.00以降】

[機能]

USPを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern void * data;
void main(void)
{
    set_usp(data);// USPにdataの値を設定
}

[備考]

dataには4バイト境界のアドレスを指定してください。

1バイト境界、もしくは2バイト境界のアドレスを指定した場合、プログラムの動作は保証できません。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void *get_usp(void)
void *__get_usp(void) 【V2.05.00以降】

[機能]

USPを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

USPの値

[例]

#include <machine.h>
extern void * ret;
void main(void)
{
    ret=get_usp();// USPの値を取得し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_isp(void *data)
void __set_isp(void *data) 【V2.05.00以降】

[機能]

ISPを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern void * data;
void main(void)
{
    set_isp(data);// ISPにdataの値を設定
}

[備考]

本関数で使用するMVTC命令の仕様により、RXのプロセッサモードがユーザモードの場合は、ISPへの書き込みは無視されます。

dataには4バイト境界のアドレスを指定してください。

1バイト境界、もしくは2バイト境界のアドレスを指定した場合、プログラムの動作は保証できません。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void *get_isp(void)
void *__get_isp(void) 【V2.05.00以降】

[機能]

ISPを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

ISPの値

[例]

#include <machine.h>
extern void * ret;
void main(void)
{
    ret=get_isp();// ISPの値を取得し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_intb(void *data)
void __set_intb(void *data) 【V2.05.00以降】

[機能]

INTBを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern void * data;
void main(void)
{
    set_intb (data);// INTBにdataの値を設定
}

[備考]

本関数で使用するMVTC命令の仕様により、RXのプロセッサモードがユーザモードの場合は、INTBへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void *get_intb(void)
void *__get_intb(void) 【V2.05.00以降】

[機能]

INTBを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

INTBの値

[例]

#include <machine.h>
extern void * ret;
void main(void)
{
    ret=get_intb();// INTBの値を取得し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_bpsw(unsigned long data)
void __set_bpsw(unsigned long data) 【V2.05.00以降】

[機能]

BPSWを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern unsigned long data;
void main(void)
{
    set_bpsw (data);// BPSWにdataの値を設定
}

[備考]

本関数で使用するMVTC命令の仕様により、RXのプロセッサモードがユーザモードの場合は、BPSWへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long get_bpsw(void)
unsigned long __get_bpsw(void) 【V2.05.00以降】

[機能]

BPSWを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

BPSWの値

[例]

#include <machine.h>
extern unsigned long ret;
void main(void)
{
    ret=get_bpsw ();// BPSWの値を取得し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_bpc(void *data)
void __set_bpc(void *data) 【V2.05.00以降】

[機能]

BPCを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern void * data;
void main(void)
{
    set_bpc(data);// BPCにdataの値を設定
}

[備考]

本関数で使用するMVTC命令の仕様により、RXのプロセッサモードがユーザモードの場合は、BPCへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void *get_bpc(void)
void *__get_bpc(void) 【V2.05.00以降】

[機能]

BPCを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

BPCの値

[例]

#include <machine.h>
extern void * ret;
void main(void)
{
    ret=get_bpc();// BPCの値を取得し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_fintv(void *data)
void __set_fintv(void *data) 【V2.05.00以降】

[機能]

FINTVを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern void * data;
void main(void)
{
    set_fintv(data);// FINTVにdataの値を設定
}

[備考]

本関数で使用するMVTC命令の仕様により、RXのプロセッサモードがユーザモードの場合は、FINTVへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void *get_fintv(void)
void *__get_fintv(void) 【V2.05.00以降】

[機能]

FINTVを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

FINTVの値

[例]

#include <machine.h>
extern void * ret;
void main(void)
{
    ret=get_fintv();// FINTVの値を取得し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

signed long long emul(signed long data1, signed long data2)
signed long long __emul(signed long data1, signed long data2) 【V2.05.00以降】

[機能]

有効桁64bitの符号付き乗算を行います。

[ヘッダ]

<machine.h>

[引数]

data1 入力値1

data2 入力値2

[リターン値]

符号付き乗算の結果(64bit符号付き)

[例]

#include <machine.h>
extern signed long long ret;
extern signed long data1, data2;
void main(void)
{
    ret=emul(data1, data2);// data1 * data2 の値を計算し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

unsigned long long emulu(unsigned long data1, unsigned long data2)
unsigned long long __emulu(unsigned long data1, unsigned long data2)  【V2.05.00以降】

[機能]

有効桁64bitの符号なし乗算を行います。

[ヘッダ]

<machine.h>

[引数]

data1 入力値1

data2 入力値2

[リターン値]

符号なし乗算の結果(64bit符号なし)

[例]

#include <machine.h>
extern unsigned long long ret;
extern unsigned long data1, data2;
void main(void)
{
    ret=emulu(data1, data2);// data1 * data2 の値を計算し、retに設定
}

[備考]

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void chg_pmusr(void)
void __chg_pmusr(void)  【V2.05.00以降】

[機能]

RXのプロセッサモードをユーザに切り換えます。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

[例]

#include <machine.h>
void main(void);
void Do_Main_on_UserMode(void)
{
    chg_pmusr();  // プロセッサモードをユーザモードに切り換え
    main();       // mainを実行
}

[備考]

本関数はリセット処理関数あるいは割り込み関数のために用意されています。それ以外の関数での使用は推奨しません。

RXのプロセッサモードがユーザモードのときは、プロセッサモードは切り替わりません。

chg_pmusr関数の実行により、スタックは割り込みスタックからユーザスタックに切り換えが起こりますので、本関数を呼び出す関数では、必ず次の条件を守ってください。守られない場合、本関数の実行前後のスタックの相違が起こるため、コードは正常に動作しません。

-

呼び出し元にreturnすることはできません。

-

auto変数を宣言することはできません。

-

引数を宣言することはできません。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_acc(signed long long data)
void __set_acc(signed long long data)  【V2.05.00以降】

[機能]

ACCを設定します。

[ヘッダ]

<machine.h>

[引数]

data ACCへの設定値

[リターン値]

[例]

#include <machine.h>
void main(void)
{
signed long long data = 0x123456789ab0000LL;
    set_acc(data);// ACCにdataの値を設定
}

[備考]

ACC0, ACC1はサポートしていません。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

signed long long get_acc(void)
signed long long __get_acc(void)  【V2.05.00以降】

[機能]

ACCを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

ACCの値

[例]

/* get_acc とset_acc によるACC の退避/ 回復を利用したプログラムの例 */
#include <machine.h>
signed long a, b, c;
void func(void)
{
    signed long long bak_acc = get_acc(); // ACC の値を取得し、bak_acc に退避
    c = a * b; // 乗算(ACC を破壊する)
    set_acc(bak_acc); // bak_acc で退避していた値でACC を回復
}

[備考]

ACC0, ACC1はサポートしていません。

RX命令セットの仕様のため、ACCの下位16ビットは取得できません。本関数は、これらのビットには0を返します。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void setpsw_i(void)
void __setpsw_i(void)  【V2.05.00以降】

[機能]

PSWの割り込み許可ビット(Iビット)を1に設定します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    setpsw_i();// 割り込み許可ビットを1にする
}

[備考]

本関数で使用するSETPSW命令の仕様により、RXのプロセッサモードがユーザモードの場合は、割り込み許可ビットへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void clrpsw_i(void)
void __clrpsw_i(void)  【V2.05.00以降】

[機能]

PSWの割り込み許可ビット(Iビット)を0に設定します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

[例]

#include <machine.h>
void main(void)
{
    clrpsw_i();// 割り込み許可ビットを0にする
}

[備考]

本関数で使用するCLRPSW命令の仕様により、RXのプロセッサモードがユーザモードの場合は、割り込み許可ビットへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

long macl(short *data1, short *data2, unsigned long count)
long __macl(short *data1, short *data2, unsigned long count)  【V2.05.00以降】

[機能]

積和演算を行います。

2byteのデータ同士の積和演算を行い、その結果を4byteで返します。

積和演算は、DSP機能命令(MULLO,MACLO,MACHI)を使用して演算します。

積和演算の途中のデータは、ACCに48bit長データとして保持されます。

全ての積和演算が終わったら、ACCの内容をMVFACMI命令で取り出し、組み込み関数の戻り値とします。

本組み込み関数を使用することにより、組み込み関数を使用せずに積和演算を記述する場合よりも、高速な積和演算処理が期待できます。

2byteの整数データの積和演算をする場合に利用できます。積和演算の演算結果には、飽和処理や丸め処理はされません。

[ヘッダ]

<machine.h>

[引数]

data1 乗数1の先頭アドレス

data2 乗数2の先頭アドレス

count 積和演算の乗算回数

[リターン値]

Σ(data1[n]×data2[n])の演算結果

[例]

#include <machine.h>
short data1[3] = {a1, b1, c1};
short data2[3] = {a2, b2, c2};
void mac_calc()
{
result = macl(data1, data2, 3);    /* a1*a2+b1*b2+c1*c2 の結果を求めます */
}

[備考]

積和演算に使用される各種DSP機能命令の詳細な内容を確認するには、プログラミングマニュアルを参照してください。

乗算回数が0の場合、組み込み関数の戻り値は0です。

本組み込み関数を使用する場合、ACCの内容が書き換わる割り込み処理では、ACCを退避回復してください。

ACCを退避回復する機能については、コンパイルオプションのsave_acc、もしくは、拡張言語仕様の#pragma interruptを参照してください。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

short macw1(short *data1, short *data2, unsigned long count)
short macw2(short *data1, short *data2, unsigned long count)
short __macw1(short *data1, short *data2, unsigned long count) 【V2.05.00以降】
short __macw2(short *data1, short *data2, unsigned long count) 【V2.05.00以降】

[機能]

2byteのデータ同士の積和演算を行い、その結果を2byteで返します。

積和演算は、DSP機能命令(MULLO,MACLO,MACHI)を使用して演算します。

積和演算の途中のデータは、ACCに48bit長データとして保持されます。

全ての積和演算が終わった後に、ACCの積和演算結果に対して丸め処理を行います。

macw1関数は"RACW #1"命令、macw2関数は"RACW #2"命令で丸め処理を行います。

丸め処理の処理内容は、以下の手順になります。

-

ACCの内容を、macw1関数は1ビット、macw2関数は2ビット、左シフトします

-

ACCの下位32ビットの最上位ビットを0捨1入します

-

ACCの上位32ビットを、上限値0x00007FFF、下限値を0xFFFF8000として飽和処理します

最後に、MVFACHI命令でACCから上位32ビットを取得し、組み込み関数の戻り値とします。

通常、固定小数点データ同士の乗算をする場合、乗算結果の小数点位置を調整する必要があります。たとえば、Q15形式の固定小数点データ同士の乗算の場合、乗算結果を同じQ15形式にするためには、乗算結果を1ビット左シフトする必要があります。

この小数点位置を調整するための左シフトは、RACW命令の左シフト動作によって実現できます。そのため、2byteの固定小数点データの積和演算をする場合に、本組み込み関数を利用することにより、容易に積和演算処理を実現できます。なお、macw1とmacw2は演算結果の丸め方法が異なりますので、演算結果に求められる精度に応じて、使用する組み込み関数を選択してください。

[ヘッダ]

<machine.h>

[引数]

data1 乗数1の先頭アドレス

data2 乗数2の先頭アドレス

count 積和演算の乗算回数

[リターン値]

積和演算の演算結果を、RACW命令で丸めた値

[例]

#include <machine.h>
short data1[3] = {a1, b1, c1};
short data2[3] = {a2, b2, c2};
void mac_calc()
{
result = macw1(data1, data2, 3); 
/* a1*a2+b1*b2+c1*c2 の結果を、"RACW #1"命令で丸めた値を求めます。 */
}

[備考]

積和演算に使用される各種DSP機能命令の詳細な内容を確認するには、プログラミングマニュアルを参照してください。

乗算回数が0の場合、組み込み関数の戻り値は0です。

本組み込み関数を使用する場合、ACCの内容が書き換わる割り込み関数では、 ACCを退避回復してください。

ACCを退避回復する機能については、コンパイルオプションのsave_acc、もしくは、拡張言語仕様の#pragma interruptを参照してください。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void set_extb(void *data)
void __set_extb(void *data) 【V2.05.00以降】

[機能]

EXTBを設定します。

[ヘッダ]

<machine.h>

[引数]

data 設定値

[リターン値]

[例]

#include <machine.h>
extern void * data;
void main(void)
{
    set_extb (data);// EXTBにdataの値を設定
}

[備考]

本関数は、isaオプションもしくは環境変数ISA_RXにRXv1以外が指定されている場合に使用できます。それ以外の場合はコンパイル時にエラーとなります。

本関数で使用するMVTC命令の仕様により、RXのプロセッサモードがユーザモードの場合は、EXTBへの書き込みは無視されます。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void *get_extb(void)
void *__get_extb(void) 【V2.05.00以降】

[機能]

EXTBを参照します。

[ヘッダ]

<machine.h>

[引数]

[リターン値]

EXTBの値

[例]

#include <machine.h>
extern void * ret;
void main(void)
{
    ret=get_extb();// ENTBの値を取得し、retに設定
}

[備考]

本関数は、isaオプションもしくは環境変数ISA_RXにRXv1以外が指定されている場合に使用できます。それ以外の場合はコンパイル時にエラーとなります。

__で始まる名称の組み込み関数を使用する場合には、ヘッダのインクルードは不要です。

 

 

 

void __bclr(unsigned char *data, unsigned long bit) 【V2.05.00以降】

[機能]

指定した1バイト領域の指定した1ビットを0にします(BCLR命令に展開します)。

[ヘッダ]

[引数]

data 操作対象となる1バイト領域のアドレス。

bit 操作対象のビット位置。

[リターン値]

[例]

unsigned char *data;
void main(void)
{
    __bclr(data, 0);  // アドレスdataが指示する1バイト領域の最下位ビットを0にします。
}

[備考]

引数bitに指定できる値は0〜7の整数定数のみです。

引数で指定したビットをメモリ上で直接0に書き換えるBCLR命令に展開します。

 

 

 

void __bset(unsigned char *data, unsigned long bit) 【V2.05.00以降】

[機能]

指定した1バイト領域の指定した1ビットを1にします(BSET命令に展開します)。

[ヘッダ]

[引数]

data 操作対象となる1バイト領域のアドレス。

bit 操作対象のビット位置。

[リターン値]

[例]

unsigned char *data;
void main(void)
{
    __bset(data, 0);  // アドレスdataが指示する1バイト領域の最下位ビットを1にします。
}

[備考]

引数bitに指定できる値は0〜7の整数定数のみです。

引数で指定したビットをメモリ上で直接1に書き換えるBSET命令に展開します。

 

 

 

void __bnot(unsigned char *data, unsigned long bit) 【V2.05.00以降】

[機能]

指定した1バイト領域の指定した1ビットの値を反転します(BNOT命令に展開します)。

[ヘッダ]

[引数]

data 操作対象となる1バイト領域のアドレス。

bit 操作対象のビット位置。

[リターン値]

[例]

unsigned char *data;
void main(void)
{
    __bnot(data, 0);  // アドレスdataが指示する1バイト領域の最下位ビットが1なら0に、
                      // 0なら1にします。
}

[備考]

引数bitに指定できる値は0〜7の整数定数のみです。

引数で指定したビットをメモリ上で直接反転するBNOT命令に展開します。