@@ -355,40 +355,32 @@ define i128 @i128_mul(i128 %x, i128 %y) {
355355define { i128 , i8 } @i128_checked_mul (i128 %x , i128 %y ) {
356356; CHECK-LABEL: i128_checked_mul:
357357; CHECK: // %bb.0:
358- ; CHECK-NEXT: asr x8, x1, #63
359- ; CHECK-NEXT: asr x11, x3, #63
360- ; CHECK-NEXT: umulh x13, x0, x2
361- ; CHECK-NEXT: mul x9, x2, x8
362- ; CHECK-NEXT: umulh x10, x2, x8
363- ; CHECK-NEXT: umulh x12, x11, x0
364- ; CHECK-NEXT: mul x14, x1, x2
365- ; CHECK-NEXT: add x10, x10, x9
366- ; CHECK-NEXT: madd x8, x3, x8, x10
367- ; CHECK-NEXT: madd x10, x11, x1, x12
368- ; CHECK-NEXT: mul x11, x11, x0
369- ; CHECK-NEXT: umulh x12, x1, x2
370- ; CHECK-NEXT: mul x15, x0, x3
371- ; CHECK-NEXT: add x10, x10, x11
372- ; CHECK-NEXT: adds x9, x11, x9
373- ; CHECK-NEXT: umulh x16, x0, x3
374- ; CHECK-NEXT: adc x10, x10, x8
375- ; CHECK-NEXT: adds x8, x14, x13
376- ; CHECK-NEXT: cinc x12, x12, hs
377- ; CHECK-NEXT: mul x11, x1, x3
378- ; CHECK-NEXT: adds x8, x15, x8
379- ; CHECK-NEXT: umulh x13, x1, x3
358+ ; CHECK-NEXT: asr x9, x1, #63
359+ ; CHECK-NEXT: umulh x10, x0, x2
360+ ; CHECK-NEXT: asr x13, x3, #63
361+ ; CHECK-NEXT: mul x11, x1, x2
362+ ; CHECK-NEXT: umulh x8, x1, x2
363+ ; CHECK-NEXT: mul x9, x9, x2
364+ ; CHECK-NEXT: adds x10, x11, x10
365+ ; CHECK-NEXT: mul x14, x0, x3
366+ ; CHECK-NEXT: umulh x12, x0, x3
367+ ; CHECK-NEXT: adc x9, x8, x9
368+ ; CHECK-NEXT: mul x13, x0, x13
369+ ; CHECK-NEXT: adds x8, x14, x10
370+ ; CHECK-NEXT: mul x15, x1, x3
371+ ; CHECK-NEXT: smulh x10, x1, x3
380372; CHECK-NEXT: mov x1, x8
381- ; CHECK-NEXT: cinc x14, x16, hs
382- ; CHECK-NEXT: adds x12, x12, x14
373+ ; CHECK-NEXT: adc x11, x12, x13
374+ ; CHECK-NEXT: asr x12, x9, #63
375+ ; CHECK-NEXT: asr x13, x11, #63
376+ ; CHECK-NEXT: adds x9, x9, x11
377+ ; CHECK-NEXT: asr x11, x8, #63
383378; CHECK-NEXT: mul x0, x0, x2
384- ; CHECK-NEXT: cset w14, hs
385- ; CHECK-NEXT: adds x11, x11, x12
386- ; CHECK-NEXT: asr x12, x8, #63
387- ; CHECK-NEXT: adc x13, x13, x14
388- ; CHECK-NEXT: adds x9, x11, x9
389- ; CHECK-NEXT: adc x10, x13, x10
390- ; CHECK-NEXT: cmp x9, x12
391- ; CHECK-NEXT: ccmp x10, x12, #0, eq
379+ ; CHECK-NEXT: adc x12, x12, x13
380+ ; CHECK-NEXT: adds x9, x15, x9
381+ ; CHECK-NEXT: adc x10, x10, x12
382+ ; CHECK-NEXT: cmp x9, x11
383+ ; CHECK-NEXT: ccmp x10, x11, #0, eq
392384; CHECK-NEXT: cset w2, eq
393385; CHECK-NEXT: ret
394386 %1 = tail call { i128 , i1 } @llvm.smul.with.overflow.i128 (i128 %x , i128 %y )
@@ -404,40 +396,32 @@ define { i128, i8 } @i128_checked_mul(i128 %x, i128 %y) {
404396define { i128 , i8 } @i128_overflowing_mul (i128 %x , i128 %y ) {
405397; CHECK-LABEL: i128_overflowing_mul:
406398; CHECK: // %bb.0:
407- ; CHECK-NEXT: asr x8, x1, #63
408- ; CHECK-NEXT: asr x11, x3, #63
409- ; CHECK-NEXT: umulh x13, x0, x2
410- ; CHECK-NEXT: mul x9, x2, x8
411- ; CHECK-NEXT: umulh x10, x2, x8
412- ; CHECK-NEXT: umulh x12, x11, x0
413- ; CHECK-NEXT: mul x14, x1, x2
414- ; CHECK-NEXT: add x10, x10, x9
415- ; CHECK-NEXT: madd x8, x3, x8, x10
416- ; CHECK-NEXT: madd x10, x11, x1, x12
417- ; CHECK-NEXT: mul x11, x11, x0
418- ; CHECK-NEXT: umulh x12, x1, x2
419- ; CHECK-NEXT: mul x15, x0, x3
420- ; CHECK-NEXT: add x10, x10, x11
421- ; CHECK-NEXT: adds x9, x11, x9
422- ; CHECK-NEXT: umulh x16, x0, x3
423- ; CHECK-NEXT: adc x10, x10, x8
424- ; CHECK-NEXT: adds x8, x14, x13
425- ; CHECK-NEXT: cinc x12, x12, hs
426- ; CHECK-NEXT: mul x11, x1, x3
427- ; CHECK-NEXT: adds x8, x15, x8
428- ; CHECK-NEXT: umulh x13, x1, x3
399+ ; CHECK-NEXT: asr x9, x1, #63
400+ ; CHECK-NEXT: umulh x10, x0, x2
401+ ; CHECK-NEXT: asr x13, x3, #63
402+ ; CHECK-NEXT: mul x11, x1, x2
403+ ; CHECK-NEXT: umulh x8, x1, x2
404+ ; CHECK-NEXT: mul x9, x9, x2
405+ ; CHECK-NEXT: adds x10, x11, x10
406+ ; CHECK-NEXT: mul x14, x0, x3
407+ ; CHECK-NEXT: umulh x12, x0, x3
408+ ; CHECK-NEXT: adc x9, x8, x9
409+ ; CHECK-NEXT: mul x13, x0, x13
410+ ; CHECK-NEXT: adds x8, x14, x10
411+ ; CHECK-NEXT: mul x15, x1, x3
412+ ; CHECK-NEXT: smulh x10, x1, x3
429413; CHECK-NEXT: mov x1, x8
430- ; CHECK-NEXT: cinc x14, x16, hs
431- ; CHECK-NEXT: adds x12, x12, x14
414+ ; CHECK-NEXT: adc x11, x12, x13
415+ ; CHECK-NEXT: asr x12, x9, #63
416+ ; CHECK-NEXT: asr x13, x11, #63
417+ ; CHECK-NEXT: adds x9, x9, x11
418+ ; CHECK-NEXT: asr x11, x8, #63
432419; CHECK-NEXT: mul x0, x0, x2
433- ; CHECK-NEXT: cset w14, hs
434- ; CHECK-NEXT: adds x11, x11, x12
435- ; CHECK-NEXT: asr x12, x8, #63
436- ; CHECK-NEXT: adc x13, x13, x14
437- ; CHECK-NEXT: adds x9, x11, x9
438- ; CHECK-NEXT: adc x10, x13, x10
439- ; CHECK-NEXT: cmp x9, x12
440- ; CHECK-NEXT: ccmp x10, x12, #0, eq
420+ ; CHECK-NEXT: adc x12, x12, x13
421+ ; CHECK-NEXT: adds x9, x15, x9
422+ ; CHECK-NEXT: adc x10, x10, x12
423+ ; CHECK-NEXT: cmp x9, x11
424+ ; CHECK-NEXT: ccmp x10, x11, #0, eq
441425; CHECK-NEXT: cset w2, ne
442426; CHECK-NEXT: ret
443427 %1 = tail call { i128 , i1 } @llvm.smul.with.overflow.i128 (i128 %x , i128 %y )
@@ -452,46 +436,38 @@ define { i128, i8 } @i128_overflowing_mul(i128 %x, i128 %y) {
452436define i128 @i128_saturating_mul (i128 %x , i128 %y ) {
453437; CHECK-LABEL: i128_saturating_mul:
454438; CHECK: // %bb.0:
455- ; CHECK-NEXT: asr x8, x1, #63
456- ; CHECK-NEXT: asr x11, x3, #63
457- ; CHECK-NEXT: umulh x13, x0, x2
458- ; CHECK-NEXT: mul x9, x2, x8
459- ; CHECK-NEXT: umulh x10, x2, x8
460- ; CHECK-NEXT: umulh x12, x11, x0
461- ; CHECK-NEXT: mul x14, x1, x2
462- ; CHECK-NEXT: add x10, x10, x9
463- ; CHECK-NEXT: madd x8, x3, x8, x10
464- ; CHECK-NEXT: madd x10, x11, x1, x12
465- ; CHECK-NEXT: mul x11, x11, x0
466- ; CHECK-NEXT: umulh x12, x1, x2
467- ; CHECK-NEXT: mul x16, x0, x3
468- ; CHECK-NEXT: add x10, x10, x11
469- ; CHECK-NEXT: adds x9, x11, x9
470- ; CHECK-NEXT: umulh x15, x0, x3
471- ; CHECK-NEXT: adc x8, x10, x8
472- ; CHECK-NEXT: adds x10, x14, x13
473- ; CHECK-NEXT: cinc x12, x12, hs
474- ; CHECK-NEXT: mul x17, x1, x3
475- ; CHECK-NEXT: adds x10, x16, x10
476- ; CHECK-NEXT: umulh x11, x1, x3
477- ; CHECK-NEXT: cinc x13, x15, hs
478- ; CHECK-NEXT: adds x12, x12, x13
479- ; CHECK-NEXT: cset w13, hs
480- ; CHECK-NEXT: adds x12, x17, x12
481- ; CHECK-NEXT: adc x11, x11, x13
482- ; CHECK-NEXT: adds x9, x12, x9
483- ; CHECK-NEXT: asr x12, x10, #63
439+ ; CHECK-NEXT: asr x9, x1, #63
440+ ; CHECK-NEXT: umulh x10, x0, x2
441+ ; CHECK-NEXT: asr x13, x3, #63
442+ ; CHECK-NEXT: mul x11, x1, x2
443+ ; CHECK-NEXT: umulh x8, x1, x2
444+ ; CHECK-NEXT: mul x9, x9, x2
445+ ; CHECK-NEXT: adds x10, x11, x10
446+ ; CHECK-NEXT: mul x14, x0, x3
447+ ; CHECK-NEXT: umulh x12, x0, x3
448+ ; CHECK-NEXT: adc x8, x8, x9
449+ ; CHECK-NEXT: mul x13, x0, x13
450+ ; CHECK-NEXT: adds x9, x14, x10
451+ ; CHECK-NEXT: mul x11, x1, x3
452+ ; CHECK-NEXT: adc x10, x12, x13
453+ ; CHECK-NEXT: smulh x12, x1, x3
454+ ; CHECK-NEXT: asr x13, x8, #63
455+ ; CHECK-NEXT: asr x14, x10, #63
456+ ; CHECK-NEXT: adds x8, x8, x10
457+ ; CHECK-NEXT: adc x10, x13, x14
458+ ; CHECK-NEXT: adds x8, x11, x8
459+ ; CHECK-NEXT: asr x11, x9, #63
484460; CHECK-NEXT: mul x13, x0, x2
485- ; CHECK-NEXT: adc x8, x11, x8
486- ; CHECK-NEXT: eor x11 , x3, x1
487- ; CHECK-NEXT: eor x8, x8, x12
488- ; CHECK-NEXT: eor x9, x9, x12
489- ; CHECK-NEXT: asr x11, x11 , #63
490- ; CHECK-NEXT: orr x8, x9, x8
491- ; CHECK-NEXT: eor x9 , x11, #0x7fffffffffffffff
461+ ; CHECK-NEXT: adc x10, x12, x10
462+ ; CHECK-NEXT: eor x12 , x3, x1
463+ ; CHECK-NEXT: eor x8, x8, x11
464+ ; CHECK-NEXT: eor x10, x10, x11
465+ ; CHECK-NEXT: asr x11, x12 , #63
466+ ; CHECK-NEXT: orr x8, x8, x10
467+ ; CHECK-NEXT: eor x10 , x11, #0x7fffffffffffffff
492468; CHECK-NEXT: cmp x8, #0
493- ; CHECK-NEXT: csel x1, x9, x10, ne
494469; CHECK-NEXT: csinv x0, x13, x11, eq
470+ ; CHECK-NEXT: csel x1, x10, x9, ne
495471; CHECK-NEXT: ret
496472 %1 = tail call { i128 , i1 } @llvm.smul.with.overflow.i128 (i128 %x , i128 %y )
497473 %2 = extractvalue { i128 , i1 } %1 , 0
0 commit comments