[25/40] i386: Emulate MMX movntq with SSE2 movntidi

Message ID 20190211225553.32050-26-hjl.tools@gmail.com
State New
Headers show
Series
  • V4: Emulate MMX intrinsics with SSE
Related show

Commit Message

H.J. Lu Feb. 11, 2019, 10:55 p.m.
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.  Require TARGET_MMX and disallow
	TARGET_MMX_WITH_SSE.
	(sse_movntq): New.  Emulate MMX movntq with SSE2 movntidi.
---
 gcc/config/i386/mmx.md | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

-- 
2.20.1

Comments

Uros Bizjak Feb. 12, 2019, 10:59 a.m. | #1
On Mon, Feb 11, 2019 at 11:55 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>

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

> is allowed.


Actually, it allows general register source operand.
>

>         PR target/89021

>         * config/i386/mmx.md (sse_movntq): Renamed to ...

>         (*sse_movntq): This.  Require TARGET_MMX and disallow

>         TARGET_MMX_WITH_SSE.

>         (sse_movntq): New.  Emulate MMX movntq with SSE2 movntidi.


No need to complicate that much. Just add movnti alternative to the
existing pattern.

Uros.

> ---

>  gcc/config/i386/mmx.md | 19 +++++++++++++++++--

>  1 file changed, 17 insertions(+), 2 deletions(-)

>

> diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md

> index b3048a6a3b8..2efa663b3e2 100644

> --- a/gcc/config/i386/mmx.md

> +++ b/gcc/config/i386/mmx.md

> @@ -238,11 +238,26 @@

>    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

>

Patch

diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
index b3048a6a3b8..2efa663b3e2 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -238,11 +238,26 @@ 
   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")])