15. Intrinsic functions¶
This chapter covers predefined intrinsic and built-in functions.
Intrinsics functions appear as ordinary calls but are special compiler
constructs, emitting specific instruction sequences. To enable them,
include the calypsi/intrinsics68000.h header file.
Built-in functions are similar, but they are not declared in
calypsi/intrinsics68000.h.
15.1. Intrinsic functions reference¶
The calypsi/intrinsics68000.h file appears as follows:
/****************************************************************************
*
* Copyright Håkan Thörngren
*
* This file is part of the Calypsi C library.
* Permission to use with the Calypsi tool chain is hereby granted.
*
****************************************************************************/
#ifndef __INTRINSICS_68000_H
#define __INTRINSICS_68000_H
#ifdef __CALYPSI_TARGET_68000__
typedef unsigned short __interrupt_state_t;
typedef void (*__return_address_t)(void);
__attribute__((intrinsic)) void __disable_interrupts(void);
__attribute__((intrinsic)) void __enable_interrupts(void);
__attribute__((intrinsic)) __interrupt_state_t __get_interrupt_state(void);
__attribute__((intrinsic)) void __restore_interrupt_state(__interrupt_state_t);
__attribute__((intrinsic)) __return_address_t __get_return_address(void);
__attribute__((intrinsic)) void __set_return_address(__return_address_t);
__attribute__((intrinsic)) void __stop_processor(__interrupt_state_t);
__attribute__((intrinsic)) void __reset_processor(void);
__attribute__((intrinsic)) void __break_instruction(unsigned char);
#endif // __CALYPSI_TARGET_68000__
#endif // __INTRINSICS_68000_H
Summary of intrinsic functions¶
Function name |
Description |
|---|---|
|
Disable interrupts |
|
Enable interrupts |
|
Get the current interrupt state |
|
Restore to a previous interrupt state |
|
Get the return address of the current function |
|
Alter the return address of current function |
|
Generate a |
|
Generate a |
|
Stop the processor |
|
Count leading zeroes in an |
|
Count leading zeroes in a |
|
Count leading zeroes in a |
|
Get the value of the sign bit |
Description of intrinsic functions¶
This section details each intrinsic function.
__disable_interrupts¶
Emits a machine instruction that disables interrupts by setting the interrrupt level to 7.
Note
This can only be done in supervisor mode.
__enable_interrupts¶
Emits a machine instruction that enables interrupts by setting the interrrupt level to 0.
Note
This can only be done in supervisor mode.
__get_interrupt_state¶
Returns the current interrupt state as a value of type
__interrupt_state_t. This can be used in the following way:
int global;
void safe_increment () {
__interrupt_state_t state = __get_interrupt_state();
__disable_interrupts;
global++;
__restore_interrupt_state(state);
}
In the example the current state of interrupts is obtained and saved
in state. The code then ensures interrupts are disabled and then
do the real work. Finally, the interrupt state is restored to what it
was when the function was entered.
Note
This can only be done in supervisor mode.
__restore_interrupt_state¶
Restores to a previous interrupt state, see example above.
Note
This can only be done in supervisor mode.
__get_return_address¶
Reads the return address of the current function from its the stack frame.
__set_return_address¶
Replaces the return address of the current function with the address
found in the argument of __set_return_address().
__break_instruction¶
Emits a machine instruction that causes a breakpoint exception. This
takes a value between 0 and 7 which encodes one of the 8
available software breakpoints.
__reset_processor¶
Emits the RESET instruction which has the effect of generating a
reset to all external devices. Execution continues with the next
instruction.
Note
This can only be done in supervisor mode.
__stop_processor¶
Emits an STOP instruction which takes an argument that is the
value to set the processor status register to. This stops execution
until an interrupt of high enough priority is received.
Note
This can only be done in supervisor mode.
__builtin_clz¶
Count the number of leading zeroes in a provided int value.
Returns an undefined result if input is zero.
__builtin_clzl¶
Count the number of leading zeroes in a provided long value.
Returns an undefined result if input is zero.
__builtin_clzll¶
Count the number of leading zeroes in a provided long long value.
Returns an undefined result if input is zero.
__builtin_signbit¶
Returns the value (0 or 1) of the signbit of its input.