2013/7/18 Georg-Johann Lay <a...@gjlay.de>: > Currently, the fixed-point rounding does not work correctly in the overflow > case. This is because of misreading section 2.1.7.2 of TR 18037. > > Rounding builtins expand to saturated addition and AND so that the instruction > sequence is > > add value1 > if not overflow goto 0 > load max value > 0: > and value2 > > where the correct sequence reads > > add value1 > if not overflow goto 0 > load max value > goto 1 > 0: > and value2 > 1: > > This change is performed by the patch. The round expander is transformed to > an > insn that uses avr_out_plus and avr_out_bitop to print most of the > instructions. > > Okay to apply? > > Johann > > gcc/ > PR target/57516 > * config/avr/avr-fixed.md (round<mode>3_const): Turn expander to insn. > * config/avr/avr.md (adjust_len): Add `round'. > * config/avr/avr-protos.h (avr_out_round): New prototype. > (avr_out_plus): Add `out_label' argument. > * config/avr/avr.c (avr_out_plus_1): Add `out_label' argument. > (avr_out_plus): Pass down `out_label' to avr_out_plus_1. > Handle the case where `insn' is just a pattern. > (avr_out_bitop): Handle the case where `insn' is just a pattern. > (avr_out_round): New function. > (avr_adjust_insn_length): Handle ADJUST_LEN_ROUND. > > libgcc/ > PR target/57516 > * config/avr/lib1funcs-fixed.S (__roundqq3, __rounduqq3) > (__round_s2_const, __round_u2_const) > (__round_s4_const, __round_u4_const, __round_x8): > Saturate result if addition result cannot be represented. > > gcc/testsuite/ > PR target/57516 > * gcc.target/avr/torture/builtins-4-roundfx.c (test2hr, test2k): > Adjust to corrected rounding. > >
Approved. Denis.