brintos

brintos / llvm-project-archived public Read only

0
0
Text · 61.9 KiB · 5748172 Raw
1308 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -global-isel -global-isel-abort=1 -stop-after=aarch64-expand-pseudo -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-NOLSE3; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -global-isel -global-isel-abort=1 -stop-after=aarch64-expand-pseudo -mattr=+rcpc -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-LDAPR4 5define i32 @val_compare_and_swap(ptr %p, i32 %cmp, i32 %new) {6  ; CHECK-LABEL: name: val_compare_and_swap7  ; CHECK: bb.0 (%ir-block.0):8  ; CHECK-NEXT:   successors: %bb.1(0x80000000)9  ; CHECK-NEXT:   liveins: $w1, $w2, $x010  ; CHECK-NEXT: {{  $}}11  ; CHECK-NEXT: bb.1.cmpxchg.start:12  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)13  ; CHECK-NEXT:   liveins: $w1, $w2, $x014  ; CHECK-NEXT: {{  $}}15  ; CHECK-NEXT:   renamable $w8 = LDAXRW renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s32) from %ir.p)16  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w1, 0, implicit-def $nzcv, pcsections !017  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !018  ; CHECK-NEXT: {{  $}}19  ; CHECK-NEXT: bb.2.cmpxchg.trystore:20  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800)21  ; CHECK-NEXT:   liveins: $w1, $w2, $x0, $x822  ; CHECK-NEXT: {{  $}}23  ; CHECK-NEXT:   early-clobber renamable $w9 = STXRW renamable $w2, renamable $x0, pcsections !0 :: (volatile store (s32) into %ir.p)24  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.125  ; CHECK-NEXT:   B %bb.426  ; CHECK-NEXT: {{  $}}27  ; CHECK-NEXT: bb.3.cmpxchg.nostore:28  ; CHECK-NEXT:   successors: %bb.4(0x80000000)29  ; CHECK-NEXT:   liveins: $x830  ; CHECK-NEXT: {{  $}}31  ; CHECK-NEXT:   CLREX 15, pcsections !032  ; CHECK-NEXT: {{  $}}33  ; CHECK-NEXT: bb.4.cmpxchg.end:34  ; CHECK-NEXT:   liveins: $x835  ; CHECK-NEXT: {{  $}}36  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x837  ; CHECK-NEXT:   RET undef $lr, implicit $w038  %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acquire acquire, !pcsections !039  %val = extractvalue { i32, i1 } %pair, 040  ret i32 %val41}42 43define i32 @val_compare_and_swap_from_load(ptr %p, i32 %cmp, ptr %pnew) {44  ; CHECK-LABEL: name: val_compare_and_swap_from_load45  ; CHECK: bb.0 (%ir-block.0):46  ; CHECK-NEXT:   successors: %bb.1(0x80000000)47  ; CHECK-NEXT:   liveins: $w1, $x0, $x248  ; CHECK-NEXT: {{  $}}49  ; CHECK-NEXT:   renamable $w9 = LDRWui killed renamable $x2, 0, implicit-def $x9, pcsections !0 :: (load (s32) from %ir.pnew)50  ; CHECK-NEXT: {{  $}}51  ; CHECK-NEXT: bb.1.cmpxchg.start:52  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)53  ; CHECK-NEXT:   liveins: $w1, $x0, $x954  ; CHECK-NEXT: {{  $}}55  ; CHECK-NEXT:   renamable $w8 = LDAXRW renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s32) from %ir.p)56  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w1, 0, implicit-def $nzcv, pcsections !057  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !058  ; CHECK-NEXT: {{  $}}59  ; CHECK-NEXT: bb.2.cmpxchg.trystore:60  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800)61  ; CHECK-NEXT:   liveins: $w1, $x0, $x8, $x962  ; CHECK-NEXT: {{  $}}63  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRW renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s32) into %ir.p)64  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.165  ; CHECK-NEXT:   B %bb.466  ; CHECK-NEXT: {{  $}}67  ; CHECK-NEXT: bb.3.cmpxchg.nostore:68  ; CHECK-NEXT:   successors: %bb.4(0x80000000)69  ; CHECK-NEXT:   liveins: $x870  ; CHECK-NEXT: {{  $}}71  ; CHECK-NEXT:   CLREX 15, pcsections !072  ; CHECK-NEXT: {{  $}}73  ; CHECK-NEXT: bb.4.cmpxchg.end:74  ; CHECK-NEXT:   liveins: $x875  ; CHECK-NEXT: {{  $}}76  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x877  ; CHECK-NEXT:   RET undef $lr, implicit $w078  %new = load i32, ptr %pnew, !pcsections !079  %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acquire acquire, !pcsections !080  %val = extractvalue { i32, i1 } %pair, 081  ret i32 %val82}83 84define i32 @val_compare_and_swap_rel(ptr %p, i32 %cmp, i32 %new) {85  ; CHECK-LABEL: name: val_compare_and_swap_rel86  ; CHECK: bb.0 (%ir-block.0):87  ; CHECK-NEXT:   successors: %bb.1(0x80000000)88  ; CHECK-NEXT:   liveins: $w1, $w2, $x089  ; CHECK-NEXT: {{  $}}90  ; CHECK-NEXT: bb.1.cmpxchg.start:91  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)92  ; CHECK-NEXT:   liveins: $w1, $w2, $x093  ; CHECK-NEXT: {{  $}}94  ; CHECK-NEXT:   renamable $w8 = LDAXRW renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s32) from %ir.p)95  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w1, 0, implicit-def $nzcv, pcsections !096  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !097  ; CHECK-NEXT: {{  $}}98  ; CHECK-NEXT: bb.2.cmpxchg.trystore:99  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800)100  ; CHECK-NEXT:   liveins: $w1, $w2, $x0, $x8101  ; CHECK-NEXT: {{  $}}102  ; CHECK-NEXT:   early-clobber renamable $w9 = STLXRW renamable $w2, renamable $x0, pcsections !0 :: (volatile store (s32) into %ir.p)103  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.1104  ; CHECK-NEXT:   B %bb.4105  ; CHECK-NEXT: {{  $}}106  ; CHECK-NEXT: bb.3.cmpxchg.nostore:107  ; CHECK-NEXT:   successors: %bb.4(0x80000000)108  ; CHECK-NEXT:   liveins: $x8109  ; CHECK-NEXT: {{  $}}110  ; CHECK-NEXT:   CLREX 15, pcsections !0111  ; CHECK-NEXT: {{  $}}112  ; CHECK-NEXT: bb.4.cmpxchg.end:113  ; CHECK-NEXT:   liveins: $x8114  ; CHECK-NEXT: {{  $}}115  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8116  ; CHECK-NEXT:   RET undef $lr, implicit $w0117  %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acq_rel monotonic, !pcsections !0118  %val = extractvalue { i32, i1 } %pair, 0119  ret i32 %val120}121 122define i64 @val_compare_and_swap_64(ptr %p, i64 %cmp, i64 %new) {123  ; CHECK-LABEL: name: val_compare_and_swap_64124  ; CHECK: bb.0 (%ir-block.0):125  ; CHECK-NEXT:   successors: %bb.1(0x80000000)126  ; CHECK-NEXT:   liveins: $x0, $x1, $x2127  ; CHECK-NEXT: {{  $}}128  ; CHECK-NEXT: bb.1.cmpxchg.start:129  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)130  ; CHECK-NEXT:   liveins: $x0, $x1, $x2131  ; CHECK-NEXT: {{  $}}132  ; CHECK-NEXT:   renamable $x8 = LDXRX renamable $x0, pcsections !0 :: (volatile load (s64) from %ir.p)133  ; CHECK-NEXT:   $xzr = SUBSXrs renamable $x8, renamable $x1, 0, implicit-def $nzcv, pcsections !0134  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !0135  ; CHECK-NEXT: {{  $}}136  ; CHECK-NEXT: bb.2.cmpxchg.trystore:137  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800)138  ; CHECK-NEXT:   liveins: $x0, $x1, $x2, $x8139  ; CHECK-NEXT: {{  $}}140  ; CHECK-NEXT:   early-clobber renamable $w9 = STXRX renamable $x2, renamable $x0, pcsections !0 :: (volatile store (s64) into %ir.p)141  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.1142  ; CHECK-NEXT:   B %bb.4143  ; CHECK-NEXT: {{  $}}144  ; CHECK-NEXT: bb.3.cmpxchg.nostore:145  ; CHECK-NEXT:   successors: %bb.4(0x80000000)146  ; CHECK-NEXT:   liveins: $x8147  ; CHECK-NEXT: {{  $}}148  ; CHECK-NEXT:   CLREX 15, pcsections !0149  ; CHECK-NEXT: {{  $}}150  ; CHECK-NEXT: bb.4.cmpxchg.end:151  ; CHECK-NEXT:   liveins: $x8152  ; CHECK-NEXT: {{  $}}153  ; CHECK-NEXT:   $x0 = ORRXrs $xzr, killed $x8, 0154  ; CHECK-NEXT:   RET undef $lr, implicit $x0155  %pair = cmpxchg ptr %p, i64 %cmp, i64 %new monotonic monotonic, !pcsections !0156  %val = extractvalue { i64, i1 } %pair, 0157  ret i64 %val158}159 160define i64 @val_compare_and_swap_64_monotonic_seqcst(ptr %p, i64 %cmp, i64 %new) {161  ; CHECK-LABEL: name: val_compare_and_swap_64_monotonic_seqcst162  ; CHECK: bb.0 (%ir-block.0):163  ; CHECK-NEXT:   successors: %bb.1(0x80000000)164  ; CHECK-NEXT:   liveins: $x0, $x1, $x2165  ; CHECK-NEXT: {{  $}}166  ; CHECK-NEXT: bb.1.cmpxchg.start:167  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)168  ; CHECK-NEXT:   liveins: $x0, $x1, $x2169  ; CHECK-NEXT: {{  $}}170  ; CHECK-NEXT:   renamable $x8 = LDAXRX renamable $x0, pcsections !0 :: (volatile load (s64) from %ir.p)171  ; CHECK-NEXT:   $xzr = SUBSXrs renamable $x8, renamable $x1, 0, implicit-def $nzcv, pcsections !0172  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !0173  ; CHECK-NEXT: {{  $}}174  ; CHECK-NEXT: bb.2.cmpxchg.trystore:175  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800)176  ; CHECK-NEXT:   liveins: $x0, $x1, $x2, $x8177  ; CHECK-NEXT: {{  $}}178  ; CHECK-NEXT:   early-clobber renamable $w9 = STLXRX renamable $x2, renamable $x0, pcsections !0 :: (volatile store (s64) into %ir.p)179  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.1180  ; CHECK-NEXT:   B %bb.4181  ; CHECK-NEXT: {{  $}}182  ; CHECK-NEXT: bb.3.cmpxchg.nostore:183  ; CHECK-NEXT:   successors: %bb.4(0x80000000)184  ; CHECK-NEXT:   liveins: $x8185  ; CHECK-NEXT: {{  $}}186  ; CHECK-NEXT:   CLREX 15, pcsections !0187  ; CHECK-NEXT: {{  $}}188  ; CHECK-NEXT: bb.4.cmpxchg.end:189  ; CHECK-NEXT:   liveins: $x8190  ; CHECK-NEXT: {{  $}}191  ; CHECK-NEXT:   $x0 = ORRXrs $xzr, killed $x8, 0192  ; CHECK-NEXT:   RET undef $lr, implicit $x0193  %pair = cmpxchg ptr %p, i64 %cmp, i64 %new monotonic seq_cst, !pcsections !0194  %val = extractvalue { i64, i1 } %pair, 0195  ret i64 %val196}197 198define i64 @val_compare_and_swap_64_release_acquire(ptr %p, i64 %cmp, i64 %new) {199  ; CHECK-LABEL: name: val_compare_and_swap_64_release_acquire200  ; CHECK: bb.0 (%ir-block.0):201  ; CHECK-NEXT:   successors: %bb.1(0x80000000)202  ; CHECK-NEXT:   liveins: $x0, $x1, $x2203  ; CHECK-NEXT: {{  $}}204  ; CHECK-NEXT: bb.1.cmpxchg.start:205  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)206  ; CHECK-NEXT:   liveins: $x0, $x1, $x2207  ; CHECK-NEXT: {{  $}}208  ; CHECK-NEXT:   renamable $x8 = LDAXRX renamable $x0, pcsections !0 :: (volatile load (s64) from %ir.p)209  ; CHECK-NEXT:   $xzr = SUBSXrs renamable $x8, renamable $x1, 0, implicit-def $nzcv, pcsections !0210  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !0211  ; CHECK-NEXT: {{  $}}212  ; CHECK-NEXT: bb.2.cmpxchg.trystore:213  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800)214  ; CHECK-NEXT:   liveins: $x0, $x1, $x2, $x8215  ; CHECK-NEXT: {{  $}}216  ; CHECK-NEXT:   early-clobber renamable $w9 = STLXRX renamable $x2, renamable $x0, pcsections !0 :: (volatile store (s64) into %ir.p)217  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.1218  ; CHECK-NEXT:   B %bb.4219  ; CHECK-NEXT: {{  $}}220  ; CHECK-NEXT: bb.3.cmpxchg.nostore:221  ; CHECK-NEXT:   successors: %bb.4(0x80000000)222  ; CHECK-NEXT:   liveins: $x8223  ; CHECK-NEXT: {{  $}}224  ; CHECK-NEXT:   CLREX 15, pcsections !0225  ; CHECK-NEXT: {{  $}}226  ; CHECK-NEXT: bb.4.cmpxchg.end:227  ; CHECK-NEXT:   liveins: $x8228  ; CHECK-NEXT: {{  $}}229  ; CHECK-NEXT:   $x0 = ORRXrs $xzr, killed $x8, 0230  ; CHECK-NEXT:   RET undef $lr, implicit $x0231  %pair = cmpxchg ptr %p, i64 %cmp, i64 %new release acquire, !pcsections !0232  %val = extractvalue { i64, i1 } %pair, 0233  ret i64 %val234}235 236define i32 @fetch_and_nand(ptr %p) {237  ; CHECK-LABEL: name: fetch_and_nand238  ; CHECK: bb.0 (%ir-block.0):239  ; CHECK-NEXT:   successors: %bb.1(0x80000000)240  ; CHECK-NEXT:   liveins: $x0241  ; CHECK-NEXT: {{  $}}242  ; CHECK-NEXT: bb.1.atomicrmw.start:243  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)244  ; CHECK-NEXT:   liveins: $x0245  ; CHECK-NEXT: {{  $}}246  ; CHECK-NEXT:   renamable $w8 = LDXRW renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s32) from %ir.p)247  ; CHECK-NEXT:   renamable $w9 = ANDWri renamable $w8, 2, pcsections !0248  ; CHECK-NEXT:   $w9 = ORNWrs $wzr, killed renamable $w9, 0, pcsections !0249  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRW killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s32) into %ir.p)250  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0251  ; CHECK-NEXT: {{  $}}252  ; CHECK-NEXT: bb.2.atomicrmw.end:253  ; CHECK-NEXT:   liveins: $x8254  ; CHECK-NEXT: {{  $}}255  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8256  ; CHECK-NEXT:   RET undef $lr, implicit $w0257  %val = atomicrmw nand ptr %p, i32 7 release, !pcsections !0258  ret i32 %val259}260 261define i64 @fetch_and_nand_64(ptr %p) {262  ; CHECK-LABEL: name: fetch_and_nand_64263  ; CHECK: bb.0 (%ir-block.0):264  ; CHECK-NEXT:   successors: %bb.1(0x80000000)265  ; CHECK-NEXT:   liveins: $x0266  ; CHECK-NEXT: {{  $}}267  ; CHECK-NEXT: bb.1.atomicrmw.start:268  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)269  ; CHECK-NEXT:   liveins: $x0270  ; CHECK-NEXT: {{  $}}271  ; CHECK-NEXT:   renamable $x8 = LDAXRX renamable $x0, pcsections !0 :: (volatile load (s64) from %ir.p)272  ; CHECK-NEXT:   renamable $x9 = ANDXri renamable $x8, 4098, pcsections !0273  ; CHECK-NEXT:   $x9 = ORNXrs $xzr, killed renamable $x9, 0, pcsections !0274  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRX killed renamable $x9, renamable $x0, pcsections !0 :: (volatile store (s64) into %ir.p)275  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0276  ; CHECK-NEXT: {{  $}}277  ; CHECK-NEXT: bb.2.atomicrmw.end:278  ; CHECK-NEXT:   liveins: $x8279  ; CHECK-NEXT: {{  $}}280  ; CHECK-NEXT:   $x0 = ORRXrs $xzr, killed $x8, 0281  ; CHECK-NEXT:   RET undef $lr, implicit $x0282  %val = atomicrmw nand ptr %p, i64 7 acq_rel, !pcsections !0283  ret i64 %val284}285 286define i32 @fetch_and_or(ptr %p) {287  ; CHECK-LABEL: name: fetch_and_or288  ; CHECK: bb.0 (%ir-block.0):289  ; CHECK-NEXT:   successors: %bb.1(0x80000000)290  ; CHECK-NEXT:   liveins: $x0291  ; CHECK-NEXT: {{  $}}292  ; CHECK-NEXT:   renamable $w9 = MOVZWi 5, 0293  ; CHECK-NEXT: {{  $}}294  ; CHECK-NEXT: bb.1.atomicrmw.start:295  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)296  ; CHECK-NEXT:   liveins: $w9, $x0297  ; CHECK-NEXT: {{  $}}298  ; CHECK-NEXT:   renamable $w8 = LDAXRW renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s32) from %ir.p)299  ; CHECK-NEXT:   $w10 = ORRWrs renamable $w8, renamable $w9, 0, pcsections !0300  ; CHECK-NEXT:   early-clobber renamable $w11 = STLXRW killed renamable $w10, renamable $x0, pcsections !0 :: (volatile store (s32) into %ir.p)301  ; CHECK-NEXT:   CBNZW killed renamable $w11, %bb.1, pcsections !0302  ; CHECK-NEXT: {{  $}}303  ; CHECK-NEXT: bb.2.atomicrmw.end:304  ; CHECK-NEXT:   liveins: $x8305  ; CHECK-NEXT: {{  $}}306  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8307  ; CHECK-NEXT:   RET undef $lr, implicit $w0308  %val = atomicrmw or ptr %p, i32 5 seq_cst, !pcsections !0309  ret i32 %val310}311 312define i64 @fetch_and_or_64(ptr %p) {313  ; CHECK-LABEL: name: fetch_and_or_64314  ; CHECK: bb.0 (%ir-block.0):315  ; CHECK-NEXT:   successors: %bb.1(0x80000000)316  ; CHECK-NEXT:   liveins: $x0317  ; CHECK-NEXT: {{  $}}318  ; CHECK-NEXT: bb.1.atomicrmw.start:319  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)320  ; CHECK-NEXT:   liveins: $x0321  ; CHECK-NEXT: {{  $}}322  ; CHECK-NEXT:   renamable $x8 = LDXRX renamable $x0, pcsections !0 :: (volatile load (s64) from %ir.p)323  ; CHECK-NEXT:   renamable $x9 = ORRXri renamable $x8, 4098, pcsections !0324  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRX killed renamable $x9, renamable $x0, pcsections !0 :: (volatile store (s64) into %ir.p)325  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0326  ; CHECK-NEXT: {{  $}}327  ; CHECK-NEXT: bb.2.atomicrmw.end:328  ; CHECK-NEXT:   liveins: $x8329  ; CHECK-NEXT: {{  $}}330  ; CHECK-NEXT:   $x0 = ORRXrs $xzr, killed $x8, 0331  ; CHECK-NEXT:   RET undef $lr, implicit $x0332  %val = atomicrmw or ptr %p, i64 7 monotonic, !pcsections !0333  ret i64 %val334}335 336define void @acquire_fence() {337  ; CHECK-LABEL: name: acquire_fence338  ; CHECK: bb.0 (%ir-block.0):339  ; CHECK-NEXT:   DMB 9, pcsections !0340  ; CHECK-NEXT:   RET undef $lr341   fence acquire, !pcsections !0342   ret void343}344 345define void @release_fence() {346  ; CHECK-LABEL: name: release_fence347  ; CHECK: bb.0 (%ir-block.0):348  ; CHECK-NEXT:   DMB 11, pcsections !0349  ; CHECK-NEXT:   RET undef $lr350   fence release, !pcsections !0351   ret void352}353 354define void @seq_cst_fence() {355  ; CHECK-LABEL: name: seq_cst_fence356  ; CHECK: bb.0 (%ir-block.0):357  ; CHECK-NEXT:   DMB 11, pcsections !0358  ; CHECK-NEXT:   RET undef $lr359   fence seq_cst, !pcsections !0360   ret void361}362 363define i32 @atomic_load(ptr %p) {364  ; CHECK-LABEL: name: atomic_load365  ; CHECK: bb.0 (%ir-block.0):366  ; CHECK-NEXT:   liveins: $x0367  ; CHECK-NEXT: {{  $}}368  ; CHECK-NEXT:   renamable $w0 = LDARW killed renamable $x0, pcsections !0 :: (load seq_cst (s32) from %ir.p)369  ; CHECK-NEXT:   RET undef $lr, implicit $w0370   %r = load atomic i32, ptr %p seq_cst, align 4, !pcsections !0371   ret i32 %r372}373 374define i8 @atomic_load_relaxed_8(ptr %p, i32 %off32) {375  ; CHECK-LABEL: name: atomic_load_relaxed_8376  ; CHECK: bb.0 (%ir-block.0):377  ; CHECK-NEXT:   liveins: $w1, $x0378  ; CHECK-NEXT: {{  $}}379  ; CHECK-NEXT:   renamable $w8 = LDRBBui renamable $x0, 4095, pcsections !0 :: (load monotonic (s8) from %ir.ptr_unsigned)380  ; CHECK-NEXT:   renamable $w9 = LDRBBroW renamable $x0, killed renamable $w1, 1, 0 :: (load unordered (s8) from %ir.ptr_regoff)381  ; CHECK-NEXT:   renamable $w10 = LDURBBi renamable $x0, -256 :: (load monotonic (s8) from %ir.ptr_unscaled)382  ; CHECK-NEXT:   renamable $w8 = ADDWrx killed renamable $w9, killed renamable $w8, 0, pcsections !0383  ; CHECK-NEXT:   renamable $x9 = ADDXri killed renamable $x0, 291, 12384  ; CHECK-NEXT:   renamable $w8 = ADDWrx killed renamable $w8, killed renamable $w10, 0, pcsections !0385  ; CHECK-NEXT:   renamable $w9 = LDRBBui killed renamable $x9, 0, pcsections !0 :: (load unordered (s8) from %ir.ptr_random)386  ; CHECK-NEXT:   renamable $w0 = ADDWrx killed renamable $w8, killed renamable $w9, 0, pcsections !0387  ; CHECK-NEXT:   RET undef $lr, implicit $w0388  %ptr_unsigned = getelementptr i8, ptr %p, i32 4095389  %val_unsigned = load atomic i8, ptr %ptr_unsigned monotonic, align 1, !pcsections !0390 391  %ptr_regoff = getelementptr i8, ptr %p, i32 %off32392  %val_regoff = load atomic i8, ptr %ptr_regoff unordered, align 1, !pcsections !0393  %tot1 = add i8 %val_unsigned, %val_regoff, !pcsections !0394 395  %ptr_unscaled = getelementptr i8, ptr %p, i32 -256396  %val_unscaled = load atomic i8, ptr %ptr_unscaled monotonic, align 1, !pcsections !0397  %tot2 = add i8 %tot1, %val_unscaled, !pcsections !0398 399  %ptr_random = getelementptr i8, ptr %p, i32 1191936 ; 0x123000 (i.e. ADD imm)400  %val_random = load atomic i8, ptr %ptr_random unordered, align 1, !pcsections !0401  %tot3 = add i8 %tot2, %val_random, !pcsections !0402 403  ret i8 %tot3404}405 406define i16 @atomic_load_relaxed_16(ptr %p, i32 %off32) {407  ; CHECK-LABEL: name: atomic_load_relaxed_16408  ; CHECK: bb.0 (%ir-block.0):409  ; CHECK-NEXT:   liveins: $w1, $x0410  ; CHECK-NEXT: {{  $}}411  ; CHECK-NEXT:   renamable $w8 = LDRHHui renamable $x0, 4095, pcsections !0 :: (load monotonic (s16) from %ir.ptr_unsigned)412  ; CHECK-NEXT:   renamable $w9 = LDRHHroW renamable $x0, killed renamable $w1, 1, 1 :: (load unordered (s16) from %ir.ptr_regoff)413  ; CHECK-NEXT:   renamable $w10 = LDURHHi renamable $x0, -256 :: (load monotonic (s16) from %ir.ptr_unscaled)414  ; CHECK-NEXT:   renamable $w8 = ADDWrx killed renamable $w9, killed renamable $w8, 8, pcsections !0415  ; CHECK-NEXT:   renamable $x9 = ADDXri killed renamable $x0, 291, 12416  ; CHECK-NEXT:   renamable $w8 = ADDWrx killed renamable $w8, killed renamable $w10, 8, pcsections !0417  ; CHECK-NEXT:   renamable $w9 = LDRHHui killed renamable $x9, 0, pcsections !0 :: (load unordered (s16) from %ir.ptr_random)418  ; CHECK-NEXT:   renamable $w0 = ADDWrx killed renamable $w8, killed renamable $w9, 8, pcsections !0419  ; CHECK-NEXT:   RET undef $lr, implicit $w0420  %ptr_unsigned = getelementptr i16, ptr %p, i32 4095421  %val_unsigned = load atomic i16, ptr %ptr_unsigned monotonic, align 2, !pcsections !0422 423  %ptr_regoff = getelementptr i16, ptr %p, i32 %off32424  %val_regoff = load atomic i16, ptr %ptr_regoff unordered, align 2, !pcsections !0425  %tot1 = add i16 %val_unsigned, %val_regoff, !pcsections !0426 427  %ptr_unscaled = getelementptr i16, ptr %p, i32 -128428  %val_unscaled = load atomic i16, ptr %ptr_unscaled monotonic, align 2, !pcsections !0429  %tot2 = add i16 %tot1, %val_unscaled, !pcsections !0430 431  %ptr_random = getelementptr i16, ptr %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)432  %val_random = load atomic i16, ptr %ptr_random unordered, align 2, !pcsections !0433  %tot3 = add i16 %tot2, %val_random, !pcsections !0434 435  ret i16 %tot3436}437 438define i32 @atomic_load_relaxed_32(ptr %p, i32 %off32) {439  ; CHECK-LABEL: name: atomic_load_relaxed_32440  ; CHECK: bb.0 (%ir-block.0):441  ; CHECK-NEXT:   liveins: $w1, $x0442  ; CHECK-NEXT: {{  $}}443  ; CHECK-NEXT:   renamable $w8 = LDRWui renamable $x0, 4095, pcsections !0 :: (load monotonic (s32) from %ir.ptr_unsigned)444  ; CHECK-NEXT:   renamable $w9 = LDRWroW renamable $x0, killed renamable $w1, 1, 1, pcsections !0 :: (load unordered (s32) from %ir.ptr_regoff)445  ; CHECK-NEXT:   renamable $w10 = LDURWi renamable $x0, -256, pcsections !0 :: (load monotonic (s32) from %ir.ptr_unscaled)446  ; CHECK-NEXT:   renamable $x11 = ADDXri killed renamable $x0, 291, 12447  ; CHECK-NEXT:   $w8 = ADDWrs killed renamable $w8, killed renamable $w9, 0, pcsections !0448  ; CHECK-NEXT:   renamable $w9 = LDRWui killed renamable $x11, 0, pcsections !0 :: (load unordered (s32) from %ir.ptr_random)449  ; CHECK-NEXT:   $w8 = ADDWrs killed renamable $w8, killed renamable $w10, 0, pcsections !0450  ; CHECK-NEXT:   $w0 = ADDWrs killed renamable $w8, killed renamable $w9, 0, pcsections !0451  ; CHECK-NEXT:   RET undef $lr, implicit $w0452  %ptr_unsigned = getelementptr i32, ptr %p, i32 4095453  %val_unsigned = load atomic i32, ptr %ptr_unsigned monotonic, align 4, !pcsections !0454 455  %ptr_regoff = getelementptr i32, ptr %p, i32 %off32456  %val_regoff = load atomic i32, ptr %ptr_regoff unordered, align 4, !pcsections !0457  %tot1 = add i32 %val_unsigned, %val_regoff, !pcsections !0458 459  %ptr_unscaled = getelementptr i32, ptr %p, i32 -64460  %val_unscaled = load atomic i32, ptr %ptr_unscaled monotonic, align 4, !pcsections !0461  %tot2 = add i32 %tot1, %val_unscaled, !pcsections !0462 463  %ptr_random = getelementptr i32, ptr %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)464  %val_random = load atomic i32, ptr %ptr_random unordered, align 4, !pcsections !0465  %tot3 = add i32 %tot2, %val_random, !pcsections !0466 467  ret i32 %tot3468}469 470define i64 @atomic_load_relaxed_64(ptr %p, i32 %off32) {471  ; CHECK-LABEL: name: atomic_load_relaxed_64472  ; CHECK: bb.0 (%ir-block.0):473  ; CHECK-NEXT:   liveins: $w1, $x0474  ; CHECK-NEXT: {{  $}}475  ; CHECK-NEXT:   renamable $x8 = LDRXui renamable $x0, 4095, pcsections !0 :: (load monotonic (s64) from %ir.ptr_unsigned)476  ; CHECK-NEXT:   renamable $x9 = LDRXroW renamable $x0, killed renamable $w1, 1, 1, pcsections !0 :: (load unordered (s64) from %ir.ptr_regoff)477  ; CHECK-NEXT:   renamable $x10 = LDURXi renamable $x0, -256, pcsections !0 :: (load monotonic (s64) from %ir.ptr_unscaled)478  ; CHECK-NEXT:   renamable $x11 = ADDXri killed renamable $x0, 291, 12479  ; CHECK-NEXT:   $x8 = ADDXrs killed renamable $x8, killed renamable $x9, 0, pcsections !0480  ; CHECK-NEXT:   renamable $x9 = LDRXui killed renamable $x11, 0, pcsections !0 :: (load unordered (s64) from %ir.ptr_random)481  ; CHECK-NEXT:   $x8 = ADDXrs killed renamable $x8, killed renamable $x10, 0, pcsections !0482  ; CHECK-NEXT:   $x0 = ADDXrs killed renamable $x8, killed renamable $x9, 0, pcsections !0483  ; CHECK-NEXT:   RET undef $lr, implicit $x0484  %ptr_unsigned = getelementptr i64, ptr %p, i32 4095485  %val_unsigned = load atomic i64, ptr %ptr_unsigned monotonic, align 8, !pcsections !0486 487  %ptr_regoff = getelementptr i64, ptr %p, i32 %off32488  %val_regoff = load atomic i64, ptr %ptr_regoff unordered, align 8, !pcsections !0489  %tot1 = add i64 %val_unsigned, %val_regoff, !pcsections !0490 491  %ptr_unscaled = getelementptr i64, ptr %p, i32 -32492  %val_unscaled = load atomic i64, ptr %ptr_unscaled monotonic, align 8, !pcsections !0493  %tot2 = add i64 %tot1, %val_unscaled, !pcsections !0494 495  %ptr_random = getelementptr i64, ptr %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)496  %val_random = load atomic i64, ptr %ptr_random unordered, align 8, !pcsections !0497  %tot3 = add i64 %tot2, %val_random, !pcsections !0498 499  ret i64 %tot3500}501 502 503define void @atomc_store(ptr %p) {504  ; CHECK-LABEL: name: atomc_store505  ; CHECK: bb.0 (%ir-block.0):506  ; CHECK-NEXT:   liveins: $x0507  ; CHECK-NEXT: {{  $}}508  ; CHECK-NEXT:   renamable $w8 = MOVZWi 4, 0509  ; CHECK-NEXT:   STLRW killed renamable $w8, killed renamable $x0, pcsections !0 :: (store seq_cst (s32) into %ir.p)510  ; CHECK-NEXT:   RET undef $lr511   store atomic i32 4, ptr %p seq_cst, align 4, !pcsections !0512   ret void513}514 515define void @atomic_store_relaxed_8(ptr %p, i32 %off32, i8 %val) {516  ; CHECK-LABEL: name: atomic_store_relaxed_8517  ; CHECK: bb.0 (%ir-block.0):518  ; CHECK-NEXT:   liveins: $w1, $w2, $x0519  ; CHECK-NEXT: {{  $}}520  ; CHECK-NEXT:   STRBBui renamable $w2, renamable $x0, 4095, pcsections !0 :: (store monotonic (s8) into %ir.ptr_unsigned)521  ; CHECK-NEXT:   STRBBroW renamable $w2, renamable $x0, killed renamable $w1, 1, 0, pcsections !0 :: (store unordered (s8) into %ir.ptr_regoff)522  ; CHECK-NEXT:   STURBBi renamable $w2, renamable $x0, -256, pcsections !0 :: (store monotonic (s8) into %ir.ptr_unscaled)523  ; CHECK-NEXT:   renamable $x8 = ADDXri killed renamable $x0, 291, 12524  ; CHECK-NEXT:   STRBBui killed renamable $w2, killed renamable $x8, 0, pcsections !0 :: (store unordered (s8) into %ir.ptr_random)525  ; CHECK-NEXT:   RET undef $lr526  %ptr_unsigned = getelementptr i8, ptr %p, i32 4095527  store atomic i8 %val, ptr %ptr_unsigned monotonic, align 1, !pcsections !0528 529  %ptr_regoff = getelementptr i8, ptr %p, i32 %off32530  store atomic i8 %val, ptr %ptr_regoff unordered, align 1, !pcsections !0531 532  %ptr_unscaled = getelementptr i8, ptr %p, i32 -256533  store atomic i8 %val, ptr %ptr_unscaled monotonic, align 1, !pcsections !0534 535  %ptr_random = getelementptr i8, ptr %p, i32 1191936 ; 0x123000 (i.e. ADD imm)536  store atomic i8 %val, ptr %ptr_random unordered, align 1, !pcsections !0537 538  ret void539}540 541define void @atomic_store_relaxed_16(ptr %p, i32 %off32, i16 %val) {542  ; CHECK-LABEL: name: atomic_store_relaxed_16543  ; CHECK: bb.0 (%ir-block.0):544  ; CHECK-NEXT:   liveins: $w1, $w2, $x0545  ; CHECK-NEXT: {{  $}}546  ; CHECK-NEXT:   STRHHui renamable $w2, renamable $x0, 4095, pcsections !0 :: (store monotonic (s16) into %ir.ptr_unsigned)547  ; CHECK-NEXT:   STRHHroW renamable $w2, renamable $x0, killed renamable $w1, 1, 1, pcsections !0 :: (store unordered (s16) into %ir.ptr_regoff)548  ; CHECK-NEXT:   STURHHi renamable $w2, renamable $x0, -256, pcsections !0 :: (store monotonic (s16) into %ir.ptr_unscaled)549  ; CHECK-NEXT:   renamable $x8 = ADDXri killed renamable $x0, 291, 12550  ; CHECK-NEXT:   STRHHui killed renamable $w2, killed renamable $x8, 0, pcsections !0 :: (store unordered (s16) into %ir.ptr_random)551  ; CHECK-NEXT:   RET undef $lr552  %ptr_unsigned = getelementptr i16, ptr %p, i32 4095553  store atomic i16 %val, ptr %ptr_unsigned monotonic, align 2, !pcsections !0554 555  %ptr_regoff = getelementptr i16, ptr %p, i32 %off32556  store atomic i16 %val, ptr %ptr_regoff unordered, align 2, !pcsections !0557 558  %ptr_unscaled = getelementptr i16, ptr %p, i32 -128559  store atomic i16 %val, ptr %ptr_unscaled monotonic, align 2, !pcsections !0560 561  %ptr_random = getelementptr i16, ptr %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)562  store atomic i16 %val, ptr %ptr_random unordered, align 2, !pcsections !0563 564  ret void565}566 567define void @atomic_store_relaxed_32(ptr %p, i32 %off32, i32 %val) {568  ; CHECK-LABEL: name: atomic_store_relaxed_32569  ; CHECK: bb.0 (%ir-block.0):570  ; CHECK-NEXT:   liveins: $w1, $w2, $x0571  ; CHECK-NEXT: {{  $}}572  ; CHECK-NEXT:   STRWui renamable $w2, renamable $x0, 4095, pcsections !0 :: (store monotonic (s32) into %ir.ptr_unsigned)573  ; CHECK-NEXT:   STRWroW renamable $w2, renamable $x0, killed renamable $w1, 1, 1, pcsections !0 :: (store unordered (s32) into %ir.ptr_regoff)574  ; CHECK-NEXT:   STURWi renamable $w2, renamable $x0, -256, pcsections !0 :: (store monotonic (s32) into %ir.ptr_unscaled)575  ; CHECK-NEXT:   renamable $x8 = ADDXri killed renamable $x0, 291, 12576  ; CHECK-NEXT:   STRWui killed renamable $w2, killed renamable $x8, 0, pcsections !0 :: (store unordered (s32) into %ir.ptr_random)577  ; CHECK-NEXT:   RET undef $lr578  %ptr_unsigned = getelementptr i32, ptr %p, i32 4095579  store atomic i32 %val, ptr %ptr_unsigned monotonic, align 4, !pcsections !0580 581  %ptr_regoff = getelementptr i32, ptr %p, i32 %off32582  store atomic i32 %val, ptr %ptr_regoff unordered, align 4, !pcsections !0583 584  %ptr_unscaled = getelementptr i32, ptr %p, i32 -64585  store atomic i32 %val, ptr %ptr_unscaled monotonic, align 4, !pcsections !0586 587  %ptr_random = getelementptr i32, ptr %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)588  store atomic i32 %val, ptr %ptr_random unordered, align 4, !pcsections !0589 590  ret void591}592 593define void @atomic_store_relaxed_64(ptr %p, i32 %off32, i64 %val) {594  ; CHECK-LABEL: name: atomic_store_relaxed_64595  ; CHECK: bb.0 (%ir-block.0):596  ; CHECK-NEXT:   liveins: $w1, $x0, $x2597  ; CHECK-NEXT: {{  $}}598  ; CHECK-NEXT:   STRXui renamable $x2, renamable $x0, 4095, pcsections !0 :: (store monotonic (s64) into %ir.ptr_unsigned)599  ; CHECK-NEXT:   STRXroW renamable $x2, renamable $x0, killed renamable $w1, 1, 1, pcsections !0 :: (store unordered (s64) into %ir.ptr_regoff)600  ; CHECK-NEXT:   STURXi renamable $x2, renamable $x0, -256, pcsections !0 :: (store monotonic (s64) into %ir.ptr_unscaled)601  ; CHECK-NEXT:   renamable $x8 = ADDXri killed renamable $x0, 291, 12602  ; CHECK-NEXT:   STRXui killed renamable $x2, killed renamable $x8, 0, pcsections !0 :: (store unordered (s64) into %ir.ptr_random)603  ; CHECK-NEXT:   RET undef $lr604  %ptr_unsigned = getelementptr i64, ptr %p, i32 4095605  store atomic i64 %val, ptr %ptr_unsigned monotonic, align 8, !pcsections !0606 607  %ptr_regoff = getelementptr i64, ptr %p, i32 %off32608  store atomic i64 %val, ptr %ptr_regoff unordered, align 8, !pcsections !0609 610  %ptr_unscaled = getelementptr i64, ptr %p, i32 -32611  store atomic i64 %val, ptr %ptr_unscaled monotonic, align 8, !pcsections !0612 613  %ptr_random = getelementptr i64, ptr %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)614  store atomic i64 %val, ptr %ptr_random unordered, align 8, !pcsections !0615 616  ret void617}618 619define i32 @load_zext(ptr %p8, ptr %p16) {620  ; CHECK-NOLSE-LABEL: name: load_zext621  ; CHECK-NOLSE: bb.0 (%ir-block.0):622  ; CHECK-NOLSE-NEXT:   liveins: $x0, $x1623  ; CHECK-NOLSE-NEXT: {{  $}}624  ; CHECK-NOLSE-NEXT:   renamable $w8 = LDARB killed renamable $x0, pcsections !0 :: (load acquire (s8) from %ir.p8)625  ; CHECK-NOLSE-NEXT:   renamable $w9 = LDRHHui killed renamable $x1, 0, pcsections !0 :: (load unordered (s16) from %ir.p16)626  ; CHECK-NOLSE-NEXT:   renamable $w0 = ADDWrx killed renamable $w9, killed renamable $w8, 0, pcsections !0627  ; CHECK-NOLSE-NEXT:   RET undef $lr, implicit $w0628  ;629  ; CHECK-LDAPR-LABEL: name: load_zext630  ; CHECK-LDAPR: bb.0 (%ir-block.0):631  ; CHECK-LDAPR-NEXT:   liveins: $x0, $x1632  ; CHECK-LDAPR-NEXT: {{  $}}633  ; CHECK-LDAPR-NEXT:   renamable $w8 = LDAPRB killed renamable $x0, pcsections !0 :: (load acquire (s8) from %ir.p8)634  ; CHECK-LDAPR-NEXT:   renamable $w9 = LDRHHui killed renamable $x1, 0, pcsections !0 :: (load unordered (s16) from %ir.p16)635  ; CHECK-LDAPR-NEXT:   renamable $w0 = ADDWrx killed renamable $w9, killed renamable $w8, 0, pcsections !0636  ; CHECK-LDAPR-NEXT:   RET undef $lr, implicit $w0637  %val1.8 = load atomic i8, ptr %p8 acquire, align 1, !pcsections !0638  %val1 = zext i8 %val1.8 to i32639 640  %val2.16 = load atomic i16, ptr %p16 unordered, align 2, !pcsections !0641  %val2 = zext i16 %val2.16 to i32642 643  %res = add i32 %val1, %val2, !pcsections !0644  ret i32 %res645}646 647define { i32, i64 } @load_acq(ptr %p32, ptr %p64) {648  ; CHECK-NOLSE-LABEL: name: load_acq649  ; CHECK-NOLSE: bb.0 (%ir-block.0):650  ; CHECK-NOLSE-NEXT:   liveins: $x0, $x1651  ; CHECK-NOLSE-NEXT: {{  $}}652  ; CHECK-NOLSE-NEXT:   renamable $w0 = LDARW killed renamable $x0, pcsections !0 :: (load seq_cst (s32) from %ir.p32)653  ; CHECK-NOLSE-NEXT:   renamable $x1 = LDARX killed renamable $x1, pcsections !0 :: (load acquire (s64) from %ir.p64)654  ; CHECK-NOLSE-NEXT:   RET undef $lr, implicit $w0, implicit $x1655  ;656  ; CHECK-LDAPR-LABEL: name: load_acq657  ; CHECK-LDAPR: bb.0 (%ir-block.0):658  ; CHECK-LDAPR-NEXT:   liveins: $x0, $x1659  ; CHECK-LDAPR-NEXT: {{  $}}660  ; CHECK-LDAPR-NEXT:   renamable $w0 = LDARW killed renamable $x0, pcsections !0 :: (load seq_cst (s32) from %ir.p32)661  ; CHECK-LDAPR-NEXT:   renamable $x1 = LDAPRX killed renamable $x1, pcsections !0 :: (load acquire (s64) from %ir.p64)662  ; CHECK-LDAPR-NEXT:   RET undef $lr, implicit $w0, implicit $x1663  %val32 = load atomic i32, ptr %p32 seq_cst, align 4, !pcsections !0664  %tmp = insertvalue { i32, i64 } undef, i32 %val32, 0665 666  %val64 = load atomic i64, ptr %p64 acquire, align 8, !pcsections !0667  %res = insertvalue { i32, i64 } %tmp, i64 %val64, 1668 669  ret { i32, i64 } %res670}671 672define i32 @load_sext(ptr %p8, ptr %p16) {673  ; CHECK-NOLSE-LABEL: name: load_sext674  ; CHECK-NOLSE: bb.0 (%ir-block.0):675  ; CHECK-NOLSE-NEXT:   liveins: $x0, $x1676  ; CHECK-NOLSE-NEXT: {{  $}}677  ; CHECK-NOLSE-NEXT:   renamable $w8 = LDARB killed renamable $x0, pcsections !0 :: (load acquire (s8) from %ir.p8)678  ; CHECK-NOLSE-NEXT:   renamable $w9 = LDRHHui killed renamable $x1, 0, pcsections !0 :: (load unordered (s16) from %ir.p16)679  ; CHECK-NOLSE-NEXT:   renamable $w9 = SBFMWri killed renamable $w9, 0, 15680  ; CHECK-NOLSE-NEXT:   renamable $w0 = ADDWrx killed renamable $w9, killed renamable $w8, 32, pcsections !0681  ; CHECK-NOLSE-NEXT:   RET undef $lr, implicit $w0682  ;683  ; CHECK-LDAPR-LABEL: name: load_sext684  ; CHECK-LDAPR: bb.0 (%ir-block.0):685  ; CHECK-LDAPR-NEXT:   liveins: $x0, $x1686  ; CHECK-LDAPR-NEXT: {{  $}}687  ; CHECK-LDAPR-NEXT:   renamable $w8 = LDAPRB killed renamable $x0, pcsections !0 :: (load acquire (s8) from %ir.p8)688  ; CHECK-LDAPR-NEXT:   renamable $w9 = LDRHHui killed renamable $x1, 0, pcsections !0 :: (load unordered (s16) from %ir.p16)689  ; CHECK-LDAPR-NEXT:   renamable $w9 = SBFMWri killed renamable $w9, 0, 15690  ; CHECK-LDAPR-NEXT:   renamable $w0 = ADDWrx killed renamable $w9, killed renamable $w8, 32, pcsections !0691  ; CHECK-LDAPR-NEXT:   RET undef $lr, implicit $w0692  %val1.8 = load atomic i8, ptr %p8 acquire, align 1, !pcsections !0693  %val1 = sext i8 %val1.8 to i32694 695  %val2.16 = load atomic i16, ptr %p16 unordered, align 2, !pcsections !0696  %val2 = sext i16 %val2.16 to i32697 698  %res = add i32 %val1, %val2, !pcsections !0699  ret i32 %res700}701 702define void @store_trunc(i32 %val, ptr %p8, ptr %p16) {703  ; CHECK-LABEL: name: store_trunc704  ; CHECK: bb.0 (%ir-block.0):705  ; CHECK-NEXT:   liveins: $w0, $x1, $x2706  ; CHECK-NEXT: {{  $}}707  ; CHECK-NEXT:   STLRB renamable $w0, killed renamable $x1, pcsections !0 :: (store seq_cst (s8) into %ir.p8)708  ; CHECK-NEXT:   STRHHui killed renamable $w0, killed renamable $x2, 0, pcsections !0 :: (store monotonic (s16) into %ir.p16)709  ; CHECK-NEXT:   RET undef $lr710  %val8 = trunc i32 %val to i8711  store atomic i8 %val8, ptr %p8 seq_cst, align 1, !pcsections !0712 713  %val16 = trunc i32 %val to i16714  store atomic i16 %val16, ptr %p16 monotonic, align 2, !pcsections !0715 716  ret void717}718 719define i8 @atomicrmw_add_i8(ptr %ptr, i8 %rhs) {720  ; CHECK-LABEL: name: atomicrmw_add_i8721  ; CHECK: bb.0 (%ir-block.0):722  ; CHECK-NEXT:   successors: %bb.1(0x80000000)723  ; CHECK-NEXT:   liveins: $w1, $x0724  ; CHECK-NEXT: {{  $}}725  ; CHECK-NEXT: bb.1.atomicrmw.start:726  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)727  ; CHECK-NEXT:   liveins: $w1, $x0728  ; CHECK-NEXT: {{  $}}729  ; CHECK-NEXT:   renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)730  ; CHECK-NEXT:   $w9 = ADDWrs renamable $w8, renamable $w1, 0, pcsections !0731  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)732  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0733  ; CHECK-NEXT: {{  $}}734  ; CHECK-NEXT: bb.2.atomicrmw.end:735  ; CHECK-NEXT:   liveins: $x8736  ; CHECK-NEXT: {{  $}}737  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8738  ; CHECK-NEXT:   RET undef $lr, implicit $w0739  %res = atomicrmw add ptr %ptr, i8 %rhs seq_cst, !pcsections !0740  ret i8 %res741}742 743define i8 @atomicrmw_xchg_i8(ptr %ptr, i8 %rhs) {744  ; CHECK-LABEL: name: atomicrmw_xchg_i8745  ; CHECK: bb.0 (%ir-block.0):746  ; CHECK-NEXT:   successors: %bb.1(0x80000000)747  ; CHECK-NEXT:   liveins: $w1, $x0748  ; CHECK-NEXT: {{  $}}749  ; CHECK-NEXT: bb.1.atomicrmw.start:750  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)751  ; CHECK-NEXT:   liveins: $w1, $x0752  ; CHECK-NEXT: {{  $}}753  ; CHECK-NEXT:   renamable $w8 = LDXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)754  ; CHECK-NEXT:   early-clobber renamable $w9 = STXRB renamable $w1, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)755  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.1, pcsections !0756  ; CHECK-NEXT: {{  $}}757  ; CHECK-NEXT: bb.2.atomicrmw.end:758  ; CHECK-NEXT:   liveins: $x8759  ; CHECK-NEXT: {{  $}}760  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8761  ; CHECK-NEXT:   RET undef $lr, implicit $w0762  %res = atomicrmw xchg ptr %ptr, i8 %rhs monotonic, !pcsections !0763  ret i8 %res764}765 766define i8 @atomicrmw_sub_i8(ptr %ptr, i8 %rhs) {767  ; CHECK-LABEL: name: atomicrmw_sub_i8768  ; CHECK: bb.0 (%ir-block.0):769  ; CHECK-NEXT:   successors: %bb.1(0x80000000)770  ; CHECK-NEXT:   liveins: $w1, $x0771  ; CHECK-NEXT: {{  $}}772  ; CHECK-NEXT: bb.1.atomicrmw.start:773  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)774  ; CHECK-NEXT:   liveins: $w1, $x0775  ; CHECK-NEXT: {{  $}}776  ; CHECK-NEXT:   renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)777  ; CHECK-NEXT:   $w9 = SUBWrs renamable $w8, renamable $w1, 0, pcsections !0778  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)779  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0780  ; CHECK-NEXT: {{  $}}781  ; CHECK-NEXT: bb.2.atomicrmw.end:782  ; CHECK-NEXT:   liveins: $x8783  ; CHECK-NEXT: {{  $}}784  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8785  ; CHECK-NEXT:   RET undef $lr, implicit $w0786  %res = atomicrmw sub ptr %ptr, i8 %rhs acquire, !pcsections !0787  ret i8 %res788}789 790define i8 @atomicrmw_and_i8(ptr %ptr, i8 %rhs) {791  ; CHECK-LABEL: name: atomicrmw_and_i8792  ; CHECK: bb.0 (%ir-block.0):793  ; CHECK-NEXT:   successors: %bb.1(0x80000000)794  ; CHECK-NEXT:   liveins: $w1, $x0795  ; CHECK-NEXT: {{  $}}796  ; CHECK-NEXT: bb.1.atomicrmw.start:797  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)798  ; CHECK-NEXT:   liveins: $w1, $x0799  ; CHECK-NEXT: {{  $}}800  ; CHECK-NEXT:   renamable $w8 = LDXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)801  ; CHECK-NEXT:   $w9 = ANDWrs renamable $w8, renamable $w1, 0, pcsections !0802  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)803  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0804  ; CHECK-NEXT: {{  $}}805  ; CHECK-NEXT: bb.2.atomicrmw.end:806  ; CHECK-NEXT:   liveins: $x8807  ; CHECK-NEXT: {{  $}}808  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8809  ; CHECK-NEXT:   RET undef $lr, implicit $w0810  %res = atomicrmw and ptr %ptr, i8 %rhs release, !pcsections !0811  ret i8 %res812}813 814define i8 @atomicrmw_or_i8(ptr %ptr, i8 %rhs) {815  ; CHECK-LABEL: name: atomicrmw_or_i8816  ; CHECK: bb.0 (%ir-block.0):817  ; CHECK-NEXT:   successors: %bb.1(0x80000000)818  ; CHECK-NEXT:   liveins: $w1, $x0819  ; CHECK-NEXT: {{  $}}820  ; CHECK-NEXT: bb.1.atomicrmw.start:821  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)822  ; CHECK-NEXT:   liveins: $w1, $x0823  ; CHECK-NEXT: {{  $}}824  ; CHECK-NEXT:   renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)825  ; CHECK-NEXT:   $w9 = ORRWrs renamable $w8, renamable $w1, 0, pcsections !0826  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)827  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0828  ; CHECK-NEXT: {{  $}}829  ; CHECK-NEXT: bb.2.atomicrmw.end:830  ; CHECK-NEXT:   liveins: $x8831  ; CHECK-NEXT: {{  $}}832  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8833  ; CHECK-NEXT:   RET undef $lr, implicit $w0834  %res = atomicrmw or ptr %ptr, i8 %rhs seq_cst, !pcsections !0835  ret i8 %res836}837 838define i8 @atomicrmw_xor_i8(ptr %ptr, i8 %rhs) {839  ; CHECK-LABEL: name: atomicrmw_xor_i8840  ; CHECK: bb.0 (%ir-block.0):841  ; CHECK-NEXT:   successors: %bb.1(0x80000000)842  ; CHECK-NEXT:   liveins: $w1, $x0843  ; CHECK-NEXT: {{  $}}844  ; CHECK-NEXT: bb.1.atomicrmw.start:845  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)846  ; CHECK-NEXT:   liveins: $w1, $x0847  ; CHECK-NEXT: {{  $}}848  ; CHECK-NEXT:   renamable $w8 = LDXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)849  ; CHECK-NEXT:   $w9 = EORWrs renamable $w8, renamable $w1, 0, pcsections !0850  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)851  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0852  ; CHECK-NEXT: {{  $}}853  ; CHECK-NEXT: bb.2.atomicrmw.end:854  ; CHECK-NEXT:   liveins: $x8855  ; CHECK-NEXT: {{  $}}856  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8857  ; CHECK-NEXT:   RET undef $lr, implicit $w0858  %res = atomicrmw xor ptr %ptr, i8 %rhs monotonic, !pcsections !0859  ret i8 %res860}861 862define i8 @atomicrmw_min_i8(ptr %ptr, i8 %rhs) {863  ; CHECK-LABEL: name: atomicrmw_min_i8864  ; CHECK: bb.0 (%ir-block.0):865  ; CHECK-NEXT:   successors: %bb.1(0x80000000)866  ; CHECK-NEXT:   liveins: $w1, $x0867  ; CHECK-NEXT: {{  $}}868  ; CHECK-NEXT: bb.1.atomicrmw.start:869  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)870  ; CHECK-NEXT:   liveins: $w1, $x0871  ; CHECK-NEXT: {{  $}}872  ; CHECK-NEXT:   renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)873  ; CHECK-NEXT:   renamable $w9 = SBFMWri renamable $w8, 0, 7, pcsections !0874  ; CHECK-NEXT:   dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 32, implicit-def $nzcv, pcsections !0875  ; CHECK-NEXT:   renamable $w9 = CSELWr renamable $w8, renamable $w1, 11, implicit killed $nzcv, pcsections !0876  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)877  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0878  ; CHECK-NEXT: {{  $}}879  ; CHECK-NEXT: bb.2.atomicrmw.end:880  ; CHECK-NEXT:   liveins: $x8881  ; CHECK-NEXT: {{  $}}882  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8883  ; CHECK-NEXT:   RET undef $lr, implicit $w0884  %res = atomicrmw min ptr %ptr, i8 %rhs acquire, !pcsections !0885  ret i8 %res886}887 888define i8 @atomicrmw_max_i8(ptr %ptr, i8 %rhs) {889  ; CHECK-LABEL: name: atomicrmw_max_i8890  ; CHECK: bb.0 (%ir-block.0):891  ; CHECK-NEXT:   successors: %bb.1(0x80000000)892  ; CHECK-NEXT:   liveins: $w1, $x0893  ; CHECK-NEXT: {{  $}}894  ; CHECK-NEXT: bb.1.atomicrmw.start:895  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)896  ; CHECK-NEXT:   liveins: $w1, $x0897  ; CHECK-NEXT: {{  $}}898  ; CHECK-NEXT:   renamable $w8 = LDXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)899  ; CHECK-NEXT:   renamable $w9 = SBFMWri renamable $w8, 0, 7, pcsections !0900  ; CHECK-NEXT:   dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 32, implicit-def $nzcv, pcsections !0901  ; CHECK-NEXT:   renamable $w9 = CSELWr renamable $w8, renamable $w1, 12, implicit killed $nzcv, pcsections !0902  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRB killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s8) into %ir.ptr)903  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0904  ; CHECK-NEXT: {{  $}}905  ; CHECK-NEXT: bb.2.atomicrmw.end:906  ; CHECK-NEXT:   liveins: $x8907  ; CHECK-NEXT: {{  $}}908  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8909  ; CHECK-NEXT:   RET undef $lr, implicit $w0910  %res = atomicrmw max ptr %ptr, i8 %rhs release, !pcsections !0911  ret i8 %res912}913 914define i8 @atomicrmw_umin_i8(ptr %ptr, i8 %rhs) {915  ; CHECK-LABEL: name: atomicrmw_umin_i8916  ; CHECK: bb.0 (%ir-block.0):917  ; CHECK-NEXT:   successors: %bb.1(0x80000000)918  ; CHECK-NEXT:   liveins: $w1, $x0919  ; CHECK-NEXT: {{  $}}920  ; CHECK-NEXT:   renamable $w9 = ANDWri killed renamable $w1, 7921  ; CHECK-NEXT: {{  $}}922  ; CHECK-NEXT: bb.1.atomicrmw.start:923  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)924  ; CHECK-NEXT:   liveins: $w9, $x0925  ; CHECK-NEXT: {{  $}}926  ; CHECK-NEXT:   renamable $w8 = LDAXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)927  ; CHECK-NEXT:   renamable $w8 = ANDWri renamable $w8, 7, implicit killed $x8928  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w9, 0, implicit-def $nzcv, pcsections !0929  ; CHECK-NEXT:   renamable $w10 = CSELWr renamable $w8, renamable $w9, 3, implicit killed $nzcv, implicit-def $x10, pcsections !0930  ; CHECK-NEXT:   early-clobber renamable $w11 = STLXRB renamable $w10, renamable $x0, implicit killed $x10, pcsections !0 :: (volatile store (s8) into %ir.ptr)931  ; CHECK-NEXT:   CBNZW killed renamable $w11, %bb.1, pcsections !0932  ; CHECK-NEXT: {{  $}}933  ; CHECK-NEXT: bb.2.atomicrmw.end:934  ; CHECK-NEXT:   liveins: $w8935  ; CHECK-NEXT: {{  $}}936  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, killed $w8, 0937  ; CHECK-NEXT:   RET undef $lr, implicit $w0938  %res = atomicrmw umin ptr %ptr, i8 %rhs seq_cst, !pcsections !0939  ret i8 %res940}941 942define i8 @atomicrmw_umax_i8(ptr %ptr, i8 %rhs) {943  ; CHECK-LABEL: name: atomicrmw_umax_i8944  ; CHECK: bb.0 (%ir-block.0):945  ; CHECK-NEXT:   successors: %bb.1(0x80000000)946  ; CHECK-NEXT:   liveins: $w1, $x0947  ; CHECK-NEXT: {{  $}}948  ; CHECK-NEXT:   renamable $w9 = ANDWri killed renamable $w1, 7949  ; CHECK-NEXT: {{  $}}950  ; CHECK-NEXT: bb.1.atomicrmw.start:951  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)952  ; CHECK-NEXT:   liveins: $w9, $x0953  ; CHECK-NEXT: {{  $}}954  ; CHECK-NEXT:   renamable $w8 = LDXRB renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s8) from %ir.ptr)955  ; CHECK-NEXT:   renamable $w8 = ANDWri renamable $w8, 7, implicit killed $x8956  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w9, 0, implicit-def $nzcv, pcsections !0957  ; CHECK-NEXT:   renamable $w10 = CSELWr renamable $w8, renamable $w9, 8, implicit killed $nzcv, implicit-def $x10, pcsections !0958  ; CHECK-NEXT:   early-clobber renamable $w11 = STXRB renamable $w10, renamable $x0, implicit killed $x10, pcsections !0 :: (volatile store (s8) into %ir.ptr)959  ; CHECK-NEXT:   CBNZW killed renamable $w11, %bb.1, pcsections !0960  ; CHECK-NEXT: {{  $}}961  ; CHECK-NEXT: bb.2.atomicrmw.end:962  ; CHECK-NEXT:   liveins: $w8963  ; CHECK-NEXT: {{  $}}964  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, killed $w8, 0965  ; CHECK-NEXT:   RET undef $lr, implicit $w0966  %res = atomicrmw umax ptr %ptr, i8 %rhs monotonic, !pcsections !0967  ret i8 %res968}969 970define i16 @atomicrmw_add_i16(ptr %ptr, i16 %rhs) {971  ; CHECK-LABEL: name: atomicrmw_add_i16972  ; CHECK: bb.0 (%ir-block.0):973  ; CHECK-NEXT:   successors: %bb.1(0x80000000)974  ; CHECK-NEXT:   liveins: $w1, $x0975  ; CHECK-NEXT: {{  $}}976  ; CHECK-NEXT: bb.1.atomicrmw.start:977  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)978  ; CHECK-NEXT:   liveins: $w1, $x0979  ; CHECK-NEXT: {{  $}}980  ; CHECK-NEXT:   renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)981  ; CHECK-NEXT:   $w9 = ADDWrs renamable $w8, renamable $w1, 0, pcsections !0982  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)983  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !0984  ; CHECK-NEXT: {{  $}}985  ; CHECK-NEXT: bb.2.atomicrmw.end:986  ; CHECK-NEXT:   liveins: $x8987  ; CHECK-NEXT: {{  $}}988  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x8989  ; CHECK-NEXT:   RET undef $lr, implicit $w0990  %res = atomicrmw add ptr %ptr, i16 %rhs seq_cst, !pcsections !0991  ret i16 %res992}993 994define i16 @atomicrmw_xchg_i16(ptr %ptr, i16 %rhs) {995  ; CHECK-LABEL: name: atomicrmw_xchg_i16996  ; CHECK: bb.0 (%ir-block.0):997  ; CHECK-NEXT:   successors: %bb.1(0x80000000)998  ; CHECK-NEXT:   liveins: $w1, $x0999  ; CHECK-NEXT: {{  $}}1000  ; CHECK-NEXT: bb.1.atomicrmw.start:1001  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1002  ; CHECK-NEXT:   liveins: $w1, $x01003  ; CHECK-NEXT: {{  $}}1004  ; CHECK-NEXT:   renamable $w8 = LDXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1005  ; CHECK-NEXT:   early-clobber renamable $w9 = STXRH renamable $w1, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1006  ; CHECK-NEXT:   CBNZW killed renamable $w9, %bb.1, pcsections !01007  ; CHECK-NEXT: {{  $}}1008  ; CHECK-NEXT: bb.2.atomicrmw.end:1009  ; CHECK-NEXT:   liveins: $x81010  ; CHECK-NEXT: {{  $}}1011  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81012  ; CHECK-NEXT:   RET undef $lr, implicit $w01013  %res = atomicrmw xchg ptr %ptr, i16 %rhs monotonic, !pcsections !01014  ret i16 %res1015}1016 1017define i16 @atomicrmw_sub_i16(ptr %ptr, i16 %rhs) {1018  ; CHECK-LABEL: name: atomicrmw_sub_i161019  ; CHECK: bb.0 (%ir-block.0):1020  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1021  ; CHECK-NEXT:   liveins: $w1, $x01022  ; CHECK-NEXT: {{  $}}1023  ; CHECK-NEXT: bb.1.atomicrmw.start:1024  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1025  ; CHECK-NEXT:   liveins: $w1, $x01026  ; CHECK-NEXT: {{  $}}1027  ; CHECK-NEXT:   renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1028  ; CHECK-NEXT:   $w9 = SUBWrs renamable $w8, renamable $w1, 0, pcsections !01029  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1030  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !01031  ; CHECK-NEXT: {{  $}}1032  ; CHECK-NEXT: bb.2.atomicrmw.end:1033  ; CHECK-NEXT:   liveins: $x81034  ; CHECK-NEXT: {{  $}}1035  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81036  ; CHECK-NEXT:   RET undef $lr, implicit $w01037  %res = atomicrmw sub ptr %ptr, i16 %rhs acquire, !pcsections !01038  ret i16 %res1039}1040 1041define i16 @atomicrmw_and_i16(ptr %ptr, i16 %rhs) {1042  ; CHECK-LABEL: name: atomicrmw_and_i161043  ; CHECK: bb.0 (%ir-block.0):1044  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1045  ; CHECK-NEXT:   liveins: $w1, $x01046  ; CHECK-NEXT: {{  $}}1047  ; CHECK-NEXT: bb.1.atomicrmw.start:1048  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1049  ; CHECK-NEXT:   liveins: $w1, $x01050  ; CHECK-NEXT: {{  $}}1051  ; CHECK-NEXT:   renamable $w8 = LDXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1052  ; CHECK-NEXT:   $w9 = ANDWrs renamable $w8, renamable $w1, 0, pcsections !01053  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1054  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !01055  ; CHECK-NEXT: {{  $}}1056  ; CHECK-NEXT: bb.2.atomicrmw.end:1057  ; CHECK-NEXT:   liveins: $x81058  ; CHECK-NEXT: {{  $}}1059  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81060  ; CHECK-NEXT:   RET undef $lr, implicit $w01061  %res = atomicrmw and ptr %ptr, i16 %rhs release, !pcsections !01062  ret i16 %res1063}1064 1065define i16 @atomicrmw_or_i16(ptr %ptr, i16 %rhs) {1066  ; CHECK-LABEL: name: atomicrmw_or_i161067  ; CHECK: bb.0 (%ir-block.0):1068  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1069  ; CHECK-NEXT:   liveins: $w1, $x01070  ; CHECK-NEXT: {{  $}}1071  ; CHECK-NEXT: bb.1.atomicrmw.start:1072  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1073  ; CHECK-NEXT:   liveins: $w1, $x01074  ; CHECK-NEXT: {{  $}}1075  ; CHECK-NEXT:   renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1076  ; CHECK-NEXT:   $w9 = ORRWrs renamable $w8, renamable $w1, 0, pcsections !01077  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1078  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !01079  ; CHECK-NEXT: {{  $}}1080  ; CHECK-NEXT: bb.2.atomicrmw.end:1081  ; CHECK-NEXT:   liveins: $x81082  ; CHECK-NEXT: {{  $}}1083  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81084  ; CHECK-NEXT:   RET undef $lr, implicit $w01085  %res = atomicrmw or ptr %ptr, i16 %rhs seq_cst, !pcsections !01086  ret i16 %res1087}1088 1089define i16 @atomicrmw_xor_i16(ptr %ptr, i16 %rhs) {1090  ; CHECK-LABEL: name: atomicrmw_xor_i161091  ; CHECK: bb.0 (%ir-block.0):1092  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1093  ; CHECK-NEXT:   liveins: $w1, $x01094  ; CHECK-NEXT: {{  $}}1095  ; CHECK-NEXT: bb.1.atomicrmw.start:1096  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1097  ; CHECK-NEXT:   liveins: $w1, $x01098  ; CHECK-NEXT: {{  $}}1099  ; CHECK-NEXT:   renamable $w8 = LDXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1100  ; CHECK-NEXT:   $w9 = EORWrs renamable $w8, renamable $w1, 0, pcsections !01101  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1102  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !01103  ; CHECK-NEXT: {{  $}}1104  ; CHECK-NEXT: bb.2.atomicrmw.end:1105  ; CHECK-NEXT:   liveins: $x81106  ; CHECK-NEXT: {{  $}}1107  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81108  ; CHECK-NEXT:   RET undef $lr, implicit $w01109  %res = atomicrmw xor ptr %ptr, i16 %rhs monotonic, !pcsections !01110  ret i16 %res1111}1112 1113define i16 @atomicrmw_min_i16(ptr %ptr, i16 %rhs) {1114  ; CHECK-LABEL: name: atomicrmw_min_i161115  ; CHECK: bb.0 (%ir-block.0):1116  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1117  ; CHECK-NEXT:   liveins: $w1, $x01118  ; CHECK-NEXT: {{  $}}1119  ; CHECK-NEXT: bb.1.atomicrmw.start:1120  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1121  ; CHECK-NEXT:   liveins: $w1, $x01122  ; CHECK-NEXT: {{  $}}1123  ; CHECK-NEXT:   renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1124  ; CHECK-NEXT:   renamable $w9 = SBFMWri renamable $w8, 0, 15, pcsections !01125  ; CHECK-NEXT:   dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 40, implicit-def $nzcv, pcsections !01126  ; CHECK-NEXT:   renamable $w9 = CSELWr renamable $w8, renamable $w1, 11, implicit killed $nzcv, pcsections !01127  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1128  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !01129  ; CHECK-NEXT: {{  $}}1130  ; CHECK-NEXT: bb.2.atomicrmw.end:1131  ; CHECK-NEXT:   liveins: $x81132  ; CHECK-NEXT: {{  $}}1133  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81134  ; CHECK-NEXT:   RET undef $lr, implicit $w01135  %res = atomicrmw min ptr %ptr, i16 %rhs acquire, !pcsections !01136  ret i16 %res1137}1138 1139define i16 @atomicrmw_max_i16(ptr %ptr, i16 %rhs) {1140  ; CHECK-LABEL: name: atomicrmw_max_i161141  ; CHECK: bb.0 (%ir-block.0):1142  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1143  ; CHECK-NEXT:   liveins: $w1, $x01144  ; CHECK-NEXT: {{  $}}1145  ; CHECK-NEXT: bb.1.atomicrmw.start:1146  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1147  ; CHECK-NEXT:   liveins: $w1, $x01148  ; CHECK-NEXT: {{  $}}1149  ; CHECK-NEXT:   renamable $w8 = LDXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1150  ; CHECK-NEXT:   renamable $w9 = SBFMWri renamable $w8, 0, 15, pcsections !01151  ; CHECK-NEXT:   dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 40, implicit-def $nzcv, pcsections !01152  ; CHECK-NEXT:   renamable $w9 = CSELWr renamable $w8, renamable $w1, 12, implicit killed $nzcv, pcsections !01153  ; CHECK-NEXT:   early-clobber renamable $w10 = STLXRH killed renamable $w9, renamable $x0, pcsections !0 :: (volatile store (s16) into %ir.ptr)1154  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.1, pcsections !01155  ; CHECK-NEXT: {{  $}}1156  ; CHECK-NEXT: bb.2.atomicrmw.end:1157  ; CHECK-NEXT:   liveins: $x81158  ; CHECK-NEXT: {{  $}}1159  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, $w8, 0, implicit killed $x81160  ; CHECK-NEXT:   RET undef $lr, implicit $w01161  %res = atomicrmw max ptr %ptr, i16 %rhs release, !pcsections !01162  ret i16 %res1163}1164 1165define i16 @atomicrmw_umin_i16(ptr %ptr, i16 %rhs) {1166  ; CHECK-LABEL: name: atomicrmw_umin_i161167  ; CHECK: bb.0 (%ir-block.0):1168  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1169  ; CHECK-NEXT:   liveins: $w1, $x01170  ; CHECK-NEXT: {{  $}}1171  ; CHECK-NEXT:   renamable $w9 = ANDWri killed renamable $w1, 151172  ; CHECK-NEXT: {{  $}}1173  ; CHECK-NEXT: bb.1.atomicrmw.start:1174  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1175  ; CHECK-NEXT:   liveins: $w9, $x01176  ; CHECK-NEXT: {{  $}}1177  ; CHECK-NEXT:   renamable $w8 = LDAXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1178  ; CHECK-NEXT:   renamable $w8 = ANDWri renamable $w8, 15, implicit killed $x81179  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w9, 0, implicit-def $nzcv, pcsections !01180  ; CHECK-NEXT:   renamable $w10 = CSELWr renamable $w8, renamable $w9, 3, implicit killed $nzcv, implicit-def $x10, pcsections !01181  ; CHECK-NEXT:   early-clobber renamable $w11 = STLXRH renamable $w10, renamable $x0, implicit killed $x10, pcsections !0 :: (volatile store (s16) into %ir.ptr)1182  ; CHECK-NEXT:   CBNZW killed renamable $w11, %bb.1, pcsections !01183  ; CHECK-NEXT: {{  $}}1184  ; CHECK-NEXT: bb.2.atomicrmw.end:1185  ; CHECK-NEXT:   liveins: $w81186  ; CHECK-NEXT: {{  $}}1187  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, killed $w8, 01188  ; CHECK-NEXT:   RET undef $lr, implicit $w01189  %res = atomicrmw umin ptr %ptr, i16 %rhs seq_cst, !pcsections !01190  ret i16 %res1191}1192 1193define i16 @atomicrmw_umax_i16(ptr %ptr, i16 %rhs) {1194  ; CHECK-LABEL: name: atomicrmw_umax_i161195  ; CHECK: bb.0 (%ir-block.0):1196  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1197  ; CHECK-NEXT:   liveins: $w1, $x01198  ; CHECK-NEXT: {{  $}}1199  ; CHECK-NEXT:   renamable $w9 = ANDWri killed renamable $w1, 151200  ; CHECK-NEXT: {{  $}}1201  ; CHECK-NEXT: bb.1.atomicrmw.start:1202  ; CHECK-NEXT:  successors: %bb.1(0x7c000000), %bb.2(0x04000000)1203  ; CHECK-NEXT:   liveins: $w9, $x01204  ; CHECK-NEXT: {{  $}}1205  ; CHECK-NEXT:   renamable $w8 = LDXRH renamable $x0, implicit-def $x8, pcsections !0 :: (volatile load (s16) from %ir.ptr)1206  ; CHECK-NEXT:   renamable $w8 = ANDWri renamable $w8, 15, implicit killed $x81207  ; CHECK-NEXT:   $wzr = SUBSWrs renamable $w8, renamable $w9, 0, implicit-def $nzcv, pcsections !01208  ; CHECK-NEXT:   renamable $w10 = CSELWr renamable $w8, renamable $w9, 8, implicit killed $nzcv, implicit-def $x10, pcsections !01209  ; CHECK-NEXT:   early-clobber renamable $w11 = STXRH renamable $w10, renamable $x0, implicit killed $x10, pcsections !0 :: (volatile store (s16) into %ir.ptr)1210  ; CHECK-NEXT:   CBNZW killed renamable $w11, %bb.1, pcsections !01211  ; CHECK-NEXT: {{  $}}1212  ; CHECK-NEXT: bb.2.atomicrmw.end:1213  ; CHECK-NEXT:   liveins: $w81214  ; CHECK-NEXT: {{  $}}1215  ; CHECK-NEXT:   $w0 = ORRWrs $wzr, killed $w8, 01216  ; CHECK-NEXT:   RET undef $lr, implicit $w01217  %res = atomicrmw umax ptr %ptr, i16 %rhs monotonic, !pcsections !01218  ret i16 %res1219}1220 1221define { i8, i1 } @cmpxchg_i8(ptr %ptr, i8 %desired, i8 %new) {1222  ; CHECK-LABEL: name: cmpxchg_i81223  ; CHECK: bb.0 (%ir-block.0):1224  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1225  ; CHECK-NEXT:   liveins: $w1, $w2, $x01226  ; CHECK-NEXT: {{  $}}1227  ; CHECK-NEXT:   $x8 = ORRXrs $xzr, $x0, 01228  ; CHECK-NEXT: {{  $}}1229  ; CHECK-NEXT: bb.1.cmpxchg.start:1230  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)1231  ; CHECK-NEXT:   liveins: $w1, $w2, $x81232  ; CHECK-NEXT: {{  $}}1233  ; CHECK-NEXT:   renamable $w0 = LDXRB renamable $x8, implicit-def $x0, pcsections !0 :: (volatile load (s8) from %ir.ptr)1234  ; CHECK-NEXT:   renamable $w9 = ANDWri renamable $w0, 7, pcsections !01235  ; CHECK-NEXT:   dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 0, implicit-def $nzcv, pcsections !01236  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !01237  ; CHECK-NEXT: {{  $}}1238  ; CHECK-NEXT: bb.2.cmpxchg.trystore:1239  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800) 1240  ; CHECK-NEXT:   liveins: $w1, $w2, $x0, $x81241  ; CHECK-NEXT: {{  $}}1242  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRB renamable $w2, renamable $x8, pcsections !0 :: (volatile store (s8) into %ir.ptr) 1243  ; CHECK-NEXT:   renamable $w9 = MOVZWi 1, 0 1244  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.11245  ; CHECK-NEXT:   B %bb.4 1246  ; CHECK-NEXT: {{  $}}1247  ; CHECK-NEXT: bb.3.cmpxchg.nostore: 1248  ; CHECK-NEXT:   successors: %bb.4(0x80000000)1249  ; CHECK-NEXT:   liveins: $x01250  ; CHECK-NEXT: {{  $}}1251  ; CHECK-NEXT:   $w9 = ORRWrs $wzr, $wzr, 01252  ; CHECK-NEXT:   CLREX 15, pcsections !01253  ; CHECK-NEXT: {{  $}}1254  ; CHECK-NEXT: bb.4.cmpxchg.end:1255  ; CHECK-NEXT:   liveins: $w9, $x01256  ; CHECK-NEXT: {{  $}}1257  ; CHECK-NEXT:   $w0 = KILL renamable $w0, implicit killed $x01258  ; CHECK-NEXT:   $w1 = ORRWrs $wzr, killed $w9, 01259  ; CHECK-NEXT:   RET undef $lr, implicit $w0, implicit $w11260  %res = cmpxchg ptr %ptr, i8 %desired, i8 %new monotonic monotonic, !pcsections !01261  ret { i8, i1 } %res1262}1263 1264define { i16, i1 } @cmpxchg_i16(ptr %ptr, i16 %desired, i16 %new) {1265  ; CHECK-LABEL: name: cmpxchg_i161266  ; CHECK: bb.0 (%ir-block.0):1267  ; CHECK-NEXT:   successors: %bb.1(0x80000000)1268  ; CHECK-NEXT:   liveins: $w1, $w2, $x01269  ; CHECK-NEXT: {{  $}}1270  ; CHECK-NEXT:   $x8 = ORRXrs $xzr, $x0, 01271  ; CHECK-NEXT: {{  $}}1272  ; CHECK-NEXT: bb.1.cmpxchg.start:1273  ; CHECK-NEXT:   successors: %bb.2(0x7ffff800), %bb.3(0x00000800)1274  ; CHECK-NEXT:   liveins: $w1, $w2, $x81275  ; CHECK-NEXT: {{  $}}1276  ; CHECK-NEXT:   renamable $w0 = LDXRH renamable $x8, implicit-def $x0, pcsections !0 :: (volatile load (s16) from %ir.ptr)1277  ; CHECK-NEXT:   renamable $w9 = ANDWri renamable $w0, 15, pcsections !01278  ; CHECK-NEXT:   dead $wzr = SUBSWrx killed renamable $w9, renamable $w1, 8, implicit-def $nzcv, pcsections !01279  ; CHECK-NEXT:   Bcc 1, %bb.3, implicit killed $nzcv, pcsections !01280  ; CHECK-NEXT: {{  $}}1281  ; CHECK-NEXT: bb.2.cmpxchg.trystore:1282  ; CHECK-NEXT:   successors: %bb.4(0x7ffff800), %bb.1(0x00000800) 1283  ; CHECK-NEXT:   liveins: $w1, $w2, $x0, $x81284  ; CHECK-NEXT: {{  $}}1285  ; CHECK-NEXT:   early-clobber renamable $w10 = STXRH renamable $w2, renamable $x8, pcsections !0 :: (volatile store (s16) into %ir.ptr) 1286  ; CHECK-NEXT:   renamable $w9 = MOVZWi 1, 01287  ; CHECK-NEXT:   CBNZW killed renamable $w10, %bb.11288  ; CHECK-NEXT:   B %bb.41289  ; CHECK-NEXT: {{  $}}1290  ; CHECK-NEXT: bb.3.cmpxchg.nostore:1291  ; CHECK-NEXT:   successors: %bb.4(0x80000000)1292  ; CHECK-NEXT:   liveins: $x01293  ; CHECK-NEXT: {{  $}}1294  ; CHECK-NEXT:   $w9 = ORRWrs $wzr, $wzr, 01295  ; CHECK-NEXT:   CLREX 15, pcsections !01296  ; CHECK-NEXT: {{  $}}1297  ; CHECK-NEXT: bb.4.cmpxchg.end:1298  ; CHECK-NEXT:   liveins: $w9, $x01299  ; CHECK-NEXT: {{  $}}1300  ; CHECK-NEXT:   $w0 = KILL renamable $w0, implicit killed $x01301  ; CHECK-NEXT:   $w1 = ORRWrs $wzr, killed $w9, 01302  ; CHECK-NEXT:   RET undef $lr, implicit $w0, implicit $w1 1303  %res = cmpxchg ptr %ptr, i16 %desired, i16 %new monotonic monotonic, !pcsections !01304  ret { i16, i1 } %res1305}1306 1307!0 = !{!"foo"}1308