]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm: mve: avoid invalid immediate values in vbicq_n, vorrq_n, vmvnq_n [PR122175]
authorChristophe Lyon <christophe.lyon@linaro.org>
Mon, 10 Nov 2025 09:02:04 +0000 (09:02 +0000)
committerChristophe Lyon <christophe.lyon@linaro.org>
Wed, 12 Nov 2025 13:38:29 +0000 (13:38 +0000)
A constant value with the top bit of a 16-bit const passed to vbicq_n_u16 will
generate invalid assembly.  Avoid this by masking the constant during assembly
generation.

The same applies to vorrq_n and vmvnq_n.

gcc/ChangeLog:

PR target/122175
* config/arm/iterators.md (asm_const_size): New mode attr.
* config/arm/mve.md (@mve_<mve_insn>q_n_<supf><mode>): Use it.

gcc/testsuite/ChangeLog:

PR target/122175
* gcc.target/arm/mve/intrinsics/pr122175.c: New test.

Co-authored-by: Richard Earnshaw <rearnsha@arm.com>
gcc/config/arm/iterators.md
gcc/config/arm/mve.md
gcc/testsuite/gcc.target/arm/mve/intrinsics/pr122175.c [new file with mode: 0644]

index dfbe0270c8d7e2a826cfd9406c5d4f32d6b8b90b..592613d98906cd76ce4e0c30131f1420d41c41d9 100644 (file)
                             (V2QI "v2qi")])
 (define_mode_attr MVE_vctp [(V16BI "8") (V8BI "16") (V4BI "32") (V2QI "64")])
 
+;; Assembly modifier for a const_int operand to narrow it to a
+;; specific mode.  For vector modes this is the element size.
+;; Currently only supports SI and HI.
+
+(define_mode_attr asm_const_size [(SI "") (HI "L")
+                                 (V4SI "") (V2SI "")
+                                 (V8HI "L") (V4HI "L")])
+
 ;;----------------------------------------------------------------------------
 ;; Code attributes
 ;;----------------------------------------------------------------------------
index 87b45b2e41c257fd356a0d7d8434efc9a7c6f228..bd52a916ff8859300b83ff9fe1cefeebe979e7e4 100644 (file)
         VMVNQ_N))
   ]
   "TARGET_HAVE_MVE"
-  "<mve_insn>.i%#<V_sz_elem>\t%q0, %1"
+  "<mve_insn>.i%#<V_sz_elem>\t%q0, %<asm_const_size>1"
  [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_<mve_insn>q_n_<supf><mode>"))
   (set_attr "type" "mve_move")
 ])
         MVE_INT_N_BINARY_LOGIC))
   ]
   "TARGET_HAVE_MVE"
-  "<mve_insn>.i%#<V_sz_elem>   %q0, %2"
+  "<mve_insn>.i%#<V_sz_elem>   %q0, %<asm_const_size>2"
  [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_<mve_insn>q_n_<supf><mode>"))
   (set_attr "type" "mve_move")
 ])
         VMVNQ_M_N))
   ]
   "TARGET_HAVE_MVE"
-  "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %2"
+  "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %<asm_const_size>2"
  [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_<mve_insn>q_n_<supf><mode>"))
   (set_attr "type" "mve_move")
    (set_attr "length""8")])
         MVE_INT_M_N_BINARY_LOGIC))
   ]
   "TARGET_HAVE_MVE"
-  "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %2"
+  "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %<asm_const_size>2"
  [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_<mve_insn>q_n_<supf><mode>"))
   (set_attr "type" "mve_move")
    (set_attr "length""8")])
diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr122175.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr122175.c
new file mode 100644 (file)
index 0000000..42873d0
--- /dev/null
@@ -0,0 +1,38 @@
+/* { dg-require-effective-target arm_v8_1m_mve_ok } */
+/* { dg-add-options arm_v8_1m_mve } */
+/* { dg-additional-options "-O2" } */
+
+#include <arm_mve.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+uint16x8_t test_1(uint16x8_t v11) {
+  return vbicq_n_u16(v11, 0x8000);
+}
+
+uint16x8_t test_2(uint16x8_t v11) {
+  return vorrq_n_u16(v11, 0x8000);
+}
+
+uint16x8_t test_3() {
+  return vmvnq_n_u16(0x8000);
+}
+
+mve_pred16_t pred;
+uint16x8_t test_4(uint16x8_t v11) {
+  return vbicq_m_n_u16(v11, 0x8000, pred);
+}
+
+uint16x8_t test_5(uint16x8_t v11) {
+  return vorrq_m_n_u16(v11, 0x8000, pred);
+}
+
+uint16x8_t test_6() {
+  return vmvnq_x_n_u16(0x8000, pred);
+}
+
+#ifdef __cplusplus
+}
+#endif