On 03/30/2012 11:11 AM, Richard Henderson wrote: > On 03/30/2012 11:03 AM, Teresa Johnson wrote: >> +(define_insn "*movhi_imm_internal" >> + [(set (match_operand:HI 0 "memory_operand" "=m") >> + (match_operand:HI 1 "immediate_operand" "n"))] >> + "!TARGET_LCP_STALL" >> +{ >> + return "mov{w}\t{%1, %0|%0, %1}"; >> +} >> + [(set (attr "type") (const_string "imov")) >> + (set (attr "mode") (const_string "HI"))]) >> + >> (define_insn "*movhi_internal" >> [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m") >> - (match_operand:HI 1 "general_operand" "r,rn,rm,rn"))] >> + (match_operand:HI 1 "general_operand" "r,rn,rm,r"))] >> "!(MEM_P (operands[0]) && MEM_P (operands[1]))" > > For reload to work correctly, all alternatives must remain part of the same > pattern. > This issue should be handled with the ISA and ENABLED attributes.
I'll also ask if this should better be handled with a peephole2. While movw $1234,(%eax) might be expensive, is it so expensive that we *must* force the use of a free register? Might it be better only to split the insn in two if and only if a free register exists? That can easily be done with a peephole2 pattern... r~