4.2.4.7 Embedded functions

In the CC-RH, some of the assembler instructions can be described in C source as "Embedded Functions". However, it is not described "as assembler instruction", but as a function format set in the CC-RH.

If a parameter is specified whose type cannot be implicitly converted to that of the parameter of the embedded function, then an warning is output, and it is treated as an embedded function.

A error is also output if a register number that does not exist in the hardware is specified for ldsr()/stsr().

The instructions that can be described as functions are as follows.

Table 4.19

Assembler Instruction

Assembler Instruction

Function

Embedded Function

di

Interrupt control

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

Interrupt-priority-level control

int     NUM;
void*   ADDRNote 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   (Priority - 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 : No greater than 4 and no less than 17

  Out-of-range error
nop

No operation

void __nop(void);
halt

Stops the processor

void __halt(void);
satadd

Saturated addition

long    a, b;
long    __satadd(a, b);
satsub

Saturated subtraction

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

Halfword data byte swap

long    a;
long    __bsh(a);
bsw

Word data byte swap

long    a;
long    __bsw(a);
hsw

Word data halfword swap

long    a;
long    __hsw(a);
mul

Instruction that assigns higher 32 bits of multiplication result to variable

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

Instruction that assigns higher 32 bits of unsigned multiplication result to variable

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

Bit (0) search from MSB side

long    a;
long    __sch0l(a);
sch0r

Bit (0) search from LSB side

long    a;
long    __sch0r(a);
sch1l

Bit (1) search from MSB side

long    a;
long    __sch1l(a);
sch1r

Bit (1) search from LSB side

long    a;
long    __sch1r(a);
ldsr

Loads to system register

long    regID;
unsigned long   a;
void __ldsr(regIDNote 2, a);
ldsr

Loads to system register

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

Stores contents of system register

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

Stores contents of system register

long    regID;
long    selID;
unsigned long   __stsr_rh(regIDNote 2, selIDNote 2);
caxi

Compare and Exchange

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

Bit clear

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

Bit set

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

Bit not

unsigned char   *a;
int             bit;
void __not1(a, bit);
ldl.wNote 3

Atomic load.

long    *a;
long    __ldlw(a);
stc.wNote 3

Store

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

Exception synchronization

void __synce(void);
synci

Instruction pipeline synchronization

void __synci(void);
syncm

Memory synchronization

void __syncm(void);
syncp

Pipeline synchronization

void __syncp(void);

Note 1.

For ADDR, specify the address of the interrupt control register.

Note 2.

Specified the system register number (0 to 31) in regID and 0 to 31 in selID.

Note 3.

A warning is output when the -Xcpu=g3k option is used.

Caution

Even if a function is defined with the same name as an embedded function, it cannot be used.
If an att isempt made to call such a function, processing for the embedded function provided by the compiler takes precedence.