@@ -45,6 +45,40 @@ define i32 @bclr_i32_no_mask(i32 %a, i32 %b) nounwind {
4545 ret i32 %and1
4646}
4747
48+ define i32 @bclr_i32_mask_multiple (i32 %a , i32 %b , i32 %shamt ) nounwind {
49+ ; RV32I-LABEL: bclr_i32_mask_multiple:
50+ ; RV32I: # %bb.0:
51+ ; RV32I-NEXT: li a3, 1
52+ ; RV32I-NEXT: sll a2, a3, a2
53+ ; RV32I-NEXT: not a3, a2
54+ ; RV32I-NEXT: and a0, a3, a0
55+ ; RV32I-NEXT: or a1, a1, a2
56+ ; RV32I-NEXT: add a0, a0, a1
57+ ; RV32I-NEXT: ret
58+ ;
59+ ; RV32ZBSNOZBB-LABEL: bclr_i32_mask_multiple:
60+ ; RV32ZBSNOZBB: # %bb.0:
61+ ; RV32ZBSNOZBB-NEXT: bclr a0, a0, a2
62+ ; RV32ZBSNOZBB-NEXT: bset a1, a1, a2
63+ ; RV32ZBSNOZBB-NEXT: add a0, a0, a1
64+ ; RV32ZBSNOZBB-NEXT: ret
65+ ;
66+ ; RV32ZBSZBB-LABEL: bclr_i32_mask_multiple:
67+ ; RV32ZBSZBB: # %bb.0:
68+ ; RV32ZBSZBB-NEXT: andi a3, a2, 63
69+ ; RV32ZBSZBB-NEXT: bclr a0, a0, a3
70+ ; RV32ZBSZBB-NEXT: bset a1, a1, a2
71+ ; RV32ZBSZBB-NEXT: add a0, a0, a1
72+ ; RV32ZBSZBB-NEXT: ret
73+ %shamt_masked = and i32 %shamt , 63
74+ %shl = shl nuw i32 1 , %shamt_masked
75+ %neg = xor i32 %shl , -1
76+ %and = and i32 %neg , %a
77+ %or = or i32 %b , %shl
78+ %c = add i32 %and , %or
79+ ret i32 %c
80+ }
81+
4882define i64 @bclr_i64 (i64 %a , i64 %b ) nounwind {
4983; RV32I-LABEL: bclr_i64:
5084; RV32I: # %bb.0:
@@ -301,17 +335,17 @@ define i64 @bext_i64(i64 %a, i64 %b) nounwind {
301335; CHECK: # %bb.0:
302336; CHECK-NEXT: andi a3, a2, 63
303337; CHECK-NEXT: addi a4, a3, -32
304- ; CHECK-NEXT: bltz a4, .LBB12_2
338+ ; CHECK-NEXT: bltz a4, .LBB13_2
305339; CHECK-NEXT: # %bb.1:
306340; CHECK-NEXT: srl a0, a1, a3
307- ; CHECK-NEXT: j .LBB12_3
308- ; CHECK-NEXT: .LBB12_2 :
341+ ; CHECK-NEXT: j .LBB13_3
342+ ; CHECK-NEXT: .LBB13_2 :
309343; CHECK-NEXT: srl a0, a0, a2
310344; CHECK-NEXT: slli a1, a1, 1
311345; CHECK-NEXT: not a2, a3
312346; CHECK-NEXT: sll a1, a1, a2
313347; CHECK-NEXT: or a0, a0, a1
314- ; CHECK-NEXT: .LBB12_3 :
348+ ; CHECK-NEXT: .LBB13_3 :
315349; CHECK-NEXT: andi a0, a0, 1
316350; CHECK-NEXT: li a1, 0
317351; CHECK-NEXT: ret
@@ -789,17 +823,17 @@ define i64 @bset_trailing_ones_i64_mask(i64 %a) nounwind {
789823; CHECK-NEXT: li a3, -1
790824; CHECK-NEXT: addi a1, a2, -32
791825; CHECK-NEXT: sll a0, a3, a0
792- ; CHECK-NEXT: bltz a1, .LBB43_2
826+ ; CHECK-NEXT: bltz a1, .LBB44_2
793827; CHECK-NEXT: # %bb.1:
794828; CHECK-NEXT: sll a2, a3, a2
795- ; CHECK-NEXT: j .LBB43_3
796- ; CHECK-NEXT: .LBB43_2 :
829+ ; CHECK-NEXT: j .LBB44_3
830+ ; CHECK-NEXT: .LBB44_2 :
797831; CHECK-NEXT: not a2, a2
798832; CHECK-NEXT: lui a3, 524288
799833; CHECK-NEXT: addi a3, a3, -1
800834; CHECK-NEXT: srl a2, a3, a2
801835; CHECK-NEXT: or a2, a0, a2
802- ; CHECK-NEXT: .LBB43_3 :
836+ ; CHECK-NEXT: .LBB44_3 :
803837; CHECK-NEXT: srai a1, a1, 31
804838; CHECK-NEXT: and a0, a1, a0
805839; CHECK-NEXT: not a1, a2
@@ -817,17 +851,17 @@ define i64 @bset_trailing_ones_i64_no_mask(i64 %a) nounwind {
817851; CHECK-NEXT: li a1, -1
818852; CHECK-NEXT: addi a2, a0, -32
819853; CHECK-NEXT: sll a1, a1, a0
820- ; CHECK-NEXT: bltz a2, .LBB44_2
854+ ; CHECK-NEXT: bltz a2, .LBB45_2
821855; CHECK-NEXT: # %bb.1:
822856; CHECK-NEXT: mv a0, a1
823- ; CHECK-NEXT: j .LBB44_3
824- ; CHECK-NEXT: .LBB44_2 :
857+ ; CHECK-NEXT: j .LBB45_3
858+ ; CHECK-NEXT: .LBB45_2 :
825859; CHECK-NEXT: not a0, a0
826860; CHECK-NEXT: lui a3, 524288
827861; CHECK-NEXT: addi a3, a3, -1
828862; CHECK-NEXT: srl a0, a3, a0
829863; CHECK-NEXT: or a0, a1, a0
830- ; CHECK-NEXT: .LBB44_3 :
864+ ; CHECK-NEXT: .LBB45_3 :
831865; CHECK-NEXT: srai a2, a2, 31
832866; CHECK-NEXT: and a2, a2, a1
833867; CHECK-NEXT: not a1, a0
0 commit comments