gcc/ChangeLog:
* config/aarch64/aarch64-acle-builtins.h (TYPES_neon_mla,
TYPES_neon_mla_lane): New type arrays.
* config/aarch64/aarch64-neon-builtins-base.cc (struct
gimple_mla): New struct.
* config/aarch64/aarch64-neon-builtins-base.def
(vmla, vmlaq, vmla_n, vmlaq_n, vmla_lane, vmla_laneq,
vmlaq_lane, vmlaq_laneq, vmls, vmlsq, vmls_n, vmlsq_n,
vmls_lane, vmls_laneq, vmlsq_lane, vmlsq_laneq): New function
declarations.
* config/aarch64/aarch64-simd-builtins.def: Delete builtin
functions.
* config/aarch64/aarch64-simd.md (aarch64_float_mla<mode>,
aarch64_float_mls<mode>, aarch64_float_mla_n<mode>,
aarch64_float_mls_n<mode>, aarch64_float_mla_lane<mode>,
aarch64_float_mls_lane<mode>, aarch64_float_mla_laneq<mode>,
aarch64_float_mls_laneq<mode>): Delete now-obsolete insns.
* config/aarch64/arm_neon.h: (vmla_n_f32, vmla_n_s16,
vmla_n_s32, vmla_n_u16, vmla_n_u32, vmla_s8, vmla_s16,
vmla_s32, vmla_u8, vmla_u16, vmla_u32, vmlaq_n_f32,
vmlaq_n_s16, vmlaq_n_s32, vmlaq_n_u16, vmlaq_n_u32, vmlaq_s8,
vmlaq_s16, vmlaq_s32, vmlaq_u8, vmlaq_u16, vmlaq_u32,
vmls_n_f32, vmls_n_s16, vmls_n_s32, vmls_n_u16, vmls_n_u32,
vmls_s8, vmls_s16, vmls_s32, vmls_u8, vmls_u16, vmls_u32,
vmlsq_n_f32, vmlsq_n_s16, vmlsq_n_s32, vmlsq_n_u16,
vmlsq_n_u32, vmlsq_s8, vmlsq_s16, vmlsq_s32, vmlsq_u8,
vmlsq_u16, vmlsq_u32, vmla_f32, vmla_f64, vmlaq_f32,
vmlaq_f64, vmla_lane_f32, vmla_lane_s16, vmla_lane_s32,
vmla_lane_u16, vmla_lane_u32, vmla_laneq_f32, vmla_laneq_s16,
vmla_laneq_s32, vmla_laneq_u16, vmla_laneq_u32,
vmlaq_lane_f32, vmlaq_lane_s16, vmlaq_lane_s32,
vmlaq_lane_u16, vmlaq_lane_u32, vmlaq_laneq_f32,
vmlaq_laneq_s16, vmlaq_laneq_s32, vmlaq_laneq_u16,
vmlaq_laneq_u32, vmls_f32, vmls_f64, vmlsq_f32, vmlsq_f64,
vmls_lane_f32, vmls_lane_s16, vmls_lane_s32, vmls_lane_u16,
vmls_lane_u32, vmls_laneq_f32, vmls_laneq_s16, vmls_laneq_s32,
vmls_laneq_u16, vmls_laneq_u32, vmlsq_lane_f32,
vmlsq_lane_s16, vmlsq_lane_s32, vmlsq_lane_u16,
vmlsq_lane_u32, vmlsq_laneq_f32, vmlsq_laneq_s16,
vmlsq_laneq_s32, vmlsq_laneq_u16, vmlsq_laneq_u32): Delete
function definitions.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/neon/vmla.c: New test.
* gcc.target/aarch64/neon/vmls.c: New test.
---
gcc/config/aarch64/aarch64-acle-builtins.h | 15 +
.../aarch64/aarch64-neon-builtins-base.cc | 45 ++
.../aarch64/aarch64-neon-builtins-base.def | 20 +
gcc/config/aarch64/aarch64-simd-builtins.def | 23 -
gcc/config/aarch64/aarch64-simd.md | 146 ----
gcc/config/aarch64/arm_neon.h | 703 ------------------
gcc/testsuite/gcc.target/aarch64/neon/vmla.c | 350 +++++++++
gcc/testsuite/gcc.target/aarch64/neon/vmls.c | 350 +++++++++
8 files changed, 780 insertions(+), 872 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vmla.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vmls.c
diff --git a/gcc/config/aarch64/aarch64-acle-builtins.h
b/gcc/config/aarch64/aarch64-acle-builtins.h
index a9832c1689b..93306f61520 100644
--- a/gcc/config/aarch64/aarch64-acle-builtins.h
+++ b/gcc/config/aarch64/aarch64-acle-builtins.h
@@ -1959,6 +1959,19 @@ function_expander::result_mode () const
#define TYPES_b_neon(S, D, T) \
S (p8), S (s8), S (u8)
+/* _s8 _s16 _s32
+ _u8 _u16 _u32
+ _f32 _f64. */
+#define TYPES_neon_mla(S, D, T) \
+ TYPES_bhs_integer (S, D, T), \
+ TYPES_sd_float (S, D, T)
+
+/* _s16 _u16
+ _s32 _u32 _f32. */
+#define TYPES_neon_mla_lane(S, D, T) \
+ TYPES_hs_integer (S, D, T), \
+ TYPES_s_float (S, D, T)
+
/* _p8 _s8 _u8 _mf8. */
#define TYPES_neon_rev16(S, D, T) \
S (p8), S (s8), S (u8), S (mf8)
@@ -2207,6 +2220,8 @@ DEF_SVE_TYPES_ARRAY (bhdq_poly);
DEF_SVE_TYPES_ARRAY (bhs_neon);
DEF_SVE_TYPES_ARRAY (bhsd_neon);
DEF_SVE_TYPES_ARRAY (neon_copy_lane);
+DEF_SVE_TYPES_ARRAY (neon_mla_lane);
+DEF_SVE_TYPES_ARRAY (neon_mla);
DEF_SVE_TYPES_ARRAY (neon_rev16);
DEF_SVE_TYPES_ARRAY (neon_rev32);
DEF_SVE_TYPES_ARRAY (neon_rev64);
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index 0313eb49759..37071c4aab8 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -720,6 +720,45 @@ struct gimple_reinterpret : public gimple_function_base
}
};
+// vmla (add, mul1, mul2) = add + mul1 * mul2
+// vmls (add, mul1, mul2) = add - mul1 * mul2
+struct gimple_mla : public gimple_function_base
+{
+ tree_code m_code;
+
+public:
+ constexpr gimple_mla (tree_code code)
+ : m_code (code)
+ {}
+
+ gimple *fold (gimple_folder &f) const override
+ {
+ auto add = gimple_call_arg (f.call, 0);
+ auto mul1 = gimple_call_arg (f.call, 1);
+ auto mul2 = gimple_call_arg (f.call, 2);
+ auto lane_index = (gimple_call_num_args (f.call) >= 4)
+ ? gimple_call_arg (f.call, 3)
+ : nullptr;
+
+ if (lane_index)
+ mul2 = f.force_val (build_lane_get (mul2, lane_index));
+
+ auto mul1_type = TREE_TYPE (mul1);
+ auto mul2_type = TREE_TYPE (mul2);
+ if (!VECTOR_TYPE_P (mul2_type))
+ mul2 = f.force_val (build_vec_dup (mul1_type, mul2));
+
+ auto product = f.force_val (fold_build2 (MULT_EXPR, mul1_type, mul1,
mul2));
+
+ /* Use a PAREN_EXPR (equivalent to C's `__builtin_assoc_barrier`) to
prevent
+ floating-point add and mul being transformed to an FMA. */
+ if (FLOAT_TYPE_P (mul1_type))
+ product = f.force_val (fold_build1 (PAREN_EXPR, mul1_type, product));
+
+ return gimple_build_assign (f.lhs, this->m_code, add, product);
+ }
+};
+
// Reinterpret
NEON_FUNCTION (vreinterpret, vreinterpretq, gimple_reinterpret,)
@@ -738,6 +777,12 @@ NEON_FUNCTION (vaddd, gimple_expr, (PLUS_EXPR))
NEON_FUNCTION (vadd, gimple_expr, (PLUS_EXPR, PLUS_EXPR, BIT_XOR_EXPR))
NEON_FUNCTION (vaddq, gimple_expr, (PLUS_EXPR, PLUS_EXPR, BIT_XOR_EXPR))
+// Multiply-accumulate
+NEON_FUNCTION (vmla, vmlaq, vmla_n, vmlaq_n, vmla_lane, vmla_laneq, vmlaq_lane,
+ vmlaq_laneq, gimple_mla, (PLUS_EXPR))
+NEON_FUNCTION (vmls, vmlsq, vmls_n, vmlsq_n, vmls_lane, vmls_laneq, vmlsq_lane,
+ vmlsq_laneq, gimple_mla, (MINUS_EXPR))
+
// Bitwise operations
NEON_FUNCTION (vand, vandq, gimple_expr, (BIT_AND_EXPR))
NEON_FUNCTION (vbic, vbicq, gimple_not_rhs, (BIT_AND_EXPR))
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index 7257f59bbc5..d2ab46a3d95 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -76,6 +76,26 @@ DEF_NEON_FUNCTION (vadd, h_float, ("D0,D0,D0"))
DEF_NEON_FUNCTION (vaddq, h_float, ("Q0,Q0,Q0"))
#undef REQUIRED_EXTENSIONS
+// Multiply-accumulate
+#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
+DEF_NEON_FUNCTION (vmla, neon_mla, ("D0,D0,D0,D0"))
+DEF_NEON_FUNCTION (vmlaq, neon_mla, ("Q0,Q0,Q0,Q0"))
+DEF_NEON_FUNCTION (vmla_n, neon_mla_lane, ("D0,D0,D0,s0"))
+DEF_NEON_FUNCTION (vmlaq_n, neon_mla_lane, ("Q0,Q0,Q0,s0"))
+DEF_NEON_FUNCTION (vmla_lane, neon_mla_lane, ("D0,D0,D0,D0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmla_laneq, neon_mla_lane, ("D0,D0,D0,Q0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmlaq_lane, neon_mla_lane, ("Q0,Q0,Q0,D0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmlaq_laneq, neon_mla_lane, ("Q0,Q0,Q0,Q0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmls, neon_mla, ("D0,D0,D0,D0"))
+DEF_NEON_FUNCTION (vmlsq, neon_mla, ("Q0,Q0,Q0,Q0"))
+DEF_NEON_FUNCTION (vmls_n, neon_mla_lane, ("D0,D0,D0,s0"))
+DEF_NEON_FUNCTION (vmlsq_n, neon_mla_lane, ("Q0,Q0,Q0,s0"))
+DEF_NEON_FUNCTION (vmls_lane, neon_mla_lane, ("D0,D0,D0,D0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmls_laneq, neon_mla_lane, ("D0,D0,D0,Q0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmlsq_lane, neon_mla_lane, ("Q0,Q0,Q0,D0,ss32", lane<3>))
+DEF_NEON_FUNCTION (vmlsq_laneq, neon_mla_lane, ("Q0,Q0,Q0,Q0,ss32", lane<3>))
+#undef REQUIRED_EXTENSIONS
+
// Bitwise operations
#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
DEF_NEON_FUNCTION (vand, all_integer, ("D0,D0,D0"))
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def
b/gcc/config/aarch64/aarch64-simd-builtins.def
index 9c61cc05a05..2814caea1e3 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -241,20 +241,6 @@
BUILTIN_VQN (UNOP, xtn, 0, DEFAULT)
BUILTIN_VQN (UNOPU, xtn, 0, DEFAULT)
- /* Implemented by aarch64_mla<mode>. */
- BUILTIN_VDQ_BHSI (TERNOP, mla, 0, DEFAULT)
- BUILTIN_VDQ_BHSI (TERNOPU, mla, 0, DEFAULT)
- /* Implemented by aarch64_mla_n<mode>. */
- BUILTIN_VDQHS (TERNOP, mla_n, 0, DEFAULT)
- BUILTIN_VDQHS (TERNOPU, mla_n, 0, DEFAULT)
-
- /* Implemented by aarch64_mls<mode>. */
- BUILTIN_VDQ_BHSI (TERNOP, mls, 0, DEFAULT)
- BUILTIN_VDQ_BHSI (TERNOPU, mls, 0, DEFAULT)
- /* Implemented by aarch64_mls_n<mode>. */
- BUILTIN_VDQHS (TERNOP, mls_n, 0, DEFAULT)
- BUILTIN_VDQHS (TERNOPU, mls_n, 0, DEFAULT)
-
BUILTIN_VQN (SHIFTIMM, shrn_n, 0, DEFAULT)
BUILTIN_VQN (USHIFTIMM, shrn_n, 0, DEFAULT)
@@ -703,15 +689,6 @@
BUILTIN_VHSDF (TERNOP, fnma, 4, FP)
VAR1 (TERNOP, fnma, 4, FP, hf)
- BUILTIN_VDQF_DF (TERNOP, float_mla, 0, FP)
- BUILTIN_VDQF_DF (TERNOP, float_mls, 0, FP)
- BUILTIN_VDQSF (TERNOP, float_mla_n, 0, FP)
- BUILTIN_VDQSF (TERNOP, float_mls_n, 0, FP)
- BUILTIN_VDQSF (QUADOP_LANE, float_mla_lane, 0, FP)
- BUILTIN_VDQSF (QUADOP_LANE, float_mls_lane, 0, FP)
- BUILTIN_VDQSF (QUADOP_LANE, float_mla_laneq, 0, FP)
- BUILTIN_VDQSF (QUADOP_LANE, float_mls_laneq, 0, FP)
-
/* Implemented by aarch64_crypto_aes<op><mode>. */
VAR1 (BINOPU, crypto_aese, 0, DEFAULT, v16qi)
VAR1 (BINOPU, crypto_aesd, 0, DEFAULT, v16qi)
diff --git a/gcc/config/aarch64/aarch64-simd.md
b/gcc/config/aarch64/aarch64-simd.md
index fe6cb4250f6..0b824e73dbf 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -3040,152 +3040,6 @@ (define_insn "abs<mode>2<vczle><vczbe>"
[(set_attr "type" "neon_fp_abs_<stype><q>")]
)
-(define_expand "aarch64_float_mla<mode>"
- [(set (match_operand:VDQF_DF 0 "register_operand")
- (plus:VDQF_DF
- (mult:VDQF_DF
- (match_operand:VDQF_DF 2 "register_operand")
- (match_operand:VDQF_DF 3 "register_operand"))
- (match_operand:VDQF_DF 1 "register_operand")))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul<mode>3 (scratch, operands[2], operands[3]));
- emit_insn (gen_add<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mls<mode>"
- [(set (match_operand:VDQF_DF 0 "register_operand")
- (minus:VDQF_DF
- (match_operand:VDQF_DF 1 "register_operand")
- (mult:VDQF_DF
- (match_operand:VDQF_DF 2 "register_operand")
- (match_operand:VDQF_DF 3 "register_operand"))))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul<mode>3 (scratch, operands[2], operands[3]));
- emit_insn (gen_sub<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mla_n<mode>"
- [(set (match_operand:VDQSF 0 "register_operand")
- (plus:VDQSF
- (mult:VDQSF
- (vec_duplicate:VDQSF
- (match_operand:<VEL> 3 "register_operand"))
- (match_operand:VDQSF 2 "register_operand"))
- (match_operand:VDQSF 1 "register_operand")))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul_n<mode>3 (scratch, operands[2], operands[3]));
- emit_insn (gen_add<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mls_n<mode>"
- [(set (match_operand:VDQSF 0 "register_operand")
- (minus:VDQSF
- (match_operand:VDQSF 1 "register_operand")
- (mult:VDQSF
- (vec_duplicate:VDQSF
- (match_operand:<VEL> 3 "register_operand"))
- (match_operand:VDQSF 2 "register_operand"))))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul_n<mode>3 (scratch, operands[2], operands[3]));
- emit_insn (gen_sub<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mla_lane<mode>"
- [(set (match_operand:VDQSF 0 "register_operand")
- (plus:VDQSF
- (mult:VDQSF
- (vec_duplicate:VDQSF
- (vec_select:<VEL>
- (match_operand:V2SF 3 "register_operand")
- (parallel [(match_operand:SI 4 "immediate_operand")])))
- (match_operand:VDQSF 2 "register_operand"))
- (match_operand:VDQSF 1 "register_operand")))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul_lane<mode>3 (scratch, operands[2],
- operands[3], operands[4]));
- emit_insn (gen_add<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mls_lane<mode>"
- [(set (match_operand:VDQSF 0 "register_operand")
- (minus:VDQSF
- (match_operand:VDQSF 1 "register_operand")
- (mult:VDQSF
- (vec_duplicate:VDQSF
- (vec_select:<VEL>
- (match_operand:V2SF 3 "register_operand")
- (parallel [(match_operand:SI 4 "immediate_operand")])))
- (match_operand:VDQSF 2 "register_operand"))))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul_lane<mode>3 (scratch, operands[2],
- operands[3], operands[4]));
- emit_insn (gen_sub<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mla_laneq<mode>"
- [(set (match_operand:VDQSF 0 "register_operand")
- (plus:VDQSF
- (mult:VDQSF
- (vec_duplicate:VDQSF
- (vec_select:<VEL>
- (match_operand:V4SF 3 "register_operand")
- (parallel [(match_operand:SI 4 "immediate_operand")])))
- (match_operand:VDQSF 2 "register_operand"))
- (match_operand:VDQSF 1 "register_operand")))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul_laneq<mode>3 (scratch, operands[2],
- operands[3], operands[4]));
- emit_insn (gen_add<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
-(define_expand "aarch64_float_mls_laneq<mode>"
- [(set (match_operand:VDQSF 0 "register_operand")
- (minus:VDQSF
- (match_operand:VDQSF 1 "register_operand")
- (mult:VDQSF
- (vec_duplicate:VDQSF
- (vec_select:<VEL>
- (match_operand:V4SF 3 "register_operand")
- (parallel [(match_operand:SI 4 "immediate_operand")])))
- (match_operand:VDQSF 2 "register_operand"))))]
- "TARGET_SIMD"
- {
- rtx scratch = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_mul_laneq<mode>3 (scratch, operands[2],
- operands[3], operands[4]));
- emit_insn (gen_sub<mode>3 (operands[0], operands[1], scratch));
- DONE;
- }
-)
-
(define_insn "fma<mode>4<vczle><vczbe>"
[(set (match_operand:VHSDF 0 "register_operand" "=w")
(fma:VHSDF (match_operand:VHSDF 1 "register_operand" "w")
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 873a1195d3e..968609fcd4b 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -2130,83 +2130,6 @@ vcvtxd_f32_f64 (float64_t __a)
return __builtin_aarch64_float_trunc_rodd_df (__a);
}
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_n_f32 (float32x2_t __a, float32x2_t __b, float32_t __c)
-{
- return __builtin_aarch64_float_mla_nv2sf (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_n_s16 (int16x4_t __a, int16x4_t __b, int16_t __c)
-{
- return __builtin_aarch64_mla_nv4hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_n_s32 (int32x2_t __a, int32x2_t __b, int32_t __c)
-{
- return __builtin_aarch64_mla_nv2si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_n_u16 (uint16x4_t __a, uint16x4_t __b, uint16_t __c)
-{
- return __builtin_aarch64_mla_nv4hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_n_u32 (uint32x2_t __a, uint32x2_t __b, uint32_t __c)
-{
- return __builtin_aarch64_mla_nv2si_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline int8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_s8 (int8x8_t __a, int8x8_t __b, int8x8_t __c)
-{
- return __builtin_aarch64_mlav8qi (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_s16 (int16x4_t __a, int16x4_t __b, int16x4_t __c)
-{
- return __builtin_aarch64_mlav4hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_s32 (int32x2_t __a, int32x2_t __b, int32x2_t __c)
-{
- return __builtin_aarch64_mlav2si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_u8 (uint8x8_t __a, uint8x8_t __b, uint8x8_t __c)
-{
- return __builtin_aarch64_mlav8qi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_u16 (uint16x4_t __a, uint16x4_t __b, uint16x4_t __c)
-{
- return __builtin_aarch64_mlav4hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_u32 (uint32x2_t __a, uint32x2_t __b, uint32x2_t __c)
-{
- return __builtin_aarch64_mlav2si_uuuu (__a, __b, __c);
-}
-
__extension__ extern __inline int32x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vmlal_high_lane_s16(int32x4_t __a, int16x8_t __b, int16x4_t __v,
@@ -2467,160 +2390,6 @@ vmlal_u32 (uint64x2_t __a, uint32x2_t __b, uint32x2_t
__c)
return __builtin_aarch64_umlalv2si_uuuu (__a, __b, __c);
}
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_n_f32 (float32x4_t __a, float32x4_t __b, float32_t __c)
-{
- return __builtin_aarch64_float_mla_nv4sf (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_n_s16 (int16x8_t __a, int16x8_t __b, int16_t __c)
-{
- return __builtin_aarch64_mla_nv8hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_n_s32 (int32x4_t __a, int32x4_t __b, int32_t __c)
-{
- return __builtin_aarch64_mla_nv4si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_n_u16 (uint16x8_t __a, uint16x8_t __b, uint16_t __c)
-{
- return __builtin_aarch64_mla_nv8hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_n_u32 (uint32x4_t __a, uint32x4_t __b, uint32_t __c)
-{
- return __builtin_aarch64_mla_nv4si_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline int8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_s8 (int8x16_t __a, int8x16_t __b, int8x16_t __c)
-{
- return __builtin_aarch64_mlav16qi (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_s16 (int16x8_t __a, int16x8_t __b, int16x8_t __c)
-{
- return __builtin_aarch64_mlav8hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_s32 (int32x4_t __a, int32x4_t __b, int32x4_t __c)
-{
- return __builtin_aarch64_mlav4si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_u8 (uint8x16_t __a, uint8x16_t __b, uint8x16_t __c)
-{
- return __builtin_aarch64_mlav16qi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_u16 (uint16x8_t __a, uint16x8_t __b, uint16x8_t __c)
-{
- return __builtin_aarch64_mlav8hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_u32 (uint32x4_t __a, uint32x4_t __b, uint32x4_t __c)
-{
- return __builtin_aarch64_mlav4si_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_n_f32 (float32x2_t __a, float32x2_t __b, float32_t __c)
-{
- return __builtin_aarch64_float_mls_nv2sf (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_n_s16 (int16x4_t __a, int16x4_t __b, int16_t __c)
-{
- return __builtin_aarch64_mls_nv4hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_n_s32 (int32x2_t __a, int32x2_t __b, int32_t __c)
-{
- return __builtin_aarch64_mls_nv2si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_n_u16 (uint16x4_t __a, uint16x4_t __b, uint16_t __c)
-{
- return __builtin_aarch64_mls_nv4hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_n_u32 (uint32x2_t __a, uint32x2_t __b, uint32_t __c)
-{
- return __builtin_aarch64_mls_nv2si_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline int8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_s8 (int8x8_t __a, int8x8_t __b, int8x8_t __c)
-{
- return __builtin_aarch64_mlsv8qi (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_s16 (int16x4_t __a, int16x4_t __b, int16x4_t __c)
-{
- return __builtin_aarch64_mlsv4hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_s32 (int32x2_t __a, int32x2_t __b, int32x2_t __c)
-{
- return __builtin_aarch64_mlsv2si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_u8 (uint8x8_t __a, uint8x8_t __b, uint8x8_t __c)
-{
- return __builtin_aarch64_mlsv8qi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_u16 (uint16x4_t __a, uint16x4_t __b, uint16x4_t __c)
-{
- return __builtin_aarch64_mlsv4hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_u32 (uint32x2_t __a, uint32x2_t __b, uint32x2_t __c)
-{
- return __builtin_aarch64_mlsv2si_uuuu (__a, __b, __c);
-}
-
__extension__ extern __inline int32x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vmlsl_high_lane_s16(int32x4_t __a, int16x8_t __b, int16x4_t __v,
@@ -2885,83 +2654,6 @@ vmlsl_u32 (uint64x2_t __a, uint32x2_t __b, uint32x2_t
__c)
return __builtin_aarch64_umlslv2si_uuuu (__a, __b, __c);
}
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_n_f32 (float32x4_t __a, float32x4_t __b, float32_t __c)
-{
- return __builtin_aarch64_float_mls_nv4sf (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_n_s16 (int16x8_t __a, int16x8_t __b, int16_t __c)
-{
- return __builtin_aarch64_mls_nv8hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_n_s32 (int32x4_t __a, int32x4_t __b, int32_t __c)
-{
- return __builtin_aarch64_mls_nv4si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_n_u16 (uint16x8_t __a, uint16x8_t __b, uint16_t __c)
-{
- return __builtin_aarch64_mls_nv8hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_n_u32 (uint32x4_t __a, uint32x4_t __b, uint32_t __c)
-{
- return __builtin_aarch64_mls_nv4si_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline int8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_s8 (int8x16_t __a, int8x16_t __b, int8x16_t __c)
-{
- return __builtin_aarch64_mlsv16qi (__a, __b, __c);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_s16 (int16x8_t __a, int16x8_t __b, int16x8_t __c)
-{
- return __builtin_aarch64_mlsv8hi (__a, __b, __c);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_s32 (int32x4_t __a, int32x4_t __b, int32x4_t __c)
-{
- return __builtin_aarch64_mlsv4si (__a, __b, __c);
-}
-
-__extension__ extern __inline uint8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_u8 (uint8x16_t __a, uint8x16_t __b, uint8x16_t __c)
-{
- return __builtin_aarch64_mlsv16qi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_u16 (uint16x8_t __a, uint16x8_t __b, uint16x8_t __c)
-{
- return __builtin_aarch64_mlsv8hi_uuuu (__a, __b, __c);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_u32 (uint32x4_t __a, uint32x4_t __b, uint32x4_t __c)
-{
- return __builtin_aarch64_mlsv4si_uuuu (__a, __b, __c);
-}
-
__extension__ extern __inline int16x8_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vmovl_high_s8 (int8x16_t __a)
@@ -12994,401 +12686,6 @@ vminnmvq_f64 (float64x2_t __a)
return __builtin_aarch64_reduc_smin_scal_v2df (__a);
}
-/* vmla */
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_f32 (float32x2_t __a, float32x2_t __b, float32x2_t __c)
-{
- return __builtin_aarch64_float_mlav2sf (__a, __b, __c);
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_f64 (float64x1_t __a, float64x1_t __b, float64x1_t __c)
-{
- return (float64x1_t) {__builtin_aarch64_float_mladf (__a[0], __b[0],
__c[0])};
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_f32 (float32x4_t __a, float32x4_t __b, float32x4_t __c)
-{
- return __builtin_aarch64_float_mlav4sf (__a, __b, __c);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_f64 (float64x2_t __a, float64x2_t __b, float64x2_t __c)
-{
- return __builtin_aarch64_float_mlav2df (__a, __b, __c);
-}
-
-/* vmla_lane */
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_lane_f32 (float32x2_t __a, float32x2_t __b,
- float32x2_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mla_lanev2sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_lane_s16 (int16x4_t __a, int16x4_t __b,
- int16x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_lane_s32 (int32x2_t __a, int32x2_t __b,
- int32x2_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_lane_u16 (uint16x4_t __a, uint16x4_t __b,
- uint16x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_lane_u32 (uint32x2_t __a, uint32x2_t __b,
- uint32x2_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-/* vmla_laneq */
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_laneq_f32 (float32x2_t __a, float32x2_t __b,
- float32x4_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mla_laneqv2sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_laneq_s16 (int16x4_t __a, int16x4_t __b,
- int16x8_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_laneq_s32 (int32x2_t __a, int32x2_t __b,
- int32x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_laneq_u16 (uint16x4_t __a, uint16x4_t __b,
- uint16x8_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmla_laneq_u32 (uint32x2_t __a, uint32x2_t __b,
- uint32x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-/* vmlaq_lane */
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_lane_f32 (float32x4_t __a, float32x4_t __b,
- float32x2_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mla_lanev4sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_lane_s16 (int16x8_t __a, int16x8_t __b,
- int16x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_lane_s32 (int32x4_t __a, int32x4_t __b,
- int32x2_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_lane_u16 (uint16x8_t __a, uint16x8_t __b,
- uint16x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_lane_u32 (uint32x4_t __a, uint32x4_t __b,
- uint32x2_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
- /* vmlaq_laneq */
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_laneq_f32 (float32x4_t __a, float32x4_t __b,
- float32x4_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mla_laneqv4sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_laneq_s16 (int16x8_t __a, int16x8_t __b,
- int16x8_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_laneq_s32 (int32x4_t __a, int32x4_t __b,
- int32x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_laneq_u16 (uint16x8_t __a, uint16x8_t __b,
- uint16x8_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlaq_laneq_u32 (uint32x4_t __a, uint32x4_t __b,
- uint32x4_t __c, const int __lane)
-{
- return (__a + (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-/* vmls */
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_f32 (float32x2_t __a, float32x2_t __b, float32x2_t __c)
-{
- return __builtin_aarch64_float_mlsv2sf (__a, __b, __c);
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_f64 (float64x1_t __a, float64x1_t __b, float64x1_t __c)
-{
- return (float64x1_t) {__builtin_aarch64_float_mlsdf (__a[0], __b[0],
__c[0])};
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_f32 (float32x4_t __a, float32x4_t __b, float32x4_t __c)
-{
- return __builtin_aarch64_float_mlsv4sf (__a, __b, __c);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_f64 (float64x2_t __a, float64x2_t __b, float64x2_t __c)
-{
- return __builtin_aarch64_float_mlsv2df (__a, __b, __c);
-}
-
-/* vmls_lane */
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_lane_f32 (float32x2_t __a, float32x2_t __b,
- float32x2_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mls_lanev2sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_lane_s16 (int16x4_t __a, int16x4_t __b,
- int16x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_lane_s32 (int32x2_t __a, int32x2_t __b,
- int32x2_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_lane_u16 (uint16x4_t __a, uint16x4_t __b,
- uint16x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_lane_u32 (uint32x2_t __a, uint32x2_t __b,
- uint32x2_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-/* vmls_laneq */
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_laneq_f32 (float32x2_t __a, float32x2_t __b,
- float32x4_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mls_laneqv2sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_laneq_s16 (int16x4_t __a, int16x4_t __b,
- int16x8_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_laneq_s32 (int32x2_t __a, int32x2_t __b,
- int32x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_laneq_u16 (uint16x4_t __a, uint16x4_t __b,
- uint16x8_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmls_laneq_u32 (uint32x2_t __a, uint32x2_t __b,
- uint32x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-/* vmlsq_lane */
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_lane_f32 (float32x4_t __a, float32x4_t __b,
- float32x2_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mls_lanev4sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_lane_s16 (int16x8_t __a, int16x8_t __b,
- int16x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_lane_s32 (int32x4_t __a, int32x4_t __b,
- int32x2_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_lane_u16 (uint16x8_t __a, uint16x8_t __b,
- uint16x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_lane_u32 (uint32x4_t __a, uint32x4_t __b,
- uint32x2_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
- /* vmlsq_laneq */
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_laneq_f32 (float32x4_t __a, float32x4_t __b,
- float32x4_t __c, const int __lane)
-{
- return __builtin_aarch64_float_mls_laneqv4sf (__a, __b, __c, __lane);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_laneq_s16 (int16x8_t __a, int16x8_t __b,
- int16x8_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_laneq_s32 (int32x4_t __a, int32x4_t __b,
- int32x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_laneq_u16 (uint16x8_t __a, uint16x8_t __b,
- uint16x8_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vmlsq_laneq_u32 (uint32x4_t __a, uint32x4_t __b,
- uint32x4_t __c, const int __lane)
-{
- return (__a - (__b * __aarch64_vget_lane_any (__c, __lane)));
-}
-
/* vmul_lane */
__extension__ extern __inline float32x2_t
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vmla.c
b/gcc/testsuite/gcc.target/aarch64/neon/vmla.c
new file mode 100644
index 00000000000..a247987b1fa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vmla.c
@@ -0,0 +1,350 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+#define TEST_LANE(NAME, RET_TYPE, TYPE1, TYPE2, TYPE3)
\
+ RET_TYPE test_##NAME (TYPE1 a, TYPE2 b, TYPE3 c)
\
+ {
\
+ return NAME (a, b, c, VEC_LEN (c) - 1);
\
+ }
+
+/*
+** test_vmla_s8:
+** mla v0\.8b, (v1\.8b, v2\.8b|v2\.8b, v1\.8b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_s8, int8x8_t)
+
+/*
+** test_vmla_u8:
+** mla v0\.8b, (v1\.8b, v2\.8b|v2\.8b, v1\.8b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_u8, uint8x8_t)
+
+/*
+** test_vmlaq_s8:
+** mla v0\.16b, (v1\.16b, v2\.16b|v2\.16b, v1\.16b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_s8, int8x16_t)
+
+/*
+** test_vmlaq_u8:
+** mla v0\.16b, (v1\.16b, v2\.16b|v2\.16b, v1\.16b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_u8, uint8x16_t)
+
+/*
+** test_vmla_s16:
+** mla v0\.4h, (v1\.4h, v2\.4h|v2\.4h, v1\.4h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_s16, int16x4_t)
+
+/*
+** test_vmla_u16:
+** mla v0\.4h, (v1\.4h, v2\.4h|v2\.4h, v1\.4h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_u16, uint16x4_t)
+
+/*
+** test_vmlaq_s16:
+** mla v0\.8h, (v1\.8h, v2\.8h|v2\.8h, v1\.8h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_s16, int16x8_t)
+
+/*
+** test_vmlaq_u16:
+** mla v0\.8h, (v1\.8h, v2\.8h|v2\.8h, v1\.8h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_u16, uint16x8_t)
+
+/*
+** test_vmla_s32:
+** mla v0\.2s, (v1\.2s, v2\.2s|v2\.2s, v1\.2s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_s32, int32x2_t)
+
+/*
+** test_vmla_u32:
+** mla v0\.2s, (v1\.2s, v2\.2s|v2\.2s, v1\.2s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_u32, uint32x2_t)
+
+/*
+** test_vmlaq_s32:
+** mla v0\.4s, (v1\.4s, v2\.4s|v2\.4s, v1\.4s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_s32, int32x4_t)
+
+/*
+** test_vmlaq_u32:
+** mla v0\.4s, (v1\.4s, v2\.4s|v2\.4s, v1\.4s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_u32, uint32x4_t)
+
+/*
+** test_vmla_f32:
+** fmul (v[0-9]+\.2s), (v1\.2s, v2\.2s|v2\.2s, v1\.2s)
+** fadd v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_f32, float32x2_t)
+
+/*
+** test_vmlaq_f32:
+** fmul (v[0-9]+\.4s), (v1\.4s, v2\.4s|v2\.4s, v1\.4s)
+** fadd v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_f32, float32x4_t)
+
+/*
+** test_vmla_f64:
+** fmul (d[0-9]+), (d1, d2|d2, d1)
+** fadd d0, (\1, d0|d0, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmla_f64, float64x1_t)
+
+/*
+** test_vmlaq_f64:
+** fmul (v[0-9]+\.2d), (v1\.2d, v2\.2d|v2\.2d, v1\.2d)
+** fadd v0\.2d, (\1, v0\.2d|v0\.2d, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlaq_f64, float64x2_t)
+
+/*
+** test_vmla_n_s16:
+** dup v([0-9]+)\.4h, w0
+** mla v0\.4h, v1\.4h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmla_n_s16, int16x4_t, int16x4_t, int16x4_t, int16_t)
+
+/*
+** test_vmla_n_u16:
+** dup v([0-9]+)\.4h, w0
+** mla v0\.4h, v1\.4h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmla_n_u16, uint16x4_t, uint16x4_t, uint16x4_t, uint16_t)
+
+/*
+** test_vmlaq_n_s16:
+** dup v([0-9]+)\.4h, w0
+** mla v0\.8h, v1\.8h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmlaq_n_s16, int16x8_t, int16x8_t, int16x8_t, int16_t)
+
+/*
+** test_vmlaq_n_u16:
+** dup v([0-9]+)\.4h, w0
+** mla v0\.8h, v1\.8h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmlaq_n_u16, uint16x8_t, uint16x8_t, uint16x8_t, uint16_t)
+
+/*
+** test_vmla_n_s32:
+** fmov s([0-9]+), w0
+** mla v0\.2s, v1\.2s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmla_n_s32, int32x2_t, int32x2_t, int32x2_t, int32_t)
+
+/*
+** test_vmla_n_u32:
+** fmov s([0-9]+), w0
+** mla v0\.2s, v1\.2s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmla_n_u32, uint32x2_t, uint32x2_t, uint32x2_t, uint32_t)
+
+/*
+** test_vmlaq_n_s32:
+** fmov s([0-9]+), w0
+** mla v0\.4s, v1\.4s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmlaq_n_s32, int32x4_t, int32x4_t, int32x4_t, int32_t)
+
+/*
+** test_vmlaq_n_u32:
+** fmov s([0-9]+), w0
+** mla v0\.4s, v1\.4s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmlaq_n_u32, uint32x4_t, uint32x4_t, uint32x4_t, uint32_t)
+
+/*
+** test_vmla_n_f32:
+** fmul (v[0-9]+\.2s), v1\.2s, v2\.s\[0\]
+** fadd v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_TERNARY (vmla_n_f32, float32x2_t, float32x2_t, float32x2_t, float32_t)
+
+/*
+** test_vmlaq_n_f32:
+** fmul (v[0-9]+\.4s), v1\.4s, v2\.s\[0\]
+** fadd v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_TERNARY (vmlaq_n_f32, float32x4_t, float32x4_t, float32x4_t, float32_t)
+
+/*
+** test_vmla_lane_s16:
+** mla v0\.4h, v1\.4h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmla_lane_s16, int16x4_t, int16x4_t, int16x4_t, int16x4_t)
+
+/*
+** test_vmla_lane_u16:
+** mla v0\.4h, v1\.4h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmla_lane_u16, uint16x4_t, uint16x4_t, uint16x4_t, uint16x4_t)
+
+/*
+** test_vmla_lane_s32:
+** mla v0\.2s, v1\.2s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmla_lane_s32, int32x2_t, int32x2_t, int32x2_t, int32x2_t)
+
+/*
+** test_vmla_lane_u32:
+** mla v0\.2s, v1\.2s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmla_lane_u32, uint32x2_t, uint32x2_t, uint32x2_t, uint32x2_t)
+
+/*
+** test_vmla_lane_f32:
+** fmul (v[0-9]+\.2s), v1\.2s, v2\.s\[1\]
+** fadd v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_LANE (vmla_lane_f32, float32x2_t, float32x2_t, float32x2_t, float32x2_t)
+
+/*
+** test_vmla_laneq_s16:
+** mla v0\.4h, v1\.4h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmla_laneq_s16, int16x4_t, int16x4_t, int16x4_t, int16x8_t)
+
+/*
+** test_vmla_laneq_u16:
+** mla v0\.4h, v1\.4h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmla_laneq_u16, uint16x4_t, uint16x4_t, uint16x4_t, uint16x8_t)
+
+/*
+** test_vmla_laneq_s32:
+** mla v0\.2s, v1\.2s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmla_laneq_s32, int32x2_t, int32x2_t, int32x2_t, int32x4_t)
+
+/*
+** test_vmla_laneq_u32:
+** mla v0\.2s, v1\.2s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmla_laneq_u32, uint32x2_t, uint32x2_t, uint32x2_t, uint32x4_t)
+
+/*
+** test_vmla_laneq_f32:
+** fmul (v[0-9]+\.2s), v1\.2s, v2\.s\[3\]
+** fadd v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_LANE (vmla_laneq_f32, float32x2_t, float32x2_t, float32x2_t, float32x4_t)
+
+/*
+** test_vmlaq_lane_s16:
+** mla v0\.8h, v1\.8h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmlaq_lane_s16, int16x8_t, int16x8_t, int16x8_t, int16x4_t)
+
+/*
+** test_vmlaq_lane_u16:
+** mla v0\.8h, v1\.8h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmlaq_lane_u16, uint16x8_t, uint16x8_t, uint16x8_t, uint16x4_t)
+
+/*
+** test_vmlaq_lane_s32:
+** mla v0\.4s, v1\.4s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmlaq_lane_s32, int32x4_t, int32x4_t, int32x4_t, int32x2_t)
+
+/*
+** test_vmlaq_lane_u32:
+** mla v0\.4s, v1\.4s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmlaq_lane_u32, uint32x4_t, uint32x4_t, uint32x4_t, uint32x2_t)
+
+/*
+** test_vmlaq_lane_f32:
+** fmul (v[0-9]+\.4s), v1\.4s, v2\.s\[1\]
+** fadd v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_LANE (vmlaq_lane_f32, float32x4_t, float32x4_t, float32x4_t, float32x2_t)
+
+/*
+** test_vmlaq_laneq_s16:
+** mla v0\.8h, v1\.8h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmlaq_laneq_s16, int16x8_t, int16x8_t, int16x8_t, int16x8_t)
+
+/*
+** test_vmlaq_laneq_u16:
+** mla v0\.8h, v1\.8h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmlaq_laneq_u16, uint16x8_t, uint16x8_t, uint16x8_t, uint16x8_t)
+
+/*
+** test_vmlaq_laneq_s32:
+** mla v0\.4s, v1\.4s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmlaq_laneq_s32, int32x4_t, int32x4_t, int32x4_t, int32x4_t)
+
+/*
+** test_vmlaq_laneq_u32:
+** mla v0\.4s, v1\.4s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmlaq_laneq_u32, uint32x4_t, uint32x4_t, uint32x4_t, uint32x4_t)
+
+/*
+** test_vmlaq_laneq_f32:
+** fmul (v[0-9]+\.4s), v1\.4s, v2\.s\[3\]
+** fadd v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_LANE (vmlaq_laneq_f32, float32x4_t, float32x4_t, float32x4_t, float32x4_t)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vmls.c
b/gcc/testsuite/gcc.target/aarch64/neon/vmls.c
new file mode 100644
index 00000000000..cb851681b18
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vmls.c
@@ -0,0 +1,350 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+#define TEST_LANE(NAME, RET_TYPE, TYPE1, TYPE2, TYPE3)
\
+ RET_TYPE test_##NAME (TYPE1 a, TYPE2 b, TYPE3 c)
\
+ {
\
+ return NAME (a, b, c, VEC_LEN (c) - 1);
\
+ }
+
+/*
+** test_vmls_s8:
+** mls v0\.8b, (v1\.8b, v2\.8b|v2\.8b, v1\.8b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_s8, int8x8_t)
+
+/*
+** test_vmls_u8:
+** mls v0\.8b, (v1\.8b, v2\.8b|v2\.8b, v1\.8b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_u8, uint8x8_t)
+
+/*
+** test_vmlsq_s8:
+** mls v0\.16b, (v1\.16b, v2\.16b|v2\.16b, v1\.16b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_s8, int8x16_t)
+
+/*
+** test_vmlsq_u8:
+** mls v0\.16b, (v1\.16b, v2\.16b|v2\.16b, v1\.16b)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_u8, uint8x16_t)
+
+/*
+** test_vmls_s16:
+** mls v0\.4h, (v1\.4h, v2\.4h|v2\.4h, v1\.4h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_s16, int16x4_t)
+
+/*
+** test_vmls_u16:
+** mls v0\.4h, (v1\.4h, v2\.4h|v2\.4h, v1\.4h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_u16, uint16x4_t)
+
+/*
+** test_vmlsq_s16:
+** mls v0\.8h, (v1\.8h, v2\.8h|v2\.8h, v1\.8h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_s16, int16x8_t)
+
+/*
+** test_vmlsq_u16:
+** mls v0\.8h, (v1\.8h, v2\.8h|v2\.8h, v1\.8h)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_u16, uint16x8_t)
+
+/*
+** test_vmls_s32:
+** mls v0\.2s, (v1\.2s, v2\.2s|v2\.2s, v1\.2s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_s32, int32x2_t)
+
+/*
+** test_vmls_u32:
+** mls v0\.2s, (v1\.2s, v2\.2s|v2\.2s, v1\.2s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_u32, uint32x2_t)
+
+/*
+** test_vmlsq_s32:
+** mls v0\.4s, (v1\.4s, v2\.4s|v2\.4s, v1\.4s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_s32, int32x4_t)
+
+/*
+** test_vmlsq_u32:
+** mls v0\.4s, (v1\.4s, v2\.4s|v2\.4s, v1\.4s)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_u32, uint32x4_t)
+
+/*
+** test_vmls_f32:
+** fmul (v[0-9]+\.2s), (v1\.2s, v2\.2s|v2\.2s, v1\.2s)
+** fsub v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_f32, float32x2_t)
+
+/*
+** test_vmlsq_f32:
+** fmul (v[0-9]+\.4s), (v1\.4s, v2\.4s|v2\.4s, v1\.4s)
+** fsub v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_f32, float32x4_t)
+
+/*
+** test_vmls_f64:
+** fmul (d[0-9]+), (d1, d2|d2, d1)
+** fsub d0, (\1, d0|d0, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmls_f64, float64x1_t)
+
+/*
+** test_vmlsq_f64:
+** fmul (v[0-9]+\.2d), (v1\.2d, v2\.2d|v2\.2d, v1\.2d)
+** fsub v0\.2d, (\1, v0\.2d|v0\.2d, \1)
+** ret
+*/
+TEST_UNIFORM_TERNARY (vmlsq_f64, float64x2_t)
+
+/*
+** test_vmls_n_s16:
+** dup v([0-9]+)\.4h, w0
+** mls v0\.4h, v1\.4h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmls_n_s16, int16x4_t, int16x4_t, int16x4_t, int16_t)
+
+/*
+** test_vmls_n_u16:
+** dup v([0-9]+)\.4h, w0
+** mls v0\.4h, v1\.4h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmls_n_u16, uint16x4_t, uint16x4_t, uint16x4_t, uint16_t)
+
+/*
+** test_vmlsq_n_s16:
+** dup v([0-9]+)\.4h, w0
+** mls v0\.8h, v1\.8h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmlsq_n_s16, int16x8_t, int16x8_t, int16x8_t, int16_t)
+
+/*
+** test_vmlsq_n_u16:
+** dup v([0-9]+)\.4h, w0
+** mls v0\.8h, v1\.8h, v\1\.h\[0\]
+** ret
+*/
+TEST_TERNARY (vmlsq_n_u16, uint16x8_t, uint16x8_t, uint16x8_t, uint16_t)
+
+/*
+** test_vmls_n_s32:
+** fmov s([0-9]+), w0
+** mls v0\.2s, v1\.2s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmls_n_s32, int32x2_t, int32x2_t, int32x2_t, int32_t)
+
+/*
+** test_vmls_n_u32:
+** fmov s([0-9]+), w0
+** mls v0\.2s, v1\.2s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmls_n_u32, uint32x2_t, uint32x2_t, uint32x2_t, uint32_t)
+
+/*
+** test_vmlsq_n_s32:
+** fmov s([0-9]+), w0
+** mls v0\.4s, v1\.4s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmlsq_n_s32, int32x4_t, int32x4_t, int32x4_t, int32_t)
+
+/*
+** test_vmlsq_n_u32:
+** fmov s([0-9]+), w0
+** mls v0\.4s, v1\.4s, v\1\.s\[0\]
+** ret
+*/
+TEST_TERNARY (vmlsq_n_u32, uint32x4_t, uint32x4_t, uint32x4_t, uint32_t)
+
+/*
+** test_vmls_n_f32:
+** fmul (v[0-9]+\.2s), v1\.2s, v2\.s\[0\]
+** fsub v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_TERNARY (vmls_n_f32, float32x2_t, float32x2_t, float32x2_t, float32_t)
+
+/*
+** test_vmlsq_n_f32:
+** fmul (v[0-9]+\.4s), v1\.4s, v2\.s\[0\]
+** fsub v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_TERNARY (vmlsq_n_f32, float32x4_t, float32x4_t, float32x4_t, float32_t)
+
+/*
+** test_vmls_lane_s16:
+** mls v0\.4h, v1\.4h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmls_lane_s16, int16x4_t, int16x4_t, int16x4_t, int16x4_t)
+
+/*
+** test_vmls_lane_u16:
+** mls v0\.4h, v1\.4h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmls_lane_u16, uint16x4_t, uint16x4_t, uint16x4_t, uint16x4_t)
+
+/*
+** test_vmls_lane_s32:
+** mls v0\.2s, v1\.2s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmls_lane_s32, int32x2_t, int32x2_t, int32x2_t, int32x2_t)
+
+/*
+** test_vmls_lane_u32:
+** mls v0\.2s, v1\.2s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmls_lane_u32, uint32x2_t, uint32x2_t, uint32x2_t, uint32x2_t)
+
+/*
+** test_vmls_lane_f32:
+** fmul (v[0-9]+\.2s), v1\.2s, v2\.s\[1\]
+** fsub v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_LANE (vmls_lane_f32, float32x2_t, float32x2_t, float32x2_t, float32x2_t)
+
+/*
+** test_vmls_laneq_s16:
+** mls v0\.4h, v1\.4h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmls_laneq_s16, int16x4_t, int16x4_t, int16x4_t, int16x8_t)
+
+/*
+** test_vmls_laneq_u16:
+** mls v0\.4h, v1\.4h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmls_laneq_u16, uint16x4_t, uint16x4_t, uint16x4_t, uint16x8_t)
+
+/*
+** test_vmls_laneq_s32:
+** mls v0\.2s, v1\.2s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmls_laneq_s32, int32x2_t, int32x2_t, int32x2_t, int32x4_t)
+
+/*
+** test_vmls_laneq_u32:
+** mls v0\.2s, v1\.2s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmls_laneq_u32, uint32x2_t, uint32x2_t, uint32x2_t, uint32x4_t)
+
+/*
+** test_vmls_laneq_f32:
+** fmul (v[0-9]+\.2s), v1\.2s, v2\.s\[3\]
+** fsub v0\.2s, (\1, v0\.2s|v0\.2s, \1)
+** ret
+*/
+TEST_LANE (vmls_laneq_f32, float32x2_t, float32x2_t, float32x2_t, float32x4_t)
+
+/*
+** test_vmlsq_lane_s16:
+** mls v0\.8h, v1\.8h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmlsq_lane_s16, int16x8_t, int16x8_t, int16x8_t, int16x4_t)
+
+/*
+** test_vmlsq_lane_u16:
+** mls v0\.8h, v1\.8h, v2\.h\[3\]
+** ret
+*/
+TEST_LANE (vmlsq_lane_u16, uint16x8_t, uint16x8_t, uint16x8_t, uint16x4_t)
+
+/*
+** test_vmlsq_lane_s32:
+** mls v0\.4s, v1\.4s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmlsq_lane_s32, int32x4_t, int32x4_t, int32x4_t, int32x2_t)
+
+/*
+** test_vmlsq_lane_u32:
+** mls v0\.4s, v1\.4s, v2\.s\[1\]
+** ret
+*/
+TEST_LANE (vmlsq_lane_u32, uint32x4_t, uint32x4_t, uint32x4_t, uint32x2_t)
+
+/*
+** test_vmlsq_lane_f32:
+** fmul (v[0-9]+\.4s), v1\.4s, v2\.s\[1\]
+** fsub v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_LANE (vmlsq_lane_f32, float32x4_t, float32x4_t, float32x4_t, float32x2_t)
+
+/*
+** test_vmlsq_laneq_s16:
+** mls v0\.8h, v1\.8h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmlsq_laneq_s16, int16x8_t, int16x8_t, int16x8_t, int16x8_t)
+
+/*
+** test_vmlsq_laneq_u16:
+** mls v0\.8h, v1\.8h, v2\.h\[7\]
+** ret
+*/
+TEST_LANE (vmlsq_laneq_u16, uint16x8_t, uint16x8_t, uint16x8_t, uint16x8_t)
+
+/*
+** test_vmlsq_laneq_s32:
+** mls v0\.4s, v1\.4s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmlsq_laneq_s32, int32x4_t, int32x4_t, int32x4_t, int32x4_t)
+
+/*
+** test_vmlsq_laneq_u32:
+** mls v0\.4s, v1\.4s, v2\.s\[3\]
+** ret
+*/
+TEST_LANE (vmlsq_laneq_u32, uint32x4_t, uint32x4_t, uint32x4_t, uint32x4_t)
+
+/*
+** test_vmlsq_laneq_f32:
+** fmul (v[0-9]+\.4s), v1\.4s, v2\.s\[3\]
+** fsub v0\.4s, (\1, v0\.4s|v0\.4s, \1)
+** ret
+*/
+TEST_LANE (vmlsq_laneq_f32, float32x4_t, float32x4_t, float32x4_t, float32x4_t)
--
2.51.0