Hi Mike, On Tue, Dec 06, 2016 at 03:56:11PM -0500, Michael Meissner wrote: > PR target 78658 exposed a thinko that I had in extending the conversion of > QImode and HImode to floating point. If the QImode/HImode value was in a > vector register, the pattern didn't allocate the second pseudo register, but > the code generated a reference to that second register. The second register > was used to move the value from a GPR to the vector registers. > > I also modified the zero extend patterns to use ^ instead of ?* like I did on > the November 21st patches so that the register allocator is more likely to > consider using the vector registers if it is useful to do so. > > I have done a bootstrap build and make check on a little endian power8 system > and there were no regressions. Can I check this into the trunk?
Few things, most trivial (sorry)... > * config/rs6000/rs6000.md (zero_extendqi<mode>2): Use ^ instead of > ?* constraints for the ISA 3.0 patterns, so the register allocator > is more likely to allocate QImode/HImode to vector registers for > conversion to floating point point unless a reload is needed. "point point" > (zero_extendhi<mode>2): Likewise. > (float<QHI:mode><FP_ISA3:mode>2_internal): Properly deal with the > first alternative which is converting QImode/HImode to floating > point and the QImode/HImode value is in a vector register, and > does not allocate the second temorary. "temorary". > @@ -5413,8 +5413,11 @@ (define_insn_and_split "*float<QHI:mode> > > if (!MEM_P (input)) > { > + rtx tmp = operands[3]; > if (altivec_register_operand (input, <QHI:MODE>mode)) > emit_insn (gen_extend<QHI:mode>di2 (di, input)); > + else if (GET_CODE (tmp) == SCRATCH) > + emit_insn (gen_extend<QHI:mode>di2 (di, input)); > else > { > rtx tmp = operands[3]; Please remove the extra temporary... It isn't necessary, and now you have two variables named tmp (in nested scopes). > @@ -5449,7 +5452,7 @@ (define_expand "floatuns<QHI:mode><FP_IS > (define_insn_and_split "*floatuns<QHI:mode><FP_ISA3:mode>2_internal" > [(set (match_operand:FP_ISA3 0 "vsx_register_operand" "=<Fv>,<Fv>,<Fv>") > (unsigned_float:FP_ISA3 > - (match_operand:QHI 1 "reg_or_indexed_operand" "wJwK,r,Z"))) > + (match_operand:QHI 1 "reg_or_indexed_operand" "wK,r,Z"))) > (clobber (match_scratch:DI 2 "=wK,wi,wJwK")) > (clobber (match_scratch:DI 3 "=X,r,X"))] > "TARGET_P9_VECTOR && TARGET_DIRECT_MOVE && TARGET_POWERPC64 Here you remove the wJ alternative, is that on purpose? The changelog does not mention it. Okay for trunk with those things fixed. Thanks, Segher