/* Copyright (C) 2007-2020 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* ISO/IEC JTC1 SC22 WG14 N1169
* Date: 2006-04-04
* ISO/IEC TR 18037
* Programming languages - C - Extensions to support embedded processors
*/
#ifndef _AVRGCC_STDFIX_H
#define _AVRGCC_STDFIX_H
/* 7.18a.1 Introduction. */
/* 7.18a.3 Precision macros. */
#include <stdfix-gcc.h>
#if __SIZEOF_INT__ == 2
typedef signed char int_hr_t;
typedef unsigned char uint_uhr_t;
typedef short int int_r_t;
typedef short unsigned int uint_ur_t;
typedef short int int_hk_t;
typedef short unsigned int uint_uhk_t;
typedef long int int_lr_t;
typedef long unsigned int uint_ulr_t;
typedef long int int_k_t;
typedef long unsigned int uint_uk_t;
typedef long long int int_llr_t;
typedef long long unsigned int uint_ullr_t;
typedef long long int int_lk_t;
typedef long long unsigned int uint_ulk_t;
typedef long long int int_llk_t;
typedef long long unsigned int uint_ullk_t;
#elif __SIZEOF_INT__ == 1 /* -mint8 */
typedef signed char int_hr_t;
typedef unsigned char uint_uhr_t;
typedef long int int_r_t;
typedef long unsigned int uint_ur_t;
typedef long int int_hk_t;
typedef long unsigned int uint_uhk_t;
typedef long long int int_lr_t;
typedef long long unsigned int uint_ulr_t;
typedef long long int int_k_t;
typedef long long unsigned int uint_uk_t;
#endif /* __SIZEOF_INT__ == 1, 2 */
/* 7.18a.6 The fixed-point intrinsic functions. */
/* 7.18a.6.2 The fixed-point absolute value functions. */
#define abshr __builtin_avr_abshr
#define absr __builtin_avr_absr
#define abslr __builtin_avr_abslr
#define abshk __builtin_avr_abshk
#define absk __builtin_avr_absk
#if __SIZEOF_INT__ == 2
#define abslk __builtin_avr_abslk
#define absllr __builtin_avr_absllr /* GCC Extension */
#define absllk __builtin_avr_absllk /* GCC Extension */
#endif /* sizeof (int) == 2 */
/* 7.18a.6.3 The fixed-point round functions. */
/* The Embedded-C paper specifies results only for rounding points
0 < RP < FBIT
As an extension, the following functions work as expected
with rounding points
-IBIT < RP < FBIT
For example, rounding an accum with a rounding point of -1 will
result in an even integer value. */
#define roundhr __builtin_avr_roundhr
#define roundr __builtin_avr_roundr
#define roundlr __builtin_avr_roundlr
#define rounduhr __builtin_avr_rounduhr
#define roundur __builtin_avr_roundur
#define roundulr __builtin_avr_roundulr
#define roundhk __builtin_avr_roundhk
#define roundk __builtin_avr_roundk
#define rounduhk __builtin_avr_rounduhk
#define rounduk __builtin_avr_rounduk
#if __SIZEOF_INT__ == 2
#define roundlk __builtin_avr_roundlk
#define roundulk __builtin_avr_roundulk
#define roundllr __builtin_avr_roundllr /* GCC Extension */
#define roundullr __builtin_avr_roundullr /* GCC Extension */
#define roundllk __builtin_avr_roundllk /* GCC Extension */
#define roundullk __builtin_avr_roundullk /* GCC Extension */
#endif /* sizeof (int) == 2 */
/* 7.18a.6.4 The fixed-point bit countls functions. */
#define countlshr __builtin_avr_countlshr
#define countlsr __builtin_avr_countlsr
#define countlslr __builtin_avr_countlslr
#define countlsuhr __builtin_avr_countlsuhr
#define countlsur __builtin_avr_countlsur
#define countlsulr __builtin_avr_countlsulr
#define countlshk __builtin_avr_countlshk
#define countlsk __builtin_avr_countlsk
#define countlsuhk __builtin_avr_countlsuhk
#define countlsuk __builtin_avr_countlsuk
#if __SIZEOF_INT__ == 2
#define countlslk __builtin_avr_countlslk
#define countlsulk __builtin_avr_countlsulk
#define countlsllr __builtin_avr_countlsllr /* GCC Extension */
#define countlsullr __builtin_avr_countlsullr /* GCC Extension */
#define countlsllk __builtin_avr_countlsllk /* GCC Extension */
#define countlsullk __builtin_avr_countlsullk /* GCC Extension */
#endif /* sizeof (int) == 2 */
/* 7.18a.6.5 The bitwise fixed-point to integer conversion functions. */
#define bitshr __builtin_avr_bitshr
#define bitsr __builtin_avr_bitsr
#define bitslr __builtin_avr_bitslr
#define bitsuhr __builtin_avr_bitsuhr
#define bitsur __builtin_avr_bitsur
#define bitsulr __builtin_avr_bitsulr
#define bitshk __builtin_avr_bitshk
#define bitsk __builtin_avr_bitsk
#define bitsuhk __builtin_avr_bitsuhk
#define bitsuk __builtin_avr_bitsuk
#if __SIZEOF_INT__ == 2
#define bitslk __builtin_avr_bitslk
#define bitsulk __builtin_avr_bitsulk
#define bitsllr __builtin_avr_bitsllr /* GCC Extension */
#define bitsullr __builtin_avr_bitsullr /* GCC Extension */
#define bitsllk __builtin_avr_bitsllk /* GCC Extension */
#define bitsullk __builtin_avr_bitsullk /* GCC Extension */
#endif /* sizeof (int) == 2 */
/* 7.18a.6.6 The bitwise integer to fixed-point conversion functions. */
#define hrbits __builtin_avr_hrbits
#define rbits __builtin_avr_rbits
#define lrbits __builtin_avr_lrbits
#define uhrbits __builtin_avr_uhrbits
#define urbits __builtin_avr_urbits
#define ulrbits __builtin_avr_ulrbits
#define hkbits __builtin_avr_hkbits
#define kbits __builtin_avr_kbits
#define uhkbits __builtin_avr_uhkbits
#define ukbits __builtin_avr_ukbits
#if __SIZEOF_INT__ == 2
#define lkbits __builtin_avr_lkbits
#define ulkbits __builtin_avr_ulkbits
#define llrbits __builtin_avr_llrbits /* GCC Extension */
#define ullrbits __builtin_avr_ullrbits /* GCC Extension */
#define llkbits __builtin_avr_llkbits /* GCC Extension */
#define ullkbits __builtin_avr_ullkbits /* GCC Extension */
#endif /* sizeof (int) == 2 */
/* 7.18a.6.7 Type-generic fixed-point functions. */
#define absfx __builtin_avr_absfx
#define roundfx __builtin_avr_roundfx
#define countlsfx __builtin_avr_countlsfx
/* Hook in stuff from AVR-Libc. */
#if (defined (__WITH_AVRLIBC__) \
&& defined (__has_include) \
&& __has_include (<stdfix-avrlibc.h>))
#include <stdfix-avrlibc.h>
#endif
#endif /* _AVRGCC_STDFIX_H */