So I was looking at sub_dct a little while ago and was surprised to see
us emit two instructions out of a single pattern. We generally try to
avoid that -- it's not always possible, but as a general rule of thumb
it should be avoided. Specifically I saw:
vmv1r.v v4,v2 # 138 [c=4 l=4] *pred_mul_plusrvvm1hi_undef/5
vmacc.vv v4,v8,v1
When we emit multiple instructions out of a single pattern we can't
build a good schedule as we can't really describe the two instructions
well and we can't split them up -- they move as an atomic unit.
These cases can also raise correctness issues if the pattern doesn't
properly account for both instructions in its length computation.
Note the length, 4 bytes. So this is both a performance and latent
correctness issue.
It appears that these alternatives are meant to deal with the case when
we have three source inputs and a non-matching output. The author did
put in "?" to slightly disparage these alternatives, but a "!" would
have been better. The best solution is to just remove those
alternatives and let the allocator manage the matching operand issue.
That's precisely what this patch does. For the various integer
multiply-add/multiply-accumulate patterns we drop the alternatives which
don't require a match between the output and one of the inputs.
That fixes the correctness issue and should shave a cycle or two off our
sub_dct code. Essentially the move bubbles up into an empty slot and we
can schedule around the vmacc sensibly.
Interestingly enough this fixes a scan-assembler test in my tester for
both rv32 and rv64.
Tests that now work, but didn't before (10 tests):
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
unix/-march=rv32gcv: gcc: gcc.target/riscv/rvv/autovec/ternop/ternop_nofm-3.c
scan-assembler-times \\tvmacc\\.vv 8
My BPI is already in a bootstrap test, so this patch won't hit the BPI
for bootstrapping until Wednesday, meaning no data until Thursday. Will
wait for the pre-commit tester though. * config/riscv/vector.md (pred_mul_plus<mode>_undef): Drop alternatives
where output doesn't have to match input.
(pred_madd<mode>, pred_macc<mode>): Likewise.
(pred_madd<mode>_scalar, pred_macc<mode>_scalar): Likewise.
(pred_madd<mode>_exended_scalar): Likewise.
(pred_macc<mode>_exended_scalar): Likewise.
(pred_minus_mul<mode>_undef): Likewise.
(pred_nmsub<mode>, pred_nmsac<mode>): Likewise.
(pred_nmsub<mode>_scalar, pred_nmsac<mode>_scalar): Likewise.
(pred_nmsub<mode>_exended_scalar): Likewise.
(pred_nmsac<mode>_exended_scalar): Likewise.
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index a21288f7af2..8bbae41c9f3 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -5218,56 +5218,52 @@ (define_expand "@pred_mul_plus<mode>"
})
(define_insn "*pred_mul_plus<mode>_undef"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vd,?&vd,
vr, vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vd, vr, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm, vm,Wc1,Wc1,
Wc1")
- (match_operand 6 "vector_length_operand" " rK, rK, rK, rK, rK,
rK")
- (match_operand 7 "const_int_operand" " i, i, i, i, i,
i")
- (match_operand 8 "const_int_operand" " i, i, i, i, i,
i")
- (match_operand 9 "const_int_operand" " i, i, i, i, i,
i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm, Wc1,Wc1")
+ (match_operand 6 "vector_length_operand" " rK, rK, rK, rK")
+ (match_operand 7 "const_int_operand" " i, i, i, i")
+ (match_operand 8 "const_int_operand" " i, i, i, i")
+ (match_operand 9 "const_int_operand" " i, i, i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI
(mult:V_VLSI
- (match_operand:V_VLSI 3 "register_operand" " 0, vr, vr, 0,
vr, vr")
- (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr, vr,
vr, vr"))
- (match_operand:V_VLSI 5 "register_operand" " vr, 0, vr, vr,
0, vr"))
+ (match_operand:V_VLSI 3 "register_operand" " 0, vr, 0, vr")
+ (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr,
vr"))
+ (match_operand:V_VLSI 5 "register_operand" " vr, 0, vr,
0"))
(match_operand:V_VLSI 2 "vector_undef_operand")))]
"TARGET_VECTOR"
"@
vmadd.vv\t%0,%4,%5%p1
vmacc.vv\t%0,%3,%4%p1
- vmv%m4r.v\t%0,%4\;vmacc.vv\t%0,%3,%4%p1
vmadd.vv\t%0,%4,%5%p1
- vmacc.vv\t%0,%3,%4%p1
- vmv%m5r.v\t%0,%5\;vmacc.vv\t%0,%3,%4%p1"
+ vmacc.vv\t%0,%3,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")])
(define_insn "*pred_madd<mode>"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI
(mult:V_VLSI
- (match_operand:V_VLSI 2 "register_operand" " 0, vr, 0,
vr")
- (match_operand:V_VLSI 3 "register_operand" " vr, vr, vr,
vr"))
- (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr,
vr"))
+ (match_operand:V_VLSI 2 "register_operand" " 0, 0")
+ (match_operand:V_VLSI 3 "register_operand" " vr, vr"))
+ (match_operand:V_VLSI 4 "register_operand" " vr, vr"))
(match_dup 2)))]
"TARGET_VECTOR"
"@
vmadd.vv\t%0,%3,%4%p1
- vmv%m2r.v\t%0,%2\;vmadd.vv\t%0,%3,%4%p1
- vmadd.vv\t%0,%3,%4%p1
- vmv%m2r.v\t%0,%2\;vmadd.vv\t%0,%3,%4%p1"
+ vmadd.vv\t%0,%3,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "2")
@@ -5277,28 +5273,24 @@ (define_insn "*pred_madd<mode>"
(set (attr "avl_type_idx") (const_int 8))])
(define_insn "*pred_macc<mode>"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI
(mult:V_VLSI
- (match_operand:V_VLSI 2 "register_operand" " vr, vr, vr,
vr")
- (match_operand:V_VLSI 3 "register_operand" " vr, vr, vr,
vr"))
- (match_operand:V_VLSI 4 "register_operand" " 0, vr, 0,
vr"))
+ (match_operand:V_VLSI 2 "register_operand" " vr, vr")
+ (match_operand:V_VLSI 3 "register_operand" " vr, vr"))
+ (match_operand:V_VLSI 4 "register_operand" " 0, 0"))
(match_dup 4)))]
"TARGET_VECTOR"
- "@
- vmacc.vv\t%0,%2,%3%p1
- vmv%m4r.v\t%0,%4;vmacc.vv\t%0,%2,%3%p1
- vmacc.vv\t%0,%2,%3%p1
- vmv%m4r.v\t%0,%4\;vmacc.vv\t%0,%2,%3%p1"
+ "vmacc.vv\t%0,%2,%3%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "4")
@@ -5329,29 +5321,27 @@ (define_expand "@pred_mul_plus<mode>_scalar"
{})
(define_insn "*pred_madd<mode>_scalar"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI
(mult:V_VLSI
(vec_duplicate:V_VLSI
- (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ, rJ, rJ"))
- (match_operand:V_VLSI 3 "register_operand" " 0, vr, 0,
vr"))
- (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr,
vr"))
+ (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ"))
+ (match_operand:V_VLSI 3 "register_operand" " 0, 0"))
+ (match_operand:V_VLSI 4 "register_operand" " vr, vr"))
(match_dup 3)))]
"TARGET_VECTOR"
"@
vmadd.vx\t%0,%z2,%4%p1
- vmv%m3r.v\t%0,%3\;vmadd.vx\t%0,%z2,%4%p1
- vmadd.vx\t%0,%z2,%4%p1
- vmv%m3r.v\t%0,%3\;vmadd.vx\t%0,%z2,%4%p1"
+ vmadd.vx\t%0,%z2,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "3")
@@ -5361,29 +5351,27 @@ (define_insn "*pred_madd<mode>_scalar"
(set (attr "avl_type_idx") (const_int 8))])
(define_insn "*pred_macc<mode>_scalar"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI
(mult:V_VLSI
(vec_duplicate:V_VLSI
- (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ, rJ, rJ"))
- (match_operand:V_VLSI 3 "register_operand" " vr, vr, vr,
vr"))
- (match_operand:V_VLSI 4 "register_operand" " 0, vr, 0,
vr"))
+ (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ"))
+ (match_operand:V_VLSI 3 "register_operand" " vr, vr"))
+ (match_operand:V_VLSI 4 "register_operand" " 0, 0"))
(match_dup 4)))]
"TARGET_VECTOR"
"@
vmacc.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vmacc.vx\t%0,%z2,%3%p1
- vmacc.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vmacc.vx\t%0,%z2,%3%p1"
+ vmacc.vx\t%0,%z2,%3%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "4")
@@ -5428,30 +5416,28 @@ (define_expand "@pred_mul_plus<mode>_scalar"
})
(define_insn "*pred_madd<mode>_extended_scalar"
- [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI_D
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,
Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK,
rK")
- (match_operand 6 "const_int_operand" " i, i, i,
i")
- (match_operand 7 "const_int_operand" " i, i, i,
i")
- (match_operand 8 "const_int_operand" " i, i, i,
i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI_D
(mult:V_VLSI_D
(vec_duplicate:V_VLSI_D
(sign_extend:<VEL>
- (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ, rJ,
rJ")))
- (match_operand:V_VLSI_D 3 "register_operand" " 0, vr,
0, vr"))
- (match_operand:V_VLSI_D 4 "register_operand" " vr, vr,
vr, vr"))
+ (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ")))
+ (match_operand:V_VLSI_D 3 "register_operand" " 0, 0"))
+ (match_operand:V_VLSI_D 4 "register_operand" " vr, vr"))
(match_dup 3)))]
"TARGET_VECTOR && !TARGET_64BIT"
"@
vmadd.vx\t%0,%z2,%4%p1
- vmv%m2r.v\t%0,%z2\;vmadd.vx\t%0,%z2,%4%p1
- vmadd.vx\t%0,%z2,%4%p1
- vmv%m2r.v\t%0,%z2\;vmadd.vx\t%0,%z2,%4%p1"
+ vmadd.vx\t%0,%z2,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "3")
@@ -5461,30 +5447,28 @@ (define_insn "*pred_madd<mode>_extended_scalar"
(set (attr "avl_type_idx") (const_int 8))])
(define_insn "*pred_macc<mode>_extended_scalar"
- [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI_D
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,
Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK,
rK")
- (match_operand 6 "const_int_operand" " i, i, i,
i")
- (match_operand 7 "const_int_operand" " i, i, i,
i")
- (match_operand 8 "const_int_operand" " i, i, i,
i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(plus:V_VLSI_D
(mult:V_VLSI_D
(vec_duplicate:V_VLSI_D
(sign_extend:<VEL>
- (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ, rJ,
rJ")))
- (match_operand:V_VLSI_D 3 "register_operand" " vr, vr,
vr, vr"))
- (match_operand:V_VLSI_D 4 "register_operand" " 0, vr,
0, vr"))
+ (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ")))
+ (match_operand:V_VLSI_D 3 "register_operand" " vr, vr"))
+ (match_operand:V_VLSI_D 4 "register_operand" " 0, 0"))
(match_dup 4)))]
"TARGET_VECTOR && !TARGET_64BIT"
"@
vmacc.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vmacc.vx\t%0,%z2,%3%p1
- vmacc.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vmacc.vx\t%0,%z2,%3%p1"
+ vmacc.vx\t%0,%z2,%3%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "4")
@@ -5516,56 +5500,52 @@ (define_expand "@pred_minus_mul<mode>"
})
(define_insn "*pred_minus_mul<mode>_undef"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vd,?&vd,
vr, vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vd, vr, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm, vm,Wc1,Wc1,
Wc1")
- (match_operand 6 "vector_length_operand" " rK, rK, rK, rK, rK,
rK")
- (match_operand 7 "const_int_operand" " i, i, i, i, i,
i")
- (match_operand 8 "const_int_operand" " i, i, i, i, i,
i")
- (match_operand 9 "const_int_operand" " i, i, i, i, i,
i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,Wc1")
+ (match_operand 6 "vector_length_operand" " rK, rK, rK, rK")
+ (match_operand 7 "const_int_operand" " i, i, i, i")
+ (match_operand 8 "const_int_operand" " i, i, i, i")
+ (match_operand 9 "const_int_operand" " i, i, i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI
- (match_operand:V_VLSI 5 "register_operand" " vr, 0, vr,
vr, 0, vr")
+ (match_operand:V_VLSI 5 "register_operand" " vr, 0, vr, 0")
(mult:V_VLSI
- (match_operand:V_VLSI 3 "register_operand" " 0, vr, vr, 0,
vr, vr")
- (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr, vr,
vr, vr")))
+ (match_operand:V_VLSI 3 "register_operand" " 0, vr, 0, vr")
+ (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr,
vr")))
(match_operand:V_VLSI 2 "vector_undef_operand")))]
"TARGET_VECTOR"
"@
vnmsub.vv\t%0,%4,%5%p1
vnmsac.vv\t%0,%3,%4%p1
- vmv%m3r.v\t%0,%3\;vnmsub.vv\t%0,%4,%5%p1
vnmsub.vv\t%0,%4,%5%p1
- vnmsac.vv\t%0,%3,%4%p1
- vmv%m3r.v\t%0,%3\;vnmsub.vv\t%0,%4,%5%p1"
+ vnmsac.vv\t%0,%3,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")])
(define_insn "*pred_nmsub<mode>"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI
- (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr,
vr")
+ (match_operand:V_VLSI 4 "register_operand" " vr, vr")
(mult:V_VLSI
- (match_operand:V_VLSI 2 "register_operand" " 0, vr, 0,
vr")
- (match_operand:V_VLSI 3 "register_operand" " vr, vr, vr,
vr")))
+ (match_operand:V_VLSI 2 "register_operand" " 0, 0")
+ (match_operand:V_VLSI 3 "register_operand" " vr, vr")))
(match_dup 2)))]
"TARGET_VECTOR"
"@
vnmsub.vv\t%0,%3,%4%p1
- vmv%m2r.v\t%0,%2\;vnmsub.vv\t%0,%3,%4%p1
- vnmsub.vv\t%0,%3,%4%p1
- vmv%m2r.v\t%0,%2\;vnmsub.vv\t%0,%3,%4%p1"
+ vnmsub.vv\t%0,%3,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "2")
@@ -5575,28 +5555,26 @@ (define_insn "*pred_nmsub<mode>"
(set (attr "avl_type_idx") (const_int 8))])
(define_insn "*pred_nmsac<mode>"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI
- (match_operand:V_VLSI 4 "register_operand" " 0, vr, 0,
vr")
+ (match_operand:V_VLSI 4 "register_operand" " 0, 0")
(mult:V_VLSI
- (match_operand:V_VLSI 2 "register_operand" " vr, vr, vr,
vr")
- (match_operand:V_VLSI 3 "register_operand" " vr, vr, vr,
vr")))
+ (match_operand:V_VLSI 2 "register_operand" " vr, vr")
+ (match_operand:V_VLSI 3 "register_operand" " vr, vr")))
(match_dup 4)))]
"TARGET_VECTOR"
"@
vnmsac.vv\t%0,%2,%3%p1
- vmv%m4r.v\t%0,%4\;vnmsac.vv\t%0,%2,%3%p1
- vnmsac.vv\t%0,%2,%3%p1
- vmv%m4r.v\t%0,%4\;vnmsac.vv\t%0,%2,%3%p1"
+ vnmsac.vv\t%0,%2,%3%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "4")
@@ -5627,29 +5605,27 @@ (define_expand "@pred_minus_mul<mode>_scalar"
{})
(define_insn "*pred_nmsub<mode>_scalar"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI
- (match_operand:V_VLSI 4 "register_operand" " vr, vr, vr,
vr")
+ (match_operand:V_VLSI 4 "register_operand" " vr, vr")
(mult:V_VLSI
(vec_duplicate:V_VLSI
- (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ, rJ, rJ"))
- (match_operand:V_VLSI 3 "register_operand" " 0, vr, 0,
vr")))
+ (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ"))
+ (match_operand:V_VLSI 3 "register_operand" " 0, 0")))
(match_dup 3)))]
"TARGET_VECTOR"
"@
vnmsub.vx\t%0,%z2,%4%p1
- vmv%m3r.v\t%0,%3\;vnmsub.vx\t%0,%z2,%4%p1
- vnmsub.vx\t%0,%z2,%4%p1
- vmv%m3r.v\t%0,%3\;vnmsub.vx\t%0,%z2,%4%p1"
+ vnmsub.vx\t%0,%z2,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "3")
@@ -5659,29 +5635,27 @@ (define_insn "*pred_nmsub<mode>_scalar"
(set (attr "avl_type_idx") (const_int 8))])
(define_insn "*pred_nmsac<mode>_scalar"
- [(set (match_operand:V_VLSI 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1, Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK, rK")
- (match_operand 6 "const_int_operand" " i, i, i, i")
- (match_operand 7 "const_int_operand" " i, i, i, i")
- (match_operand 8 "const_int_operand" " i, i, i, i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI
- (match_operand:V_VLSI 4 "register_operand" " 0, vr, 0,
vr")
+ (match_operand:V_VLSI 4 "register_operand" " 0, 0")
(mult:V_VLSI
(vec_duplicate:V_VLSI
- (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ, rJ, rJ"))
- (match_operand:V_VLSI 3 "register_operand" " vr, vr, vr,
vr")))
+ (match_operand:<VEL> 2 "reg_or_0_operand" " rJ, rJ"))
+ (match_operand:V_VLSI 3 "register_operand" " vr, vr")))
(match_dup 4)))]
"TARGET_VECTOR"
"@
vnmsac.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vnmsac.vx\t%0,%z2,%3%p1
- vnmsac.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vnmsac.vx\t%0,%z2,%3%p1"
+ vnmsac.vx\t%0,%z2,%3%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "4")
@@ -5726,30 +5700,28 @@ (define_expand "@pred_minus_mul<mode>_scalar"
})
(define_insn "*pred_nmsub<mode>_extended_scalar"
- [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI_D
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,
Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK,
rK")
- (match_operand 6 "const_int_operand" " i, i, i,
i")
- (match_operand 7 "const_int_operand" " i, i, i,
i")
- (match_operand 8 "const_int_operand" " i, i, i,
i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI_D
- (match_operand:V_VLSI_D 4 "register_operand" " vr, vr,
vr, vr")
+ (match_operand:V_VLSI_D 4 "register_operand" " vr, vr")
(mult:V_VLSI_D
(vec_duplicate:V_VLSI_D
(sign_extend:<VEL>
- (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ, rJ,
rJ")))
- (match_operand:V_VLSI_D 3 "register_operand" " 0, vr,
0, vr")))
+ (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ")))
+ (match_operand:V_VLSI_D 3 "register_operand" " 0, 0")))
(match_dup 3)))]
"TARGET_VECTOR && !TARGET_64BIT"
"@
vnmsub.vx\t%0,%z2,%4%p1
- vmv%m3r.v\t%0,%3\;vnmsub.vx\t%0,%z2,%4%p1
- vnmsub.vx\t%0,%z2,%4%p1
- vmv%m3r.v\t%0,%3\;vnmsub.vx\t%0,%z2,%4%p1"
+ vnmsub.vx\t%0,%z2,%4%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "3")
@@ -5759,30 +5731,28 @@ (define_insn "*pred_nmsub<mode>_extended_scalar"
(set (attr "avl_type_idx") (const_int 8))])
(define_insn "*pred_nmsac<mode>_extended_scalar"
- [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd,?&vd,
vr,?&vr")
+ [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd, vr")
(if_then_else:V_VLSI_D
(unspec:<VM>
- [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,
Wc1")
- (match_operand 5 "vector_length_operand" " rK, rK, rK,
rK")
- (match_operand 6 "const_int_operand" " i, i, i,
i")
- (match_operand 7 "const_int_operand" " i, i, i,
i")
- (match_operand 8 "const_int_operand" " i, i, i,
i")
+ [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(minus:V_VLSI_D
- (match_operand:V_VLSI_D 4 "register_operand" " 0, vr,
0, vr")
+ (match_operand:V_VLSI_D 4 "register_operand" " 0, 0")
(mult:V_VLSI_D
(vec_duplicate:V_VLSI_D
(sign_extend:<VEL>
- (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ, rJ,
rJ")))
- (match_operand:V_VLSI_D 3 "register_operand" " vr, vr,
vr, vr")))
+ (match_operand:<VSUBEL> 2 "reg_or_0_operand" " rJ, rJ")))
+ (match_operand:V_VLSI_D 3 "register_operand" " vr, vr")))
(match_dup 4)))]
"TARGET_VECTOR && !TARGET_64BIT"
"@
vnmsac.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vnmsac.vx\t%0,%z2,%3%p1
- vnmsac.vx\t%0,%z2,%3%p1
- vmv%m4r.v\t%0,%4\;vnmsac.vx\t%0,%z2,%3%p1"
+ vnmsac.vx\t%0,%z2,%3%p1"
[(set_attr "type" "vimuladd")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "4")