@@ -153,3 +153,108 @@ define i64 @xor_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) {
153
153
%b = xor i64 %a , %y
154
154
ret i64 %b
155
155
}
156
+
157
+ define signext i32 @add_select_all_zeros_i32 (i1 zeroext %c , i32 signext %x , i32 signext %y ) {
158
+ ; RV32I-LABEL: add_select_all_zeros_i32:
159
+ ; RV32I: # %bb.0:
160
+ ; RV32I-NEXT: mv a3, zero
161
+ ; RV32I-NEXT: bnez a0, .LBB6_2
162
+ ; RV32I-NEXT: # %bb.1:
163
+ ; RV32I-NEXT: mv a3, a1
164
+ ; RV32I-NEXT: .LBB6_2:
165
+ ; RV32I-NEXT: add a0, a2, a3
166
+ ; RV32I-NEXT: ret
167
+ ;
168
+ ; RV64I-LABEL: add_select_all_zeros_i32:
169
+ ; RV64I: # %bb.0:
170
+ ; RV64I-NEXT: mv a3, zero
171
+ ; RV64I-NEXT: bnez a0, .LBB6_2
172
+ ; RV64I-NEXT: # %bb.1:
173
+ ; RV64I-NEXT: mv a3, a1
174
+ ; RV64I-NEXT: .LBB6_2:
175
+ ; RV64I-NEXT: addw a0, a2, a3
176
+ ; RV64I-NEXT: ret
177
+ %a = select i1 %c , i32 0 , i32 %x
178
+ %b = add i32 %y , %a
179
+ ret i32 %b
180
+ }
181
+
182
+ define i64 @add_select_all_zeros_i64 (i1 zeroext %c , i64 %x , i64 %y ) {
183
+ ; RV32I-LABEL: add_select_all_zeros_i64:
184
+ ; RV32I: # %bb.0:
185
+ ; RV32I-NEXT: bnez a0, .LBB7_2
186
+ ; RV32I-NEXT: # %bb.1:
187
+ ; RV32I-NEXT: mv a2, zero
188
+ ; RV32I-NEXT: mv a1, zero
189
+ ; RV32I-NEXT: .LBB7_2:
190
+ ; RV32I-NEXT: add a0, a1, a3
191
+ ; RV32I-NEXT: sltu a1, a0, a1
192
+ ; RV32I-NEXT: add a2, a2, a4
193
+ ; RV32I-NEXT: add a1, a2, a1
194
+ ; RV32I-NEXT: ret
195
+ ;
196
+ ; RV64I-LABEL: add_select_all_zeros_i64:
197
+ ; RV64I: # %bb.0:
198
+ ; RV64I-NEXT: bnez a0, .LBB7_2
199
+ ; RV64I-NEXT: # %bb.1:
200
+ ; RV64I-NEXT: mv a1, zero
201
+ ; RV64I-NEXT: .LBB7_2:
202
+ ; RV64I-NEXT: add a0, a1, a2
203
+ ; RV64I-NEXT: ret
204
+ %a = select i1 %c , i64 %x , i64 0
205
+ %b = add i64 %a , %y
206
+ ret i64 %b
207
+ }
208
+
209
+ define signext i32 @sub_select_all_zeros_i32 (i1 zeroext %c , i32 signext %x , i32 signext %y ) {
210
+ ; RV32I-LABEL: sub_select_all_zeros_i32:
211
+ ; RV32I: # %bb.0:
212
+ ; RV32I-NEXT: mv a3, zero
213
+ ; RV32I-NEXT: bnez a0, .LBB8_2
214
+ ; RV32I-NEXT: # %bb.1:
215
+ ; RV32I-NEXT: mv a3, a1
216
+ ; RV32I-NEXT: .LBB8_2:
217
+ ; RV32I-NEXT: sub a0, a2, a3
218
+ ; RV32I-NEXT: ret
219
+ ;
220
+ ; RV64I-LABEL: sub_select_all_zeros_i32:
221
+ ; RV64I: # %bb.0:
222
+ ; RV64I-NEXT: mv a3, zero
223
+ ; RV64I-NEXT: bnez a0, .LBB8_2
224
+ ; RV64I-NEXT: # %bb.1:
225
+ ; RV64I-NEXT: mv a3, a1
226
+ ; RV64I-NEXT: .LBB8_2:
227
+ ; RV64I-NEXT: subw a0, a2, a3
228
+ ; RV64I-NEXT: ret
229
+ %a = select i1 %c , i32 0 , i32 %x
230
+ %b = sub i32 %y , %a
231
+ ret i32 %b
232
+ }
233
+
234
+ define i64 @sub_select_all_zeros_i64 (i1 zeroext %c , i64 %x , i64 %y ) {
235
+ ; RV32I-LABEL: sub_select_all_zeros_i64:
236
+ ; RV32I: # %bb.0:
237
+ ; RV32I-NEXT: bnez a0, .LBB9_2
238
+ ; RV32I-NEXT: # %bb.1:
239
+ ; RV32I-NEXT: mv a2, zero
240
+ ; RV32I-NEXT: mv a1, zero
241
+ ; RV32I-NEXT: .LBB9_2:
242
+ ; RV32I-NEXT: sltu a0, a3, a1
243
+ ; RV32I-NEXT: sub a2, a4, a2
244
+ ; RV32I-NEXT: sub a2, a2, a0
245
+ ; RV32I-NEXT: sub a0, a3, a1
246
+ ; RV32I-NEXT: mv a1, a2
247
+ ; RV32I-NEXT: ret
248
+ ;
249
+ ; RV64I-LABEL: sub_select_all_zeros_i64:
250
+ ; RV64I: # %bb.0:
251
+ ; RV64I-NEXT: bnez a0, .LBB9_2
252
+ ; RV64I-NEXT: # %bb.1:
253
+ ; RV64I-NEXT: mv a1, zero
254
+ ; RV64I-NEXT: .LBB9_2:
255
+ ; RV64I-NEXT: sub a0, a2, a1
256
+ ; RV64I-NEXT: ret
257
+ %a = select i1 %c , i64 %x , i64 0
258
+ %b = sub i64 %y , %a
259
+ ret i64 %b
260
+ }
0 commit comments