Richard Henderson wrote:
> On 07/18/2011 08:41 AM, Georg-Johann Lay wrote:
>> +(define_insn_and_split "*muluqihi3.uconst"
>> + [(set (match_operand:HI 0 "register_operand" "=r")
>> + (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand"
>> "r"))
>> + (match_operand:HI 2 "u8_operand"
>> "M")))]
>> + "AVR_HAVE_MUL
>> + && avr_gate_split1()"
>> + { gcc_unreachable(); }
>> + "&& 1"
>> + [(set (match_dup 3)
>> + (match_dup 2))
>> + ; umulqihi3
>> + (set (match_dup 0)
>> + (mult:HI (zero_extend:HI (match_dup 1))
>> + (zero_extend:HI (match_dup 3))))]
>> + {
>> + operands[2] = gen_int_mode (INTVAL (operands[2]), QImode);
>> + operands[3] = gen_reg_rtx (QImode);
>> + })
>> +
>
> I'm not keen on this at all. I'd much prefer a formulation like
>
> (define_insn_and_split "*muliqihi3_uconst"
> [(set (match_operand:HI 0 "register_operand" "=r")
> (mult:HI (zero_extend:HI
> (match_operand:QI 1 "register_operand" "r"))
> (match_operand:HI 2 "u8_operand" "n")))
> (clobber (match_scratch:QI 3 "=&r"))]
> "AVR_HAVE_MUL"
> "#"
> "&& reload_completed"
> [...]
> )
>
> I see the obvious problem, of course, pass_split_after_reload
> runs after pass_postreload_cse.
I intend to do similar things for HI->SI widening multiply.
These multiplications are too complex to do them inline and
thus are expanded to libgcc calls like so:
(define_expand "umulhisi3"
[(set (reg:HI 18)
(match_operand:HI 1 "register_operand" ""))
(set (reg:HI 20)
(match_operand:HI 2 "register_operand" ""))
(set (reg:SI 22)
(mult:SI (zero_extend:SI (reg:HI 18))
(zero_extend:SI (reg:HI 20))))
(set (match_operand:SI 0 "register_operand" "")
(reg:SI 22))]
"AVR_HAVE_MUL"
"")
This is no more possible after reload, so for these cases
there is no alternative to doing it a pre-reload split.
Or am I something missing?
Johann