[Bug target/31344] [4.3 Regression]: DFP isn't properly supported on x86
hjl at lucon dot org
gcc-bugzilla@gcc.gnu.org
Mon Mar 26 19:42:00 GMT 2007
------- 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
More information about the Gcc-bugs
mailing list