This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: general_operand() not accepting CONCAT?
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~