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

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
I suspect

(insn 10 9 11 2 (set (mem:V16QI (reg/v/f:SI 117 [ pa ]) [0 MEM[(signed char[16]
*)pa_2(D)]+0 S16 A8]) 
        (unspec:V16QI [
                (reg/v:V16QI 116 [ a ])
                (reg:V16BI 120)
            ] VSTRBQ_U)) "include/arm_mve.h":12501:3 4673 {mve_vstrbq_p_uv16qi}
     (nil)) 

isn't a very accurate description of a masked store.  On x86 we have

(insn 17 16 0 (set (mem:V8DI (reg/v/f:DI 87 [ p ]) [0  S64 A8])
        (vec_merge:V8DI (reg:V8DI 92)
            (mem:V8DI (reg/v/f:DI 87 [ p ]) [0  S64 A8])
            (subreg:QI (reg:SI 95) 0)))
"/home/rguenther/obj-trunk-g/gcc/include/avx512fintrin.h":6484:3 -1

For AVX we use:

(define_expand "maskstore<mode><sseintvecmodelower>"
  [(set (match_operand:V48_AVX2 0 "memory_operand")
    (unspec:V48_AVX2
      [(match_operand:<sseintvecmode> 2 "register_operand")
       (match_operand:V48_AVX2 1 "register_operand")
       (match_dup 0)]
      UNSPEC_MASKMOV))]
  "TARGET_AVX")

note how the memory destination is also an input to the UNSPEC here.

Reply via email to