[(set_attr "type" "neon_mul_<Vetype><q>")]
)
+;; Advanced SIMD does not support vector DImode MUL, but SVE does.
+;; Make use of the overlap between Z and V registers to implement the V2DI
+;; optab for TARGET_SVE. The mulvnx2di3 expander can
+;; handle the TARGET_SVE2 case transparently.
+(define_expand "mulv2di3"
+ [(set (match_operand:V2DI 0 "register_operand")
+ (mult:V2DI (match_operand:V2DI 1 "register_operand")
+ (match_operand:V2DI 2 "aarch64_sve_vsm_operand")))]
+ "TARGET_SVE"
+ {
+ machine_mode sve_mode = VNx2DImode;
+ rtx sve_op0 = simplify_gen_subreg (sve_mode, operands[0], V2DImode, 0);
+ rtx sve_op1 = simplify_gen_subreg (sve_mode, operands[1], V2DImode, 0);
+ rtx sve_op2 = simplify_gen_subreg (sve_mode, operands[2], V2DImode, 0);
+
+ emit_insn (gen_mulvnx2di3 (sve_op0, sve_op1, sve_op2));
+ DONE;
+ }
+)
+
(define_insn "bswap<mode>2"
[(set (match_operand:VDQHSD 0 "register_operand" "=w")
(bswap:VDQHSD (match_operand:VDQHSD 1 "register_operand" "w")))]
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -march=armv8.2-a+sve" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef long v2di __attribute__((vector_size (16)));
+
+/*
+** foo:
+** ptrue p0.b, all
+** mul z0.d, p0/m, z0.d, z1.d
+** ret
+*/
+
+v2di
+foo (v2di a, v2di b)
+{
+ return a * b;
+}
+
+/*
+** foo_imm:
+** mul z0.d, z0.d, #125
+** ret
+*/
+
+v2di
+foo_imm (v2di a)
+{
+ return a * 125;
+}
+