]> gcc.gnu.org Git - gcc.git/commitdiff
Refine maskstore patterns with UNSPEC_MASKMOV.
authorliuhongt <hongtao.liu@intel.com>
Mon, 26 Jun 2023 13:07:09 +0000 (21:07 +0800)
committerliuhongt <hongtao.liu@intel.com>
Tue, 27 Jun 2023 07:29:43 +0000 (15:29 +0800)
Similar like r14-2070-gc79476da46728e

If mem_addr points to a memory region with less than whole vector size
bytes of accessible memory and k is a mask that would prevent reading
the inaccessible bytes from mem_addr, add UNSPEC_MASKMOV to prevent
it to be transformed to any other whole memory access instructions.

gcc/ChangeLog:

PR rtl-optimization/110237
* config/i386/sse.md (<avx512>_store<mode>_mask): Refine with
UNSPEC_MASKMOV.
(maskstore<mode><avx512fmaskmodelower): Ditto.
(*<avx512>_store<mode>_mask): New define_insn, it's renamed
from original <avx512>_store<mode>_mask.

gcc/config/i386/sse.md

index 3b50c7117f85d1aec7dd77cd7d0a27825eb8b697..812cfca4b9257fd1dadc0ffccf7cd1b02725b22f 100644 (file)
    (set_attr "prefix" "evex")
    (set_attr "mode" "<sseinsnmode>")])
 
-(define_insn "<avx512>_store<mode>_mask"
+(define_insn "*<avx512>_store<mode>_mask"
   [(set (match_operand:V48_AVX512VL 0 "memory_operand" "=m")
        (vec_merge:V48_AVX512VL
          (match_operand:V48_AVX512VL 1 "register_operand" "v")
    (set_attr "memory" "store")
    (set_attr "mode" "<sseinsnmode>")])
 
-(define_insn "<avx512>_store<mode>_mask"
+(define_insn "*<avx512>_store<mode>_mask"
   [(set (match_operand:VI12HFBF_AVX512VL 0 "memory_operand" "=m")
        (vec_merge:VI12HFBF_AVX512VL
          (match_operand:VI12HFBF_AVX512VL 1 "register_operand" "v")
   "TARGET_AVX")
 
 (define_expand "maskstore<mode><avx512fmaskmodelower>"
-  [(set (match_operand:V48H_AVX512VL 0 "memory_operand")
-       (vec_merge:V48H_AVX512VL
-         (match_operand:V48H_AVX512VL 1 "register_operand")
-         (match_dup 0)
-         (match_operand:<avx512fmaskmode> 2 "register_operand")))]
+  [(set (match_operand:V48_AVX512VL 0 "memory_operand")
+       (unspec:V48_AVX512VL
+         [(match_operand:V48_AVX512VL 1 "register_operand")
+          (match_dup 0)
+          (match_operand:<avx512fmaskmode> 2 "register_operand")]
+         UNSPEC_MASKMOV))]
   "TARGET_AVX512F")
 
 (define_expand "maskstore<mode><avx512fmaskmodelower>"
-  [(set (match_operand:VI12_AVX512VL 0 "memory_operand")
-       (vec_merge:VI12_AVX512VL
-         (match_operand:VI12_AVX512VL 1 "register_operand")
-         (match_dup 0)
-         (match_operand:<avx512fmaskmode> 2 "register_operand")))]
+  [(set (match_operand:VI12HFBF_AVX512VL 0 "memory_operand")
+       (unspec:VI12HFBF_AVX512VL
+         [(match_operand:VI12HFBF_AVX512VL 1 "register_operand")
+          (match_dup 0)
+          (match_operand:<avx512fmaskmode> 2 "register_operand")]
+         UNSPEC_MASKMOV))]
   "TARGET_AVX512BW")
 
+(define_insn "<avx512>_store<mode>_mask"
+  [(set (match_operand:V48_AVX512VL 0 "memory_operand" "=m")
+       (unspec:V48_AVX512VL
+         [(match_operand:V48_AVX512VL 1 "register_operand" "v")
+          (match_dup 0)
+          (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")]
+         UNSPEC_MASKMOV))]
+  "TARGET_AVX512F"
+{
+  if (FLOAT_MODE_P (GET_MODE_INNER (<MODE>mode)))
+    {
+      if (misaligned_operand (operands[0], <MODE>mode))
+       return "vmovu<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
+      else
+       return "vmova<ssemodesuffix>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
+    }
+  else
+    {
+      if (misaligned_operand (operands[0], <MODE>mode))
+       return "vmovdqu<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
+      else
+       return "vmovdqa<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}";
+    }
+}
+  [(set_attr "type" "ssemov")
+   (set_attr "prefix" "evex")
+   (set_attr "memory" "store")
+   (set_attr "mode" "<sseinsnmode>")])
+
+(define_insn "<avx512>_store<mode>_mask"
+  [(set (match_operand:VI12HFBF_AVX512VL 0 "memory_operand" "=m")
+       (unspec:VI12HFBF_AVX512VL
+         [(match_operand:VI12HFBF_AVX512VL 1 "register_operand" "v")
+          (match_dup 0)
+          (match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")]
+          UNSPEC_MASKMOV))]
+  "TARGET_AVX512BW"
+  "vmovdqu<ssescalarsize>\t{%1, %0%{%2%}|%0%{%2%}, %1}"
+  [(set_attr "type" "ssemov")
+   (set_attr "prefix" "evex")
+   (set_attr "memory" "store")
+   (set_attr "mode" "<sseinsnmode>")])
+
 (define_expand "cbranch<mode>4"
   [(set (reg:CC FLAGS_REG)
        (compare:CC (match_operand:VI48_AVX 1 "register_operand")
This page took 0.108363 seconds and 5 git commands to generate.