https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100041

--- Comment #15 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Richard Biener from comment #12)
> A possible solution might be to disallow the -m64 -m96bit-long-double
> combination, the documentation suggests -m128bit-long-double was intended
> as an "optimization" over the x86-32 ABI.

Yes, I think this is the way to go.

While it is possible to "fix" the ICE with:

--cut here--
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 2820f6d6188..e2fa01756fd 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3050,7 +3050,7 @@
            (reg:P SP_REG)
            (plus:P (reg:P SP_REG) (const_int -16))))
        (match_operand:XF 0 "nonmemory_no_elim_operand" "f,r,*r,C"))]
-  "TARGET_64BIT"
+  "TARGET_64BIT && !TARGET_128BIT_LONG_DOUBLE"
   "#"
   "&& 1"
   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16)))
@@ -3077,7 +3077,7 @@
 (define_insn "*pushxf"
   [(set (match_operand:XF 0 "push_operand" "=<,<,<,<,<")
        (match_operand:XF 1 "general_no_elim_operand" "f,r,*r,oF,oC"))]
-  ""
+  "!TARGET_64BIT || TARGET_128BIT_LONG_DOUBLE"
 {
   /* This insn should be already split before reg-stack.  */
   return "#";
--cut here--

where the above patch prevents the push from memory, it is quite obvious from
ix86_split_long_move that TARGET_128BIT_LONG_DOUBLE is indeed intended as an
optimization for 32bit targets only.

So, let's kill -m96bit-long-double for TARGET_64BIT.

Reply via email to