t-avr revision 1.1.1.1.2.1
1LIB1ASMSRC = avr/lib1funcs.S
2LIB1ASMFUNCS = \
3	_mulqi3 \
4	_mulhi3 \
5	_mulqihi3 _umulqihi3 \
6	_mulpsi3 _mulsqipsi3 \
7	_mulhisi3 \
8	_umulhisi3 \
9	_usmulhisi3 \
10	_muluhisi3 \
11	_mulshisi3 \
12	_mulsi3 \
13	_udivmodqi4 \
14	_divmodqi4 \
15	_udivmodhi4 \
16	_divmodhi4 \
17	_divmodpsi4 _udivmodpsi4 \
18	_udivmodsi4 \
19	_divmodsi4 \
20	_divdi3 _udivdi3 \
21	_muldi3 _muldi3_6 \
22	_mulsidi3 _umulsidi3 \
23	_udivmod64 \
24	_negsi2 _negdi2 \
25	_prologue \
26	_epilogue \
27	_exit \
28	_cleanup \
29	_tablejump \
30	_tablejump_elpm \
31	_load_3 _load_4 \
32	_xload_1 _xload_2 _xload_3 _xload_4 \
33	_movmemx \
34	_copy_data \
35	_clear_bss \
36	_ctors \
37	_dtors \
38	_ffssi2 \
39	_ffshi2 \
40	_loop_ffsqi2 \
41	_ctzsi2 \
42	_ctzhi2 \
43	_clzdi2 \
44	_clzsi2 \
45	_clzhi2 \
46	_paritydi2 \
47	_paritysi2 \
48	_parityhi2 \
49	_popcounthi2 \
50	_popcountsi2 \
51	_popcountdi2 \
52	_popcountqi2 \
53	_bswapsi2 \
54	_bswapdi2 \
55	_ashldi3 _ashrdi3 _lshrdi3 _rotldi3 \
56	_adddi3 _adddi3_s8 _subdi3 \
57	_cmpdi2 _cmpdi2_s8 \
58	_fmul _fmuls _fmulsu
59
60# Fixed point routines in avr/lib1funcs-fixed.S
61LIB1ASMFUNCS += \
62	_fractqqsf _fractuqqsf \
63	_fracthqsf _fractuhqsf _fracthasf _fractuhasf \
64	_fractsasf _fractusasf _fractsqsf _fractusqsf \
65	\
66	_fractsfqq _fractsfuqq \
67	_fractsfhq _fractsfuhq _fractsfha _fractsfuha \
68	_fractsfsq _fractsfusq _fractsfsa _fractsfusa \
69	_mulqq3 \
70	_mulhq3 _muluhq3 \
71	_mulha3 _muluha3 _muluha3_round \
72	_mulsa3 _mulusa3 \
73	_usmuluha3 _ssmulha3 \
74	_usmulusa3 _ssmulsa3 \
75	_divqq3 _udivuqq3 _divqq_helper \
76	_divhq3 _udivuhq3 \
77	_divha3 _udivuha3 \
78	_divsa3 _udivusa3 \
79	_clr_8 \
80	_ssneg_2 _ssneg_4 _ssneg_8 \
81	_ssabs_1 _ssabs_2 _ssabs_4 _ssabs_8 \
82	_ssadd_8 _sssub_8 \
83	_usadd_8 _ussub_8 \
84	_mask1 _ret \
85	_roundqq3 _rounduqq3 \
86	_round_s2 _round_u2 _round_2_const _addmask_2 \
87	_round_s4 _round_u4 _round_4_const _addmask_4 \
88	_round_x8 \
89	_rounddq3 _roundudq3 \
90	_roundda3 _rounduda3 \
91	_roundta3 _rounduta3 \
92
93
94LIB2FUNCS_EXCLUDE = \
95	_moddi3 _umoddi3 \
96	_clz \
97	_clrsbdi2 \
98
99
100# We do not have the DF type.
101# Most of the C functions in libgcc2 use almost all registers,
102# so use -mcall-prologues for smaller code size.
103HOST_LIBGCC2_CFLAGS += -DDF=SF -Dinhibit_libc -mcall-prologues -Os
104
105# Extra 16-bit integer functions.
106intfuncs16 = _absvXX2 _addvXX3 _subvXX3 _mulvXX3 _negvXX2 _clrsbXX2
107
108hiintfuncs16 = $(subst XX,hi,$(intfuncs16))
109siintfuncs16 = $(subst XX,si,$(intfuncs16))
110
111iter-items := $(hiintfuncs16)
112iter-labels := $(siintfuncs16)
113iter-sizes := $(patsubst %,2,$(siintfuncs16)) $(patsubst %,2,$(hiintfuncs16))
114
115
116include $(srcdir)/empty.mk $(patsubst %,$(srcdir)/siditi-object.mk,$(iter-items))
117libgcc-objects += $(patsubst %,%$(objext),$(hiintfuncs16))
118
119ifeq ($(enable_shared),yes)
120libgcc-s-objects += $(patsubst %,%_s$(objext),$(hiintfuncs16))
121endif
122
123###
124
125conv_XY=$(conv)$(mode1)$(mode2)
126func_X=$(func)$(mode)
127
128# Compile C functions from lib2funcs.c and add them to libgcc.a.
129#
130# Some functions which are not performance.critical are more convenient
131# to implement in C than in assembler.  Most of them serve as implementation
132# for AVR-specific builtins in the case where the address of a builtin
133# function is taken or if there is no insn that implements the builtin.
134#
135# We don't use LIB2ADD because we want to iterate over the source for
136# different modes, fixed-point suffixes, etc.  See iter-labels and L_LABEL.
137# iter-label will get one more underscore in order to avoid too short
138# labels like -DLk and we use -DL_k instead.
139
140# Build roundFX functions from lib2funcs.c
141
142round_suffix :=  hr r lr uhr ur ulr  \
143		 hk k    uhk uk 
144round_funcs  := $(foreach func,_round,\
145		$(foreach mode,$(round_suffix),$(func_X)))
146
147iter-items  := $(round_funcs)
148iter-labels := $(round_suffix)
149iter-flags  := $(patsubst %,-DL_round,$(iter-items))
150
151include $(srcdir)/empty.mk $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items))
152
153libgcc-objects += $(patsubst %,%$(objext),$(round_funcs))
154
155# Build clrsbXX functions from lib2funcs.c
156
157clrsb_modes := qi di
158clrsb_funcs := $(foreach func,_clrsb,\
159	       $(foreach mode,$(clrsb_modes),$(func_X)))
160
161iter-items  := $(clrsb_funcs)
162iter-labels := $(clrsb_funcs)
163iter-flags  := $(patsubst %,-DL_clrsb,$(iter-items))
164
165include $(srcdir)/empty.mk $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items))
166
167libgcc-objects += $(patsubst %,%$(objext),$(clrsb_funcs))
168
169# Build signed countlsFX functions from lib2funcs.c
170
171countls_modes := qi hi si di
172countls_funcs := $(foreach func,_countls,\
173		 $(foreach mode,$(countls_modes),$(func_X)))
174
175iter-items  := $(countls_funcs)
176iter-labels := $(countls_modes)
177iter-flags  := $(patsubst %,-DL_countls,$(iter-items))
178
179include $(srcdir)/empty.mk $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items))
180
181libgcc-objects += $(patsubst %,%$(objext),$(countls_funcs))
182
183# Build unsigned countlsFX functions from lib2funcs.c
184
185countlsu_modes := qi hi si di
186countlsu_funcs := $(foreach func,_countlsu,\
187		  $(foreach mode,$(countlsu_modes),$(func_X)))
188
189iter-items  := $(countlsu_funcs)
190iter-labels := $(countlsu_modes)
191iter-flags  := $(patsubst %,-DL_countlsu,$(iter-items))
192
193include $(srcdir)/empty.mk $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items))
194
195libgcc-objects += $(patsubst %,%$(objext),$(countlsu_funcs))
196
197
198# Filter out supported conversions from fixed-bit.c
199# Also filter out TQ and UTQ.
200
201# Conversions supported by the compiler
202
203convf_modes =	 QI UQI QQ UQQ \
204		 HI UHI HQ UHQ HA UHA \
205		 SI USI SQ USQ SA USA \
206		 DI UDI DQ UDQ DA UDA \
207		 TI UTI TQ UTQ TA UTA
208
209LIB2FUNCS_EXCLUDE += \
210	$(foreach conv,_fract _fractuns,\
211	$(foreach mode1,$(convf_modes),\
212	$(foreach mode2,$(convf_modes),$(conv_XY))))
213
214# Conversions supported by lib1funcs-fixed.S
215
216conv_to_sf_modes   = QQ UQQ HQ UHQ HA UHA SQ USQ SA USA
217conv_from_sf_modes = QQ UQQ HQ UHQ HA UHA        SA USA
218
219LIB2FUNCS_EXCLUDE += \
220	$(foreach conv,_fract, \
221	$(foreach mode1,$(conv_to_sf_modes), \
222	$(foreach mode2,SF,$(conv_XY))))
223
224LIB2FUNCS_EXCLUDE += \
225	$(foreach conv,_fract,\
226	$(foreach mode1,SF,\
227	$(foreach mode2,$(conv_from_sf_modes),$(conv_XY))))
228
229# Arithmetik supported by the compiler
230
231allfix_modes = QQ UQQ HQ UHQ HA UHA SQ USQ SA USA DA UDA DQ UDQ TQ UTQ TA UTA
232
233LIB2FUNCS_EXCLUDE += \
234	$(foreach func,_add _sub,\
235	$(foreach mode,$(allfix_modes),$(func_X)))
236
237LIB2FUNCS_EXCLUDE += \
238	$(foreach func,_lshr _ashl _ashr _cmp,\
239	$(foreach mode,$(allfix_modes),$(func_X)))
240
241
242usat_modes = UQQ UHQ UHA USQ USA UDQ UDA UTQ UTA
243ssat_modes =  QQ  HQ  HA  SQ  SA  DQ  DA  TQ  TA
244
245LIB2FUNCS_EXCLUDE += \
246	$(foreach func,_ssadd _sssub _ssneg _ssabs,\
247	$(foreach mode,$(ssat_modes),$(func_X)))
248
249LIB2FUNCS_EXCLUDE += \
250	$(foreach func,_usadd _ussub _usneg,\
251	$(foreach mode,$(usat_modes),$(func_X)))
252
253
254smul_modes =  QQ  HQ  HA  SA
255umul_modes = UQQ UHQ UHA USA
256sdiv_modes =  QQ  HQ  HA  SA
257udiv_modes = UQQ UHQ UHA USA
258
259LIB2FUNCS_EXCLUDE += \
260	$(foreach func,_mul,\
261	$(foreach mode,$(smul_modes) $(umul_modes),$(func_X)))
262
263LIB2FUNCS_EXCLUDE += \
264	$(foreach func,_div,\
265	$(foreach mode,$(sdiv_modes) $(udiv_modes),$(func_X)))
266
267
268ssmul_modes =  HA  SA
269usmul_modes = UHA USA
270
271LIB2FUNCS_EXCLUDE += \
272	$(foreach func,_usmul,\
273	$(foreach mode,$(usmul_modes),$(func_X)))
274
275LIB2FUNCS_EXCLUDE += \
276	$(foreach func,_ssmul,\
277	$(foreach mode,$(ssmul_modes),$(func_X)))
278