------- Comment #19 from ubizjak at gmail dot com 2007-05-07 08:19 ------- Here is the problem:
Compilation enteres emit_move_via_integer() with: x = (mem/i:SD (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A32]) y = (reg/v:SD 59 [ arg ]) emit_move_change_mode() generates invalid insn from x because it forces pre_dec:SI into pseudo register. emit_move_change_mode() generates following sequence: (insn 11 10 12 (set (reg/f:SI 61) (pre_dec:SI (reg/f:SI 7 sp))) -1 (nil) (nil)) (insn 12 11 13 (set (mem/i:SI (reg/f:SI 61) [0 S4 A32]) (subreg:SI (reg/v:SD 59 [ arg ]) 0)) -1 (nil) (nil)) For some reason, pre_dec is forced into pseudo in adjust_address_1()/change_address_1(). Above sequence is surely wrong, as i386 does not have a move that would also decrement one of its operands before move. -- ubizjak at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ubizjak at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31344