Emulate MMX movntq with SSE2 movntidi.  Only SSE register source operand
is allowed.

        PR target/89021
        * config/i386/mmx.md (sse_movntq): Renamed to ...
        (*sse_movntq): This.
        (sse_movntq): New.  Emulate MMX movntq with SSE2 movntidi.
---
 gcc/config/i386/mmx.md | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
index 5cbe1875f21..481b987f4a7 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -243,11 +243,27 @@
   DONE;
 })
 
-(define_insn "sse_movntq"
+(define_expand "sse_movntq"
+  [(set (match_operand:DI 0 "memory_operand")
+       (unspec:DI [(match_operand:DI 1 "register_operand")]
+                  UNSPEC_MOVNTQ))]
+  "((TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSE)
+   || TARGET_3DNOW_A"
+{
+  if (TARGET_MMX_WITH_SSE)
+    {
+      rtx insn = gen_sse2_movntidi (operands[0], operands[1]);
+      emit_insn (insn);
+      DONE;
+    }
+})
+
+(define_insn "*sse_movntq"
   [(set (match_operand:DI 0 "memory_operand" "=m")
        (unspec:DI [(match_operand:DI 1 "register_operand" "y")]
                   UNSPEC_MOVNTQ))]
-  "TARGET_SSE || TARGET_3DNOW_A"
+  "(TARGET_MMX && !TARGET_MMX_WITH_SSE && TARGET_SSE)
+   || TARGET_3DNOW_A"
   "movntq\t{%1, %0|%0, %1}"
   [(set_attr "type" "mmxmov")
    (set_attr "mode" "DI")])
-- 
2.20.1

Reply via email to