@@ -45,6 +45,32 @@ 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+ ; RV32ZBS-LABEL: bclr_i32_mask_multiple:
60+ ; RV32ZBS: # %bb.0:
61+ ; RV32ZBS-NEXT: bclr a0, a0, a2
62+ ; RV32ZBS-NEXT: bset a1, a1, a2
63+ ; RV32ZBS-NEXT: add a0, a0, a1
64+ ; RV32ZBS-NEXT: ret
65+ %shamt_masked = and i32 %shamt , 63
66+ %shl = shl nuw i32 1 , %shamt_masked
67+ %neg = xor i32 %shl , -1
68+ %and = and i32 %neg , %a
69+ %or = or i32 %b , %shl
70+ %c = add i32 %and , %or
71+ ret i32 %c
72+ }
73+
4874define i64 @bclr_i64 (i64 %a , i64 %b ) nounwind {
4975; RV32I-LABEL: bclr_i64:
5076; RV32I: # %bb.0:
@@ -301,17 +327,17 @@ define i64 @bext_i64(i64 %a, i64 %b) nounwind {
301327; CHECK: # %bb.0:
302328; CHECK-NEXT: andi a3, a2, 63
303329; CHECK-NEXT: addi a4, a3, -32
304- ; CHECK-NEXT: bltz a4, .LBB12_2
330+ ; CHECK-NEXT: bltz a4, .LBB13_2
305331; CHECK-NEXT: # %bb.1:
306332; CHECK-NEXT: srl a0, a1, a3
307- ; CHECK-NEXT: j .LBB12_3
308- ; CHECK-NEXT: .LBB12_2 :
333+ ; CHECK-NEXT: j .LBB13_3
334+ ; CHECK-NEXT: .LBB13_2 :
309335; CHECK-NEXT: srl a0, a0, a2
310336; CHECK-NEXT: slli a1, a1, 1
311337; CHECK-NEXT: not a2, a3
312338; CHECK-NEXT: sll a1, a1, a2
313339; CHECK-NEXT: or a0, a0, a1
314- ; CHECK-NEXT: .LBB12_3 :
340+ ; CHECK-NEXT: .LBB13_3 :
315341; CHECK-NEXT: andi a0, a0, 1
316342; CHECK-NEXT: li a1, 0
317343; CHECK-NEXT: ret
@@ -789,17 +815,17 @@ define i64 @bset_trailing_ones_i64_mask(i64 %a) nounwind {
789815; CHECK-NEXT: li a3, -1
790816; CHECK-NEXT: addi a1, a2, -32
791817; CHECK-NEXT: sll a0, a3, a0
792- ; CHECK-NEXT: bltz a1, .LBB43_2
818+ ; CHECK-NEXT: bltz a1, .LBB44_2
793819; CHECK-NEXT: # %bb.1:
794820; CHECK-NEXT: sll a2, a3, a2
795- ; CHECK-NEXT: j .LBB43_3
796- ; CHECK-NEXT: .LBB43_2 :
821+ ; CHECK-NEXT: j .LBB44_3
822+ ; CHECK-NEXT: .LBB44_2 :
797823; CHECK-NEXT: not a2, a2
798824; CHECK-NEXT: lui a3, 524288
799825; CHECK-NEXT: addi a3, a3, -1
800826; CHECK-NEXT: srl a2, a3, a2
801827; CHECK-NEXT: or a2, a0, a2
802- ; CHECK-NEXT: .LBB43_3 :
828+ ; CHECK-NEXT: .LBB44_3 :
803829; CHECK-NEXT: srai a1, a1, 31
804830; CHECK-NEXT: and a0, a1, a0
805831; CHECK-NEXT: not a1, a2
@@ -817,17 +843,17 @@ define i64 @bset_trailing_ones_i64_no_mask(i64 %a) nounwind {
817843; CHECK-NEXT: li a1, -1
818844; CHECK-NEXT: addi a2, a0, -32
819845; CHECK-NEXT: sll a1, a1, a0
820- ; CHECK-NEXT: bltz a2, .LBB44_2
846+ ; CHECK-NEXT: bltz a2, .LBB45_2
821847; CHECK-NEXT: # %bb.1:
822848; CHECK-NEXT: mv a0, a1
823- ; CHECK-NEXT: j .LBB44_3
824- ; CHECK-NEXT: .LBB44_2 :
849+ ; CHECK-NEXT: j .LBB45_3
850+ ; CHECK-NEXT: .LBB45_2 :
825851; CHECK-NEXT: not a0, a0
826852; CHECK-NEXT: lui a3, 524288
827853; CHECK-NEXT: addi a3, a3, -1
828854; CHECK-NEXT: srl a0, a3, a0
829855; CHECK-NEXT: or a0, a1, a0
830- ; CHECK-NEXT: .LBB44_3 :
856+ ; CHECK-NEXT: .LBB45_3 :
831857; CHECK-NEXT: srai a2, a2, 31
832858; CHECK-NEXT: and a2, a2, a1
833859; CHECK-NEXT: not a1, a0
0 commit comments