On Thu, Apr 26, 2007 at 09:49:16PM +0200, Rask Ingemann Lambertsen wrote:
>    Unfortunately, the fallback code isn't exactly optimum, as it produces
> something like
> 
>       addw    $-N*2,  %sp
>       movw    %sp,    %basereg
>       movw    %wordN, N*2(%basereg)
>       ...
>       movw    %word0, (%basereg)
> 
> which compared with
> 
>       pushw   %wordN
>       ...
>       pushw   %word0

It's not supposed to.  Please debug emit_move_complex_push
and find out why.  I suspect PUSH_ROUNDING is larger than
it's supposed to be.

> (define_insn_and_split "*push<mode>1_concat"
>   [(set (mem:COMPLEX (pre_dec:HI (reg:HI SP_REG)))
>         (concat:COMPLEX (match_operand:<INNER> 0 "general_operand" "RmIpu")
>                         (match_operand:<INNER> 1 "general_operand" "RmIpu")))]

This is horrible.  At minimum you should expand this to
two separate pushed immediately.


r~

Reply via email to