@@ -129,7 +129,6 @@ define i64 @zero_singlebit1(i64 %rs1, i64 %rs2) {
129
129
ret i64 %sel
130
130
}
131
131
132
- ; TODO: Optimize Zicond case.
133
132
define i64 @zero_singlebit2 (i64 %rs1 , i64 %rs2 ) {
134
133
; RV32I-LABEL: zero_singlebit2:
135
134
; RV32I: # %bb.0:
@@ -148,9 +147,8 @@ define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
148
147
;
149
148
; RV64XVENTANACONDOPS-LABEL: zero_singlebit2:
150
149
; 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
154
152
; RV64XVENTANACONDOPS-NEXT: ret
155
153
;
156
154
; RV64XTHEADCONDMOV-LABEL: zero_singlebit2:
@@ -162,17 +160,15 @@ define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
162
160
;
163
161
; RV32ZICOND-LABEL: zero_singlebit2:
164
162
; 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
169
166
; RV32ZICOND-NEXT: ret
170
167
;
171
168
; RV64ZICOND-LABEL: zero_singlebit2:
172
169
; 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
176
172
; RV64ZICOND-NEXT: ret
177
173
%and = and i64 %rs2 , 4096
178
174
%rc = icmp eq i64 %and , 0
@@ -3694,9 +3690,8 @@ define i64 @single_bit2(i64 %x) {
3694
3690
;
3695
3691
; RV64XVENTANACONDOPS-LABEL: single_bit2:
3696
3692
; 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
3700
3695
; RV64XVENTANACONDOPS-NEXT: ret
3701
3696
;
3702
3697
; RV64XTHEADCONDMOV-LABEL: single_bit2:
@@ -3708,17 +3703,15 @@ define i64 @single_bit2(i64 %x) {
3708
3703
;
3709
3704
; RV32ZICOND-LABEL: single_bit2:
3710
3705
; 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
3715
3709
; RV32ZICOND-NEXT: ret
3716
3710
;
3717
3711
; RV64ZICOND-LABEL: single_bit2:
3718
3712
; 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
3722
3715
; RV64ZICOND-NEXT: ret
3723
3716
entry:
3724
3717
%and = and i64 %x , 2048
0 commit comments