@@ -129,7 +129,6 @@ define i64 @zero_singlebit1(i64 %rs1, i64 %rs2) {
129129 ret i64 %sel
130130}
131131
132- ; TODO: Optimize Zicond case.
133132define i64 @zero_singlebit2 (i64 %rs1 , i64 %rs2 ) {
134133; RV32I-LABEL: zero_singlebit2:
135134; RV32I: # %bb.0:
@@ -148,9 +147,8 @@ define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
148147;
149148; RV64XVENTANACONDOPS-LABEL: zero_singlebit2:
150149; RV64XVENTANACONDOPS: # %bb.0:
151- ; RV64XVENTANACONDOPS-NEXT: slli a1, a1, 51
152- ; RV64XVENTANACONDOPS-NEXT: srai a1, a1, 63
153- ; RV64XVENTANACONDOPS-NEXT: and a0, a1, a0
150+ ; RV64XVENTANACONDOPS-NEXT: bexti a1, a1, 12
151+ ; RV64XVENTANACONDOPS-NEXT: vt.maskc a0, a0, a1
154152; RV64XVENTANACONDOPS-NEXT: ret
155153;
156154; RV64XTHEADCONDMOV-LABEL: zero_singlebit2:
@@ -162,17 +160,15 @@ define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
162160;
163161; RV32ZICOND-LABEL: zero_singlebit2:
164162; RV32ZICOND: # %bb.0:
165- ; RV32ZICOND-NEXT: slli a2, a2, 19
166- ; RV32ZICOND-NEXT: srai a2, a2, 31
167- ; RV32ZICOND-NEXT: and a0, a2, a0
168- ; RV32ZICOND-NEXT: and a1, a2, a1
163+ ; RV32ZICOND-NEXT: bexti a2, a2, 12
164+ ; RV32ZICOND-NEXT: czero.eqz a0, a0, a2
165+ ; RV32ZICOND-NEXT: czero.eqz a1, a1, a2
169166; RV32ZICOND-NEXT: ret
170167;
171168; RV64ZICOND-LABEL: zero_singlebit2:
172169; RV64ZICOND: # %bb.0:
173- ; RV64ZICOND-NEXT: slli a1, a1, 51
174- ; RV64ZICOND-NEXT: srai a1, a1, 63
175- ; RV64ZICOND-NEXT: and a0, a1, a0
170+ ; RV64ZICOND-NEXT: bexti a1, a1, 12
171+ ; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
176172; RV64ZICOND-NEXT: ret
177173 %and = and i64 %rs2 , 4096
178174 %rc = icmp eq i64 %and , 0
@@ -3694,9 +3690,8 @@ define i64 @single_bit2(i64 %x) {
36943690;
36953691; RV64XVENTANACONDOPS-LABEL: single_bit2:
36963692; RV64XVENTANACONDOPS: # %bb.0: # %entry
3697- ; RV64XVENTANACONDOPS-NEXT: slli a1, a0, 52
3698- ; RV64XVENTANACONDOPS-NEXT: srai a1, a1, 63
3699- ; RV64XVENTANACONDOPS-NEXT: and a0, a1, a0
3693+ ; RV64XVENTANACONDOPS-NEXT: bexti a1, a0, 11
3694+ ; RV64XVENTANACONDOPS-NEXT: vt.maskc a0, a0, a1
37003695; RV64XVENTANACONDOPS-NEXT: ret
37013696;
37023697; RV64XTHEADCONDMOV-LABEL: single_bit2:
@@ -3708,17 +3703,15 @@ define i64 @single_bit2(i64 %x) {
37083703;
37093704; RV32ZICOND-LABEL: single_bit2:
37103705; RV32ZICOND: # %bb.0: # %entry
3711- ; RV32ZICOND-NEXT: slli a2, a0, 20
3712- ; RV32ZICOND-NEXT: srai a2, a2, 31
3713- ; RV32ZICOND-NEXT: and a0, a2, a0
3714- ; RV32ZICOND-NEXT: and a1, a2, a1
3706+ ; RV32ZICOND-NEXT: bexti a2, a0, 11
3707+ ; RV32ZICOND-NEXT: czero.eqz a0, a0, a2
3708+ ; RV32ZICOND-NEXT: czero.eqz a1, a1, a2
37153709; RV32ZICOND-NEXT: ret
37163710;
37173711; RV64ZICOND-LABEL: single_bit2:
37183712; RV64ZICOND: # %bb.0: # %entry
3719- ; RV64ZICOND-NEXT: slli a1, a0, 52
3720- ; RV64ZICOND-NEXT: srai a1, a1, 63
3721- ; RV64ZICOND-NEXT: and a0, a1, a0
3713+ ; RV64ZICOND-NEXT: bexti a1, a0, 11
3714+ ; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
37223715; RV64ZICOND-NEXT: ret
37233716entry:
37243717 %and = and i64 %x , 2048
0 commit comments