@@ -278,13 +278,12 @@ define { i128, i8 } @u128_checked_mul(i128 %x, i128 %y) {
278
278
; CHECK-NEXT: cset w8, ne
279
279
; CHECK-NEXT: adds x1, x11, x9
280
280
; CHECK-NEXT: csinc w8, w8, wzr, lo
281
- ; CHECK-NEXT: b .LBB17_3
281
+ ; CHECK-NEXT: eor w2, w8, #0x1
282
+ ; CHECK-NEXT: ret
282
283
; CHECK-NEXT: .LBB17_2: // %overflow.no
283
284
; CHECK-NEXT: umulh x1, x0, x2
284
285
; CHECK-NEXT: mul x0, x0, x2
285
- ; CHECK-NEXT: .LBB17_3: // %overflow.res
286
- ; CHECK-NEXT: mov w9, #1 // =0x1
287
- ; CHECK-NEXT: bic w2, w9, w8
286
+ ; CHECK-NEXT: eor w2, w8, #0x1
288
287
; CHECK-NEXT: ret
289
288
%1 = tail call { i128 , i1 } @llvm.umul.with.overflow.i128 (i128 %x , i128 %y )
290
289
%2 = extractvalue { i128 , i1 } %1 , 0
@@ -314,13 +313,12 @@ define { i128, i8 } @u128_overflowing_mul(i128 %x, i128 %y) {
314
313
; CHECK-NEXT: mul x0, x0, x2
315
314
; CHECK-NEXT: cset w8, ne
316
315
; CHECK-NEXT: adds x1, x11, x9
317
- ; CHECK-NEXT: csinc w8, w8, wzr, lo
318
- ; CHECK-NEXT: and w2, w8, #0x1
316
+ ; CHECK-NEXT: csinc w2, w8, wzr, lo
319
317
; CHECK-NEXT: ret
320
318
; CHECK-NEXT: .LBB18_2: // %overflow.no
321
319
; CHECK-NEXT: umulh x1, x0, x2
322
320
; CHECK-NEXT: mul x0, x0, x2
323
- ; CHECK-NEXT: and w2, w8, #0x1
321
+ ; CHECK-NEXT: mov w2, wzr
324
322
; CHECK-NEXT: ret
325
323
%1 = tail call { i128 , i1 } @llvm.umul.with.overflow.i128 (i128 %x , i128 %y )
326
324
%2 = extractvalue { i128 , i1 } %1 , 0
@@ -356,7 +354,7 @@ define i128 @u128_saturating_mul(i128 %x, i128 %y) {
356
354
; CHECK-NEXT: mov w10, wzr
357
355
; CHECK-NEXT: mul x8, x0, x2
358
356
; CHECK-NEXT: .LBB19_3: // %overflow.res
359
- ; CHECK-NEXT: tst w10, #0x1
357
+ ; CHECK-NEXT: cmp w10, #0
360
358
; CHECK-NEXT: csinv x0, x8, xzr, eq
361
359
; CHECK-NEXT: csinv x1, x9, xzr, eq
362
360
; CHECK-NEXT: ret
@@ -382,18 +380,12 @@ define i128 @i128_mul(i128 %x, i128 %y) {
382
380
define { i128 , i8 } @i128_checked_mul (i128 %x , i128 %y ) {
383
381
; CHECK-LABEL: i128_checked_mul:
384
382
; CHECK: // %bb.0: // %overflow.entry
385
- ; CHECK-NEXT: cmp x1, x0, asr #63
386
- ; CHECK-NEXT: b.ne .LBB21_3
387
- ; CHECK-NEXT: // %bb.1: // %overflow.entry
388
- ; CHECK-NEXT: asr x8, x2, #63
389
- ; CHECK-NEXT: cmp x3, x8
390
- ; CHECK-NEXT: b.ne .LBB21_3
391
- ; CHECK-NEXT: // %bb.2: // %overflow.no
392
- ; CHECK-NEXT: smulh x1, x0, x2
393
- ; CHECK-NEXT: mov w8, wzr
394
- ; CHECK-NEXT: mul x0, x0, x2
395
- ; CHECK-NEXT: b .LBB21_4
396
- ; CHECK-NEXT: .LBB21_3: // %overflow
383
+ ; CHECK-NEXT: eor x8, x3, x2, asr #63
384
+ ; CHECK-NEXT: eor x9, x1, x0, asr #63
385
+ ; CHECK-NEXT: orr x8, x9, x8
386
+ ; CHECK-NEXT: cmp x8, #1
387
+ ; CHECK-NEXT: b.ne .LBB21_2
388
+ ; CHECK-NEXT: // %bb.1: // %overflow
397
389
; CHECK-NEXT: asr x9, x1, #63
398
390
; CHECK-NEXT: umulh x10, x0, x2
399
391
; CHECK-NEXT: asr x13, x3, #63
@@ -421,9 +413,12 @@ define { i128, i8 } @i128_checked_mul(i128 %x, i128 %y) {
421
413
; CHECK-NEXT: cmp x8, x10
422
414
; CHECK-NEXT: ccmp x9, x10, #0, eq
423
415
; CHECK-NEXT: cset w8, ne
424
- ; CHECK-NEXT: .LBB21_4: // %overflow.res
425
- ; CHECK-NEXT: mov w9, #1 // =0x1
426
- ; CHECK-NEXT: bic w2, w9, w8
416
+ ; CHECK-NEXT: eor w2, w8, #0x1
417
+ ; CHECK-NEXT: ret
418
+ ; CHECK-NEXT: .LBB21_2: // %overflow.no
419
+ ; CHECK-NEXT: smulh x1, x0, x2
420
+ ; CHECK-NEXT: mul x0, x0, x2
421
+ ; CHECK-NEXT: eor w2, wzr, #0x1
427
422
; CHECK-NEXT: ret
428
423
%1 = tail call { i128 , i1 } @llvm.smul.with.overflow.i128 (i128 %x , i128 %y )
429
424
%2 = extractvalue { i128 , i1 } %1 , 0
@@ -438,18 +433,12 @@ define { i128, i8 } @i128_checked_mul(i128 %x, i128 %y) {
438
433
define { i128 , i8 } @i128_overflowing_mul (i128 %x , i128 %y ) {
439
434
; CHECK-LABEL: i128_overflowing_mul:
440
435
; CHECK: // %bb.0: // %overflow.entry
441
- ; CHECK-NEXT: cmp x1, x0, asr #63
442
- ; CHECK-NEXT: b.ne .LBB22_3
443
- ; CHECK-NEXT: // %bb.1: // %overflow.entry
444
- ; CHECK-NEXT: asr x8, x2, #63
445
- ; CHECK-NEXT: cmp x3, x8
446
- ; CHECK-NEXT: b.ne .LBB22_3
447
- ; CHECK-NEXT: // %bb.2: // %overflow.no
448
- ; CHECK-NEXT: smulh x1, x0, x2
449
- ; CHECK-NEXT: mul x0, x0, x2
450
- ; CHECK-NEXT: and w2, wzr, #0x1
451
- ; CHECK-NEXT: ret
452
- ; CHECK-NEXT: .LBB22_3: // %overflow
436
+ ; CHECK-NEXT: eor x8, x3, x2, asr #63
437
+ ; CHECK-NEXT: eor x9, x1, x0, asr #63
438
+ ; CHECK-NEXT: orr x8, x9, x8
439
+ ; CHECK-NEXT: cmp x8, #1
440
+ ; CHECK-NEXT: b.ne .LBB22_2
441
+ ; CHECK-NEXT: // %bb.1: // %overflow
453
442
; CHECK-NEXT: asr x9, x1, #63
454
443
; CHECK-NEXT: umulh x10, x0, x2
455
444
; CHECK-NEXT: asr x13, x3, #63
@@ -476,8 +465,12 @@ define { i128, i8 } @i128_overflowing_mul(i128 %x, i128 %y) {
476
465
; CHECK-NEXT: adc x9, x9, x11
477
466
; CHECK-NEXT: cmp x8, x10
478
467
; CHECK-NEXT: ccmp x9, x10, #0, eq
479
- ; CHECK-NEXT: cset w8, ne
480
- ; CHECK-NEXT: and w2, w8, #0x1
468
+ ; CHECK-NEXT: cset w2, ne
469
+ ; CHECK-NEXT: ret
470
+ ; CHECK-NEXT: .LBB22_2: // %overflow.no
471
+ ; CHECK-NEXT: smulh x1, x0, x2
472
+ ; CHECK-NEXT: mul x0, x0, x2
473
+ ; CHECK-NEXT: mov w2, wzr
481
474
; CHECK-NEXT: ret
482
475
%1 = tail call { i128 , i1 } @llvm.smul.with.overflow.i128 (i128 %x , i128 %y )
483
476
%2 = extractvalue { i128 , i1 } %1 , 0
@@ -491,18 +484,12 @@ define { i128, i8 } @i128_overflowing_mul(i128 %x, i128 %y) {
491
484
define i128 @i128_saturating_mul (i128 %x , i128 %y ) {
492
485
; CHECK-LABEL: i128_saturating_mul:
493
486
; CHECK: // %bb.0: // %overflow.entry
494
- ; CHECK-NEXT: cmp x1, x0, asr #63
495
- ; CHECK-NEXT: b.ne .LBB23_3
496
- ; CHECK-NEXT: // %bb.1: // %overflow.entry
497
- ; CHECK-NEXT: asr x8, x2, #63
498
- ; CHECK-NEXT: cmp x3, x8
499
- ; CHECK-NEXT: b.ne .LBB23_3
500
- ; CHECK-NEXT: // %bb.2: // %overflow.no
501
- ; CHECK-NEXT: smulh x8, x0, x2
502
- ; CHECK-NEXT: mov w10, wzr
503
- ; CHECK-NEXT: mul x9, x0, x2
504
- ; CHECK-NEXT: b .LBB23_4
505
- ; CHECK-NEXT: .LBB23_3: // %overflow
487
+ ; CHECK-NEXT: eor x8, x3, x2, asr #63
488
+ ; CHECK-NEXT: eor x9, x1, x0, asr #63
489
+ ; CHECK-NEXT: orr x8, x9, x8
490
+ ; CHECK-NEXT: cmp x8, #1
491
+ ; CHECK-NEXT: b.ne .LBB23_2
492
+ ; CHECK-NEXT: // %bb.1: // %overflow
506
493
; CHECK-NEXT: asr x9, x1, #63
507
494
; CHECK-NEXT: umulh x10, x0, x2
508
495
; CHECK-NEXT: asr x13, x3, #63
@@ -529,9 +516,14 @@ define i128 @i128_saturating_mul(i128 %x, i128 %y) {
529
516
; CHECK-NEXT: cmp x11, x14
530
517
; CHECK-NEXT: ccmp x10, x14, #0, eq
531
518
; CHECK-NEXT: cset w10, ne
532
- ; CHECK-NEXT: .LBB23_4: // %overflow.res
519
+ ; CHECK-NEXT: b .LBB23_3
520
+ ; CHECK-NEXT: .LBB23_2: // %overflow.no
521
+ ; CHECK-NEXT: smulh x8, x0, x2
522
+ ; CHECK-NEXT: mov w10, wzr
523
+ ; CHECK-NEXT: mul x9, x0, x2
524
+ ; CHECK-NEXT: .LBB23_3: // %overflow.res
533
525
; CHECK-NEXT: eor x11, x3, x1
534
- ; CHECK-NEXT: tst w10, #0x1
526
+ ; CHECK-NEXT: cmp w10, #0
535
527
; CHECK-NEXT: asr x11, x11, #63
536
528
; CHECK-NEXT: eor x12, x11, #0x7fffffffffffffff
537
529
; CHECK-NEXT: csinv x0, x9, x11, eq
0 commit comments