diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index a9c2752c0ea..0b0e8620717 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -2375,6 +2375,21 @@ extern int making_const_table;
else if (TARGET_THUMB1) \
thumb1_final_prescan_insn (INSN)
+/* These defines are useful to refer to the value of the mve_unpredicated_insn
+ insn attribute. Note that, because these use the get_attr_* function, these
+ will change recog_data if (INSN) isn't current_insn. */
+#define MVE_VPT_PREDICABLE_INSN_P(INSN) \
+ (recog_memoized (INSN) >= 0 \
+ && get_attr_mve_unpredicated_insn (INSN) != 0) \
+
+#define MVE_VPT_PREDICATED_INSN_P(INSN) \
+ (MVE_VPT_PREDICABLE_INSN_P (INSN) \
+ && recog_memoized (INSN) != get_attr_mve_unpredicated_insn (INSN)) \
+
+#define MVE_VPT_UNPREDICATED_INSN_P(INSN) \
+ (MVE_VPT_PREDICABLE_INSN_P (INSN) \
+ && recog_memoized (INSN) == get_attr_mve_unpredicated_insn (INSN)) \
+
#define ARM_SIGN_EXTEND(x) ((HOST_WIDE_INT) \
(HOST_BITS_PER_WIDE_INT <= 32 ? (unsigned HOST_WIDE_INT) (x) \
: ((((unsigned HOST_WIDE_INT)(x)) & (unsigned HOST_WIDE_INT) 0xffffffff) |\
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 07eaf06cdea..8efdebecc3c 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -124,6 +124,8 @@ (define_attr "fpu" "none,vfp"
; and not all ARM insns do.
(define_attr "predicated" "yes,no" (const_string "no"))
+(define_attr "mve_unpredicated_insn" "" (const_int 0))
+
; LENGTH of an instruction (in bytes)
(define_attr "length" ""
(const_int 4))
diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md
index a9803538101..5ea2d9e8668 100644
--- a/gcc/config/arm/iterators.md
+++ b/gcc/config/arm/iterators.md
@@ -2305,6 +2305,7 @@ (define_int_attr simd32_op [(UNSPEC_QADD8 "qadd8") (UNSPEC_QSUB8 "qsub8")
(define_int_attr mmla_sfx [(UNSPEC_MATMUL_S "s8") (UNSPEC_MATMUL_U "u8")
(UNSPEC_MATMUL_US "s8")])
+
;;MVE int attribute.
(define_int_attr supf [(VCVTQ_TO_F_S "s") (VCVTQ_TO_F_U "u") (VREV16Q_S "s")
(VREV16Q_U "u") (VMVNQ_N_S "s") (VMVNQ_N_U "u")
diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md
index b0d3443da9c..62df022ef19 100644
--- a/gcc/config/arm/mve.md
+++ b/gcc/config/arm/mve.md
@@ -17,7 +17,7 @@
;; along with GCC; see the file COPYING3. If not see
;; .
-(define_insn "*mve_mov"
+(define_insn "mve_mov"
[(set (match_operand:MVE_types 0 "nonimmediate_operand" "=w,w,r,w , w, r,Ux,w")
(match_operand:MVE_types 1 "general_operand" " w,r,w,DnDm,UxUi,r,w, Ul"))]
"TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
@@ -81,18 +81,27 @@ (define_insn "*mve_mov"
return "";
}
}
- [(set_attr "type" "mve_move,mve_move,mve_move,mve_move,mve_load,multiple,mve_store,mve_load")
+ [(set_attr_alternative "mve_unpredicated_insn" [(symbol_ref "CODE_FOR_mve_mov")
+ (symbol_ref "CODE_FOR_nothing")
+ (symbol_ref "CODE_FOR_nothing")
+ (symbol_ref "CODE_FOR_mve_mov")
+ (symbol_ref "CODE_FOR_mve_mov")
+ (symbol_ref "CODE_FOR_nothing")
+ (symbol_ref "CODE_FOR_mve_mov")
+ (symbol_ref "CODE_FOR_nothing")])
+ (set_attr "type" "mve_move,mve_move,mve_move,mve_move,mve_load,multiple,mve_store,mve_load")
(set_attr "length" "4,8,8,4,4,8,4,8")
(set_attr "thumb2_pool_range" "*,*,*,*,1018,*,*,*")
(set_attr "neg_pool_range" "*,*,*,*,996,*,*,*")])
-(define_insn "*mve_vdup"
+(define_insn "mve_vdup"
[(set (match_operand:MVE_vecs 0 "s_register_operand" "=w")
(vec_duplicate:MVE_vecs
(match_operand: 1 "s_register_operand" "r")))]
"TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
"vdup.\t%q0, %1"
- [(set_attr "length" "4")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vdup"))
+ (set_attr "length" "4")
(set_attr "type" "mve_move")])
;;
@@ -145,7 +154,8 @@ (define_insn "@mve_q_f"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_f"))
+ (set_attr "type" "mve_move")
])
;;
@@ -159,7 +169,8 @@ (define_insn "@mve_q_f"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_f"))
+ (set_attr "type" "mve_move")
])
;;
@@ -173,7 +184,8 @@ (define_insn "mve_vq_f"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"v.f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vq_f"))
+ (set_attr "type" "mve_move")
])
;;
@@ -187,7 +199,8 @@ (define_insn "@mve_q_n_f"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".%#\t%q0, %1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_f"))
+ (set_attr "type" "mve_move")
])
;;
@@ -201,7 +214,8 @@ (define_insn "@mve_q_f"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_f"))
+ (set_attr "type" "mve_move")
])
;;
;; [vcvttq_f32_f16])
@@ -214,7 +228,8 @@ (define_insn "mve_vcvttq_f32_f16v4sf"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtt.f32.f16\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvttq_f32_f16v4sf"))
+ (set_attr "type" "mve_move")
])
;;
@@ -228,7 +243,8 @@ (define_insn "mve_vcvtbq_f32_f16v4sf"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtb.f32.f16\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtbq_f32_f16v4sf"))
+ (set_attr "type" "mve_move")
])
;;
@@ -242,7 +258,8 @@ (define_insn "mve_vcvtq_to_f_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt.f%#.%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_to_f_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -256,7 +273,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -270,7 +288,8 @@ (define_insn "mve_vcvtq_from_f_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt.%#.f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_from_f_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -284,7 +303,8 @@ (define_insn "mve_vq_s"
]
"TARGET_HAVE_MVE"
"v.s%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vq_s"))
+ (set_attr "type" "mve_move")
])
;;
@@ -297,7 +317,8 @@ (define_insn "mve_vmvnq_u"
]
"TARGET_HAVE_MVE"
"vmvn\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vmvnq_u"))
+ (set_attr "type" "mve_move")
])
(define_expand "mve_vmvnq_s"
[
@@ -318,7 +339,8 @@ (define_insn "@mve_q_n_"
]
"TARGET_HAVE_MVE"
".%#\t%q0, %1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -331,7 +353,8 @@ (define_insn "@mve_vclzq_s"
]
"TARGET_HAVE_MVE"
"vclz.i%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vclzq_s"))
+ (set_attr "type" "mve_move")
])
(define_expand "mve_vclzq_u"
[
@@ -354,7 +377,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -368,7 +392,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -382,7 +407,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -397,7 +423,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -411,7 +438,8 @@ (define_insn "mve_vcvtpq_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtp.%#.f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtpq_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -425,7 +453,8 @@ (define_insn "mve_vcvtnq_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtn.%#.f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtnq_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -439,7 +468,8 @@ (define_insn "mve_vcvtmq_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvtm.%#.f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtmq_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -453,7 +483,8 @@ (define_insn "mve_vcvtaq_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvta.%#.f%#\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtaq_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -467,7 +498,8 @@ (define_insn "@mve_q_n_"
]
"TARGET_HAVE_MVE"
".i%#\t%q0, %1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -481,7 +513,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".\t%q0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -495,7 +528,8 @@ (define_insn "@mve_q_v4si"
]
"TARGET_HAVE_MVE"
".32\t%Q0, %R0, %q1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_v4si"))
+ (set_attr "type" "mve_move")
])
;;
@@ -509,7 +543,8 @@ (define_insn "mve_vctpq"
]
"TARGET_HAVE_MVE"
"vctp.\t%1"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vctpq"))
+ (set_attr "type" "mve_move")
])
;;
@@ -523,7 +558,8 @@ (define_insn "mve_vpnotv16bi"
]
"TARGET_HAVE_MVE"
"vpnot"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vpnotv16bi"))
+ (set_attr "type" "mve_move")
])
;;
@@ -538,7 +574,8 @@ (define_insn "@mve_q_n_f"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
".\t%q0, %q1, %2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_f"))
+ (set_attr "type" "mve_move")
])
;;
@@ -553,7 +590,8 @@ (define_insn "mve_vcvtq_n_to_f_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt.f.\t%q0, %q1, %2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_n_to_f_"))
+ (set_attr "type" "mve_move")
])
;; [vcreateq_f])
@@ -599,7 +637,8 @@ (define_insn "@mve_q_n_"
]
"TARGET_HAVE_MVE"
".\t%q0, %q1, %2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
+ (set_attr "type" "mve_move")
])
;; Versions that take constant vectors as operand 2 (with all elements
@@ -617,7 +656,8 @@ (define_insn "mve_vshrq_n_s_imm"
VALID_NEON_QREG_MODE (mode),
true);
}
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrq_n_s_imm"))
+ (set_attr "type" "mve_move")
])
(define_insn "mve_vshrq_n_u_imm"
[
@@ -632,7 +672,8 @@ (define_insn "mve_vshrq_n_u_imm"
VALID_NEON_QREG_MODE (mode),
true);
}
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vshrq_n_u_imm"))
+ (set_attr "type" "mve_move")
])
;;
@@ -647,7 +688,8 @@ (define_insn "mve_vcvtq_n_from_f_"
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
"vcvt..f\t%q0, %q1, %2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcvtq_n_from_f_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -662,8 +704,9 @@ (define_insn "@mve_q_p_v4si"
]
"TARGET_HAVE_MVE"
"vpst\;t.32\t%Q0, %R0, %q1"
- [(set_attr "type" "mve_move")
- (set_attr "length""8")])
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_v4si"))
+ (set_attr "type" "mve_move")
+ (set_attr "length""8")])
;;
;; [vcmpneq_, vcmpcsq_, vcmpeqq_, vcmpgeq_, vcmpgtq_, vcmphiq_, vcmpleq_, vcmpltq_])
@@ -676,7 +719,8 @@ (define_insn "@mve_vcmpq_"
]
"TARGET_HAVE_MVE"
"vcmp.%#\t, %q1, %q2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpq_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -691,7 +735,8 @@ (define_insn "@mve_vcmpq_n_"
]
"TARGET_HAVE_MVE"
"vcmp.%# , %q1, %2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_vcmpq_n_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -722,7 +767,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%q0, %q1, %q2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -739,7 +785,8 @@ (define_insn "@mve_q_n_"
]
"TARGET_HAVE_MVE"
".i%#\t%q0, %q1, %2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_q_n_"))
+ (set_attr "type" "mve_move")
])
;;
@@ -754,7 +801,8 @@ (define_insn "@mve_q_"
]
"TARGET_HAVE_MVE"
".%#\t%0, %q2"
- [(set_attr "type" "mve_move")
+ [(set (attr "mve_unpredicated_insn") (symbol_ref "CODE_FOR_mve_