Skip to content

Commit b621d20

Browse files
committed
[RISCV] Simplify (srl (and X, Mask), Const) to TH_EXTU
1 parent b57038a commit b621d20

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,15 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
11641164
}
11651165

11661166
unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1167+
if (Subtarget->hasVendorXTHeadBb()) {
1168+
SDNode *THEXTU = CurDAG->getMachineNode(
1169+
RISCV::TH_EXTU, DL, VT, N0->getOperand(0),
1170+
CurDAG->getTargetConstant(TrailingOnes - 1, DL, VT),
1171+
CurDAG->getTargetConstant(ShAmt, DL, VT));
1172+
ReplaceNode(Node, THEXTU);
1173+
return;
1174+
}
1175+
11671176
SDNode *SLLI =
11681177
CurDAG->getMachineNode(RISCV::SLLI, DL, VT, N0->getOperand(0),
11691178
CurDAG->getTargetConstant(LShAmt, DL, VT));

llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2367,10 +2367,9 @@ define i16 @test_ctpop_i16(i16 %a) nounwind {
23672367
; RV32XTHEADBB-NEXT: add a0, a2, a0
23682368
; RV32XTHEADBB-NEXT: srli a1, a0, 4
23692369
; RV32XTHEADBB-NEXT: add a0, a0, a1
2370-
; RV32XTHEADBB-NEXT: andi a1, a0, 15
2371-
; RV32XTHEADBB-NEXT: slli a0, a0, 20
2372-
; RV32XTHEADBB-NEXT: srli a0, a0, 28
2373-
; RV32XTHEADBB-NEXT: add a0, a1, a0
2370+
; RV32XTHEADBB-NEXT: th.extu a1, a0, 11, 8
2371+
; RV32XTHEADBB-NEXT: andi a0, a0, 15
2372+
; RV32XTHEADBB-NEXT: add a0, a0, a1
23742373
; RV32XTHEADBB-NEXT: ret
23752374
;
23762375
; RV64XTHEADBB-LABEL: test_ctpop_i16:
@@ -2388,10 +2387,9 @@ define i16 @test_ctpop_i16(i16 %a) nounwind {
23882387
; RV64XTHEADBB-NEXT: add a0, a2, a0
23892388
; RV64XTHEADBB-NEXT: srli a1, a0, 4
23902389
; RV64XTHEADBB-NEXT: add a0, a0, a1
2391-
; RV64XTHEADBB-NEXT: andi a1, a0, 15
2392-
; RV64XTHEADBB-NEXT: slli a0, a0, 52
2393-
; RV64XTHEADBB-NEXT: srli a0, a0, 60
2394-
; RV64XTHEADBB-NEXT: add a0, a1, a0
2390+
; RV64XTHEADBB-NEXT: th.extu a1, a0, 11, 8
2391+
; RV64XTHEADBB-NEXT: andi a0, a0, 15
2392+
; RV64XTHEADBB-NEXT: add a0, a0, a1
23952393
; RV64XTHEADBB-NEXT: ret
23962394
%1 = call i16 @llvm.ctpop.i16(i16 %a)
23972395
ret i16 %1

llvm/test/CodeGen/RISCV/rv64xtheadbb.ll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,22 @@ define i64 @zext_bf_i64(i64 %a) nounwind {
702702
ret i64 %and
703703
}
704704

705+
define i64 @zext_bf2_i64(i64 %a) nounwind {
706+
; RV64I-LABEL: zext_bf2_i64:
707+
; RV64I: # %bb.0:
708+
; RV64I-NEXT: slli a0, a0, 48
709+
; RV64I-NEXT: srli a0, a0, 49
710+
; RV64I-NEXT: ret
711+
;
712+
; RV64XTHEADBB-LABEL: zext_bf2_i64:
713+
; RV64XTHEADBB: # %bb.0:
714+
; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 1
715+
; RV64XTHEADBB-NEXT: ret
716+
%t0 = and i64 %a, 65535
717+
%result = lshr i64 %t0, 1
718+
ret i64 %result
719+
}
720+
705721
define i64 @zext_i64_srliw(i64 %a) nounwind {
706722
; RV64I-LABEL: zext_i64_srliw:
707723
; RV64I: # %bb.0:

0 commit comments

Comments
 (0)