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