@@ -986,10 +986,7 @@ define i128 @cas_weak_acquire_acquire(ptr %a, i128 %cmp, i128 %new) {
986
986
; CHECK-NEXT: mr r10, r6
987
987
; CHECK-NEXT: stqcx. r10, 0, r3
988
988
; CHECK-NEXT: bne cr0, .LBB7_1
989
- ; CHECK-NEXT: b .LBB7_4
990
989
; CHECK-NEXT: .LBB7_3: # %entry
991
- ; CHECK-NEXT: stqcx. r8, 0, r3
992
- ; CHECK-NEXT: .LBB7_4: # %entry
993
990
; CHECK-NEXT: lwsync
994
991
; CHECK-NEXT: mr r3, r8
995
992
; CHECK-NEXT: mr r4, r9
@@ -1033,10 +1030,7 @@ define i128 @cas_weak_acquire_acquire(ptr %a, i128 %cmp, i128 %new) {
1033
1030
; LE-PWR8-NEXT: mr r10, r7
1034
1031
; LE-PWR8-NEXT: stqcx. r10, 0, r3
1035
1032
; LE-PWR8-NEXT: bne cr0, .LBB7_1
1036
- ; LE-PWR8-NEXT: b .LBB7_4
1037
1033
; LE-PWR8-NEXT: .LBB7_3: # %entry
1038
- ; LE-PWR8-NEXT: stqcx. r8, 0, r3
1039
- ; LE-PWR8-NEXT: .LBB7_4: # %entry
1040
1034
; LE-PWR8-NEXT: lwsync
1041
1035
; LE-PWR8-NEXT: mr r3, r9
1042
1036
; LE-PWR8-NEXT: mr r4, r8
@@ -1057,10 +1051,7 @@ define i128 @cas_weak_acquire_acquire(ptr %a, i128 %cmp, i128 %new) {
1057
1051
; AIX64-PWR8-NEXT: mr r10, r6
1058
1052
; AIX64-PWR8-NEXT: stqcx. r10, 0, r3
1059
1053
; AIX64-PWR8-NEXT: bne cr0, L..BB7_1
1060
- ; AIX64-PWR8-NEXT: b L..BB7_4
1061
1054
; AIX64-PWR8-NEXT: L..BB7_3: # %entry
1062
- ; AIX64-PWR8-NEXT: stqcx. r8, 0, r3
1063
- ; AIX64-PWR8-NEXT: L..BB7_4: # %entry
1064
1055
; AIX64-PWR8-NEXT: lwsync
1065
1056
; AIX64-PWR8-NEXT: mr r3, r8
1066
1057
; AIX64-PWR8-NEXT: mr r4, r9
@@ -1121,10 +1112,7 @@ define i128 @cas_weak_release_monotonic(ptr %a, i128 %cmp, i128 %new) {
1121
1112
; CHECK-NEXT: mr r10, r6
1122
1113
; CHECK-NEXT: stqcx. r10, 0, r3
1123
1114
; CHECK-NEXT: bne cr0, .LBB8_1
1124
- ; CHECK-NEXT: b .LBB8_4
1125
1115
; CHECK-NEXT: .LBB8_3: # %entry
1126
- ; CHECK-NEXT: stqcx. r8, 0, r3
1127
- ; CHECK-NEXT: .LBB8_4: # %entry
1128
1116
; CHECK-NEXT: mr r3, r8
1129
1117
; CHECK-NEXT: mr r4, r9
1130
1118
; CHECK-NEXT: blr
@@ -1168,10 +1156,7 @@ define i128 @cas_weak_release_monotonic(ptr %a, i128 %cmp, i128 %new) {
1168
1156
; LE-PWR8-NEXT: mr r10, r7
1169
1157
; LE-PWR8-NEXT: stqcx. r10, 0, r3
1170
1158
; LE-PWR8-NEXT: bne cr0, .LBB8_1
1171
- ; LE-PWR8-NEXT: b .LBB8_4
1172
1159
; LE-PWR8-NEXT: .LBB8_3: # %entry
1173
- ; LE-PWR8-NEXT: stqcx. r8, 0, r3
1174
- ; LE-PWR8-NEXT: .LBB8_4: # %entry
1175
1160
; LE-PWR8-NEXT: mr r3, r9
1176
1161
; LE-PWR8-NEXT: mr r4, r8
1177
1162
; LE-PWR8-NEXT: blr
@@ -1192,10 +1177,7 @@ define i128 @cas_weak_release_monotonic(ptr %a, i128 %cmp, i128 %new) {
1192
1177
; AIX64-PWR8-NEXT: mr r10, r6
1193
1178
; AIX64-PWR8-NEXT: stqcx. r10, 0, r3
1194
1179
; AIX64-PWR8-NEXT: bne cr0, L..BB8_1
1195
- ; AIX64-PWR8-NEXT: b L..BB8_4
1196
1180
; AIX64-PWR8-NEXT: L..BB8_3: # %entry
1197
- ; AIX64-PWR8-NEXT: stqcx. r8, 0, r3
1198
- ; AIX64-PWR8-NEXT: L..BB8_4: # %entry
1199
1181
; AIX64-PWR8-NEXT: mr r3, r8
1200
1182
; AIX64-PWR8-NEXT: mr r4, r9
1201
1183
; AIX64-PWR8-NEXT: blr
@@ -1255,10 +1237,7 @@ define i128 @cas_sc_sc(ptr %a, i128 %cmp, i128 %new) {
1255
1237
; CHECK-NEXT: mr r10, r6
1256
1238
; CHECK-NEXT: stqcx. r10, 0, r3
1257
1239
; CHECK-NEXT: bne cr0, .LBB9_1
1258
- ; CHECK-NEXT: b .LBB9_4
1259
1240
; CHECK-NEXT: .LBB9_3: # %entry
1260
- ; CHECK-NEXT: stqcx. r8, 0, r3
1261
- ; CHECK-NEXT: .LBB9_4: # %entry
1262
1241
; CHECK-NEXT: lwsync
1263
1242
; CHECK-NEXT: mr r3, r8
1264
1243
; CHECK-NEXT: mr r4, r9
@@ -1303,10 +1282,7 @@ define i128 @cas_sc_sc(ptr %a, i128 %cmp, i128 %new) {
1303
1282
; LE-PWR8-NEXT: mr r10, r7
1304
1283
; LE-PWR8-NEXT: stqcx. r10, 0, r3
1305
1284
; LE-PWR8-NEXT: bne cr0, .LBB9_1
1306
- ; LE-PWR8-NEXT: b .LBB9_4
1307
1285
; LE-PWR8-NEXT: .LBB9_3: # %entry
1308
- ; LE-PWR8-NEXT: stqcx. r8, 0, r3
1309
- ; LE-PWR8-NEXT: .LBB9_4: # %entry
1310
1286
; LE-PWR8-NEXT: lwsync
1311
1287
; LE-PWR8-NEXT: mr r3, r9
1312
1288
; LE-PWR8-NEXT: mr r4, r8
@@ -1328,10 +1304,7 @@ define i128 @cas_sc_sc(ptr %a, i128 %cmp, i128 %new) {
1328
1304
; AIX64-PWR8-NEXT: mr r10, r6
1329
1305
; AIX64-PWR8-NEXT: stqcx. r10, 0, r3
1330
1306
; AIX64-PWR8-NEXT: bne cr0, L..BB9_1
1331
- ; AIX64-PWR8-NEXT: b L..BB9_4
1332
1307
; AIX64-PWR8-NEXT: L..BB9_3: # %entry
1333
- ; AIX64-PWR8-NEXT: stqcx. r8, 0, r3
1334
- ; AIX64-PWR8-NEXT: L..BB9_4: # %entry
1335
1308
; AIX64-PWR8-NEXT: lwsync
1336
1309
; AIX64-PWR8-NEXT: mr r3, r8
1337
1310
; AIX64-PWR8-NEXT: mr r4, r9
@@ -1392,10 +1365,7 @@ define i128 @cas_acqrel_acquire(ptr %a, i128 %cmp, i128 %new) {
1392
1365
; CHECK-NEXT: mr r10, r6
1393
1366
; CHECK-NEXT: stqcx. r10, 0, r3
1394
1367
; CHECK-NEXT: bne cr0, .LBB10_1
1395
- ; CHECK-NEXT: b .LBB10_4
1396
1368
; CHECK-NEXT: .LBB10_3: # %entry
1397
- ; CHECK-NEXT: stqcx. r8, 0, r3
1398
- ; CHECK-NEXT: .LBB10_4: # %entry
1399
1369
; CHECK-NEXT: lwsync
1400
1370
; CHECK-NEXT: mr r3, r8
1401
1371
; CHECK-NEXT: mr r4, r9
@@ -1440,10 +1410,7 @@ define i128 @cas_acqrel_acquire(ptr %a, i128 %cmp, i128 %new) {
1440
1410
; LE-PWR8-NEXT: mr r10, r7
1441
1411
; LE-PWR8-NEXT: stqcx. r10, 0, r3
1442
1412
; LE-PWR8-NEXT: bne cr0, .LBB10_1
1443
- ; LE-PWR8-NEXT: b .LBB10_4
1444
1413
; LE-PWR8-NEXT: .LBB10_3: # %entry
1445
- ; LE-PWR8-NEXT: stqcx. r8, 0, r3
1446
- ; LE-PWR8-NEXT: .LBB10_4: # %entry
1447
1414
; LE-PWR8-NEXT: lwsync
1448
1415
; LE-PWR8-NEXT: mr r3, r9
1449
1416
; LE-PWR8-NEXT: mr r4, r8
@@ -1465,10 +1432,7 @@ define i128 @cas_acqrel_acquire(ptr %a, i128 %cmp, i128 %new) {
1465
1432
; AIX64-PWR8-NEXT: mr r10, r6
1466
1433
; AIX64-PWR8-NEXT: stqcx. r10, 0, r3
1467
1434
; AIX64-PWR8-NEXT: bne cr0, L..BB10_1
1468
- ; AIX64-PWR8-NEXT: b L..BB10_4
1469
1435
; AIX64-PWR8-NEXT: L..BB10_3: # %entry
1470
- ; AIX64-PWR8-NEXT: stqcx. r8, 0, r3
1471
- ; AIX64-PWR8-NEXT: L..BB10_4: # %entry
1472
1436
; AIX64-PWR8-NEXT: lwsync
1473
1437
; AIX64-PWR8-NEXT: mr r3, r8
1474
1438
; AIX64-PWR8-NEXT: mr r4, r9
@@ -1529,10 +1493,7 @@ define i1 @cas_acqrel_acquire_check_succ(ptr %a, i128 %cmp, i128 %new) {
1529
1493
; CHECK-NEXT: mr r10, r6
1530
1494
; CHECK-NEXT: stqcx. r10, 0, r3
1531
1495
; CHECK-NEXT: bne cr0, .LBB11_1
1532
- ; CHECK-NEXT: b .LBB11_4
1533
1496
; CHECK-NEXT: .LBB11_3: # %entry
1534
- ; CHECK-NEXT: stqcx. r8, 0, r3
1535
- ; CHECK-NEXT: .LBB11_4: # %entry
1536
1497
; CHECK-NEXT: lwsync
1537
1498
; CHECK-NEXT: xor r3, r4, r8
1538
1499
; CHECK-NEXT: xor r4, r5, r9
@@ -1578,10 +1539,7 @@ define i1 @cas_acqrel_acquire_check_succ(ptr %a, i128 %cmp, i128 %new) {
1578
1539
; LE-PWR8-NEXT: mr r10, r7
1579
1540
; LE-PWR8-NEXT: stqcx. r10, 0, r3
1580
1541
; LE-PWR8-NEXT: bne cr0, .LBB11_1
1581
- ; LE-PWR8-NEXT: b .LBB11_4
1582
1542
; LE-PWR8-NEXT: .LBB11_3: # %entry
1583
- ; LE-PWR8-NEXT: stqcx. r8, 0, r3
1584
- ; LE-PWR8-NEXT: .LBB11_4: # %entry
1585
1543
; LE-PWR8-NEXT: lwsync
1586
1544
; LE-PWR8-NEXT: xor r3, r5, r8
1587
1545
; LE-PWR8-NEXT: xor r4, r4, r9
@@ -1606,10 +1564,7 @@ define i1 @cas_acqrel_acquire_check_succ(ptr %a, i128 %cmp, i128 %new) {
1606
1564
; AIX64-PWR8-NEXT: mr r10, r6
1607
1565
; AIX64-PWR8-NEXT: stqcx. r10, 0, r3
1608
1566
; AIX64-PWR8-NEXT: bne cr0, L..BB11_1
1609
- ; AIX64-PWR8-NEXT: b L..BB11_4
1610
1567
; AIX64-PWR8-NEXT: L..BB11_3: # %entry
1611
- ; AIX64-PWR8-NEXT: stqcx. r8, 0, r3
1612
- ; AIX64-PWR8-NEXT: L..BB11_4: # %entry
1613
1568
; AIX64-PWR8-NEXT: lwsync
1614
1569
; AIX64-PWR8-NEXT: xor r3, r4, r8
1615
1570
; AIX64-PWR8-NEXT: xor r4, r5, r9
@@ -1651,3 +1606,132 @@ entry:
1651
1606
%1 = extractvalue { i128 , i1 } %0 , 1
1652
1607
ret i1 %1
1653
1608
}
1609
+
1610
+ ;; TODO: Optimize CAS at exit block when bool value is returned.
1611
+ define i1 @bool_cas_weak_acquire_acquire (ptr %a , i128 %cmp , i128 %new ) {
1612
+ ; CHECK-LABEL: bool_cas_weak_acquire_acquire:
1613
+ ; CHECK: # %bb.0: # %entry
1614
+ ; CHECK-NEXT: .LBB12_1: # %entry
1615
+ ; CHECK-NEXT: #
1616
+ ; CHECK-NEXT: lqarx r8, 0, r3
1617
+ ; CHECK-NEXT: xor r11, r9, r5
1618
+ ; CHECK-NEXT: xor r10, r8, r4
1619
+ ; CHECK-NEXT: or. r11, r11, r10
1620
+ ; CHECK-NEXT: bne cr0, .LBB12_3
1621
+ ; CHECK-NEXT: # %bb.2: # %entry
1622
+ ; CHECK-NEXT: #
1623
+ ; CHECK-NEXT: mr r11, r7
1624
+ ; CHECK-NEXT: mr r10, r6
1625
+ ; CHECK-NEXT: stqcx. r10, 0, r3
1626
+ ; CHECK-NEXT: bne cr0, .LBB12_1
1627
+ ; CHECK-NEXT: .LBB12_3: # %entry
1628
+ ; CHECK-NEXT: lwsync
1629
+ ; CHECK-NEXT: xor r3, r4, r8
1630
+ ; CHECK-NEXT: xor r4, r5, r9
1631
+ ; CHECK-NEXT: or r3, r4, r3
1632
+ ; CHECK-NEXT: cntlzd r3, r3
1633
+ ; CHECK-NEXT: rldicl r3, r3, 58, 63
1634
+ ; CHECK-NEXT: blr
1635
+ ;
1636
+ ; PWR7-LABEL: bool_cas_weak_acquire_acquire:
1637
+ ; PWR7: # %bb.0: # %entry
1638
+ ; PWR7-NEXT: mflr r0
1639
+ ; PWR7-NEXT: stdu r1, -128(r1)
1640
+ ; PWR7-NEXT: std r0, 144(r1)
1641
+ ; PWR7-NEXT: .cfi_def_cfa_offset 128
1642
+ ; PWR7-NEXT: .cfi_offset lr, 16
1643
+ ; PWR7-NEXT: std r5, 120(r1)
1644
+ ; PWR7-NEXT: std r4, 112(r1)
1645
+ ; PWR7-NEXT: addi r4, r1, 112
1646
+ ; PWR7-NEXT: mr r5, r6
1647
+ ; PWR7-NEXT: mr r6, r7
1648
+ ; PWR7-NEXT: li r7, 2
1649
+ ; PWR7-NEXT: li r8, 2
1650
+ ; PWR7-NEXT: bl __atomic_compare_exchange_16
1651
+ ; PWR7-NEXT: nop
1652
+ ; PWR7-NEXT: addi r1, r1, 128
1653
+ ; PWR7-NEXT: ld r0, 16(r1)
1654
+ ; PWR7-NEXT: mtlr r0
1655
+ ; PWR7-NEXT: blr
1656
+ ;
1657
+ ; LE-PWR8-LABEL: bool_cas_weak_acquire_acquire:
1658
+ ; LE-PWR8: # %bb.0: # %entry
1659
+ ; LE-PWR8-NEXT: .LBB12_1: # %entry
1660
+ ; LE-PWR8-NEXT: #
1661
+ ; LE-PWR8-NEXT: lqarx r8, 0, r3
1662
+ ; LE-PWR8-NEXT: xor r11, r9, r4
1663
+ ; LE-PWR8-NEXT: xor r10, r8, r5
1664
+ ; LE-PWR8-NEXT: or. r11, r11, r10
1665
+ ; LE-PWR8-NEXT: bne cr0, .LBB12_3
1666
+ ; LE-PWR8-NEXT: # %bb.2: # %entry
1667
+ ; LE-PWR8-NEXT: #
1668
+ ; LE-PWR8-NEXT: mr r11, r6
1669
+ ; LE-PWR8-NEXT: mr r10, r7
1670
+ ; LE-PWR8-NEXT: stqcx. r10, 0, r3
1671
+ ; LE-PWR8-NEXT: bne cr0, .LBB12_1
1672
+ ; LE-PWR8-NEXT: .LBB12_3: # %entry
1673
+ ; LE-PWR8-NEXT: lwsync
1674
+ ; LE-PWR8-NEXT: xor r3, r5, r8
1675
+ ; LE-PWR8-NEXT: xor r4, r4, r9
1676
+ ; LE-PWR8-NEXT: or r3, r4, r3
1677
+ ; LE-PWR8-NEXT: cntlzd r3, r3
1678
+ ; LE-PWR8-NEXT: rldicl r3, r3, 58, 63
1679
+ ; LE-PWR8-NEXT: blr
1680
+ ;
1681
+ ; AIX64-PWR8-LABEL: bool_cas_weak_acquire_acquire:
1682
+ ; AIX64-PWR8: # %bb.0: # %entry
1683
+ ; AIX64-PWR8-NEXT: L..BB12_1: # %entry
1684
+ ; AIX64-PWR8-NEXT: #
1685
+ ; AIX64-PWR8-NEXT: lqarx r8, 0, r3
1686
+ ; AIX64-PWR8-NEXT: xor r11, r9, r5
1687
+ ; AIX64-PWR8-NEXT: xor r10, r8, r4
1688
+ ; AIX64-PWR8-NEXT: or. r11, r11, r10
1689
+ ; AIX64-PWR8-NEXT: bne cr0, L..BB12_3
1690
+ ; AIX64-PWR8-NEXT: # %bb.2: # %entry
1691
+ ; AIX64-PWR8-NEXT: #
1692
+ ; AIX64-PWR8-NEXT: mr r11, r7
1693
+ ; AIX64-PWR8-NEXT: mr r10, r6
1694
+ ; AIX64-PWR8-NEXT: stqcx. r10, 0, r3
1695
+ ; AIX64-PWR8-NEXT: bne cr0, L..BB12_1
1696
+ ; AIX64-PWR8-NEXT: L..BB12_3: # %entry
1697
+ ; AIX64-PWR8-NEXT: lwsync
1698
+ ; AIX64-PWR8-NEXT: xor r3, r4, r8
1699
+ ; AIX64-PWR8-NEXT: xor r4, r5, r9
1700
+ ; AIX64-PWR8-NEXT: or r3, r4, r3
1701
+ ; AIX64-PWR8-NEXT: cntlzd r3, r3
1702
+ ; AIX64-PWR8-NEXT: rldicl r3, r3, 58, 63
1703
+ ; AIX64-PWR8-NEXT: blr
1704
+ ;
1705
+ ; PPC-PWR8-LABEL: bool_cas_weak_acquire_acquire:
1706
+ ; PPC-PWR8: # %bb.0: # %entry
1707
+ ; PPC-PWR8-NEXT: mflr r0
1708
+ ; PPC-PWR8-NEXT: stwu r1, -48(r1)
1709
+ ; PPC-PWR8-NEXT: stw r0, 52(r1)
1710
+ ; PPC-PWR8-NEXT: .cfi_def_cfa_offset 48
1711
+ ; PPC-PWR8-NEXT: .cfi_offset lr, 4
1712
+ ; PPC-PWR8-NEXT: mr r4, r3
1713
+ ; PPC-PWR8-NEXT: lwz r3, 60(r1)
1714
+ ; PPC-PWR8-NEXT: stw r8, 44(r1)
1715
+ ; PPC-PWR8-NEXT: stw r7, 40(r1)
1716
+ ; PPC-PWR8-NEXT: stw r6, 36(r1)
1717
+ ; PPC-PWR8-NEXT: stw r5, 32(r1)
1718
+ ; PPC-PWR8-NEXT: addi r5, r1, 32
1719
+ ; PPC-PWR8-NEXT: addi r6, r1, 16
1720
+ ; PPC-PWR8-NEXT: li r7, 2
1721
+ ; PPC-PWR8-NEXT: li r8, 2
1722
+ ; PPC-PWR8-NEXT: stw r10, 20(r1)
1723
+ ; PPC-PWR8-NEXT: stw r9, 16(r1)
1724
+ ; PPC-PWR8-NEXT: stw r3, 28(r1)
1725
+ ; PPC-PWR8-NEXT: lwz r3, 56(r1)
1726
+ ; PPC-PWR8-NEXT: stw r3, 24(r1)
1727
+ ; PPC-PWR8-NEXT: li r3, 16
1728
+ ; PPC-PWR8-NEXT: bl __atomic_compare_exchange
1729
+ ; PPC-PWR8-NEXT: lwz r0, 52(r1)
1730
+ ; PPC-PWR8-NEXT: addi r1, r1, 48
1731
+ ; PPC-PWR8-NEXT: mtlr r0
1732
+ ; PPC-PWR8-NEXT: blr
1733
+ entry:
1734
+ %0 = cmpxchg weak ptr %a , i128 %cmp , i128 %new acquire acquire
1735
+ %1 = extractvalue { i128 , i1 } %0 , 1
1736
+ ret i1 %1
1737
+ }
0 commit comments