1*b1e83836Smrg /* Copyright (C) 2013-2022 Free Software Foundation, Inc.
248fb7bfaSmrg
348fb7bfaSmrg This file is part of GCC.
448fb7bfaSmrg
548fb7bfaSmrg GCC is free software; you can redistribute it and/or modify it under
648fb7bfaSmrg the terms of the GNU General Public License as published by the Free
748fb7bfaSmrg Software Foundation; either version 3, or (at your option) any later
848fb7bfaSmrg version.
948fb7bfaSmrg
1048fb7bfaSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1148fb7bfaSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
1248fb7bfaSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1348fb7bfaSmrg for more details.
1448fb7bfaSmrg
1548fb7bfaSmrg Under Section 7 of GPL version 3, you are granted additional
1648fb7bfaSmrg permissions described in the GCC Runtime Library Exception, version
1748fb7bfaSmrg 3.1, as published by the Free Software Foundation.
1848fb7bfaSmrg
1948fb7bfaSmrg You should have received a copy of the GNU General Public License and
2048fb7bfaSmrg a copy of the GCC Runtime Library Exception along with this program;
2148fb7bfaSmrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
2248fb7bfaSmrg <http://www.gnu.org/licenses/>. */
2348fb7bfaSmrg
2448fb7bfaSmrg
2548fb7bfaSmrg /* This file supplies implementations for some AVR-specific builtin
2648fb7bfaSmrg functions so that code like the following works as expected:
2748fb7bfaSmrg
2848fb7bfaSmrg int (*f (void))(_Fract)
2948fb7bfaSmrg {
3048fb7bfaSmrg return __builtin_avr_countlsr;
3148fb7bfaSmrg }
3248fb7bfaSmrg
3348fb7bfaSmrg In this specific case, the generated code is:
3448fb7bfaSmrg
3548fb7bfaSmrg f:
3648fb7bfaSmrg ldi r24,lo8(gs(__countlsHI))
3748fb7bfaSmrg ldi r25,hi8(gs(__countlsHI))
3848fb7bfaSmrg ret
3948fb7bfaSmrg */
4048fb7bfaSmrg
4148fb7bfaSmrg /* Map fixed-point suffix to the corresponding fixed-point type. */
4248fb7bfaSmrg
4348fb7bfaSmrg typedef short _Fract fx_hr_t;
4448fb7bfaSmrg typedef _Fract fx_r_t;
4548fb7bfaSmrg typedef long _Fract fx_lr_t;
4648fb7bfaSmrg typedef long long _Fract fx_llr_t;
4748fb7bfaSmrg
4848fb7bfaSmrg typedef unsigned short _Fract fx_uhr_t;
4948fb7bfaSmrg typedef unsigned _Fract fx_ur_t;
5048fb7bfaSmrg typedef unsigned long _Fract fx_ulr_t;
5148fb7bfaSmrg typedef unsigned long long _Fract fx_ullr_t;
5248fb7bfaSmrg
5348fb7bfaSmrg typedef short _Accum fx_hk_t;
5448fb7bfaSmrg typedef _Accum fx_k_t;
5548fb7bfaSmrg typedef long _Accum fx_lk_t;
5648fb7bfaSmrg typedef long long _Accum fx_llk_t;
5748fb7bfaSmrg
5848fb7bfaSmrg typedef unsigned short _Accum fx_uhk_t;
5948fb7bfaSmrg typedef unsigned _Accum fx_uk_t;
6048fb7bfaSmrg typedef unsigned long _Accum fx_ulk_t;
6148fb7bfaSmrg typedef unsigned long long _Accum fx_ullk_t;
6248fb7bfaSmrg
6348fb7bfaSmrg /* Map fixed-point suffix to the corresponding natural integer type. */
6448fb7bfaSmrg
6548fb7bfaSmrg typedef char int_hr_t;
6648fb7bfaSmrg typedef int int_r_t;
6748fb7bfaSmrg typedef long int_lr_t;
6848fb7bfaSmrg typedef long long int_llr_t;
6948fb7bfaSmrg
7048fb7bfaSmrg typedef unsigned char int_uhr_t;
7148fb7bfaSmrg typedef unsigned int int_ur_t;
7248fb7bfaSmrg typedef unsigned long int_ulr_t;
7348fb7bfaSmrg typedef unsigned long long int_ullr_t;
7448fb7bfaSmrg
7548fb7bfaSmrg typedef int int_hk_t;
7648fb7bfaSmrg typedef long int_k_t;
7748fb7bfaSmrg typedef long long int_lk_t;
7848fb7bfaSmrg typedef long long int_llk_t;
7948fb7bfaSmrg
8048fb7bfaSmrg typedef unsigned int int_uhk_t;
8148fb7bfaSmrg typedef unsigned long int_uk_t;
8248fb7bfaSmrg typedef unsigned long long int_ulk_t;
8348fb7bfaSmrg typedef unsigned long long int_ullk_t;
8448fb7bfaSmrg
8548fb7bfaSmrg /* Map mode to the corresponding integer type. */
8648fb7bfaSmrg
8748fb7bfaSmrg typedef char int_qi_t;
8848fb7bfaSmrg typedef int int_hi_t;
8948fb7bfaSmrg typedef long int_si_t;
9048fb7bfaSmrg typedef long long int_di_t;
9148fb7bfaSmrg
9248fb7bfaSmrg typedef unsigned char uint_qi_t;
9348fb7bfaSmrg typedef unsigned int uint_hi_t;
9448fb7bfaSmrg typedef unsigned long uint_si_t;
9548fb7bfaSmrg typedef unsigned long long uint_di_t;
9648fb7bfaSmrg
9748fb7bfaSmrg
9848fb7bfaSmrg
9948fb7bfaSmrg /************************************************************************/
10048fb7bfaSmrg
10148fb7bfaSmrg /* Supply implementations / symbols for __builtin_roundFX ASM_NAME. */
10248fb7bfaSmrg
10348fb7bfaSmrg #ifdef L_round
10448fb7bfaSmrg
10548fb7bfaSmrg #define ROUND1(FX) \
10648fb7bfaSmrg ROUND2 (FX)
10748fb7bfaSmrg
10848fb7bfaSmrg #define ROUND2(FX) \
10948fb7bfaSmrg extern fx_## FX ##_t __round## FX (fx_## FX ##_t x, int rpoint); \
11048fb7bfaSmrg \
11148fb7bfaSmrg fx_## FX ##_t \
11248fb7bfaSmrg __round## FX (fx_## FX ##_t x, int rpoint) \
11348fb7bfaSmrg { \
11448fb7bfaSmrg return __builtin_avr_round ##FX (x, rpoint); \
11548fb7bfaSmrg }
11648fb7bfaSmrg
11748fb7bfaSmrg ROUND1(L_LABEL)
11848fb7bfaSmrg
11948fb7bfaSmrg #endif /* L_round */
12048fb7bfaSmrg
12148fb7bfaSmrg
12248fb7bfaSmrg
12348fb7bfaSmrg /*********************************************************************/
12448fb7bfaSmrg
12548fb7bfaSmrg /* Implement some count-leading-redundant-sign-bits to be used with
12648fb7bfaSmrg coundlsFX implementation. */
12748fb7bfaSmrg
12848fb7bfaSmrg #ifdef L__clrsbqi
12948fb7bfaSmrg extern int __clrsbqi2 (char x);
13048fb7bfaSmrg
13148fb7bfaSmrg int
__clrsbqi2(char x)13248fb7bfaSmrg __clrsbqi2 (char x)
13348fb7bfaSmrg {
13448fb7bfaSmrg int ret;
13548fb7bfaSmrg
13648fb7bfaSmrg if (x < 0)
13748fb7bfaSmrg x = ~x;
13848fb7bfaSmrg
13948fb7bfaSmrg if (x == 0)
14048fb7bfaSmrg return 8 * sizeof (x) -1;
14148fb7bfaSmrg
14248fb7bfaSmrg ret = __builtin_clz (x << 8);
14348fb7bfaSmrg return ret - 1;
14448fb7bfaSmrg }
14548fb7bfaSmrg #endif /* L__clrsbqi */
14648fb7bfaSmrg
14748fb7bfaSmrg
14848fb7bfaSmrg #ifdef L__clrsbdi
14948fb7bfaSmrg extern int __clrsbdi2 (long long x);
15048fb7bfaSmrg
15148fb7bfaSmrg int
__clrsbdi2(long long x)15248fb7bfaSmrg __clrsbdi2 (long long x)
15348fb7bfaSmrg {
15448fb7bfaSmrg int ret;
15548fb7bfaSmrg
15648fb7bfaSmrg if (x < 0LL)
15748fb7bfaSmrg x = ~x;
15848fb7bfaSmrg
15948fb7bfaSmrg if (x == 0LL)
16048fb7bfaSmrg return 8 * sizeof (x) -1;
16148fb7bfaSmrg
16248fb7bfaSmrg ret = __builtin_clzll ((unsigned long long) x);
16348fb7bfaSmrg return ret - 1;
16448fb7bfaSmrg }
16548fb7bfaSmrg #endif /* L__clrsbdi */
16648fb7bfaSmrg
16748fb7bfaSmrg
16848fb7bfaSmrg
16948fb7bfaSmrg /*********************************************************************/
17048fb7bfaSmrg
17148fb7bfaSmrg /* Supply implementations / symbols for __builtin_avr_countlsFX. */
17248fb7bfaSmrg
17348fb7bfaSmrg /* Signed */
17448fb7bfaSmrg
17548fb7bfaSmrg #ifdef L_countls
17648fb7bfaSmrg
17748fb7bfaSmrg #define COUNTLS1(MM) \
17848fb7bfaSmrg COUNTLS2 (MM)
17948fb7bfaSmrg
18048fb7bfaSmrg #define COUNTLS2(MM) \
18148fb7bfaSmrg extern int __countls## MM ##2 (int_## MM ##_t); \
18248fb7bfaSmrg extern int __clrsb## MM ##2 (int_## MM ##_t); \
18348fb7bfaSmrg \
18448fb7bfaSmrg int \
18548fb7bfaSmrg __countls## MM ##2 (int_## MM ##_t x) \
18648fb7bfaSmrg { \
18748fb7bfaSmrg if (x == 0) \
18848fb7bfaSmrg return __INT8_MAX__; \
18948fb7bfaSmrg \
19048fb7bfaSmrg return __clrsb## MM ##2 (x); \
19148fb7bfaSmrg }
19248fb7bfaSmrg
19348fb7bfaSmrg COUNTLS1(L_LABEL)
19448fb7bfaSmrg
19548fb7bfaSmrg #endif /* L_countls */
19648fb7bfaSmrg
19748fb7bfaSmrg /* Unsigned */
19848fb7bfaSmrg
19948fb7bfaSmrg #ifdef L_countlsu
20048fb7bfaSmrg
20148fb7bfaSmrg #define clz_qi2 __builtin_clz /* unused, avoid warning */
20248fb7bfaSmrg #define clz_hi2 __builtin_clz
20348fb7bfaSmrg #define clz_si2 __builtin_clzl
20448fb7bfaSmrg #define clz_di2 __builtin_clzll
20548fb7bfaSmrg
20648fb7bfaSmrg #define COUNTLS1(MM) \
20748fb7bfaSmrg COUNTLS2 (MM)
20848fb7bfaSmrg
20948fb7bfaSmrg #define COUNTLS2(MM) \
21048fb7bfaSmrg extern int __countlsu## MM ##2 (uint_## MM ##_t); \
21148fb7bfaSmrg \
21248fb7bfaSmrg int \
21348fb7bfaSmrg __countlsu## MM ##2 (uint_## MM ##_t x) \
21448fb7bfaSmrg { \
21548fb7bfaSmrg if (x == 0) \
21648fb7bfaSmrg return __INT8_MAX__; \
21748fb7bfaSmrg \
21848fb7bfaSmrg if (sizeof (x) == 1) \
21948fb7bfaSmrg return clz_hi2 (x << 8); \
22048fb7bfaSmrg else \
22148fb7bfaSmrg return clz_## MM ##2 (x); \
22248fb7bfaSmrg }
22348fb7bfaSmrg
22448fb7bfaSmrg COUNTLS1(L_LABEL)
22548fb7bfaSmrg
22648fb7bfaSmrg #endif /* L_countlsu */
227