@@ -258,3 +258,229 @@ define i64 @neg_abs64_multiuse(i64 %x, ptr %y) {
258258 %neg = sub nsw i64 0 , %abs
259259 ret i64 %neg
260260}
261+
262+ define i32 @expanded_neg_abs32 (i32 %x ) {
263+ ; RV32I-LABEL: expanded_neg_abs32:
264+ ; RV32I: # %bb.0:
265+ ; RV32I-NEXT: neg a1, a0
266+ ; RV32I-NEXT: blt a0, a1, .LBB6_2
267+ ; RV32I-NEXT: # %bb.1:
268+ ; RV32I-NEXT: mv a1, a0
269+ ; RV32I-NEXT: .LBB6_2:
270+ ; RV32I-NEXT: neg a0, a1
271+ ; RV32I-NEXT: ret
272+ ;
273+ ; RV32ZBB-LABEL: expanded_neg_abs32:
274+ ; RV32ZBB: # %bb.0:
275+ ; RV32ZBB-NEXT: neg a1, a0
276+ ; RV32ZBB-NEXT: max a0, a1, a0
277+ ; RV32ZBB-NEXT: neg a0, a0
278+ ; RV32ZBB-NEXT: ret
279+ ;
280+ ; RV64I-LABEL: expanded_neg_abs32:
281+ ; RV64I: # %bb.0:
282+ ; RV64I-NEXT: sext.w a1, a0
283+ ; RV64I-NEXT: negw a0, a0
284+ ; RV64I-NEXT: blt a1, a0, .LBB6_2
285+ ; RV64I-NEXT: # %bb.1:
286+ ; RV64I-NEXT: mv a0, a1
287+ ; RV64I-NEXT: .LBB6_2:
288+ ; RV64I-NEXT: negw a0, a0
289+ ; RV64I-NEXT: ret
290+ ;
291+ ; RV64ZBB-LABEL: expanded_neg_abs32:
292+ ; RV64ZBB: # %bb.0:
293+ ; RV64ZBB-NEXT: sext.w a1, a0
294+ ; RV64ZBB-NEXT: negw a0, a0
295+ ; RV64ZBB-NEXT: max a0, a0, a1
296+ ; RV64ZBB-NEXT: negw a0, a0
297+ ; RV64ZBB-NEXT: ret
298+ %n = sub i32 0 , %x
299+ %t = call i32 @llvm.smax.i32 (i32 %n , i32 %x )
300+ %r = sub i32 0 , %t
301+ ret i32 %r
302+ }
303+
304+ define i32 @expanded_neg_abs32_unsigned (i32 %x ) {
305+ ; RV32I-LABEL: expanded_neg_abs32_unsigned:
306+ ; RV32I: # %bb.0:
307+ ; RV32I-NEXT: neg a1, a0
308+ ; RV32I-NEXT: bltu a0, a1, .LBB7_2
309+ ; RV32I-NEXT: # %bb.1:
310+ ; RV32I-NEXT: mv a1, a0
311+ ; RV32I-NEXT: .LBB7_2:
312+ ; RV32I-NEXT: neg a0, a1
313+ ; RV32I-NEXT: ret
314+ ;
315+ ; RV32ZBB-LABEL: expanded_neg_abs32_unsigned:
316+ ; RV32ZBB: # %bb.0:
317+ ; RV32ZBB-NEXT: neg a1, a0
318+ ; RV32ZBB-NEXT: maxu a0, a1, a0
319+ ; RV32ZBB-NEXT: neg a0, a0
320+ ; RV32ZBB-NEXT: ret
321+ ;
322+ ; RV64I-LABEL: expanded_neg_abs32_unsigned:
323+ ; RV64I: # %bb.0:
324+ ; RV64I-NEXT: sext.w a1, a0
325+ ; RV64I-NEXT: negw a0, a0
326+ ; RV64I-NEXT: bltu a1, a0, .LBB7_2
327+ ; RV64I-NEXT: # %bb.1:
328+ ; RV64I-NEXT: mv a0, a1
329+ ; RV64I-NEXT: .LBB7_2:
330+ ; RV64I-NEXT: negw a0, a0
331+ ; RV64I-NEXT: ret
332+ ;
333+ ; RV64ZBB-LABEL: expanded_neg_abs32_unsigned:
334+ ; RV64ZBB: # %bb.0:
335+ ; RV64ZBB-NEXT: sext.w a1, a0
336+ ; RV64ZBB-NEXT: negw a0, a0
337+ ; RV64ZBB-NEXT: maxu a0, a0, a1
338+ ; RV64ZBB-NEXT: negw a0, a0
339+ ; RV64ZBB-NEXT: ret
340+ %n = sub i32 0 , %x
341+ %t = call i32 @llvm.umax.i32 (i32 %n , i32 %x )
342+ %r = sub i32 0 , %t
343+ ret i32 %r
344+ }
345+
346+ define i64 @expanded_neg_abs64 (i64 %x ) {
347+ ; RV32I-LABEL: expanded_neg_abs64:
348+ ; RV32I: # %bb.0:
349+ ; RV32I-NEXT: snez a2, a0
350+ ; RV32I-NEXT: neg a3, a1
351+ ; RV32I-NEXT: sub a2, a3, a2
352+ ; RV32I-NEXT: neg a3, a0
353+ ; RV32I-NEXT: beq a2, a1, .LBB8_2
354+ ; RV32I-NEXT: # %bb.1:
355+ ; RV32I-NEXT: slt a4, a1, a2
356+ ; RV32I-NEXT: beqz a4, .LBB8_3
357+ ; RV32I-NEXT: j .LBB8_4
358+ ; RV32I-NEXT: .LBB8_2:
359+ ; RV32I-NEXT: sltu a4, a0, a3
360+ ; RV32I-NEXT: bnez a4, .LBB8_4
361+ ; RV32I-NEXT: .LBB8_3:
362+ ; RV32I-NEXT: mv a2, a1
363+ ; RV32I-NEXT: mv a3, a0
364+ ; RV32I-NEXT: .LBB8_4:
365+ ; RV32I-NEXT: snez a0, a3
366+ ; RV32I-NEXT: add a0, a2, a0
367+ ; RV32I-NEXT: neg a1, a0
368+ ; RV32I-NEXT: neg a0, a3
369+ ; RV32I-NEXT: ret
370+ ;
371+ ; RV32ZBB-LABEL: expanded_neg_abs64:
372+ ; RV32ZBB: # %bb.0:
373+ ; RV32ZBB-NEXT: snez a2, a0
374+ ; RV32ZBB-NEXT: neg a3, a1
375+ ; RV32ZBB-NEXT: sub a2, a3, a2
376+ ; RV32ZBB-NEXT: neg a3, a0
377+ ; RV32ZBB-NEXT: beq a2, a1, .LBB8_2
378+ ; RV32ZBB-NEXT: # %bb.1:
379+ ; RV32ZBB-NEXT: slt a4, a1, a2
380+ ; RV32ZBB-NEXT: beqz a4, .LBB8_3
381+ ; RV32ZBB-NEXT: j .LBB8_4
382+ ; RV32ZBB-NEXT: .LBB8_2:
383+ ; RV32ZBB-NEXT: sltu a4, a0, a3
384+ ; RV32ZBB-NEXT: bnez a4, .LBB8_4
385+ ; RV32ZBB-NEXT: .LBB8_3:
386+ ; RV32ZBB-NEXT: mv a2, a1
387+ ; RV32ZBB-NEXT: mv a3, a0
388+ ; RV32ZBB-NEXT: .LBB8_4:
389+ ; RV32ZBB-NEXT: snez a0, a3
390+ ; RV32ZBB-NEXT: add a0, a2, a0
391+ ; RV32ZBB-NEXT: neg a1, a0
392+ ; RV32ZBB-NEXT: neg a0, a3
393+ ; RV32ZBB-NEXT: ret
394+ ;
395+ ; RV64I-LABEL: expanded_neg_abs64:
396+ ; RV64I: # %bb.0:
397+ ; RV64I-NEXT: neg a1, a0
398+ ; RV64I-NEXT: blt a0, a1, .LBB8_2
399+ ; RV64I-NEXT: # %bb.1:
400+ ; RV64I-NEXT: mv a1, a0
401+ ; RV64I-NEXT: .LBB8_2:
402+ ; RV64I-NEXT: neg a0, a1
403+ ; RV64I-NEXT: ret
404+ ;
405+ ; RV64ZBB-LABEL: expanded_neg_abs64:
406+ ; RV64ZBB: # %bb.0:
407+ ; RV64ZBB-NEXT: neg a1, a0
408+ ; RV64ZBB-NEXT: max a0, a1, a0
409+ ; RV64ZBB-NEXT: neg a0, a0
410+ ; RV64ZBB-NEXT: ret
411+ %n = sub i64 0 , %x
412+ %t = call i64 @llvm.smax.i64 (i64 %n , i64 %x )
413+ %r = sub i64 0 , %t
414+ ret i64 %r
415+ }
416+
417+ define i64 @expanded_neg_abs64_unsigned (i64 %x ) {
418+ ; RV32I-LABEL: expanded_neg_abs64_unsigned:
419+ ; RV32I: # %bb.0:
420+ ; RV32I-NEXT: snez a2, a0
421+ ; RV32I-NEXT: neg a3, a1
422+ ; RV32I-NEXT: sub a2, a3, a2
423+ ; RV32I-NEXT: neg a3, a0
424+ ; RV32I-NEXT: beq a2, a1, .LBB9_2
425+ ; RV32I-NEXT: # %bb.1:
426+ ; RV32I-NEXT: sltu a4, a1, a2
427+ ; RV32I-NEXT: beqz a4, .LBB9_3
428+ ; RV32I-NEXT: j .LBB9_4
429+ ; RV32I-NEXT: .LBB9_2:
430+ ; RV32I-NEXT: sltu a4, a0, a3
431+ ; RV32I-NEXT: bnez a4, .LBB9_4
432+ ; RV32I-NEXT: .LBB9_3:
433+ ; RV32I-NEXT: mv a2, a1
434+ ; RV32I-NEXT: mv a3, a0
435+ ; RV32I-NEXT: .LBB9_4:
436+ ; RV32I-NEXT: snez a0, a3
437+ ; RV32I-NEXT: add a0, a2, a0
438+ ; RV32I-NEXT: neg a1, a0
439+ ; RV32I-NEXT: neg a0, a3
440+ ; RV32I-NEXT: ret
441+ ;
442+ ; RV32ZBB-LABEL: expanded_neg_abs64_unsigned:
443+ ; RV32ZBB: # %bb.0:
444+ ; RV32ZBB-NEXT: snez a2, a0
445+ ; RV32ZBB-NEXT: neg a3, a1
446+ ; RV32ZBB-NEXT: sub a2, a3, a2
447+ ; RV32ZBB-NEXT: neg a3, a0
448+ ; RV32ZBB-NEXT: beq a2, a1, .LBB9_2
449+ ; RV32ZBB-NEXT: # %bb.1:
450+ ; RV32ZBB-NEXT: sltu a4, a1, a2
451+ ; RV32ZBB-NEXT: beqz a4, .LBB9_3
452+ ; RV32ZBB-NEXT: j .LBB9_4
453+ ; RV32ZBB-NEXT: .LBB9_2:
454+ ; RV32ZBB-NEXT: sltu a4, a0, a3
455+ ; RV32ZBB-NEXT: bnez a4, .LBB9_4
456+ ; RV32ZBB-NEXT: .LBB9_3:
457+ ; RV32ZBB-NEXT: mv a2, a1
458+ ; RV32ZBB-NEXT: mv a3, a0
459+ ; RV32ZBB-NEXT: .LBB9_4:
460+ ; RV32ZBB-NEXT: snez a0, a3
461+ ; RV32ZBB-NEXT: add a0, a2, a0
462+ ; RV32ZBB-NEXT: neg a1, a0
463+ ; RV32ZBB-NEXT: neg a0, a3
464+ ; RV32ZBB-NEXT: ret
465+ ;
466+ ; RV64I-LABEL: expanded_neg_abs64_unsigned:
467+ ; RV64I: # %bb.0:
468+ ; RV64I-NEXT: neg a1, a0
469+ ; RV64I-NEXT: bltu a0, a1, .LBB9_2
470+ ; RV64I-NEXT: # %bb.1:
471+ ; RV64I-NEXT: mv a1, a0
472+ ; RV64I-NEXT: .LBB9_2:
473+ ; RV64I-NEXT: neg a0, a1
474+ ; RV64I-NEXT: ret
475+ ;
476+ ; RV64ZBB-LABEL: expanded_neg_abs64_unsigned:
477+ ; RV64ZBB: # %bb.0:
478+ ; RV64ZBB-NEXT: neg a1, a0
479+ ; RV64ZBB-NEXT: maxu a0, a1, a0
480+ ; RV64ZBB-NEXT: neg a0, a0
481+ ; RV64ZBB-NEXT: ret
482+ %n = sub i64 0 , %x
483+ %t = call i64 @llvm.umax.i64 (i64 %n , i64 %x )
484+ %r = sub i64 0 , %t
485+ ret i64 %r
486+ }
0 commit comments