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