@@ -346,3 +346,349 @@ define i1 @cmpxchg_i64_acquire_acquire_reti1(ptr %ptr, i64 %cmp, i64 %val) nounw
346
346
%res = extractvalue { i64 , i1 } %tmp , 1
347
347
ret i1 %res
348
348
}
349
+
350
+ define void @cmpxchg_i8_monotonic_monotonic (ptr %ptr , i8 %cmp , i8 %val ) nounwind {
351
+ ; LA64-LABEL: cmpxchg_i8_monotonic_monotonic:
352
+ ; LA64: # %bb.0:
353
+ ; LA64-NEXT: andi $a1, $a1, 255
354
+ ; LA64-NEXT: slli.d $a3, $a0, 3
355
+ ; LA64-NEXT: sll.w $a1, $a1, $a3
356
+ ; LA64-NEXT: andi $a2, $a2, 255
357
+ ; LA64-NEXT: sll.w $a2, $a2, $a3
358
+ ; LA64-NEXT: ori $a4, $zero, 255
359
+ ; LA64-NEXT: sll.w $a3, $a4, $a3
360
+ ; LA64-NEXT: addi.w $a3, $a3, 0
361
+ ; LA64-NEXT: addi.w $a2, $a2, 0
362
+ ; LA64-NEXT: addi.w $a1, $a1, 0
363
+ ; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
364
+ ; LA64-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1
365
+ ; LA64-NEXT: ll.w $a4, $a0, 0
366
+ ; LA64-NEXT: and $a5, $a4, $a3
367
+ ; LA64-NEXT: bne $a5, $a1, .LBB12_3
368
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1
369
+ ; LA64-NEXT: dbar 0
370
+ ; LA64-NEXT: andn $a5, $a4, $a3
371
+ ; LA64-NEXT: or $a5, $a5, $a2
372
+ ; LA64-NEXT: sc.w $a5, $a0, 0
373
+ ; LA64-NEXT: beqz $a5, .LBB12_1
374
+ ; LA64-NEXT: b .LBB12_4
375
+ ; LA64-NEXT: .LBB12_3:
376
+ ; LA64-NEXT: dbar 1792
377
+ ; LA64-NEXT: .LBB12_4:
378
+ ; LA64-NEXT: ret
379
+ %res = cmpxchg ptr %ptr , i8 %cmp , i8 %val monotonic monotonic
380
+ ret void
381
+ }
382
+
383
+ define void @cmpxchg_i16_monotonic_monotonic (ptr %ptr , i16 %cmp , i16 %val ) nounwind {
384
+ ; LA64-LABEL: cmpxchg_i16_monotonic_monotonic:
385
+ ; LA64: # %bb.0:
386
+ ; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0
387
+ ; LA64-NEXT: slli.d $a3, $a0, 3
388
+ ; LA64-NEXT: sll.w $a1, $a1, $a3
389
+ ; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0
390
+ ; LA64-NEXT: sll.w $a2, $a2, $a3
391
+ ; LA64-NEXT: lu12i.w $a4, 15
392
+ ; LA64-NEXT: ori $a4, $a4, 4095
393
+ ; LA64-NEXT: sll.w $a3, $a4, $a3
394
+ ; LA64-NEXT: addi.w $a3, $a3, 0
395
+ ; LA64-NEXT: addi.w $a2, $a2, 0
396
+ ; LA64-NEXT: addi.w $a1, $a1, 0
397
+ ; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
398
+ ; LA64-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1
399
+ ; LA64-NEXT: ll.w $a4, $a0, 0
400
+ ; LA64-NEXT: and $a5, $a4, $a3
401
+ ; LA64-NEXT: bne $a5, $a1, .LBB13_3
402
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1
403
+ ; LA64-NEXT: dbar 0
404
+ ; LA64-NEXT: andn $a5, $a4, $a3
405
+ ; LA64-NEXT: or $a5, $a5, $a2
406
+ ; LA64-NEXT: sc.w $a5, $a0, 0
407
+ ; LA64-NEXT: beqz $a5, .LBB13_1
408
+ ; LA64-NEXT: b .LBB13_4
409
+ ; LA64-NEXT: .LBB13_3:
410
+ ; LA64-NEXT: dbar 1792
411
+ ; LA64-NEXT: .LBB13_4:
412
+ ; LA64-NEXT: ret
413
+ %res = cmpxchg ptr %ptr , i16 %cmp , i16 %val monotonic monotonic
414
+ ret void
415
+ }
416
+
417
+ define void @cmpxchg_i32_monotonic_monotonic (ptr %ptr , i32 %cmp , i32 %val ) nounwind {
418
+ ; LA64-LABEL: cmpxchg_i32_monotonic_monotonic:
419
+ ; LA64: # %bb.0:
420
+ ; LA64-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1
421
+ ; LA64-NEXT: ll.w $a3, $a0, 0
422
+ ; LA64-NEXT: bne $a3, $a1, .LBB14_3
423
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB14_1 Depth=1
424
+ ; LA64-NEXT: dbar 0
425
+ ; LA64-NEXT: move $a4, $a2
426
+ ; LA64-NEXT: sc.w $a4, $a0, 0
427
+ ; LA64-NEXT: beqz $a4, .LBB14_1
428
+ ; LA64-NEXT: b .LBB14_4
429
+ ; LA64-NEXT: .LBB14_3:
430
+ ; LA64-NEXT: dbar 1792
431
+ ; LA64-NEXT: .LBB14_4:
432
+ ; LA64-NEXT: ret
433
+ %res = cmpxchg ptr %ptr , i32 %cmp , i32 %val monotonic monotonic
434
+ ret void
435
+ }
436
+
437
+ define void @cmpxchg_i64_monotonic_monotonic (ptr %ptr , i64 %cmp , i64 %val ) nounwind {
438
+ ; LA64-LABEL: cmpxchg_i64_monotonic_monotonic:
439
+ ; LA64: # %bb.0:
440
+ ; LA64-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1
441
+ ; LA64-NEXT: ll.d $a3, $a0, 0
442
+ ; LA64-NEXT: bne $a3, $a1, .LBB15_3
443
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1
444
+ ; LA64-NEXT: dbar 0
445
+ ; LA64-NEXT: move $a4, $a2
446
+ ; LA64-NEXT: sc.d $a4, $a0, 0
447
+ ; LA64-NEXT: beqz $a4, .LBB15_1
448
+ ; LA64-NEXT: b .LBB15_4
449
+ ; LA64-NEXT: .LBB15_3:
450
+ ; LA64-NEXT: dbar 1792
451
+ ; LA64-NEXT: .LBB15_4:
452
+ ; LA64-NEXT: ret
453
+ %res = cmpxchg ptr %ptr , i64 %cmp , i64 %val monotonic monotonic
454
+ ret void
455
+ }
456
+
457
+ define i8 @cmpxchg_i8_monotonic_monotonic_reti8 (ptr %ptr , i8 %cmp , i8 %val ) nounwind {
458
+ ; LA64-LABEL: cmpxchg_i8_monotonic_monotonic_reti8:
459
+ ; LA64: # %bb.0:
460
+ ; LA64-NEXT: slli.d $a3, $a0, 3
461
+ ; LA64-NEXT: ori $a4, $zero, 255
462
+ ; LA64-NEXT: sll.w $a4, $a4, $a3
463
+ ; LA64-NEXT: andi $a2, $a2, 255
464
+ ; LA64-NEXT: addi.w $a4, $a4, 0
465
+ ; LA64-NEXT: sll.w $a2, $a2, $a3
466
+ ; LA64-NEXT: addi.w $a2, $a2, 0
467
+ ; LA64-NEXT: andi $a1, $a1, 255
468
+ ; LA64-NEXT: sll.w $a1, $a1, $a3
469
+ ; LA64-NEXT: addi.w $a1, $a1, 0
470
+ ; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
471
+ ; LA64-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
472
+ ; LA64-NEXT: ll.w $a5, $a0, 0
473
+ ; LA64-NEXT: and $a6, $a5, $a4
474
+ ; LA64-NEXT: bne $a6, $a1, .LBB16_3
475
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB16_1 Depth=1
476
+ ; LA64-NEXT: dbar 0
477
+ ; LA64-NEXT: andn $a6, $a5, $a4
478
+ ; LA64-NEXT: or $a6, $a6, $a2
479
+ ; LA64-NEXT: sc.w $a6, $a0, 0
480
+ ; LA64-NEXT: beqz $a6, .LBB16_1
481
+ ; LA64-NEXT: b .LBB16_4
482
+ ; LA64-NEXT: .LBB16_3:
483
+ ; LA64-NEXT: dbar 1792
484
+ ; LA64-NEXT: .LBB16_4:
485
+ ; LA64-NEXT: srl.w $a0, $a5, $a3
486
+ ; LA64-NEXT: ret
487
+ %tmp = cmpxchg ptr %ptr , i8 %cmp , i8 %val monotonic monotonic
488
+ %res = extractvalue { i8 , i1 } %tmp , 0
489
+ ret i8 %res
490
+ }
491
+
492
+ define i16 @cmpxchg_i16_monotonic_monotonic_reti16 (ptr %ptr , i16 %cmp , i16 %val ) nounwind {
493
+ ; LA64-LABEL: cmpxchg_i16_monotonic_monotonic_reti16:
494
+ ; LA64: # %bb.0:
495
+ ; LA64-NEXT: lu12i.w $a3, 15
496
+ ; LA64-NEXT: ori $a3, $a3, 4095
497
+ ; LA64-NEXT: slli.d $a4, $a0, 3
498
+ ; LA64-NEXT: sll.w $a3, $a3, $a4
499
+ ; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0
500
+ ; LA64-NEXT: addi.w $a3, $a3, 0
501
+ ; LA64-NEXT: sll.w $a2, $a2, $a4
502
+ ; LA64-NEXT: addi.w $a2, $a2, 0
503
+ ; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0
504
+ ; LA64-NEXT: sll.w $a1, $a1, $a4
505
+ ; LA64-NEXT: addi.w $a1, $a1, 0
506
+ ; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
507
+ ; LA64-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
508
+ ; LA64-NEXT: ll.w $a5, $a0, 0
509
+ ; LA64-NEXT: and $a6, $a5, $a3
510
+ ; LA64-NEXT: bne $a6, $a1, .LBB17_3
511
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB17_1 Depth=1
512
+ ; LA64-NEXT: dbar 0
513
+ ; LA64-NEXT: andn $a6, $a5, $a3
514
+ ; LA64-NEXT: or $a6, $a6, $a2
515
+ ; LA64-NEXT: sc.w $a6, $a0, 0
516
+ ; LA64-NEXT: beqz $a6, .LBB17_1
517
+ ; LA64-NEXT: b .LBB17_4
518
+ ; LA64-NEXT: .LBB17_3:
519
+ ; LA64-NEXT: dbar 1792
520
+ ; LA64-NEXT: .LBB17_4:
521
+ ; LA64-NEXT: srl.w $a0, $a5, $a4
522
+ ; LA64-NEXT: ret
523
+ %tmp = cmpxchg ptr %ptr , i16 %cmp , i16 %val monotonic monotonic
524
+ %res = extractvalue { i16 , i1 } %tmp , 0
525
+ ret i16 %res
526
+ }
527
+
528
+ define i32 @cmpxchg_i32_monotonic_monotonic_reti32 (ptr %ptr , i32 %cmp , i32 %val ) nounwind {
529
+ ; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
530
+ ; LA64: # %bb.0:
531
+ ; LA64-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
532
+ ; LA64-NEXT: ll.w $a3, $a0, 0
533
+ ; LA64-NEXT: bne $a3, $a1, .LBB18_3
534
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB18_1 Depth=1
535
+ ; LA64-NEXT: dbar 0
536
+ ; LA64-NEXT: move $a4, $a2
537
+ ; LA64-NEXT: sc.w $a4, $a0, 0
538
+ ; LA64-NEXT: beqz $a4, .LBB18_1
539
+ ; LA64-NEXT: b .LBB18_4
540
+ ; LA64-NEXT: .LBB18_3:
541
+ ; LA64-NEXT: dbar 1792
542
+ ; LA64-NEXT: .LBB18_4:
543
+ ; LA64-NEXT: move $a0, $a3
544
+ ; LA64-NEXT: ret
545
+ %tmp = cmpxchg ptr %ptr , i32 %cmp , i32 %val monotonic monotonic
546
+ %res = extractvalue { i32 , i1 } %tmp , 0
547
+ ret i32 %res
548
+ }
549
+
550
+ define i64 @cmpxchg_i64_monotonic_monotonic_reti64 (ptr %ptr , i64 %cmp , i64 %val ) nounwind {
551
+ ; LA64-LABEL: cmpxchg_i64_monotonic_monotonic_reti64:
552
+ ; LA64: # %bb.0:
553
+ ; LA64-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1
554
+ ; LA64-NEXT: ll.d $a3, $a0, 0
555
+ ; LA64-NEXT: bne $a3, $a1, .LBB19_3
556
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB19_1 Depth=1
557
+ ; LA64-NEXT: dbar 0
558
+ ; LA64-NEXT: move $a4, $a2
559
+ ; LA64-NEXT: sc.d $a4, $a0, 0
560
+ ; LA64-NEXT: beqz $a4, .LBB19_1
561
+ ; LA64-NEXT: b .LBB19_4
562
+ ; LA64-NEXT: .LBB19_3:
563
+ ; LA64-NEXT: dbar 1792
564
+ ; LA64-NEXT: .LBB19_4:
565
+ ; LA64-NEXT: move $a0, $a3
566
+ ; LA64-NEXT: ret
567
+ %tmp = cmpxchg ptr %ptr , i64 %cmp , i64 %val monotonic monotonic
568
+ %res = extractvalue { i64 , i1 } %tmp , 0
569
+ ret i64 %res
570
+ }
571
+
572
+ define i1 @cmpxchg_i8_monotonic_monotonic_reti1 (ptr %ptr , i8 %cmp , i8 %val ) nounwind {
573
+ ; LA64-LABEL: cmpxchg_i8_monotonic_monotonic_reti1:
574
+ ; LA64: # %bb.0:
575
+ ; LA64-NEXT: andi $a1, $a1, 255
576
+ ; LA64-NEXT: slli.d $a3, $a0, 3
577
+ ; LA64-NEXT: ori $a4, $zero, 255
578
+ ; LA64-NEXT: sll.w $a4, $a4, $a3
579
+ ; LA64-NEXT: sll.w $a1, $a1, $a3
580
+ ; LA64-NEXT: andi $a2, $a2, 255
581
+ ; LA64-NEXT: sll.w $a2, $a2, $a3
582
+ ; LA64-NEXT: addi.w $a2, $a2, 0
583
+ ; LA64-NEXT: addi.w $a1, $a1, 0
584
+ ; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
585
+ ; LA64-NEXT: addi.w $a3, $a4, 0
586
+ ; LA64-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1
587
+ ; LA64-NEXT: ll.w $a5, $a0, 0
588
+ ; LA64-NEXT: and $a6, $a5, $a3
589
+ ; LA64-NEXT: bne $a6, $a1, .LBB20_3
590
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB20_1 Depth=1
591
+ ; LA64-NEXT: dbar 0
592
+ ; LA64-NEXT: andn $a6, $a5, $a3
593
+ ; LA64-NEXT: or $a6, $a6, $a2
594
+ ; LA64-NEXT: sc.w $a6, $a0, 0
595
+ ; LA64-NEXT: beqz $a6, .LBB20_1
596
+ ; LA64-NEXT: b .LBB20_4
597
+ ; LA64-NEXT: .LBB20_3:
598
+ ; LA64-NEXT: dbar 1792
599
+ ; LA64-NEXT: .LBB20_4:
600
+ ; LA64-NEXT: and $a0, $a5, $a4
601
+ ; LA64-NEXT: addi.w $a0, $a0, 0
602
+ ; LA64-NEXT: xor $a0, $a1, $a0
603
+ ; LA64-NEXT: sltui $a0, $a0, 1
604
+ ; LA64-NEXT: ret
605
+ %tmp = cmpxchg ptr %ptr , i8 %cmp , i8 %val monotonic monotonic
606
+ %res = extractvalue { i8 , i1 } %tmp , 1
607
+ ret i1 %res
608
+ }
609
+
610
+ define i1 @cmpxchg_i16_monotonic_monotonic_reti1 (ptr %ptr , i16 %cmp , i16 %val ) nounwind {
611
+ ; LA64-LABEL: cmpxchg_i16_monotonic_monotonic_reti1:
612
+ ; LA64: # %bb.0:
613
+ ; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0
614
+ ; LA64-NEXT: lu12i.w $a3, 15
615
+ ; LA64-NEXT: ori $a3, $a3, 4095
616
+ ; LA64-NEXT: slli.d $a4, $a0, 3
617
+ ; LA64-NEXT: sll.w $a3, $a3, $a4
618
+ ; LA64-NEXT: sll.w $a1, $a1, $a4
619
+ ; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0
620
+ ; LA64-NEXT: sll.w $a2, $a2, $a4
621
+ ; LA64-NEXT: addi.w $a2, $a2, 0
622
+ ; LA64-NEXT: addi.w $a1, $a1, 0
623
+ ; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
624
+ ; LA64-NEXT: addi.w $a4, $a3, 0
625
+ ; LA64-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
626
+ ; LA64-NEXT: ll.w $a5, $a0, 0
627
+ ; LA64-NEXT: and $a6, $a5, $a4
628
+ ; LA64-NEXT: bne $a6, $a1, .LBB21_3
629
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1
630
+ ; LA64-NEXT: dbar 0
631
+ ; LA64-NEXT: andn $a6, $a5, $a4
632
+ ; LA64-NEXT: or $a6, $a6, $a2
633
+ ; LA64-NEXT: sc.w $a6, $a0, 0
634
+ ; LA64-NEXT: beqz $a6, .LBB21_1
635
+ ; LA64-NEXT: b .LBB21_4
636
+ ; LA64-NEXT: .LBB21_3:
637
+ ; LA64-NEXT: dbar 1792
638
+ ; LA64-NEXT: .LBB21_4:
639
+ ; LA64-NEXT: and $a0, $a5, $a3
640
+ ; LA64-NEXT: addi.w $a0, $a0, 0
641
+ ; LA64-NEXT: xor $a0, $a1, $a0
642
+ ; LA64-NEXT: sltui $a0, $a0, 1
643
+ ; LA64-NEXT: ret
644
+ %tmp = cmpxchg ptr %ptr , i16 %cmp , i16 %val monotonic monotonic
645
+ %res = extractvalue { i16 , i1 } %tmp , 1
646
+ ret i1 %res
647
+ }
648
+
649
+ define i1 @cmpxchg_i32_monotonic_monotonic_reti1 (ptr %ptr , i32 %cmp , i32 %val ) nounwind {
650
+ ; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
651
+ ; LA64: # %bb.0:
652
+ ; LA64-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
653
+ ; LA64-NEXT: ll.w $a3, $a0, 0
654
+ ; LA64-NEXT: bne $a3, $a1, .LBB22_3
655
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1
656
+ ; LA64-NEXT: dbar 0
657
+ ; LA64-NEXT: move $a4, $a2
658
+ ; LA64-NEXT: sc.w $a4, $a0, 0
659
+ ; LA64-NEXT: beqz $a4, .LBB22_1
660
+ ; LA64-NEXT: b .LBB22_4
661
+ ; LA64-NEXT: .LBB22_3:
662
+ ; LA64-NEXT: dbar 1792
663
+ ; LA64-NEXT: .LBB22_4:
664
+ ; LA64-NEXT: addi.w $a0, $a1, 0
665
+ ; LA64-NEXT: xor $a0, $a3, $a0
666
+ ; LA64-NEXT: sltui $a0, $a0, 1
667
+ ; LA64-NEXT: ret
668
+ %tmp = cmpxchg ptr %ptr , i32 %cmp , i32 %val monotonic monotonic
669
+ %res = extractvalue { i32 , i1 } %tmp , 1
670
+ ret i1 %res
671
+ }
672
+
673
+ define i1 @cmpxchg_i64_monotonic_monotonic_reti1 (ptr %ptr , i64 %cmp , i64 %val ) nounwind {
674
+ ; LA64-LABEL: cmpxchg_i64_monotonic_monotonic_reti1:
675
+ ; LA64: # %bb.0:
676
+ ; LA64-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
677
+ ; LA64-NEXT: ll.d $a3, $a0, 0
678
+ ; LA64-NEXT: bne $a3, $a1, .LBB23_3
679
+ ; LA64-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1
680
+ ; LA64-NEXT: dbar 0
681
+ ; LA64-NEXT: move $a4, $a2
682
+ ; LA64-NEXT: sc.d $a4, $a0, 0
683
+ ; LA64-NEXT: beqz $a4, .LBB23_1
684
+ ; LA64-NEXT: b .LBB23_4
685
+ ; LA64-NEXT: .LBB23_3:
686
+ ; LA64-NEXT: dbar 1792
687
+ ; LA64-NEXT: .LBB23_4:
688
+ ; LA64-NEXT: xor $a0, $a3, $a1
689
+ ; LA64-NEXT: sltui $a0, $a0, 1
690
+ ; LA64-NEXT: ret
691
+ %tmp = cmpxchg ptr %ptr , i64 %cmp , i64 %val monotonic monotonic
692
+ %res = extractvalue { i64 , i1 } %tmp , 1
693
+ ret i1 %res
694
+ }
0 commit comments