The C and C++ languages are suited to a wide variety of tasks
but they do not provide in-built support for specific areas of application,
for example, Digital Signal Processing (DSP).
Within a given application domain, there is usually a range
of domain-specific operations that have to be performed frequently.
However, often these operations cannot be efficiently implemented
in C or C++. A typical example is the saturated add of two 32-bit
signed two’s complement integers, commonly used in DSP programming. The following example shows a C implementation of saturated add
operation
#include <limits.h>
int L_add(const int a, const int b)
{
int c;
c = a + b;
if (((a ^ b) & INT_MIN) == 0)
{
if ((c ^ a) & INT_MIN)
{
c = (a < 0) ? INT_MIN : INT_MAX;
}
}
return c;
}
Using compiler intrinsics, you can achieve
more complete coverage of target architecture instructions than
you would from the instruction selection of the compiler.
An intrinsic function has the appearance of a function call
in C or C++, but is replaced during compilation by a specific sequence
of low-level instructions. When implemented using an intrinsic,
for example, the saturated add function previous example has the form:
#include <dspfns.h> /* Include ETSI intrinsics */
...
int a, b, result;
...
result = L_add(a, b); /* Saturated add of a and b */