LIB1ASMSRC = avr/lib1funcs.S LIB1ASMFUNCS = \ _mulqi3 \ _mulhi3 \ _mulqihi3 _umulqihi3 \ _mulpsi3 \ _mulsi3 \ _udivmodqi4 \ _divmodqi4 \ _udivmodhi4 \ _divmodhi4 \ _divmodpsi4 _udivmodpsi4 \ _udivmodsi4 \ _divmodsi4 \ _negsi2 \ _exit \ _cleanup \ _tablejump2 \ _copy_data \ _clear_bss \ _ctors \ _dtors \ _ffssi2 \ _ffshi2 \ _loop_ffsqi2 \ _ctzsi2 \ _ctzhi2 \ _clzsi2 \ _clzhi2 \ _paritysi2 \ _parityhi2 \ _popcounthi2 \ _popcountsi2 \ _popcountqi2 \ _bswapsi2 \ _fmul _fmuls _fmulsu # The below functions either use registers that are not present # in tiny core, or use a different register conventions (don't save # callee saved regs, for example) # _mulhisi3 and variations - clobber R18, R19 # All *di funcs - use regs < R16 or expect args in regs < R20 # _prologue and _epilogue save registers < R16 # _load ad _xload variations - expect lpm and elpm support # _movmemx - expects elpm/lpm ifneq ($(MULTIFLAGS),-mmcu=avrtiny) LIB1ASMFUNCS += \ _mulsqipsi3 \ _mulhisi3 \ _umulhisi3 \ _usmulhisi3 \ _muluhisi3 \ _mulshisi3 \ _muldi3 _muldi3_6 \ _mulsidi3 _umulsidi3 \ _divdi3 _udivdi3 \ _udivmod64 \ _negdi2 \ _prologue \ _epilogue \ _load_3 _load_4 \ _xload_1 _xload_2 _xload_3 _xload_4 \ _movmemx \ _clzdi2 \ _paritydi2 \ _popcountdi2 \ _bswapdi2 \ _ashldi3 _ashrdi3 _lshrdi3 _rotldi3 \ _adddi3 _adddi3_s8 _subdi3 \ _cmpdi2 _cmpdi2_s8 \ _powif endif # Fixed point routines in avr/lib1funcs-fixed.S ifneq ($(MULTIFLAGS),-mmcu=avrtiny) LIB1ASMFUNCS += \ _fractqqsf _fractuqqsf \ _fracthqsf _fractuhqsf _fracthasf _fractuhasf \ _fractsasf _fractusasf _fractsqsf _fractusqsf \ \ _fractsfqq _fractsfuqq \ _fractsfhq _fractsfuhq _fractsfha _fractsfuha \ _fractsfsq _fractsfusq _fractsfsa _fractsfusa \ _mulqq3 \ _mulhq3 _muluhq3 \ _mulha3 _muluha3 _muluha3_round \ _mulsa3 _mulusa3 \ _usmuluha3 _ssmulha3 \ _usmulusa3 _ssmulsa3 \ _divqq3 _udivuqq3 _divqq_helper \ _divhq3 _udivuhq3 \ _divha3 _udivuha3 \ _divsa3 _udivusa3 \ _clr_8 \ _ssneg_2 _ssneg_4 _ssneg_8 \ _ssabs_1 _ssabs_2 _ssabs_4 _ssabs_8 \ _ssadd_8 _sssub_8 \ _usadd_8 _ussub_8 \ _mask1 _ret \ _roundqq3 _rounduqq3 \ _round_s2 _round_u2 _round_2_const _addmask_2 \ _round_s4 _round_u4 _round_4_const _addmask_4 \ _round_x8 \ _rounddq3 _roundudq3 \ _roundda3 _rounduda3 \ _roundta3 _rounduta3 endif LIB2FUNCS_EXCLUDE = \ _moddi3 _umoddi3 \ _clz \ _clrsbdi2 \ _powisf2 ifeq ($(long_double_type_size),32) # We do not have the DFtype. HOST_LIBGCC2_CFLAGS += -DDF=SF endif # Most of the C functions in libgcc2 use almost all registers, # so use -mcall-prologues for smaller code size. HOST_LIBGCC2_CFLAGS += -Dinhibit_libc -mcall-prologues -Os # Extra 16-bit integer functions. intfuncs16 = _absvXX2 _addvXX3 _subvXX3 _mulvXX3 _negvXX2 _clrsbXX2 hiintfuncs16 = $(subst XX,hi,$(intfuncs16)) siintfuncs16 = $(subst XX,si,$(intfuncs16)) iter-items := $(hiintfuncs16) iter-labels := $(siintfuncs16) iter-sizes := $(patsubst %,2,$(siintfuncs16)) $(patsubst %,2,$(hiintfuncs16)) -include $(patsubst %,$(srcdir)/siditi-object.mk,$(iter-items)) libgcc-objects += $(patsubst %,%$(objext),$(hiintfuncs16)) ifeq ($(enable_shared),yes) libgcc-s-objects += $(patsubst %,%_s$(objext),$(hiintfuncs16)) endif ### conv_XY=$(conv)$(mode1)$(mode2) func_X=$(func)$(mode) # Compile C functions from lib2funcs.c and add them to libgcc.a. # # Some functions which are not performance.critical are more convenient # to implement in C than in assembler. Most of them serve as implementation # for AVR-specific builtins in the case where the address of a builtin # function is taken or if there is no insn that implements the builtin. # # We don't use LIB2ADD because we want to iterate over the source for # different modes, fixed-point suffixes, etc. See iter-labels and L_LABEL. # iter-label will get one more underscore in order to avoid too short # labels like -DLk and we use -DL_k instead. # Build roundFX functions from lib2funcs.c round_suffix := hr r lr uhr ur ulr \ hk k uhk uk round_funcs := $(foreach func,_round,\ $(foreach mode,$(round_suffix),$(func_X))) iter-items := $(round_funcs) iter-labels := $(round_suffix) iter-flags := $(patsubst %,-DL_round,$(iter-items)) -include $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items)) libgcc-objects += $(patsubst %,%$(objext),$(round_funcs)) # Build clrsbXX functions from lib2funcs.c clrsb_modes := qi di clrsb_funcs := $(foreach func,_clrsb,\ $(foreach mode,$(clrsb_modes),$(func_X))) iter-items := $(clrsb_funcs) iter-labels := $(clrsb_funcs) iter-flags := $(patsubst %,-DL_clrsb,$(iter-items)) -include $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items)) libgcc-objects += $(patsubst %,%$(objext),$(clrsb_funcs)) # Build signed countlsFX functions from lib2funcs.c countls_modes := qi hi si di countls_funcs := $(foreach func,_countls,\ $(foreach mode,$(countls_modes),$(func_X))) iter-items := $(countls_funcs) iter-labels := $(countls_modes) iter-flags := $(patsubst %,-DL_countls,$(iter-items)) -include $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items)) libgcc-objects += $(patsubst %,%$(objext),$(countls_funcs)) # Build unsigned countlsFX functions from lib2funcs.c countlsu_modes := qi hi si di countlsu_funcs := $(foreach func,_countlsu,\ $(foreach mode,$(countlsu_modes),$(func_X))) iter-items := $(countlsu_funcs) iter-labels := $(countlsu_modes) iter-flags := $(patsubst %,-DL_countlsu,$(iter-items)) -include $(patsubst %,$(srcdir)/config/avr/lib2-object.mk,$(iter-items)) libgcc-objects += $(patsubst %,%$(objext),$(countlsu_funcs)) # Filter out supported conversions from fixed-bit.c # Also filter out TQ and UTQ. # Conversions supported by the compiler convf_modes = QI UQI QQ UQQ \ HI UHI HQ UHQ HA UHA \ SI USI SQ USQ SA USA \ DI UDI DQ UDQ DA UDA \ TI UTI TQ UTQ TA UTA LIB2FUNCS_EXCLUDE += \ $(foreach conv,_fract _fractuns,\ $(foreach mode1,$(convf_modes),\ $(foreach mode2,$(convf_modes),$(conv_XY)))) # Conversions supported by lib1funcs-fixed.S conv_to_sf_modes = QQ UQQ HQ UHQ HA UHA SQ USQ SA USA conv_from_sf_modes = QQ UQQ HQ UHQ HA UHA SA USA LIB2FUNCS_EXCLUDE += \ $(foreach conv,_fract, \ $(foreach mode1,$(conv_to_sf_modes), \ $(foreach mode2,SF,$(conv_XY)))) LIB2FUNCS_EXCLUDE += \ $(foreach conv,_fract,\ $(foreach mode1,SF,\ $(foreach mode2,$(conv_from_sf_modes),$(conv_XY)))) # Arithmetik supported by the compiler allfix_modes = QQ UQQ HQ UHQ HA UHA SQ USQ SA USA DA UDA DQ UDQ TQ UTQ TA UTA LIB2FUNCS_EXCLUDE += \ $(foreach func,_add _sub,\ $(foreach mode,$(allfix_modes),$(func_X))) LIB2FUNCS_EXCLUDE += \ $(foreach func,_lshr _ashl _ashr _cmp,\ $(foreach mode,$(allfix_modes),$(func_X))) usat_modes = UQQ UHQ UHA USQ USA UDQ UDA UTQ UTA ssat_modes = QQ HQ HA SQ SA DQ DA TQ TA LIB2FUNCS_EXCLUDE += \ $(foreach func,_ssadd _sssub _ssneg _ssabs,\ $(foreach mode,$(ssat_modes),$(func_X))) LIB2FUNCS_EXCLUDE += \ $(foreach func,_usadd _ussub _usneg,\ $(foreach mode,$(usat_modes),$(func_X))) smul_modes = QQ HQ HA SA umul_modes = UQQ UHQ UHA USA sdiv_modes = QQ HQ HA SA udiv_modes = UQQ UHQ UHA USA LIB2FUNCS_EXCLUDE += \ $(foreach func,_mul,\ $(foreach mode,$(smul_modes) $(umul_modes),$(func_X))) LIB2FUNCS_EXCLUDE += \ $(foreach func,_div,\ $(foreach mode,$(sdiv_modes) $(udiv_modes),$(func_X))) ssmul_modes = HA SA usmul_modes = UHA USA LIB2FUNCS_EXCLUDE += \ $(foreach func,_usmul,\ $(foreach mode,$(usmul_modes),$(func_X))) LIB2FUNCS_EXCLUDE += \ $(foreach func,_ssmul,\ $(foreach mode,$(ssmul_modes),$(func_X)))