[(set_attr "type" "vfwalu")]
)
+;; vfwsub.wf
+(define_insn_and_split "*vfwsub_wf_<mode>"
+ [(set (match_operand:VWEXTF 0 "register_operand")
+ (minus:VWEXTF
+ (match_operand:VWEXTF 1 "register_operand")
+ (vec_duplicate:VWEXTF
+ (float_extend:<VEL>
+ (match_operand:<VSUBEL> 2 "register_operand")))))]
+ "TARGET_VECTOR && can_create_pseudo_p ()"
+ "#"
+ "&& 1"
+ [(const_int 0)]
+ {
+ riscv_vector::emit_vlmax_insn (code_for_pred_single_widen_scalar (MINUS,
+ <MODE>mode),
+ riscv_vector::BINARY_OP_FRM_DYN, operands);
+
+ DONE;
+ }
+ [(set_attr "type" "vfwalu")]
+)
+
;; vfadd.vf
(define_insn_and_split "*vfadd_vf_<mode>"
[(set (match_operand:V_VLSF 0 "register_operand")
DEF_VF_BINOP_WIDEN_CASE_0 (_Float16, float, +, add)
DEF_VF_BINOP_WIDEN_CASE_0 (_Float16, float, -, sub)
DEF_VF_BINOP_WIDEN_CASE_2 (_Float16, float, +, add)
+DEF_VF_BINOP_WIDEN_CASE_2 (_Float16, float, -, sub)
/* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfwadd.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfwsub.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfwadd.wf} 1 } } */
+/* { dg-final { scan-assembler-times {vfwsub.wf} 1 } } */
DEF_VF_BINOP_WIDEN_CASE_0 (float, double, +, add)
DEF_VF_BINOP_WIDEN_CASE_0 (float, double, -, sub)
DEF_VF_BINOP_WIDEN_CASE_2 (float, double, +, add)
+DEF_VF_BINOP_WIDEN_CASE_2 (float, double, -, sub)
/* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfwadd.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfwsub.vf} 1 } } */
/* { dg-final { scan-assembler-times {vfwadd.wf} 1 } } */
+/* { dg-final { scan-assembler-times {vfwsub.wf} 1 } } */
/* { dg-final { scan-assembler-not {vfwadd.vf} } } */
/* { dg-final { scan-assembler-not {vfwsub.vf} } } */
/* { dg-final { scan-assembler-not {vfwadd.wf} } } */
-/* { dg-final { scan-assembler-times {fcvt.s.h} 8 } } */
+/* { dg-final { scan-assembler-not {vfwsub.wf} } } */
+/* { dg-final { scan-assembler-times {fcvt.s.h} 9 } } */
/* { dg-final { scan-assembler-not {vfwadd.vf} } } */
/* { dg-final { scan-assembler-not {vfwsub.vf} } } */
/* { dg-final { scan-assembler-not {vfwadd.wf} } } */
-/* { dg-final { scan-assembler-times {fcvt.d.s} 8 } } */
+/* { dg-final { scan-assembler-not {vfwsub.wf} } } */
+/* { dg-final { scan-assembler-times {fcvt.d.s} 9 } } */
DEF_VF_BINOP_WIDEN_CASE_1 (_Float16, float, +, add)
DEF_VF_BINOP_WIDEN_CASE_1 (_Float16, float, -, sub)
DEF_VF_BINOP_WIDEN_CASE_3 (_Float16, float, +, add)
+DEF_VF_BINOP_WIDEN_CASE_3 (_Float16, float, -, sub)
/* { dg-final { scan-assembler {vfmadd.vf} } } */
/* { dg-final { scan-assembler {vfmsub.vf} } } */
/* { dg-final { scan-assembler {vfwadd.vf} } } */
/* { dg-final { scan-assembler {vfwsub.vf} } } */
/* { dg-final { scan-assembler {vfwadd.wf} } } */
+/* { dg-final { scan-assembler {vfwsub.wf} } } */
DEF_VF_BINOP_WIDEN_CASE_1 (float, double, +, add)
DEF_VF_BINOP_WIDEN_CASE_1 (float, double, -, sub)
DEF_VF_BINOP_WIDEN_CASE_3 (float, double, +, add)
+DEF_VF_BINOP_WIDEN_CASE_3 (float, double, -, sub)
/* { dg-final { scan-assembler {vfmadd.vf} } } */
/* { dg-final { scan-assembler {vfmsub.vf} } } */
/* { dg-final { scan-assembler {vfwadd.vf} } } */
/* { dg-final { scan-assembler {vfwsub.vf} } } */
/* { dg-final { scan-assembler {vfwadd.wf} } } */
+/* { dg-final { scan-assembler {vfwsub.wf} } } */
/* { dg-final { scan-assembler-not {vfwadd.vf} } } */
/* { dg-final { scan-assembler-not {vfwsub.vf} } } */
/* { dg-final { scan-assembler-not {vfwadd.wf} } } */
+/* { dg-final { scan-assembler-not {vfwsub.wf} } } */
/* { dg-final { scan-assembler {fcvt.s.h} } } */
/* { dg-final { scan-assembler-not {vfwadd.vf} } } */
/* { dg-final { scan-assembler-not {vfwsub.vf} } } */
/* { dg-final { scan-assembler-not {vfwadd.wf} } } */
+/* { dg-final { scan-assembler-not {vfwsub.wf} } } */
/* { dg-final { scan-assembler {fcvt.d.s} } } */
unsigned n) \
{ \
for (unsigned i = 0; i < n; i++) \
- out[i] = (T2) f OP in[i]; \
+ out[i] = in[i] OP (T2) f; \
}
#define DEF_VF_BINOP_WIDEN_CASE_2_WRAP(T1, T2, OP, NAME) \
DEF_VF_BINOP_WIDEN_CASE_2 (T1, T2, OP, NAME)
{ \
for (int i = 0; i < n; i++) \
{ \
- dst[i] = (TYPE2) * a OP b[i]; \
- dst2[i] = (TYPE2) * a2 OP b[i]; \
- dst3[i] = (TYPE2) * a2 OP b2[i]; \
- dst4[i] = (TYPE2) * a OP b2[i]; \
+ dst[i] = b[i] OP (TYPE2) * a; \
+ dst2[i] = b[i] OP (TYPE2) * a2; \
+ dst3[i] = b2[i] OP (TYPE2) * a2; \
+ dst4[i] = b2[i] OP (TYPE2) * a; \
} \
}
--- /dev/null
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-require-effective-target riscv_v_ok } */
+/* { dg-require-effective-target riscv_zvfh_ok } */
+/* { dg-add-options "riscv_v" } */
+/* { dg-add-options "riscv_zvfh" } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_binop.h"
+
+#define T1 _Float16
+#define T2 float
+#define NAME sub
+#define OP -
+
+DEF_VF_BINOP_WIDEN_CASE_2_WRAP (T1, T2, OP, NAME)
+
+#define TEST_RUN(T1, T2, NAME, out, in, f, n) RUN_VF_BINOP_WIDEN_CASE_2_WRAP(T1, T2, NAME, out, in, f, n)
+#define LIMIT -32768
+#define SINGLE
+
+#include "vf_binop_widen_run.h"
--- /dev/null
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "--param=fpr2vr-cost=0" } */
+
+#include "vf_binop.h"
+
+#define T1 float
+#define T2 double
+#define NAME sub
+#define OP -
+
+DEF_VF_BINOP_WIDEN_CASE_2_WRAP (T1, T2, OP, NAME)
+
+#define TEST_RUN(T1, T2, NAME, out, in, f, n) RUN_VF_BINOP_WIDEN_CASE_2_WRAP(T1, T2, NAME, out, in, f, n)
+#define LIMIT -2147483648
+#define SINGLE
+
+#include "vf_binop_widen_run.h"