e55e405619
libgcc/ PR target/54222 * config/avr/lib1funcs-fixed.S: New file. * config/avr/lib1funcs.S: Include it. Undefine some divmodsi after they are used. (neg2, neg4): New macros. (__mulqihi3,__umulqihi3,__mulhi3): Rewrite non-MUL variants. (__mulhisi3,__umulhisi3,__mulsi3): Rewrite non-MUL variants. (__umulhisi3): Speed up MUL variant if there is enough flash. * config/avr/avr-lib.h (TA, UTA): Adjust according to gcc's avr-modes.def. * config/avr/t-avr (LIB1ASMFUNCS): Add: _fractqqsf, _fractuqqsf, _fracthqsf, _fractuhqsf, _fracthasf, _fractuhasf, _fractsasf, _fractusasf, _fractsfqq, _fractsfuqq, _fractsfhq, _fractsfuhq, _fractsfha, _fractsfsa, _mulqq3, _muluqq3, _mulhq3, _muluhq3, _mulha3, _muluha3, _mulsa3, _mulusa3, _divqq3, _udivuqq3, _divhq3, _udivuhq3, _divha3, _udivuha3, _divsa3, _udivusa3. (LIB2FUNCS_EXCLUDE): Add supported functions. gcc/ PR target/54222 * avr-modes.def (HA, SA, DA, TA, UTA): Adjust modes. * avr/avr-fixed.md: New file. * avr/avr.md: Include it. (cc): Add: minus. (adjust_len): Add: minus, minus64, ufract, sfract. (ALL1, ALL2, ALL4, ORDERED234): New mode iterators. (MOVMODE): Add: QQ, UQQ, HQ, UHQ, HA, UHA, SQ, USQ, SA, USA. (MPUSH): Add: HQ, UHQ, HA, UHA, SQ, USQ, SA, USA. (pushqi1, xload8_A, xload_8, movqi_insn, *reload_inqi, addqi3, subqi3, ashlqi3, *ashlqi3, ashrqi3, lshrqi3, *lshrqi3, *cmpqi, cbranchqi4, *cpse.eq): Generalize to handle all 8-bit modes in ALL1. (*movhi, reload_inhi, addhi3, *addhi3, addhi3_clobber, subhi3, ashlhi3, *ashlhi3_const, ashrhi3, *ashirhi3_const, lshrhi3, *lshrhi3_const, *cmphi, cbranchhi4): Generalize to handle all 16-bit modes in ALL2. (subhi3, casesi, strlenhi): Add clobber when expanding minus:HI. (*movsi, *reload_insi, addsi3, subsi3, ashlsi3, *ashlsi3_const, ashrsi3, *ashrhi3_const, *ashrsi3_const, lshrsi3, *lshrsi3_const, *reversed_tstsi, *cmpsi, cbranchsi4): Generalize to handle all 32-bit modes in ALL4. * avr-dimode.md (ALL8): New mode iterator. (adddi3, adddi3_insn, adddi3_const_insn, subdi3, subdi3_insn, subdi3_const_insn, cbranchdi4, compare_di2, compare_const_di2, ashrdi3, lshrdi3, rotldi3, ashldi3_insn, ashrdi3_insn, lshrdi3_insn, rotldi3_insn): Generalize to handle all 64-bit modes in ALL8. * config/avr/avr-protos.h (avr_to_int_mode): New prototype. (avr_out_fract, avr_out_minus, avr_out_minus64): New prototypes. * config/avr/avr.c (TARGET_FIXED_POINT_SUPPORTED_P): Define to... (avr_fixed_point_supported_p): ...this new static function. (TARGET_BUILD_BUILTIN_VA_LIST): Define to... (avr_build_builtin_va_list): ...this new static function. (avr_adjust_type_node): New static function. (avr_scalar_mode_supported_p): Allow if ALL_FIXED_POINT_MODE_P. (avr_builtin_setjmp_frame_value): Use gen_subhi3 and return new pseudo instead of gen_rtx_MINUS. (avr_print_operand, avr_operand_rtx_cost): Handle: CONST_FIXED. (notice_update_cc): Handle: CC_MINUS. (output_movqi): Generalize to handle respective fixed-point modes. (output_movhi, output_movsisf, avr_2word_insn_p): Ditto. (avr_out_compare, avr_out_plus_1): Also handle fixed-point modes. (avr_assemble_integer): Ditto. (output_reload_in_const, output_reload_insisf): Ditto. (avr_compare_pattern): Skip all modes > 4 bytes. (avr_2word_insn_p): Skip movuqq_insn, movqq_insn. (avr_out_fract, avr_out_minus, avr_out_minus64): New functions. (avr_to_int_mode): New function. (adjust_insn_length): Handle: ADJUST_LEN_SFRACT, ADJUST_LEN_UFRACT, ADJUST_LEN_MINUS, ADJUST_LEN_MINUS64. * config/avr/predicates.md (const0_operand): Allow const_fixed. (const_operand, const_or_immediate_operand): New. (nonmemory_or_const_operand): New. * config/avr/constraints.md (Ynn, Y00, Y01, Y02, Ym1, Ym2, YIJ): New constraints. * config/avr/avr.h (LONG_LONG_ACCUM_TYPE_SIZE): Define. From-SVN: r190644
83 lines
2.7 KiB
C
83 lines
2.7 KiB
C
#ifdef FLOAT
|
|
#define CMPtype QItype
|
|
#define DF SF
|
|
#define DI SI
|
|
typedef int QItype __attribute__ ((mode (QI)));
|
|
#endif
|
|
|
|
/* fixed-bit.h does not define functions for TA and UTA because
|
|
that part is wrapped in #if MIN_UNITS_PER_WORD > 4.
|
|
This would lead to empty functions for TA and UTA.
|
|
Thus, supply appropriate defines as if HAVE_[U]TA == 1.
|
|
#define HAVE_[U]TA 1 won't work because avr-modes.def
|
|
uses ADJUST_BYTESIZE(TA,8) and fixed-bit.h is not generic enough
|
|
to arrange for such changes of the mode size. */
|
|
|
|
typedef unsigned _Fract UTAtype __attribute__ ((mode (UTA)));
|
|
|
|
#if defined (UTA_MODE)
|
|
#define FIXED_SIZE 8 /* in bytes */
|
|
#define INT_C_TYPE UDItype
|
|
#define UINT_C_TYPE UDItype
|
|
#define HINT_C_TYPE USItype
|
|
#define HUINT_C_TYPE USItype
|
|
#define MODE_NAME UTA
|
|
#define MODE_NAME_S uta
|
|
#define MODE_UNSIGNED 1
|
|
#endif
|
|
|
|
#if defined (FROM_UTA)
|
|
#define FROM_TYPE 4 /* ID for fixed-point */
|
|
#define FROM_MODE_NAME UTA
|
|
#define FROM_MODE_NAME_S uta
|
|
#define FROM_INT_C_TYPE UDItype
|
|
#define FROM_SINT_C_TYPE DItype
|
|
#define FROM_UINT_C_TYPE UDItype
|
|
#define FROM_MODE_UNSIGNED 1
|
|
#define FROM_FIXED_SIZE 8 /* in bytes */
|
|
#elif defined (TO_UTA)
|
|
#define TO_TYPE 4 /* ID for fixed-point */
|
|
#define TO_MODE_NAME UTA
|
|
#define TO_MODE_NAME_S uta
|
|
#define TO_INT_C_TYPE UDItype
|
|
#define TO_SINT_C_TYPE DItype
|
|
#define TO_UINT_C_TYPE UDItype
|
|
#define TO_MODE_UNSIGNED 1
|
|
#define TO_FIXED_SIZE 8 /* in bytes */
|
|
#endif
|
|
|
|
/* Same for TAmode */
|
|
|
|
typedef _Fract TAtype __attribute__ ((mode (TA)));
|
|
|
|
#if defined (TA_MODE)
|
|
#define FIXED_SIZE 8 /* in bytes */
|
|
#define INT_C_TYPE DItype
|
|
#define UINT_C_TYPE UDItype
|
|
#define HINT_C_TYPE SItype
|
|
#define HUINT_C_TYPE USItype
|
|
#define MODE_NAME TA
|
|
#define MODE_NAME_S ta
|
|
#define MODE_UNSIGNED 0
|
|
#endif
|
|
|
|
#if defined (FROM_TA)
|
|
#define FROM_TYPE 4 /* ID for fixed-point */
|
|
#define FROM_MODE_NAME TA
|
|
#define FROM_MODE_NAME_S ta
|
|
#define FROM_INT_C_TYPE DItype
|
|
#define FROM_SINT_C_TYPE DItype
|
|
#define FROM_UINT_C_TYPE UDItype
|
|
#define FROM_MODE_UNSIGNED 0
|
|
#define FROM_FIXED_SIZE 8 /* in bytes */
|
|
#elif defined (TO_TA)
|
|
#define TO_TYPE 4 /* ID for fixed-point */
|
|
#define TO_MODE_NAME TA
|
|
#define TO_MODE_NAME_S ta
|
|
#define TO_INT_C_TYPE DItype
|
|
#define TO_SINT_C_TYPE DItype
|
|
#define TO_UINT_C_TYPE UDItype
|
|
#define TO_MODE_UNSIGNED 0
|
|
#define TO_FIXED_SIZE 8 /* in bytes */
|
|
#endif
|