Skip to content

Commit a606f44

Browse files
[RISCV][VLOPT] Add support for vector integer add-with-carry/subtract-with-borrow instructions (#148247)
This PR adds support for the vmadc.vim, vmadc.vvm, vmadc.vxm, vmsbc.vvm, vmsbc.vxm, vsbc.vvm, vsbc.vxm instructions in the RISC-V VLOptimizer.
1 parent d145f71 commit a606f44

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,13 @@ static bool isSupportedInstr(const MachineInstr &MI) {
966966
case RISCV::VADC_VIM:
967967
case RISCV::VADC_VVM:
968968
case RISCV::VADC_VXM:
969+
case RISCV::VMADC_VIM:
970+
case RISCV::VMADC_VVM:
971+
case RISCV::VMADC_VXM:
972+
case RISCV::VSBC_VVM:
973+
case RISCV::VSBC_VXM:
974+
case RISCV::VMSBC_VVM:
975+
case RISCV::VMSBC_VXM:
969976
// Vector Widening Integer Multiply-Add Instructions
970977
case RISCV::VWMACCU_VV:
971978
case RISCV::VWMACCU_VX:

llvm/test/CodeGen/RISCV/rvv/vl-opt-instrs.ll

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,9 +1033,8 @@ define <vscale x 4 x i1> @vmadc_vim(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
10331033
;
10341034
; VLOPT-LABEL: vmadc_vim:
10351035
; VLOPT: # %bb.0:
1036-
; VLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1036+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
10371037
; VLOPT-NEXT: vmadc.vim v11, v8, 5, v0
1038-
; VLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
10391038
; VLOPT-NEXT: vmand.mm v0, v11, v10
10401039
; VLOPT-NEXT: ret
10411040
%1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.carry.in.nxv4i32.i32(<vscale x 4 x i32> %a, i32 5, <vscale x 4 x i1> %mask, iXLen -1)
@@ -1054,9 +1053,8 @@ define <vscale x 4 x i1> @vmadc_vxm(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
10541053
;
10551054
; VLOPT-LABEL: vmadc_vxm:
10561055
; VLOPT: # %bb.0:
1057-
; VLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1056+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
10581057
; VLOPT-NEXT: vmadc.vxm v11, v8, a0, v0
1059-
; VLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
10601058
; VLOPT-NEXT: vmand.mm v0, v11, v10
10611059
; VLOPT-NEXT: ret
10621060
%1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.carry.in.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, <vscale x 4 x i1> %mask, iXLen -1)
@@ -1075,9 +1073,8 @@ define <vscale x 4 x i1> @vmadc_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
10751073
;
10761074
; VLOPT-LABEL: vmadc_vvm:
10771075
; VLOPT: # %bb.0:
1078-
; VLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1076+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
10791077
; VLOPT-NEXT: vmadc.vvm v11, v8, v12, v0
1080-
; VLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
10811078
; VLOPT-NEXT: vmand.mm v0, v11, v10
10821079
; VLOPT-NEXT: ret
10831080
%1 = call <vscale x 4 x i1> @llvm.riscv.vmadc.carry.in.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, <vscale x 4 x i1> %mask, iXLen -1)
@@ -1096,9 +1093,8 @@ define <vscale x 4 x i1> @vmsbc_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
10961093
;
10971094
; VLOPT-LABEL: vmsbc_vvm:
10981095
; VLOPT: # %bb.0:
1099-
; VLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
1096+
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
11001097
; VLOPT-NEXT: vmsbc.vvm v11, v8, v12, v0
1101-
; VLOPT-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
11021098
; VLOPT-NEXT: vmand.mm v0, v11, v10
11031099
; VLOPT-NEXT: ret
11041100
%1 = call <vscale x 4 x i1> @llvm.riscv.vmsbc.borrow.in.nxv4i32.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %c, <vscale x 4 x i1> %mask, iXLen -1)
@@ -1117,9 +1113,8 @@ define <vscale x 4 x i1> @vmsbc_vxm(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
11171113
;
11181114
; VLOPT-LABEL: vmsbc_vxm:
11191115
; VLOPT: # %bb.0:
1120-
; VLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
1116+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
11211117
; VLOPT-NEXT: vmsbc.vxm v11, v8, a0, v0
1122-
; VLOPT-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
11231118
; VLOPT-NEXT: vmand.mm v0, v11, v10
11241119
; VLOPT-NEXT: ret
11251120
%1 = call <vscale x 4 x i1> @llvm.riscv.vmsbc.borrow.in.nxv4i32.i32(<vscale x 4 x i32> %a, i32 %c, <vscale x 4 x i1> %mask, iXLen -1)
@@ -5413,9 +5408,8 @@ define <vscale x 4 x i32> @vsbc_vvm(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
54135408
;
54145409
; VLOPT-LABEL: vsbc_vvm:
54155410
; VLOPT: # %bb.0:
5416-
; VLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
5417-
; VLOPT-NEXT: vsbc.vvm v8, v8, v10, v0
54185411
; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
5412+
; VLOPT-NEXT: vsbc.vvm v8, v8, v10, v0
54195413
; VLOPT-NEXT: vadd.vv v8, v8, v12
54205414
; VLOPT-NEXT: ret
54215415
%1 = call <vscale x 4 x i32> @llvm.riscv.vsbc.nxv4i32.nxv4i32.nxv4i1(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i1> %mask, iXLen -1)
@@ -5434,9 +5428,8 @@ define <vscale x 4 x i32> @vsbc_vxm(<vscale x 4 x i32> %a, <vscale x 4 x i1> %ma
54345428
;
54355429
; VLOPT-LABEL: vsbc_vxm:
54365430
; VLOPT: # %bb.0:
5437-
; VLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
5438-
; VLOPT-NEXT: vsbc.vxm v8, v8, a0, v0
54395431
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
5432+
; VLOPT-NEXT: vsbc.vxm v8, v8, a0, v0
54405433
; VLOPT-NEXT: vadd.vv v8, v8, v10
54415434
; VLOPT-NEXT: ret
54425435
%1 = call <vscale x 4 x i32> @llvm.riscv.vsbc.nxv4i32.i32.nxv4i1(<vscale x 4 x i32> poison, <vscale x 4 x i32> %a, i32 %c, <vscale x 4 x i1> %mask, iXLen -1)

0 commit comments

Comments
 (0)