[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