aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <jlaw@ventanamicro.com>2024-11-12 07:05:02 -0700
committerJeff Law <jlaw@ventanamicro.com>2024-11-12 07:05:02 -0700
commit705a21035bddc856c1e434d5502f69758e82c7e9 (patch)
treea723b5ce2171710e23dbb3ec1a124f702cc6abe9 /gcc
parent0256c8b4687080e17e32f525d362814f238c8d32 (diff)
downloadgcc-705a21035bddc856c1e434d5502f69758e82c7e9.zip
gcc-705a21035bddc856c1e434d5502f69758e82c7e9.tar.gz
gcc-705a21035bddc856c1e434d5502f69758e82c7e9.tar.bz2
[RISC-V] Drop undesirable two instruction macc alternatives
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. gcc/ * 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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/riscv/vector.md310
1 files changed, 140 insertions, 170 deletions
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index a21288f..8bbae41 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -5218,56 +5218,52 @@
})
(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 @@
(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_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 @@
(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_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 @@
(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_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 @@
(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_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 @@
(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_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 @@
(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")