Skip to content

Commit 412ab60

Browse files
[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedInstr (#119602)
1 parent 89b7aea commit 412ab60

File tree

2 files changed

+106
-1
lines changed

2 files changed

+106
-1
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,12 @@ static bool isSupportedInstr(const MachineInstr &MI) {
563563
// Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions
564564
// FIXME: Add support
565565
// Vector Narrowing Integer Right Shift Instructions
566-
// FIXME: Add support
566+
case RISCV::VNSRL_WX:
567567
case RISCV::VNSRL_WI:
568+
case RISCV::VNSRL_WV:
569+
case RISCV::VNSRA_WI:
570+
case RISCV::VNSRA_WV:
571+
case RISCV::VNSRA_WX:
568572
// Vector Integer Compare Instructions
569573
// FIXME: Add support
570574
// Vector Integer Min/Max Instructions

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

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,107 @@ define <vscale x 4 x i16> @vnsrl_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b
982982
ret <vscale x 4 x i16> %2
983983
}
984984

985+
define <vscale x 4 x i16> @vnsrl_wx(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %c, iXLen %vl) {
986+
; NOVLOPT-LABEL: vnsrl_wx:
987+
; NOVLOPT: # %bb.0:
988+
; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, ta, ma
989+
; NOVLOPT-NEXT: vnsrl.wx v11, v8, a0
990+
; NOVLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
991+
; NOVLOPT-NEXT: vadd.vv v8, v11, v10
992+
; NOVLOPT-NEXT: ret
993+
;
994+
; VLOPT-LABEL: vnsrl_wx:
995+
; VLOPT: # %bb.0:
996+
; VLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
997+
; VLOPT-NEXT: vnsrl.wx v11, v8, a0
998+
; VLOPT-NEXT: vadd.vv v8, v11, v10
999+
; VLOPT-NEXT: ret
1000+
%1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen %c, iXLen -1)
1001+
%2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1002+
ret <vscale x 4 x i16> %2
1003+
}
1004+
1005+
define <vscale x 4 x i16> @vnsrl_wv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) {
1006+
; NOVLOPT-LABEL: vnsrl_wv:
1007+
; NOVLOPT: # %bb.0:
1008+
; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1009+
; NOVLOPT-NEXT: vnsrl.wv v12, v8, v11
1010+
; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1011+
; NOVLOPT-NEXT: vadd.vv v8, v12, v10
1012+
; NOVLOPT-NEXT: ret
1013+
;
1014+
; VLOPT-LABEL: vnsrl_wv:
1015+
; VLOPT: # %bb.0:
1016+
; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1017+
; VLOPT-NEXT: vnsrl.wv v12, v8, v11
1018+
; VLOPT-NEXT: vadd.vv v8, v12, v10
1019+
; VLOPT-NEXT: ret
1020+
%1 = call <vscale x 4 x i16> @llvm.riscv.vnsrl.nxv4i16.nxv4i32.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, <vscale x 4 x i16> %c, iXLen -1)
1021+
%2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1022+
ret <vscale x 4 x i16> %2
1023+
}
1024+
1025+
define <vscale x 4 x i16> @vnsra_wi(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %vl) {
1026+
; NOVLOPT-LABEL: vnsra_wi:
1027+
; NOVLOPT: # %bb.0:
1028+
; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1029+
; NOVLOPT-NEXT: vnsra.wi v11, v8, 5
1030+
; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1031+
; NOVLOPT-NEXT: vadd.vv v8, v11, v10
1032+
; NOVLOPT-NEXT: ret
1033+
;
1034+
; VLOPT-LABEL: vnsra_wi:
1035+
; VLOPT: # %bb.0:
1036+
; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1037+
; VLOPT-NEXT: vnsra.wi v11, v8, 5
1038+
; VLOPT-NEXT: vadd.vv v8, v11, v10
1039+
; VLOPT-NEXT: ret
1040+
%1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen 5, iXLen -1)
1041+
%2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1042+
ret <vscale x 4 x i16> %2
1043+
}
1044+
1045+
define <vscale x 4 x i16> @vnsra_wx(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, iXLen %c, iXLen %vl) {
1046+
; NOVLOPT-LABEL: vnsra_wx:
1047+
; NOVLOPT: # %bb.0:
1048+
; NOVLOPT-NEXT: vsetvli a2, zero, e16, m1, ta, ma
1049+
; NOVLOPT-NEXT: vnsra.wx v11, v8, a0
1050+
; NOVLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1051+
; NOVLOPT-NEXT: vadd.vv v8, v11, v10
1052+
; NOVLOPT-NEXT: ret
1053+
;
1054+
; VLOPT-LABEL: vnsra_wx:
1055+
; VLOPT: # %bb.0:
1056+
; VLOPT-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1057+
; VLOPT-NEXT: vnsra.wx v11, v8, a0
1058+
; VLOPT-NEXT: vadd.vv v8, v11, v10
1059+
; VLOPT-NEXT: ret
1060+
%1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, iXLen %c, iXLen -1)
1061+
%2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1062+
ret <vscale x 4 x i16> %2
1063+
}
1064+
1065+
define <vscale x 4 x i16> @vnsra_wv(<vscale x 4 x i32> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, iXLen %vl) {
1066+
; NOVLOPT-LABEL: vnsra_wv:
1067+
; NOVLOPT: # %bb.0:
1068+
; NOVLOPT-NEXT: vsetvli a1, zero, e16, m1, ta, ma
1069+
; NOVLOPT-NEXT: vnsra.wv v12, v8, v11
1070+
; NOVLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1071+
; NOVLOPT-NEXT: vadd.vv v8, v12, v10
1072+
; NOVLOPT-NEXT: ret
1073+
;
1074+
; VLOPT-LABEL: vnsra_wv:
1075+
; VLOPT: # %bb.0:
1076+
; VLOPT-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1077+
; VLOPT-NEXT: vnsra.wv v12, v8, v11
1078+
; VLOPT-NEXT: vadd.vv v8, v12, v10
1079+
; VLOPT-NEXT: ret
1080+
%1 = call <vscale x 4 x i16> @llvm.riscv.vnsra.nxv4i16.nxv4i32.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i32> %a, <vscale x 4 x i16> %c, iXLen -1)
1081+
%2 = call <vscale x 4 x i16> @llvm.riscv.vadd.nxv4i16.nxv4i16(<vscale x 4 x i16> poison, <vscale x 4 x i16> %1, <vscale x 4 x i16> %b, iXLen %vl)
1082+
ret <vscale x 4 x i16> %2
1083+
}
1084+
1085+
9851086
define <vscale x 4 x i32> @vminu_vv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, iXLen %vl) {
9861087
; NOVLOPT-LABEL: vminu_vv:
9871088
; NOVLOPT: # %bb.0:

0 commit comments

Comments
 (0)