Commit a861ffa4 by Georg-Johann Lay Committed by Georg-Johann Lay

avr.c (avr_out_fract): Make register numbers that might be outside of source operand signed.

	* config/avr/avr.c (avr_out_fract): Make register numbers that
	might be outside of source operand signed.

From-SVN: r195424
parent 593c0ddd
2013-01-24 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr.c (avr_out_fract): Make register numbers that
might be outside of source operand signed.
2013-01-24 Uros Bizjak <ubizjak@gmail.com> 2013-01-24 Uros Bizjak <ubizjak@gmail.com>
* config/i386/constraints.md (Yf): New constraint. * config/i386/constraints.md (Yf): New constraint.
......
...@@ -7114,13 +7114,13 @@ avr_out_fract (rtx insn, rtx operands[], bool intsigned, int *plen) ...@@ -7114,13 +7114,13 @@ avr_out_fract (rtx insn, rtx operands[], bool intsigned, int *plen)
unsigned d1 = d0 + step; unsigned d1 = d0 + step;
// Current and next regno of source // Current and next regno of source
unsigned s0 = d0 - offset; signed s0 = d0 - offset;
unsigned s1 = s0 + step; signed s1 = s0 + step;
// Must current resp. next regno be CLRed? This applies to the low // Must current resp. next regno be CLRed? This applies to the low
// bytes of the destination that have no associated source bytes. // bytes of the destination that have no associated source bytes.
bool clr0 = s0 < src.regno; bool clr0 = s0 < (signed) src.regno;
bool clr1 = s1 < src.regno && d1 >= dest.regno; bool clr1 = s1 < (signed) src.regno && d1 >= dest.regno;
// First gather what code to emit (if any) and additional step to // First gather what code to emit (if any) and additional step to
// apply if a MOVW is in use. xop[2] is destination rtx and xop[3] // apply if a MOVW is in use. xop[2] is destination rtx and xop[3]
...@@ -7150,12 +7150,12 @@ avr_out_fract (rtx insn, rtx operands[], bool intsigned, int *plen) ...@@ -7150,12 +7150,12 @@ avr_out_fract (rtx insn, rtx operands[], bool intsigned, int *plen)
} }
} }
} }
else if (offset && s0 <= src.regno_msb) else if (offset && s0 <= (signed) src.regno_msb)
{ {
int movw = AVR_HAVE_MOVW && offset % 2 == 0 int movw = AVR_HAVE_MOVW && offset % 2 == 0
&& d0 % 2 == (offset > 0) && d0 % 2 == (offset > 0)
&& d1 <= dest.regno_msb && d1 >= dest.regno && d1 <= dest.regno_msb && d1 >= dest.regno
&& s1 <= src.regno_msb && s1 >= src.regno; && s1 <= (signed) src.regno_msb && s1 >= (signed) src.regno;
xop[2] = all_regs_rtx[d0 & ~movw]; xop[2] = all_regs_rtx[d0 & ~movw];
xop[3] = all_regs_rtx[s0 & ~movw]; xop[3] = all_regs_rtx[s0 & ~movw];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment