[(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
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vmla_f32 (float32x2_t __a, float32x2_t __b, float32x2_t __c)
{
- return __a + __b * __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 __a + __b * __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 __a + __b * __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 __a + __b * __c;
+ return __builtin_aarch64_float_mlav2df (__a, __b, __c);
}
/* vmla_lane */
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vmls_f32 (float32x2_t __a, float32x2_t __b, float32x2_t __c)
{
- return __a - __b * __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 __a - __b * __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 __a - __b * __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 __a - __b * __c;
+ return __builtin_aarch64_float_mlsv2df (__a, __b, __c);
}
/* vmls_lane */