
gcc/ PR target/54222 * config/avr/avr-fixed.md (ALL2S, ALL4S, ALL24S, ALL124S, ALL124U): New mode iterators. (<code_stdname><mode>3): New insns for SS_PLUS, SS_MINUS. (<code_stdname><mode>3): New insns for US_PLUS, US_MINUS. (usneg<mode>2): New insns. (<code_stdname><mode>2): New expanders for SS_NEG, SS_ABS. (*<code_stdname><mode>2): New insns for SS_NEG, SS_ABS. * config/avr/avr-dimode.md (ALL8U, ALL8S): New mode iterators. (avr_out_plus64, avr_out_minus64): Use avr_out_plus instead. (<code_stdname><mode>3): New expanders for SS_PLUS, SS_MINUS. (<code_stdname><mode>3): New expanders for US_PLUS, US_MINUS. (<code_stdname><mode>3_insn): New insns. (<code_stdname><mode>3_const_insn): New insns. * config/avr/avr.md (cc): Add: plus. Remove: out_plus, out_plus_noclobber, minus. (length): Add: plus. Remove: out_plus, out_plus_noclobber, plus64, minus, minus64. (abelian): New code_attr. (code_stdname): Handle: ss_plus, ss_minus, ss_neg, ss_abs, us_plus, us_minus, us_neg. (*add<mode>3, add<mode>3_clobber, add<mode>3, addpsi3, sub<mode>3): Use avr_out_plus to output. * config/avr/avr-protos.h (avr_out_plus): Change prototype. (avr_out_plus_noclobber, avr_out_minus): Remove. (avr_out_plus64, avr_out_minus64): Remove. * config/avr/avr.c (avr_out_plus_1): Add new default arguments code_sat, sign. Saturate after operation if code_sat != UNKNOWN. (avr_out_plus_symbol): New static function. (avr_out_plus): Rewrite. (adjust_insn_length): Handle: ADJUST_LEN_PLUS. Remove handling of: ADJUST_LEN_OUT_PLUS, ADJUST_LEN_PLUS64, ADJUST_LEN_MINUS, ADJUST_LEN_MINUS64, ADJUST_LEN_OUT_PLUS_NOCLOBBER. (notice_update_cc): Handle: CC_PLUS. Remove handling of: CC_MINUS, CC_OUT_PLUS, CC_OUT_PLUS_NOCLOBBER (avr_out_plus_noclobber, avr_out_minus): Remove. (avr_out_plus64, avr_out_minus64): Remove. (avr_print_operand): Print raw REGNO if 'r' is used with REG. libgcc/ PR target/54222 * config/avr/lib1funcs-fixed.S (__ssneg_2, __ssabs_2, __ssneg_4, __ssabs_4, __clr_8, __ssneg_8, __ssabs_8, __usadd_8, __ussub_8, __ssadd_8, __sssub_8): New functions. (__divsa3): Use __negsi2 to negate r_quoL. * config/avr/lib1funcs.S (FALIAS): New macro. (__divmodsi4): Break out and use __divmodsi4_neg1 as... (__negsi2): ...this new function. * config/avr/t-avr (LIB1ASMFUNCS): Add _negsi2, _clr_8, _ssneg_2, _ssneg_4, _ssneg_8, _ssabs_2, _ssabs_4, _ssabs_8, _ssadd_8, _sssub_8, _usadd_8, _ussub_8. (LIB2FUNCS_EXCLUDE): Fix typo for _add _sub. Add: _ssadd*, _sssub*, _ssneg*, _ssabs* for signed fixed modes. Add: _usadd*, _ussub*, _usneg* for unsigned fixed modes. gcc/testsuite/ PR target/54222 * gcc.target/avr/torture/fix-types.h: New. * gcc.target/avr/torture/vals-hr.def: New. * gcc.target/avr/torture/vals-r.def: New. * gcc.target/avr/torture/vals-k.def: New. * gcc.target/avr/torture/vals-ur.def: New. * gcc.target/avr/torture/vals-uk.def: New. * gcc.target/avr/torture/vals-uhr.def: New. * gcc.target/avr/torture/vals-llk.def: New. * gcc.target/avr/torture/vals-ullk.def: New. * gcc.target/avr/torture/sat-hr-plus-minus.c: New. * gcc.target/avr/torture/sat-r-plus-minus.c: New. * gcc.target/avr/torture/sat-k-plus-minus.c: New. * gcc.target/avr/torture/sat-ur-plus-minus.c: New. * gcc.target/avr/torture/sat-uk-plus-minus.c: New. * gcc.target/avr/torture/sat-uhr-plus-minus.c: New. * gcc.target/avr/torture/sat-llk-plus-minus.c: New. * gcc.target/avr/torture/sat-ullk-plus-minus.c: New. From-SVN: r191345
166 lines
3.7 KiB
Text
166 lines
3.7 KiB
Text
LIB1ASMSRC = avr/lib1funcs.S
|
|
LIB1ASMFUNCS = \
|
|
_mulqi3 \
|
|
_mulhi3 \
|
|
_mulqihi3 _umulqihi3 \
|
|
_mulpsi3 _mulsqipsi3 \
|
|
_mulhisi3 \
|
|
_umulhisi3 \
|
|
_usmulhisi3 \
|
|
_muluhisi3 \
|
|
_mulshisi3 \
|
|
_mulsi3 \
|
|
_udivmodqi4 \
|
|
_divmodqi4 \
|
|
_udivmodhi4 \
|
|
_divmodhi4 \
|
|
_divmodpsi4 _udivmodpsi4 \
|
|
_udivmodsi4 \
|
|
_divmodsi4 \
|
|
_divdi3 _udivdi3 \
|
|
_muldi3 \
|
|
_udivmod64 \
|
|
_negsi2 _negdi2 \
|
|
_prologue \
|
|
_epilogue \
|
|
_exit \
|
|
_cleanup \
|
|
_tablejump \
|
|
_tablejump_elpm \
|
|
_load_3 _load_4 \
|
|
_xload_1 _xload_2 _xload_3 _xload_4 \
|
|
_movmemx \
|
|
_copy_data \
|
|
_clear_bss \
|
|
_ctors \
|
|
_dtors \
|
|
_ffssi2 \
|
|
_ffshi2 \
|
|
_loop_ffsqi2 \
|
|
_ctzsi2 \
|
|
_ctzhi2 \
|
|
_clzdi2 \
|
|
_clzsi2 \
|
|
_clzhi2 \
|
|
_paritydi2 \
|
|
_paritysi2 \
|
|
_parityhi2 \
|
|
_popcounthi2 \
|
|
_popcountsi2 \
|
|
_popcountdi2 \
|
|
_popcountqi2 \
|
|
_bswapsi2 \
|
|
_bswapdi2 \
|
|
_ashldi3 _ashrdi3 _lshrdi3 _rotldi3 \
|
|
_adddi3 _adddi3_s8 _subdi3 \
|
|
_cmpdi2 _cmpdi2_s8 \
|
|
_fmul _fmuls _fmulsu
|
|
|
|
# Fixed point routines in avr/lib1funcs-fixed.S
|
|
LIB1ASMFUNCS += \
|
|
_fractqqsf _fractuqqsf \
|
|
_fracthqsf _fractuhqsf _fracthasf _fractuhasf \
|
|
_fractsasf _fractusasf _fractsqsf _fractusqsf \
|
|
\
|
|
_fractsfqq _fractsfuqq \
|
|
_fractsfhq _fractsfuhq _fractsfha _fractsfuha \
|
|
_fractsfsa _fractsfusa \
|
|
_mulqq3 \
|
|
_mulhq3 _muluhq3 \
|
|
_mulha3 _muluha3 _muluha3_round \
|
|
_mulsa3 _mulusa3 \
|
|
_divqq3 _udivuqq3 \
|
|
_divhq3 _udivuhq3 \
|
|
_divha3 _udivuha3 \
|
|
_divsa3 _udivusa3 \
|
|
_clr_8 \
|
|
_ssneg_2 _ssneg_4 _ssneg_8 \
|
|
_ssabs_2 _ssabs_4 _ssabs_8 \
|
|
_ssadd_8 _sssub_8 \
|
|
_usadd_8 _ussub_8
|
|
|
|
LIB2FUNCS_EXCLUDE = \
|
|
_moddi3 _umoddi3 \
|
|
_clz
|
|
|
|
# We do not have the DF type.
|
|
# Most of the C functions in libgcc2 use almost all registers,
|
|
# so use -mcall-prologues for smaller code size.
|
|
HOST_LIBGCC2_CFLAGS += -DDF=SF -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 $(srcdir)/empty.mk $(patsubst %,$(srcdir)/siditi-object.mk,$(iter-items))
|
|
libgcc-objects += $(patsubst %,%$(objext),$(hiintfuncs16))
|
|
|
|
ifeq ($(enable_shared),yes)
|
|
libgcc-s-objects += $(patsubst %,%_s$(objext),$(hiintfuncs16))
|
|
endif
|
|
|
|
|
|
# Filter out supported conversions from fixed-bit.c
|
|
# Also filter out TQ and UTQ.
|
|
|
|
conv_XY=$(conv)$(mode1)$(mode2)
|
|
func_X=$(func)$(mode)
|
|
|
|
# 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)))
|