annotate libgcc/config/avr/lib2funcs.c @ 120:f93fa5091070

fix conv1.c
author mir3636
date Thu, 08 Mar 2018 14:53:42 +0900
parents 04ced10e8804
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Copyright (C) 2013-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 This file is part of GCC.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
6 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
7 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
8 version.
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
13 for more details.
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
16 permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
17 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
20 a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
22 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 /* This file supplies implementations for some AVR-specific builtin
kono
parents:
diff changeset
26 functions so that code like the following works as expected:
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 int (*f (void))(_Fract)
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 return __builtin_avr_countlsr;
kono
parents:
diff changeset
31 }
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 In this specific case, the generated code is:
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 f:
kono
parents:
diff changeset
36 ldi r24,lo8(gs(__countlsHI))
kono
parents:
diff changeset
37 ldi r25,hi8(gs(__countlsHI))
kono
parents:
diff changeset
38 ret
kono
parents:
diff changeset
39 */
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 /* Map fixed-point suffix to the corresponding fixed-point type. */
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 typedef short _Fract fx_hr_t;
kono
parents:
diff changeset
44 typedef _Fract fx_r_t;
kono
parents:
diff changeset
45 typedef long _Fract fx_lr_t;
kono
parents:
diff changeset
46 typedef long long _Fract fx_llr_t;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 typedef unsigned short _Fract fx_uhr_t;
kono
parents:
diff changeset
49 typedef unsigned _Fract fx_ur_t;
kono
parents:
diff changeset
50 typedef unsigned long _Fract fx_ulr_t;
kono
parents:
diff changeset
51 typedef unsigned long long _Fract fx_ullr_t;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 typedef short _Accum fx_hk_t;
kono
parents:
diff changeset
54 typedef _Accum fx_k_t;
kono
parents:
diff changeset
55 typedef long _Accum fx_lk_t;
kono
parents:
diff changeset
56 typedef long long _Accum fx_llk_t;
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 typedef unsigned short _Accum fx_uhk_t;
kono
parents:
diff changeset
59 typedef unsigned _Accum fx_uk_t;
kono
parents:
diff changeset
60 typedef unsigned long _Accum fx_ulk_t;
kono
parents:
diff changeset
61 typedef unsigned long long _Accum fx_ullk_t;
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Map fixed-point suffix to the corresponding natural integer type. */
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 typedef char int_hr_t;
kono
parents:
diff changeset
66 typedef int int_r_t;
kono
parents:
diff changeset
67 typedef long int_lr_t;
kono
parents:
diff changeset
68 typedef long long int_llr_t;
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 typedef unsigned char int_uhr_t;
kono
parents:
diff changeset
71 typedef unsigned int int_ur_t;
kono
parents:
diff changeset
72 typedef unsigned long int_ulr_t;
kono
parents:
diff changeset
73 typedef unsigned long long int_ullr_t;
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 typedef int int_hk_t;
kono
parents:
diff changeset
76 typedef long int_k_t;
kono
parents:
diff changeset
77 typedef long long int_lk_t;
kono
parents:
diff changeset
78 typedef long long int_llk_t;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 typedef unsigned int int_uhk_t;
kono
parents:
diff changeset
81 typedef unsigned long int_uk_t;
kono
parents:
diff changeset
82 typedef unsigned long long int_ulk_t;
kono
parents:
diff changeset
83 typedef unsigned long long int_ullk_t;
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 /* Map mode to the corresponding integer type. */
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 typedef char int_qi_t;
kono
parents:
diff changeset
88 typedef int int_hi_t;
kono
parents:
diff changeset
89 typedef long int_si_t;
kono
parents:
diff changeset
90 typedef long long int_di_t;
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 typedef unsigned char uint_qi_t;
kono
parents:
diff changeset
93 typedef unsigned int uint_hi_t;
kono
parents:
diff changeset
94 typedef unsigned long uint_si_t;
kono
parents:
diff changeset
95 typedef unsigned long long uint_di_t;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 /************************************************************************/
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 /* Supply implementations / symbols for __builtin_roundFX ASM_NAME. */
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 #ifdef L_round
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 #define ROUND1(FX) \
kono
parents:
diff changeset
106 ROUND2 (FX)
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 #define ROUND2(FX) \
kono
parents:
diff changeset
109 extern fx_## FX ##_t __round## FX (fx_## FX ##_t x, int rpoint); \
kono
parents:
diff changeset
110 \
kono
parents:
diff changeset
111 fx_## FX ##_t \
kono
parents:
diff changeset
112 __round## FX (fx_## FX ##_t x, int rpoint) \
kono
parents:
diff changeset
113 { \
kono
parents:
diff changeset
114 return __builtin_avr_round ##FX (x, rpoint); \
kono
parents:
diff changeset
115 }
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 ROUND1(L_LABEL)
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 #endif /* L_round */
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 /*********************************************************************/
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 /* Implement some count-leading-redundant-sign-bits to be used with
kono
parents:
diff changeset
126 coundlsFX implementation. */
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 #ifdef L__clrsbqi
kono
parents:
diff changeset
129 extern int __clrsbqi2 (char x);
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 int
kono
parents:
diff changeset
132 __clrsbqi2 (char x)
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 int ret;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 if (x < 0)
kono
parents:
diff changeset
137 x = ~x;
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 if (x == 0)
kono
parents:
diff changeset
140 return 8 * sizeof (x) -1;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 ret = __builtin_clz (x << 8);
kono
parents:
diff changeset
143 return ret - 1;
kono
parents:
diff changeset
144 }
kono
parents:
diff changeset
145 #endif /* L__clrsbqi */
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 #ifdef L__clrsbdi
kono
parents:
diff changeset
149 extern int __clrsbdi2 (long long x);
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 int
kono
parents:
diff changeset
152 __clrsbdi2 (long long x)
kono
parents:
diff changeset
153 {
kono
parents:
diff changeset
154 int ret;
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 if (x < 0LL)
kono
parents:
diff changeset
157 x = ~x;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 if (x == 0LL)
kono
parents:
diff changeset
160 return 8 * sizeof (x) -1;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 ret = __builtin_clzll ((unsigned long long) x);
kono
parents:
diff changeset
163 return ret - 1;
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165 #endif /* L__clrsbdi */
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 /*********************************************************************/
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 /* Supply implementations / symbols for __builtin_avr_countlsFX. */
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 /* Signed */
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 #ifdef L_countls
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 #define COUNTLS1(MM) \
kono
parents:
diff changeset
178 COUNTLS2 (MM)
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 #define COUNTLS2(MM) \
kono
parents:
diff changeset
181 extern int __countls## MM ##2 (int_## MM ##_t); \
kono
parents:
diff changeset
182 extern int __clrsb## MM ##2 (int_## MM ##_t); \
kono
parents:
diff changeset
183 \
kono
parents:
diff changeset
184 int \
kono
parents:
diff changeset
185 __countls## MM ##2 (int_## MM ##_t x) \
kono
parents:
diff changeset
186 { \
kono
parents:
diff changeset
187 if (x == 0) \
kono
parents:
diff changeset
188 return __INT8_MAX__; \
kono
parents:
diff changeset
189 \
kono
parents:
diff changeset
190 return __clrsb## MM ##2 (x); \
kono
parents:
diff changeset
191 }
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 COUNTLS1(L_LABEL)
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 #endif /* L_countls */
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 /* Unsigned */
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 #ifdef L_countlsu
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 #define clz_qi2 __builtin_clz /* unused, avoid warning */
kono
parents:
diff changeset
202 #define clz_hi2 __builtin_clz
kono
parents:
diff changeset
203 #define clz_si2 __builtin_clzl
kono
parents:
diff changeset
204 #define clz_di2 __builtin_clzll
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 #define COUNTLS1(MM) \
kono
parents:
diff changeset
207 COUNTLS2 (MM)
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 #define COUNTLS2(MM) \
kono
parents:
diff changeset
210 extern int __countlsu## MM ##2 (uint_## MM ##_t); \
kono
parents:
diff changeset
211 \
kono
parents:
diff changeset
212 int \
kono
parents:
diff changeset
213 __countlsu## MM ##2 (uint_## MM ##_t x) \
kono
parents:
diff changeset
214 { \
kono
parents:
diff changeset
215 if (x == 0) \
kono
parents:
diff changeset
216 return __INT8_MAX__; \
kono
parents:
diff changeset
217 \
kono
parents:
diff changeset
218 if (sizeof (x) == 1) \
kono
parents:
diff changeset
219 return clz_hi2 (x << 8); \
kono
parents:
diff changeset
220 else \
kono
parents:
diff changeset
221 return clz_## MM ##2 (x); \
kono
parents:
diff changeset
222 }
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 COUNTLS1(L_LABEL)
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 #endif /* L_countlsu */