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~