Keil Logo Arm Logo

Technical Support

On-Line Manuals

Compiler Reference Guide

Conventions and Feedback Introduction Compiler Command-line Options Language Extensions Compiler-specific Features Keywords and operators __align __alignof__ __ALIGNOF__ __asm __forceinline __global_reg __inline __int64 __INTADDR__ __irq __packed __pure __smc __softfp __svc __svc_indirect __svc_indirect_r7 __value_in_regs __weak __writeonly __declspec attributes __declspec(dllexport) __declspec(dllimport) __declspec(noinline) __declspec(noreturn) __declspec(nothrow) __declspec(notshared) __declspec(thread) Function attributes __attribute__((alias)) function attribute __attribute__((always_inline)) function attribute __attribute__((const)) function attribute __attribute__((constructor[(priority)])) function __attribute__((deprecated)) function attribute __attribute__((destructor[(priority)])) function a __attribute__((format_arg(string-index))) function __attribute__((malloc)) function attribute __attribute__((noinline)) function attribute __attribute__((nomerge)) function attribute __attribute__((nonnull)) function attribute __attribute__((noreturn)) function attribute __attribute__((notailcall)) function attribute __attribute__((pcs("calling_convention") __attribute__((pure)) function attribute __attribute__((section("name"))) functio __attribute__((unused)) function attribute __attribute__((used)) function attribute __attribute__((visibility("visibility_type&qu __attribute__((weak)) function attribute __attribute__((weakref("target"))) funct Type attributes __attribute__((bitband)) type attribute __attribute__((aligned)) type attribute __attribute((packed)) type attribute __attribute__((transparent_union)) type attribute Variable attributes __attribute__((alias)) variable attribute __attribute__((at(address))) variable attribute __attribute__((aligned)) variable attribute __attribute__((deprecated)) variable attribute __attribute__((noinline)) constant variable attrib __attribute__((packed)) variable attribute __attribute__((section("name"))) variabl __attribute__((transparent_union)) variable attrib __attribute__((unused)) variable attribute __attribute__((used)) variable attribute __attribute__((visibility("visibility_type&qu __attribute__((weak)) variable attribute __attribute__((weakref("target"))) varia __attribute__((zero_init)) variable attribute Pragmas #pragma anon_unions, #pragma no_anon_unions #pragma arm #pragma arm section [section_type_list] #pragma diag_default tag[,tag,...] #pragma diag_error tag[,tag,...] #pragma diag_remark tag[,tag,...] #pragma diag_suppress tag[,tag,...] #pragma diag_warning tag[, tag, ...] #pragma exceptions_unwind, #pragma no_exceptions_u #pragma hdrstop #pragma import symbol_name #pragma import(__use_full_stdio) #pragma import(__use_smaller_memcpy) #pragma inline, #pragma no_inline #pragma no_pch #pragma Onum #pragma once #pragma Ospace #pragma Otime #pragma pack(n) #pragma pop #pragma push #pragma softfp_linkage, #pragma no_softfp_linkage #pragma thumb #pragma unroll [(n)] #pragma unroll_completely #pragma weak symbol, #pragma weak symbol1 = symbol Instruction intrinsics __breakpoint intrinsic __cdp intrinsic __clrex intrinsic __clz intrinsic __current_pc intrinsic __current_sp intrinsic __disable_fiq intrinsic __disable_irq intrinsic __enable_fiq intrinsic __enable_irq intrinsic __fabs intrinsic __fabsf intrinsic __force_stores intrinsic __ldrex intrinsic __ldrexd intrinsic __ldrt intrinsic __memory_changed intrinsic __nop intrinsic __pld intrinsic __pldw intrinsic __pli intrinsic __promise intrinsic __qadd intrinsic __qdbl intrinsic __qsub intrinsic __rbit intrinsic __rev intrinsic __return_address intrinsic __ror intrinsic __schedule_barrier intrinsic __semihost intrinsic __sev intrinsic __sqrt intrinsic __sqrtf intrinsic __ssat intrinsic __strex intrinsic __strexd intrinsic __strt intrinsic __swp intrinsic __usat intrinsic __wfe intrinsic __wfi intrinsic __yield intrinsic ARMv6 SIMD intrinsics ETSI basic operations C55x intrinsics VFP status intrinsic __vfp_status intrinsic Fused Multiply Add (FMA) intrinsics Named register variables Predefined macros Built-in function name variables C and C++ Implementation Details Semihosting ARMv6 SIMD Instruction Intrinsics Via File Syntax Standard C Implementation Definition Standard C++ Implementation Definition C and C++ Compiler Implementation Limits

Compiler Reference Guide

ETSI basic operations

ETSI basic operations

The compilation tools support the original ETSI family of basic operations described in the ETSI G.729 recommendation Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP).

To make use of the ETSI basic operations in your own code, include the standard header file dspfns.h. The intrinsics supplied in dspfns.h are listed in Table 22.

Table 22. ETSI basic operations supported by the ARM compilation tools

Intrinsics
abs_sL_add_cL_multL_sub_cnorm_l
addL_deposit_hL_negatemac_rround
div_sL_deposit_lL_satmsu_rsaturate
extract_hL_macL_shlmultshl
extract_lL_macNsL_shrmult_rshr
L_absL_msuL_shr_rnegateshr_r
L_addL_msuNsL_subnorm_ssub

The header file dspfns.h also exposes certain status flags as global variables for use in your C or C++ programs. The status flags exposed by dspfns.h are listed in Table 23.

Table 23. ETSI status flags exposed in the ARM compilation tools

Status flagDescription
Overflow

Overflow status flag.

Generally, saturating functions have a sticky effect on overflow.

Carry

Carry status flag.


Show/hideExample

#include <limits.h>
#include <stdint.h>
#include <dspfns.h>       // include ETSI basic operations
int32_t C_L_add(int32_t a, int32_t b)
{
    int32_t c = a + b;
    if (((a ^ b) & INT_MIN) == 0)
    {
        if ((c ^ a) & INT_MIN)
        {
            c = (a < 0) ? INT_MIN : INT_MAX;
        }
    }
    return c;
}
__asm int32_t asm_L_add(int32_t a, int32_t b)
{
    qadd r0, r0, r1
    bx lr
}
int32_t foo(int32_t a, int32_t b)
{
    int32_t c, d, e, f;
    Overflow = 0;         // set global overflow flag
    c = C_L_add(a, b);    // C saturating add
    d = asm_L_add(a, b);  // assembly language saturating add
    e = __qadd(a, b);     // ARM intrinsic saturating add
    f = L_add(a, b);      // ETSI saturating add
    return Overflow ? -1 : c == d == e == f; // returns 1, unless overflow
}

Show/hideSee also

  • the header file dspfns.h for definitions of the ETSI basic operations as a combination of C code and intrinsics

  • European Telecommunications Standards Institute (ETSI) basic operations in Using the Compiler

  • ETSI Recommendation G.191: Software tools for speech and audio coding standardization

  • ITU-T Software Tool Library 2005 User's manual, included as part of ETSI Recommendation G.191

  • ETSI Recommendation G723.1 : Dual rate speech coder for multimedia communications transmitting at 5.3 and 6.3 kbit/s

  • ETSI Recommendation G.729: Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP).

Copyright © 2007-2008, 2011-2012 ARM. All rights reserved.ARM DUI 0376D
Non-ConfidentialID062912

Keil logo

Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.