------- Comment #14 from hjl at lucon dot org 2007-03-26 20:41 ------- This isn't a real patch. But it seems to work on the testcase.
--- i386.md.dfp 2007-03-24 12:21:45.000000000 -0700 +++ i386.md 2007-03-26 12:30:21.000000000 -0700 @@ -1850,6 +1850,59 @@ "" "ix86_expand_move (DImode, operands); DONE;") +(define_expand "movsd" + [(set (match_operand:SD 0 "nonimmediate_operand" "") + (match_operand:SD 1 "general_operand" ""))] + "" + "ix86_expand_move (SDmode, operands); DONE;") + +(define_insn "*pushsd2" + [(set (match_operand:SD 0 "push_operand" "=<") + (match_operand:SD 1 "general_no_elim_operand" "ri*m"))] + "!TARGET_64BIT" + "push{l}\t%1" + [(set_attr "type" "push") + (set_attr "mode" "SI")]) + +;; For 64BIT abi we always round up to 8 bytes. +(define_insn "*pushsd2_rex64" + [(set (match_operand:SD 0 "push_operand" "=X") + (match_operand:SD 1 "nonmemory_no_elim_operand" "ri"))] + "TARGET_64BIT" + "push{q}\t%q1" + [(set_attr "type" "push") + (set_attr "mode" "SI")]) + +(define_expand "movdd" + [(set (match_operand:DD 0 "nonimmediate_operand" "") + (match_operand:DD 1 "general_operand" ""))] + "" + "ix86_expand_move (DDmode, operands); DONE;") + +(define_insn "*pushdd" + [(set (match_operand:DD 0 "push_operand" "=<") + (match_operand:DD 1 "general_no_elim_operand" "riF*m"))] + "!TARGET_64BIT" + "#") + +(define_insn "*pushdd2_rex64" + [(set (match_operand:DD 0 "push_operand" "=<,!<") + (match_operand:DD 1 "general_no_elim_operand" "re*m,n"))] + "TARGET_64BIT" + "@ + push{q}\t%1 + #" + [(set_attr "type" "push,multi") + (set_attr "mode" "DI")]) + +(define_split + [(set (match_operand:DD 0 "push_operand" "") + (match_operand:DD 1 "general_operand" ""))] + "!TARGET_64BIT && reload_completed + && (! MMX_REG_P (operands[1]) && !SSE_REG_P (operands[1]))" + [(const_int 0)] + "ix86_split_long_move (operands); DONE;") + (define_insn "*pushdi" [(set (match_operand:DI 0 "push_operand" "=<") (match_operand:DI 1 "general_no_elim_operand" "riF*m"))] -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31344