1020 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-windows-pc-msvc -disable-post-ra -verify-machineinstrs < %s | FileCheck %s3 4@var8 = dso_local global i8 05@var16 = dso_local global i16 06@var32 = dso_local global i32 07@var64 = dso_local global i64 08 9define dso_local i8 @test_atomic_load_add_i8(i8 %offset) nounwind {10; CHECK-LABEL: test_atomic_load_add_i8:11; CHECK: // %bb.0:12; CHECK-NEXT: adrp x9, var813; CHECK-NEXT: add x9, x9, :lo12:var814; CHECK-NEXT: .LBB0_1: // %atomicrmw.start15; CHECK-NEXT: // =>This Inner Loop Header: Depth=116; CHECK-NEXT: ldaxrb w8, [x9]17; CHECK-NEXT: add w10, w8, w018; CHECK-NEXT: stlxrb w11, w10, [x9]19; CHECK-NEXT: cbnz w11, .LBB0_120; CHECK-NEXT: // %bb.2: // %atomicrmw.end21; CHECK-NEXT: mov w0, w822; CHECK-NEXT: dmb ish23; CHECK-NEXT: ret24 %old = atomicrmw add ptr @var8, i8 %offset seq_cst25 ret i8 %old26}27 28define dso_local i16 @test_atomic_load_add_i16(i16 %offset) nounwind {29; CHECK-LABEL: test_atomic_load_add_i16:30; CHECK: // %bb.0:31; CHECK-NEXT: adrp x9, var1632; CHECK-NEXT: add x9, x9, :lo12:var1633; CHECK-NEXT: .LBB1_1: // %atomicrmw.start34; CHECK-NEXT: // =>This Inner Loop Header: Depth=135; CHECK-NEXT: ldaxrh w8, [x9]36; CHECK-NEXT: add w10, w8, w037; CHECK-NEXT: stxrh w11, w10, [x9]38; CHECK-NEXT: cbnz w11, .LBB1_139; CHECK-NEXT: // %bb.2: // %atomicrmw.end40; CHECK-NEXT: mov w0, w841; CHECK-NEXT: ret42 %old = atomicrmw add ptr @var16, i16 %offset acquire43 ret i16 %old44}45 46define dso_local i32 @test_atomic_load_add_i32(i32 %offset) nounwind {47; CHECK-LABEL: test_atomic_load_add_i32:48; CHECK: // %bb.0:49; CHECK-NEXT: adrp x9, var3250; CHECK-NEXT: add x9, x9, :lo12:var3251; CHECK-NEXT: .LBB2_1: // %atomicrmw.start52; CHECK-NEXT: // =>This Inner Loop Header: Depth=153; CHECK-NEXT: ldxr w8, [x9]54; CHECK-NEXT: add w10, w8, w055; CHECK-NEXT: stlxr w11, w10, [x9]56; CHECK-NEXT: cbnz w11, .LBB2_157; CHECK-NEXT: // %bb.2: // %atomicrmw.end58; CHECK-NEXT: mov w0, w859; CHECK-NEXT: ret60 %old = atomicrmw add ptr @var32, i32 %offset release61 ret i32 %old62}63 64define dso_local i64 @test_atomic_load_add_i64(i64 %offset) nounwind {65; CHECK-LABEL: test_atomic_load_add_i64:66; CHECK: // %bb.0:67; CHECK-NEXT: adrp x9, var6468; CHECK-NEXT: add x9, x9, :lo12:var6469; CHECK-NEXT: .LBB3_1: // %atomicrmw.start70; CHECK-NEXT: // =>This Inner Loop Header: Depth=171; CHECK-NEXT: ldxr x8, [x9]72; CHECK-NEXT: add x10, x8, x073; CHECK-NEXT: stxr w11, x10, [x9]74; CHECK-NEXT: cbnz w11, .LBB3_175; CHECK-NEXT: // %bb.2: // %atomicrmw.end76; CHECK-NEXT: mov x0, x877; CHECK-NEXT: ret78 %old = atomicrmw add ptr @var64, i64 %offset monotonic79 ret i64 %old80}81 82define dso_local i8 @test_atomic_load_sub_i8(i8 %offset) nounwind {83; CHECK-LABEL: test_atomic_load_sub_i8:84; CHECK: // %bb.0:85; CHECK-NEXT: adrp x9, var886; CHECK-NEXT: add x9, x9, :lo12:var887; CHECK-NEXT: .LBB4_1: // %atomicrmw.start88; CHECK-NEXT: // =>This Inner Loop Header: Depth=189; CHECK-NEXT: ldxrb w8, [x9]90; CHECK-NEXT: sub w10, w8, w091; CHECK-NEXT: stxrb w11, w10, [x9]92; CHECK-NEXT: cbnz w11, .LBB4_193; CHECK-NEXT: // %bb.2: // %atomicrmw.end94; CHECK-NEXT: mov w0, w895; CHECK-NEXT: ret96 %old = atomicrmw sub ptr @var8, i8 %offset monotonic97 ret i8 %old98}99 100define dso_local i16 @test_atomic_load_sub_i16(i16 %offset) nounwind {101; CHECK-LABEL: test_atomic_load_sub_i16:102; CHECK: // %bb.0:103; CHECK-NEXT: adrp x9, var16104; CHECK-NEXT: add x9, x9, :lo12:var16105; CHECK-NEXT: .LBB5_1: // %atomicrmw.start106; CHECK-NEXT: // =>This Inner Loop Header: Depth=1107; CHECK-NEXT: ldxrh w8, [x9]108; CHECK-NEXT: sub w10, w8, w0109; CHECK-NEXT: stlxrh w11, w10, [x9]110; CHECK-NEXT: cbnz w11, .LBB5_1111; CHECK-NEXT: // %bb.2: // %atomicrmw.end112; CHECK-NEXT: mov w0, w8113; CHECK-NEXT: ret114 %old = atomicrmw sub ptr @var16, i16 %offset release115 ret i16 %old116}117 118define dso_local i32 @test_atomic_load_sub_i32(i32 %offset) nounwind {119; CHECK-LABEL: test_atomic_load_sub_i32:120; CHECK: // %bb.0:121; CHECK-NEXT: adrp x9, var32122; CHECK-NEXT: add x9, x9, :lo12:var32123; CHECK-NEXT: .LBB6_1: // %atomicrmw.start124; CHECK-NEXT: // =>This Inner Loop Header: Depth=1125; CHECK-NEXT: ldaxr w8, [x9]126; CHECK-NEXT: sub w10, w8, w0127; CHECK-NEXT: stxr w11, w10, [x9]128; CHECK-NEXT: cbnz w11, .LBB6_1129; CHECK-NEXT: // %bb.2: // %atomicrmw.end130; CHECK-NEXT: mov w0, w8131; CHECK-NEXT: ret132 %old = atomicrmw sub ptr @var32, i32 %offset acquire133 ret i32 %old134}135 136define dso_local i64 @test_atomic_load_sub_i64(i64 %offset) nounwind {137; CHECK-LABEL: test_atomic_load_sub_i64:138; CHECK: // %bb.0:139; CHECK-NEXT: mov x8, x0140; CHECK-NEXT: adrp x9, var64141; CHECK-NEXT: add x9, x9, :lo12:var64142; CHECK-NEXT: .LBB7_1: // %atomicrmw.start143; CHECK-NEXT: // =>This Inner Loop Header: Depth=1144; CHECK-NEXT: ldaxr x0, [x9]145; CHECK-NEXT: sub x10, x0, x8146; CHECK-NEXT: stlxr w11, x10, [x9]147; CHECK-NEXT: cbnz w11, .LBB7_1148; CHECK-NEXT: // %bb.2: // %atomicrmw.end149; CHECK-NEXT: dmb ish150; CHECK-NEXT: ret151 %old = atomicrmw sub ptr @var64, i64 %offset seq_cst152 ret i64 %old153}154 155define dso_local i8 @test_atomic_load_and_i8(i8 %offset) nounwind {156; CHECK-LABEL: test_atomic_load_and_i8:157; CHECK: // %bb.0:158; CHECK-NEXT: adrp x9, var8159; CHECK-NEXT: add x9, x9, :lo12:var8160; CHECK-NEXT: .LBB8_1: // %atomicrmw.start161; CHECK-NEXT: // =>This Inner Loop Header: Depth=1162; CHECK-NEXT: ldxrb w8, [x9]163; CHECK-NEXT: and w10, w8, w0164; CHECK-NEXT: stlxrb w11, w10, [x9]165; CHECK-NEXT: cbnz w11, .LBB8_1166; CHECK-NEXT: // %bb.2: // %atomicrmw.end167; CHECK-NEXT: mov w0, w8168; CHECK-NEXT: ret169 %old = atomicrmw and ptr @var8, i8 %offset release170 ret i8 %old171}172 173define dso_local i16 @test_atomic_load_and_i16(i16 %offset) nounwind {174; CHECK-LABEL: test_atomic_load_and_i16:175; CHECK: // %bb.0:176; CHECK-NEXT: adrp x9, var16177; CHECK-NEXT: add x9, x9, :lo12:var16178; CHECK-NEXT: .LBB9_1: // %atomicrmw.start179; CHECK-NEXT: // =>This Inner Loop Header: Depth=1180; CHECK-NEXT: ldxrh w8, [x9]181; CHECK-NEXT: and w10, w8, w0182; CHECK-NEXT: stxrh w11, w10, [x9]183; CHECK-NEXT: cbnz w11, .LBB9_1184; CHECK-NEXT: // %bb.2: // %atomicrmw.end185; CHECK-NEXT: mov w0, w8186; CHECK-NEXT: ret187 %old = atomicrmw and ptr @var16, i16 %offset monotonic188 ret i16 %old189}190 191define dso_local i32 @test_atomic_load_and_i32(i32 %offset) nounwind {192; CHECK-LABEL: test_atomic_load_and_i32:193; CHECK: // %bb.0:194; CHECK-NEXT: adrp x9, var32195; CHECK-NEXT: add x9, x9, :lo12:var32196; CHECK-NEXT: .LBB10_1: // %atomicrmw.start197; CHECK-NEXT: // =>This Inner Loop Header: Depth=1198; CHECK-NEXT: ldaxr w8, [x9]199; CHECK-NEXT: and w10, w8, w0200; CHECK-NEXT: stlxr w11, w10, [x9]201; CHECK-NEXT: cbnz w11, .LBB10_1202; CHECK-NEXT: // %bb.2: // %atomicrmw.end203; CHECK-NEXT: mov w0, w8204; CHECK-NEXT: dmb ish205; CHECK-NEXT: ret206 %old = atomicrmw and ptr @var32, i32 %offset seq_cst207 ret i32 %old208}209 210define dso_local i64 @test_atomic_load_and_i64(i64 %offset) nounwind {211; CHECK-LABEL: test_atomic_load_and_i64:212; CHECK: // %bb.0:213; CHECK-NEXT: adrp x9, var64214; CHECK-NEXT: add x9, x9, :lo12:var64215; CHECK-NEXT: .LBB11_1: // %atomicrmw.start216; CHECK-NEXT: // =>This Inner Loop Header: Depth=1217; CHECK-NEXT: ldaxr x8, [x9]218; CHECK-NEXT: and x10, x8, x0219; CHECK-NEXT: stxr w11, x10, [x9]220; CHECK-NEXT: cbnz w11, .LBB11_1221; CHECK-NEXT: // %bb.2: // %atomicrmw.end222; CHECK-NEXT: mov x0, x8223; CHECK-NEXT: ret224 %old = atomicrmw and ptr @var64, i64 %offset acquire225 ret i64 %old226}227 228define dso_local i8 @test_atomic_load_or_i8(i8 %offset) nounwind {229; CHECK-LABEL: test_atomic_load_or_i8:230; CHECK: // %bb.0:231; CHECK-NEXT: adrp x9, var8232; CHECK-NEXT: add x9, x9, :lo12:var8233; CHECK-NEXT: .LBB12_1: // %atomicrmw.start234; CHECK-NEXT: // =>This Inner Loop Header: Depth=1235; CHECK-NEXT: ldaxrb w8, [x9]236; CHECK-NEXT: orr w10, w8, w0237; CHECK-NEXT: stlxrb w11, w10, [x9]238; CHECK-NEXT: cbnz w11, .LBB12_1239; CHECK-NEXT: // %bb.2: // %atomicrmw.end240; CHECK-NEXT: mov w0, w8241; CHECK-NEXT: dmb ish242; CHECK-NEXT: ret243 %old = atomicrmw or ptr @var8, i8 %offset seq_cst244 ret i8 %old245}246 247define dso_local i16 @test_atomic_load_or_i16(i16 %offset) nounwind {248; CHECK-LABEL: test_atomic_load_or_i16:249; CHECK: // %bb.0:250; CHECK-NEXT: adrp x9, var16251; CHECK-NEXT: add x9, x9, :lo12:var16252; CHECK-NEXT: .LBB13_1: // %atomicrmw.start253; CHECK-NEXT: // =>This Inner Loop Header: Depth=1254; CHECK-NEXT: ldxrh w8, [x9]255; CHECK-NEXT: orr w10, w8, w0256; CHECK-NEXT: stxrh w11, w10, [x9]257; CHECK-NEXT: cbnz w11, .LBB13_1258; CHECK-NEXT: // %bb.2: // %atomicrmw.end259; CHECK-NEXT: mov w0, w8260; CHECK-NEXT: ret261 %old = atomicrmw or ptr @var16, i16 %offset monotonic262 ret i16 %old263}264 265define dso_local i32 @test_atomic_load_or_i32(i32 %offset) nounwind {266; CHECK-LABEL: test_atomic_load_or_i32:267; CHECK: // %bb.0:268; CHECK-NEXT: adrp x9, var32269; CHECK-NEXT: add x9, x9, :lo12:var32270; CHECK-NEXT: .LBB14_1: // %atomicrmw.start271; CHECK-NEXT: // =>This Inner Loop Header: Depth=1272; CHECK-NEXT: ldaxr w8, [x9]273; CHECK-NEXT: orr w10, w8, w0274; CHECK-NEXT: stxr w11, w10, [x9]275; CHECK-NEXT: cbnz w11, .LBB14_1276; CHECK-NEXT: // %bb.2: // %atomicrmw.end277; CHECK-NEXT: mov w0, w8278; CHECK-NEXT: ret279 %old = atomicrmw or ptr @var32, i32 %offset acquire280 ret i32 %old281}282 283define dso_local i64 @test_atomic_load_or_i64(i64 %offset) nounwind {284; CHECK-LABEL: test_atomic_load_or_i64:285; CHECK: // %bb.0:286; CHECK-NEXT: adrp x9, var64287; CHECK-NEXT: add x9, x9, :lo12:var64288; CHECK-NEXT: .LBB15_1: // %atomicrmw.start289; CHECK-NEXT: // =>This Inner Loop Header: Depth=1290; CHECK-NEXT: ldxr x8, [x9]291; CHECK-NEXT: orr x10, x8, x0292; CHECK-NEXT: stlxr w11, x10, [x9]293; CHECK-NEXT: cbnz w11, .LBB15_1294; CHECK-NEXT: // %bb.2: // %atomicrmw.end295; CHECK-NEXT: mov x0, x8296; CHECK-NEXT: ret297 %old = atomicrmw or ptr @var64, i64 %offset release298 ret i64 %old299}300 301define dso_local i8 @test_atomic_load_xor_i8(i8 %offset) nounwind {302; CHECK-LABEL: test_atomic_load_xor_i8:303; CHECK: // %bb.0:304; CHECK-NEXT: adrp x9, var8305; CHECK-NEXT: add x9, x9, :lo12:var8306; CHECK-NEXT: .LBB16_1: // %atomicrmw.start307; CHECK-NEXT: // =>This Inner Loop Header: Depth=1308; CHECK-NEXT: ldaxrb w8, [x9]309; CHECK-NEXT: eor w10, w8, w0310; CHECK-NEXT: stxrb w11, w10, [x9]311; CHECK-NEXT: cbnz w11, .LBB16_1312; CHECK-NEXT: // %bb.2: // %atomicrmw.end313; CHECK-NEXT: mov w0, w8314; CHECK-NEXT: ret315 %old = atomicrmw xor ptr @var8, i8 %offset acquire316 ret i8 %old317}318 319define dso_local i16 @test_atomic_load_xor_i16(i16 %offset) nounwind {320; CHECK-LABEL: test_atomic_load_xor_i16:321; CHECK: // %bb.0:322; CHECK-NEXT: adrp x9, var16323; CHECK-NEXT: add x9, x9, :lo12:var16324; CHECK-NEXT: .LBB17_1: // %atomicrmw.start325; CHECK-NEXT: // =>This Inner Loop Header: Depth=1326; CHECK-NEXT: ldxrh w8, [x9]327; CHECK-NEXT: eor w10, w8, w0328; CHECK-NEXT: stlxrh w11, w10, [x9]329; CHECK-NEXT: cbnz w11, .LBB17_1330; CHECK-NEXT: // %bb.2: // %atomicrmw.end331; CHECK-NEXT: mov w0, w8332; CHECK-NEXT: ret333 %old = atomicrmw xor ptr @var16, i16 %offset release334 ret i16 %old335}336 337define dso_local i32 @test_atomic_load_xor_i32(i32 %offset) nounwind {338; CHECK-LABEL: test_atomic_load_xor_i32:339; CHECK: // %bb.0:340; CHECK-NEXT: adrp x9, var32341; CHECK-NEXT: add x9, x9, :lo12:var32342; CHECK-NEXT: .LBB18_1: // %atomicrmw.start343; CHECK-NEXT: // =>This Inner Loop Header: Depth=1344; CHECK-NEXT: ldaxr w8, [x9]345; CHECK-NEXT: eor w10, w8, w0346; CHECK-NEXT: stlxr w11, w10, [x9]347; CHECK-NEXT: cbnz w11, .LBB18_1348; CHECK-NEXT: // %bb.2: // %atomicrmw.end349; CHECK-NEXT: mov w0, w8350; CHECK-NEXT: dmb ish351; CHECK-NEXT: ret352 %old = atomicrmw xor ptr @var32, i32 %offset seq_cst353 ret i32 %old354}355 356define dso_local i64 @test_atomic_load_xor_i64(i64 %offset) nounwind {357; CHECK-LABEL: test_atomic_load_xor_i64:358; CHECK: // %bb.0:359; CHECK-NEXT: adrp x9, var64360; CHECK-NEXT: add x9, x9, :lo12:var64361; CHECK-NEXT: .LBB19_1: // %atomicrmw.start362; CHECK-NEXT: // =>This Inner Loop Header: Depth=1363; CHECK-NEXT: ldxr x8, [x9]364; CHECK-NEXT: eor x10, x8, x0365; CHECK-NEXT: stxr w11, x10, [x9]366; CHECK-NEXT: cbnz w11, .LBB19_1367; CHECK-NEXT: // %bb.2: // %atomicrmw.end368; CHECK-NEXT: mov x0, x8369; CHECK-NEXT: ret370 %old = atomicrmw xor ptr @var64, i64 %offset monotonic371 ret i64 %old372}373 374define dso_local i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind {375; CHECK-LABEL: test_atomic_load_xchg_i8:376; CHECK: // %bb.0:377; CHECK-NEXT: adrp x9, var8378; CHECK-NEXT: add x9, x9, :lo12:var8379; CHECK-NEXT: .LBB20_1: // %atomicrmw.start380; CHECK-NEXT: // =>This Inner Loop Header: Depth=1381; CHECK-NEXT: ldxrb w8, [x9]382; CHECK-NEXT: stxrb w10, w0, [x9]383; CHECK-NEXT: cbnz w10, .LBB20_1384; CHECK-NEXT: // %bb.2: // %atomicrmw.end385; CHECK-NEXT: mov w0, w8386; CHECK-NEXT: ret387 %old = atomicrmw xchg ptr @var8, i8 %offset monotonic388 ret i8 %old389}390 391define dso_local i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind {392; CHECK-LABEL: test_atomic_load_xchg_i16:393; CHECK: // %bb.0:394; CHECK-NEXT: mov w8, w0395; CHECK-NEXT: adrp x9, var16396; CHECK-NEXT: add x9, x9, :lo12:var16397; CHECK-NEXT: .LBB21_1: // %atomicrmw.start398; CHECK-NEXT: // =>This Inner Loop Header: Depth=1399; CHECK-NEXT: ldaxrh w0, [x9]400; CHECK-NEXT: stlxrh w10, w8, [x9]401; CHECK-NEXT: cbnz w10, .LBB21_1402; CHECK-NEXT: // %bb.2: // %atomicrmw.end403; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0404; CHECK-NEXT: dmb ish405; CHECK-NEXT: ret406 %old = atomicrmw xchg ptr @var16, i16 %offset seq_cst407 ret i16 %old408}409 410define dso_local i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind {411; CHECK-LABEL: test_atomic_load_xchg_i32:412; CHECK: // %bb.0:413; CHECK-NEXT: mov w8, w0414; CHECK-NEXT: adrp x9, var32415; CHECK-NEXT: add x9, x9, :lo12:var32416; CHECK-NEXT: .LBB22_1: // %atomicrmw.start417; CHECK-NEXT: // =>This Inner Loop Header: Depth=1418; CHECK-NEXT: ldxr w0, [x9]419; CHECK-NEXT: stlxr w10, w8, [x9]420; CHECK-NEXT: cbnz w10, .LBB22_1421; CHECK-NEXT: // %bb.2: // %atomicrmw.end422; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0423; CHECK-NEXT: ret424 %old = atomicrmw xchg ptr @var32, i32 %offset release425 ret i32 %old426}427 428define dso_local i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind {429; CHECK-LABEL: test_atomic_load_xchg_i64:430; CHECK: // %bb.0:431; CHECK-NEXT: adrp x9, var64432; CHECK-NEXT: add x9, x9, :lo12:var64433; CHECK-NEXT: .LBB23_1: // %atomicrmw.start434; CHECK-NEXT: // =>This Inner Loop Header: Depth=1435; CHECK-NEXT: ldaxr x8, [x9]436; CHECK-NEXT: stxr w10, x0, [x9]437; CHECK-NEXT: cbnz w10, .LBB23_1438; CHECK-NEXT: // %bb.2: // %atomicrmw.end439; CHECK-NEXT: mov x0, x8440; CHECK-NEXT: ret441 %old = atomicrmw xchg ptr @var64, i64 %offset acquire442 ret i64 %old443}444 445 446define dso_local i8 @test_atomic_load_min_i8(i8 %offset) nounwind {447; CHECK-LABEL: test_atomic_load_min_i8:448; CHECK: // %bb.0:449; CHECK-NEXT: adrp x9, var8450; CHECK-NEXT: add x9, x9, :lo12:var8451; CHECK-NEXT: .LBB24_1: // %atomicrmw.start452; CHECK-NEXT: // =>This Inner Loop Header: Depth=1453; CHECK-NEXT: ldaxrb w10, [x9]454; CHECK-NEXT: sxtb w8, w10455; CHECK-NEXT: cmp w8, w0, sxtb456; CHECK-NEXT: csel w10, w10, w0, le457; CHECK-NEXT: stxrb w11, w10, [x9]458; CHECK-NEXT: cbnz w11, .LBB24_1459; CHECK-NEXT: // %bb.2: // %atomicrmw.end460; CHECK-NEXT: mov w0, w8461; CHECK-NEXT: ret462 %old = atomicrmw min ptr @var8, i8 %offset acquire463 ret i8 %old464}465 466define dso_local i16 @test_atomic_load_min_i16(i16 %offset) nounwind {467; CHECK-LABEL: test_atomic_load_min_i16:468; CHECK: // %bb.0:469; CHECK-NEXT: adrp x9, var16470; CHECK-NEXT: add x9, x9, :lo12:var16471; CHECK-NEXT: .LBB25_1: // %atomicrmw.start472; CHECK-NEXT: // =>This Inner Loop Header: Depth=1473; CHECK-NEXT: ldxrh w10, [x9]474; CHECK-NEXT: sxth w8, w10475; CHECK-NEXT: cmp w8, w0, sxth476; CHECK-NEXT: csel w10, w10, w0, le477; CHECK-NEXT: stlxrh w11, w10, [x9]478; CHECK-NEXT: cbnz w11, .LBB25_1479; CHECK-NEXT: // %bb.2: // %atomicrmw.end480; CHECK-NEXT: mov w0, w8481; CHECK-NEXT: ret482 %old = atomicrmw min ptr @var16, i16 %offset release483 ret i16 %old484}485 486define dso_local i32 @test_atomic_load_min_i32(i32 %offset) nounwind {487; CHECK-LABEL: test_atomic_load_min_i32:488; CHECK: // %bb.0:489; CHECK-NEXT: adrp x9, var32490; CHECK-NEXT: add x9, x9, :lo12:var32491; CHECK-NEXT: .LBB26_1: // %atomicrmw.start492; CHECK-NEXT: // =>This Inner Loop Header: Depth=1493; CHECK-NEXT: ldxr w8, [x9]494; CHECK-NEXT: cmp w8, w0495; CHECK-NEXT: csel w10, w8, w0, le496; CHECK-NEXT: stxr w11, w10, [x9]497; CHECK-NEXT: cbnz w11, .LBB26_1498; CHECK-NEXT: // %bb.2: // %atomicrmw.end499; CHECK-NEXT: mov w0, w8500; CHECK-NEXT: ret501 %old = atomicrmw min ptr @var32, i32 %offset monotonic502 ret i32 %old503}504 505define dso_local i64 @test_atomic_load_min_i64(i64 %offset) nounwind {506; CHECK-LABEL: test_atomic_load_min_i64:507; CHECK: // %bb.0:508; CHECK-NEXT: mov x8, x0509; CHECK-NEXT: adrp x9, var64510; CHECK-NEXT: add x9, x9, :lo12:var64511; CHECK-NEXT: .LBB27_1: // %atomicrmw.start512; CHECK-NEXT: // =>This Inner Loop Header: Depth=1513; CHECK-NEXT: ldaxr x0, [x9]514; CHECK-NEXT: cmp x0, x8515; CHECK-NEXT: csel x10, x0, x8, le516; CHECK-NEXT: stlxr w11, x10, [x9]517; CHECK-NEXT: cbnz w11, .LBB27_1518; CHECK-NEXT: // %bb.2: // %atomicrmw.end519; CHECK-NEXT: dmb ish520; CHECK-NEXT: ret521 %old = atomicrmw min ptr @var64, i64 %offset seq_cst522 ret i64 %old523}524 525define dso_local i8 @test_atomic_load_max_i8(i8 %offset) nounwind {526; CHECK-LABEL: test_atomic_load_max_i8:527; CHECK: // %bb.0:528; CHECK-NEXT: adrp x9, var8529; CHECK-NEXT: add x9, x9, :lo12:var8530; CHECK-NEXT: .LBB28_1: // %atomicrmw.start531; CHECK-NEXT: // =>This Inner Loop Header: Depth=1532; CHECK-NEXT: ldaxrb w10, [x9]533; CHECK-NEXT: sxtb w8, w10534; CHECK-NEXT: cmp w8, w0, sxtb535; CHECK-NEXT: csel w10, w10, w0, gt536; CHECK-NEXT: stlxrb w11, w10, [x9]537; CHECK-NEXT: cbnz w11, .LBB28_1538; CHECK-NEXT: // %bb.2: // %atomicrmw.end539; CHECK-NEXT: mov w0, w8540; CHECK-NEXT: dmb ish541; CHECK-NEXT: ret542 %old = atomicrmw max ptr @var8, i8 %offset seq_cst543 ret i8 %old544}545 546define dso_local i16 @test_atomic_load_max_i16(i16 %offset) nounwind {547; CHECK-LABEL: test_atomic_load_max_i16:548; CHECK: // %bb.0:549; CHECK-NEXT: adrp x9, var16550; CHECK-NEXT: add x9, x9, :lo12:var16551; CHECK-NEXT: .LBB29_1: // %atomicrmw.start552; CHECK-NEXT: // =>This Inner Loop Header: Depth=1553; CHECK-NEXT: ldaxrh w10, [x9]554; CHECK-NEXT: sxth w8, w10555; CHECK-NEXT: cmp w8, w0, sxth556; CHECK-NEXT: csel w10, w10, w0, gt557; CHECK-NEXT: stxrh w11, w10, [x9]558; CHECK-NEXT: cbnz w11, .LBB29_1559; CHECK-NEXT: // %bb.2: // %atomicrmw.end560; CHECK-NEXT: mov w0, w8561; CHECK-NEXT: ret562 %old = atomicrmw max ptr @var16, i16 %offset acquire563 ret i16 %old564}565 566define dso_local i32 @test_atomic_load_max_i32(i32 %offset) nounwind {567; CHECK-LABEL: test_atomic_load_max_i32:568; CHECK: // %bb.0:569; CHECK-NEXT: adrp x9, var32570; CHECK-NEXT: add x9, x9, :lo12:var32571; CHECK-NEXT: .LBB30_1: // %atomicrmw.start572; CHECK-NEXT: // =>This Inner Loop Header: Depth=1573; CHECK-NEXT: ldxr w8, [x9]574; CHECK-NEXT: cmp w8, w0575; CHECK-NEXT: csel w10, w8, w0, gt576; CHECK-NEXT: stlxr w11, w10, [x9]577; CHECK-NEXT: cbnz w11, .LBB30_1578; CHECK-NEXT: // %bb.2: // %atomicrmw.end579; CHECK-NEXT: mov w0, w8580; CHECK-NEXT: ret581 %old = atomicrmw max ptr @var32, i32 %offset release582 ret i32 %old583}584 585define dso_local i64 @test_atomic_load_max_i64(i64 %offset) nounwind {586; CHECK-LABEL: test_atomic_load_max_i64:587; CHECK: // %bb.0:588; CHECK-NEXT: adrp x9, var64589; CHECK-NEXT: add x9, x9, :lo12:var64590; CHECK-NEXT: .LBB31_1: // %atomicrmw.start591; CHECK-NEXT: // =>This Inner Loop Header: Depth=1592; CHECK-NEXT: ldxr x8, [x9]593; CHECK-NEXT: cmp x8, x0594; CHECK-NEXT: csel x10, x8, x0, gt595; CHECK-NEXT: stxr w11, x10, [x9]596; CHECK-NEXT: cbnz w11, .LBB31_1597; CHECK-NEXT: // %bb.2: // %atomicrmw.end598; CHECK-NEXT: mov x0, x8599; CHECK-NEXT: ret600 %old = atomicrmw max ptr @var64, i64 %offset monotonic601 ret i64 %old602}603 604define dso_local i8 @test_atomic_load_umin_i8(i8 %offset) nounwind {605; CHECK-LABEL: test_atomic_load_umin_i8:606; CHECK: // %bb.0:607; CHECK-NEXT: adrp x8, var8608; CHECK-NEXT: add x8, x8, :lo12:var8609; CHECK-NEXT: and w9, w0, #0xff610; CHECK-NEXT: .LBB32_1: // %atomicrmw.start611; CHECK-NEXT: // =>This Inner Loop Header: Depth=1612; CHECK-NEXT: ldxrb w0, [x8]613; CHECK-NEXT: cmp w0, w9614; CHECK-NEXT: csel w10, w0, w9, ls615; CHECK-NEXT: stxrb w11, w10, [x8]616; CHECK-NEXT: cbnz w11, .LBB32_1617; CHECK-NEXT: // %bb.2: // %atomicrmw.end618; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0619; CHECK-NEXT: ret620 %old = atomicrmw umin ptr @var8, i8 %offset monotonic621 ret i8 %old622}623 624define dso_local i16 @test_atomic_load_umin_i16(i16 %offset) nounwind {625; CHECK-LABEL: test_atomic_load_umin_i16:626; CHECK: // %bb.0:627; CHECK-NEXT: adrp x8, var16628; CHECK-NEXT: add x8, x8, :lo12:var16629; CHECK-NEXT: and w9, w0, #0xffff630; CHECK-NEXT: .LBB33_1: // %atomicrmw.start631; CHECK-NEXT: // =>This Inner Loop Header: Depth=1632; CHECK-NEXT: ldaxrh w0, [x8]633; CHECK-NEXT: cmp w0, w9634; CHECK-NEXT: csel w10, w0, w9, ls635; CHECK-NEXT: stxrh w11, w10, [x8]636; CHECK-NEXT: cbnz w11, .LBB33_1637; CHECK-NEXT: // %bb.2: // %atomicrmw.end638; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0639; CHECK-NEXT: ret640 %old = atomicrmw umin ptr @var16, i16 %offset acquire641 ret i16 %old642}643 644define dso_local i32 @test_atomic_load_umin_i32(i32 %offset) nounwind {645; CHECK-LABEL: test_atomic_load_umin_i32:646; CHECK: // %bb.0:647; CHECK-NEXT: adrp x9, var32648; CHECK-NEXT: add x9, x9, :lo12:var32649; CHECK-NEXT: .LBB34_1: // %atomicrmw.start650; CHECK-NEXT: // =>This Inner Loop Header: Depth=1651; CHECK-NEXT: ldaxr w8, [x9]652; CHECK-NEXT: cmp w8, w0653; CHECK-NEXT: csel w10, w8, w0, ls654; CHECK-NEXT: stlxr w11, w10, [x9]655; CHECK-NEXT: cbnz w11, .LBB34_1656; CHECK-NEXT: // %bb.2: // %atomicrmw.end657; CHECK-NEXT: mov w0, w8658; CHECK-NEXT: dmb ish659; CHECK-NEXT: ret660 %old = atomicrmw umin ptr @var32, i32 %offset seq_cst661 ret i32 %old662}663 664define dso_local i64 @test_atomic_load_umin_i64(i64 %offset) nounwind {665; CHECK-LABEL: test_atomic_load_umin_i64:666; CHECK: // %bb.0:667; CHECK-NEXT: adrp x9, var64668; CHECK-NEXT: add x9, x9, :lo12:var64669; CHECK-NEXT: .LBB35_1: // %atomicrmw.start670; CHECK-NEXT: // =>This Inner Loop Header: Depth=1671; CHECK-NEXT: ldaxr x8, [x9]672; CHECK-NEXT: cmp x8, x0673; CHECK-NEXT: csel x10, x8, x0, ls674; CHECK-NEXT: stlxr w11, x10, [x9]675; CHECK-NEXT: cbnz w11, .LBB35_1676; CHECK-NEXT: // %bb.2: // %atomicrmw.end677; CHECK-NEXT: mov x0, x8678; CHECK-NEXT: ret679 %old = atomicrmw umin ptr @var64, i64 %offset acq_rel680 ret i64 %old681}682 683define dso_local i8 @test_atomic_load_umax_i8(i8 %offset) nounwind {684; CHECK-LABEL: test_atomic_load_umax_i8:685; CHECK: // %bb.0:686; CHECK-NEXT: adrp x8, var8687; CHECK-NEXT: add x8, x8, :lo12:var8688; CHECK-NEXT: and w9, w0, #0xff689; CHECK-NEXT: .LBB36_1: // %atomicrmw.start690; CHECK-NEXT: // =>This Inner Loop Header: Depth=1691; CHECK-NEXT: ldaxrb w0, [x8]692; CHECK-NEXT: cmp w0, w9693; CHECK-NEXT: csel w10, w0, w9, hi694; CHECK-NEXT: stlxrb w11, w10, [x8]695; CHECK-NEXT: cbnz w11, .LBB36_1696; CHECK-NEXT: // %bb.2: // %atomicrmw.end697; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0698; CHECK-NEXT: ret699 %old = atomicrmw umax ptr @var8, i8 %offset acq_rel700 ret i8 %old701}702 703define dso_local i16 @test_atomic_load_umax_i16(i16 %offset) nounwind {704; CHECK-LABEL: test_atomic_load_umax_i16:705; CHECK: // %bb.0:706; CHECK-NEXT: adrp x8, var16707; CHECK-NEXT: add x8, x8, :lo12:var16708; CHECK-NEXT: and w9, w0, #0xffff709; CHECK-NEXT: .LBB37_1: // %atomicrmw.start710; CHECK-NEXT: // =>This Inner Loop Header: Depth=1711; CHECK-NEXT: ldxrh w0, [x8]712; CHECK-NEXT: cmp w0, w9713; CHECK-NEXT: csel w10, w0, w9, hi714; CHECK-NEXT: stxrh w11, w10, [x8]715; CHECK-NEXT: cbnz w11, .LBB37_1716; CHECK-NEXT: // %bb.2: // %atomicrmw.end717; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0718; CHECK-NEXT: ret719 %old = atomicrmw umax ptr @var16, i16 %offset monotonic720 ret i16 %old721}722 723define dso_local i32 @test_atomic_load_umax_i32(i32 %offset) nounwind {724; CHECK-LABEL: test_atomic_load_umax_i32:725; CHECK: // %bb.0:726; CHECK-NEXT: adrp x9, var32727; CHECK-NEXT: add x9, x9, :lo12:var32728; CHECK-NEXT: .LBB38_1: // %atomicrmw.start729; CHECK-NEXT: // =>This Inner Loop Header: Depth=1730; CHECK-NEXT: ldaxr w8, [x9]731; CHECK-NEXT: cmp w8, w0732; CHECK-NEXT: csel w10, w8, w0, hi733; CHECK-NEXT: stlxr w11, w10, [x9]734; CHECK-NEXT: cbnz w11, .LBB38_1735; CHECK-NEXT: // %bb.2: // %atomicrmw.end736; CHECK-NEXT: mov w0, w8737; CHECK-NEXT: dmb ish738; CHECK-NEXT: ret739 %old = atomicrmw umax ptr @var32, i32 %offset seq_cst740 ret i32 %old741}742 743define dso_local i64 @test_atomic_load_umax_i64(i64 %offset) nounwind {744; CHECK-LABEL: test_atomic_load_umax_i64:745; CHECK: // %bb.0:746; CHECK-NEXT: adrp x9, var64747; CHECK-NEXT: add x9, x9, :lo12:var64748; CHECK-NEXT: .LBB39_1: // %atomicrmw.start749; CHECK-NEXT: // =>This Inner Loop Header: Depth=1750; CHECK-NEXT: ldxr x8, [x9]751; CHECK-NEXT: cmp x8, x0752; CHECK-NEXT: csel x10, x8, x0, hi753; CHECK-NEXT: stlxr w11, x10, [x9]754; CHECK-NEXT: cbnz w11, .LBB39_1755; CHECK-NEXT: // %bb.2: // %atomicrmw.end756; CHECK-NEXT: mov x0, x8757; CHECK-NEXT: ret758 %old = atomicrmw umax ptr @var64, i64 %offset release759 ret i64 %old760}761 762define dso_local i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind {763; CHECK-LABEL: test_atomic_cmpxchg_i8:764; CHECK: // %bb.0:765; CHECK-NEXT: and w8, w0, #0xff766; CHECK-NEXT: adrp x9, var8767; CHECK-NEXT: add x9, x9, :lo12:var8768; CHECK-NEXT: .LBB40_1: // %cmpxchg.start769; CHECK-NEXT: // =>This Inner Loop Header: Depth=1770; CHECK-NEXT: ldaxrb w0, [x9]771; CHECK-NEXT: cmp w0, w8772; CHECK-NEXT: b.ne .LBB40_4773; CHECK-NEXT: // %bb.2: // %cmpxchg.trystore774; CHECK-NEXT: // in Loop: Header=BB40_1 Depth=1775; CHECK-NEXT: stxrb w10, w1, [x9]776; CHECK-NEXT: cbnz w10, .LBB40_1777; CHECK-NEXT: // %bb.3: // %cmpxchg.end778; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0779; CHECK-NEXT: ret780; CHECK-NEXT: .LBB40_4: // %cmpxchg.nostore781; CHECK-NEXT: clrex782; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0783; CHECK-NEXT: ret784 %pair = cmpxchg ptr @var8, i8 %wanted, i8 %new acquire acquire785 %old = extractvalue { i8, i1 } %pair, 0786 ret i8 %old787}788 789define dso_local i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind {790; CHECK-LABEL: test_atomic_cmpxchg_i16:791; CHECK: // %bb.0:792; CHECK-NEXT: and w8, w0, #0xffff793; CHECK-NEXT: adrp x9, var16794; CHECK-NEXT: add x9, x9, :lo12:var16795; CHECK-NEXT: .LBB41_1: // %cmpxchg.start796; CHECK-NEXT: // =>This Inner Loop Header: Depth=1797; CHECK-NEXT: ldaxrh w0, [x9]798; CHECK-NEXT: cmp w0, w8799; CHECK-NEXT: b.ne .LBB41_4800; CHECK-NEXT: // %bb.2: // %cmpxchg.trystore801; CHECK-NEXT: // in Loop: Header=BB41_1 Depth=1802; CHECK-NEXT: stlxrh w10, w1, [x9]803; CHECK-NEXT: cbnz w10, .LBB41_1804; CHECK-NEXT: // %bb.3: // %cmpxchg.success805; CHECK-NEXT: dmb ish806; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0807; CHECK-NEXT: ret808; CHECK-NEXT: .LBB41_4: // %cmpxchg.nostore809; CHECK-NEXT: clrex810; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0811; CHECK-NEXT: ret812 %pair = cmpxchg ptr @var16, i16 %wanted, i16 %new seq_cst seq_cst813 %old = extractvalue { i16, i1 } %pair, 0814 ret i16 %old815}816 817define dso_local i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind {818; CHECK-LABEL: test_atomic_cmpxchg_i32:819; CHECK: // %bb.0:820; CHECK-NEXT: mov w8, w0821; CHECK-NEXT: adrp x9, var32822; CHECK-NEXT: add x9, x9, :lo12:var32823; CHECK-NEXT: .LBB42_1: // %cmpxchg.start824; CHECK-NEXT: // =>This Inner Loop Header: Depth=1825; CHECK-NEXT: ldxr w0, [x9]826; CHECK-NEXT: cmp w0, w8827; CHECK-NEXT: b.ne .LBB42_4828; CHECK-NEXT: // %bb.2: // %cmpxchg.trystore829; CHECK-NEXT: // in Loop: Header=BB42_1 Depth=1830; CHECK-NEXT: stlxr w10, w1, [x9]831; CHECK-NEXT: cbnz w10, .LBB42_1832; CHECK-NEXT: // %bb.3: // %cmpxchg.end833; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0834; CHECK-NEXT: ret835; CHECK-NEXT: .LBB42_4: // %cmpxchg.nostore836; CHECK-NEXT: clrex837; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0838; CHECK-NEXT: ret839 %pair = cmpxchg ptr @var32, i32 %wanted, i32 %new release monotonic840 %old = extractvalue { i32, i1 } %pair, 0841 ret i32 %old842}843 844define dso_local void @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind {845; CHECK-LABEL: test_atomic_cmpxchg_i64:846; CHECK: // %bb.0:847; CHECK-NEXT: adrp x9, var64848; CHECK-NEXT: add x9, x9, :lo12:var64849; CHECK-NEXT: .LBB43_1: // %cmpxchg.start850; CHECK-NEXT: // =>This Inner Loop Header: Depth=1851; CHECK-NEXT: ldxr x8, [x9]852; CHECK-NEXT: cmp x8, x0853; CHECK-NEXT: b.ne .LBB43_4854; CHECK-NEXT: // %bb.2: // %cmpxchg.trystore855; CHECK-NEXT: // in Loop: Header=BB43_1 Depth=1856; CHECK-NEXT: stxr w10, x1, [x9]857; CHECK-NEXT: cbnz w10, .LBB43_1858; CHECK-NEXT: .LBB43_3: // %cmpxchg.end859; CHECK-NEXT: adrp x9, var64860; CHECK-NEXT: str x8, [x9, :lo12:var64]861; CHECK-NEXT: ret862; CHECK-NEXT: .LBB43_4: // %cmpxchg.nostore863; CHECK-NEXT: clrex864; CHECK-NEXT: b .LBB43_3865 %pair = cmpxchg ptr @var64, i64 %wanted, i64 %new monotonic monotonic866 %old = extractvalue { i64, i1 } %pair, 0867 store i64 %old, ptr @var64868 ret void869}870 871define dso_local i8 @test_atomic_load_monotonic_i8() nounwind {872; CHECK-LABEL: test_atomic_load_monotonic_i8:873; CHECK: // %bb.0:874; CHECK-NEXT: adrp x8, var8875; CHECK-NEXT: ldrb w0, [x8, :lo12:var8]876; CHECK-NEXT: ret877 %val = load atomic i8, ptr @var8 monotonic, align 1878 ret i8 %val879}880 881define dso_local i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind {882; CHECK-LABEL: test_atomic_load_monotonic_regoff_i8:883; CHECK: // %bb.0:884; CHECK-NEXT: ldrb w0, [x0, x1]885; CHECK-NEXT: ret886 %addr_int = add i64 %base, %off887 %addr = inttoptr i64 %addr_int to ptr888 %val = load atomic i8, ptr %addr monotonic, align 1889 ret i8 %val890}891 892define dso_local i8 @test_atomic_load_acquire_i8() nounwind {893; CHECK-LABEL: test_atomic_load_acquire_i8:894; CHECK: // %bb.0:895; CHECK-NEXT: adrp x8, var8896; CHECK-NEXT: add x8, x8, :lo12:var8897; CHECK-NEXT: ldarb w0, [x8]898; CHECK-NEXT: ret899 %val = load atomic i8, ptr @var8 acquire, align 1900 ret i8 %val901}902 903define dso_local i8 @test_atomic_load_seq_cst_i8() nounwind {904; CHECK-LABEL: test_atomic_load_seq_cst_i8:905; CHECK: // %bb.0:906; CHECK-NEXT: adrp x8, var8907; CHECK-NEXT: add x8, x8, :lo12:var8908; CHECK-NEXT: ldarb w0, [x8]909; CHECK-NEXT: ret910 %val = load atomic i8, ptr @var8 seq_cst, align 1911 ret i8 %val912}913 914define dso_local i16 @test_atomic_load_monotonic_i16() nounwind {915; CHECK-LABEL: test_atomic_load_monotonic_i16:916; CHECK: // %bb.0:917; CHECK-NEXT: adrp x8, var16918; CHECK-NEXT: ldrh w0, [x8, :lo12:var16]919; CHECK-NEXT: ret920 %val = load atomic i16, ptr @var16 monotonic, align 2921 ret i16 %val922}923 924define dso_local i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind {925; CHECK-LABEL: test_atomic_load_monotonic_regoff_i32:926; CHECK: // %bb.0:927; CHECK-NEXT: ldr w0, [x0, x1]928; CHECK-NEXT: ret929 %addr_int = add i64 %base, %off930 %addr = inttoptr i64 %addr_int to ptr931 %val = load atomic i32, ptr %addr monotonic, align 4932 ret i32 %val933}934 935define dso_local i64 @test_atomic_load_seq_cst_i64() nounwind {936; CHECK-LABEL: test_atomic_load_seq_cst_i64:937; CHECK: // %bb.0:938; CHECK-NEXT: adrp x8, var64939; CHECK-NEXT: add x8, x8, :lo12:var64940; CHECK-NEXT: ldar x0, [x8]941; CHECK-NEXT: ret942 %val = load atomic i64, ptr @var64 seq_cst, align 8943 ret i64 %val944}945 946define dso_local void @test_atomic_store_monotonic_i8(i8 %val) nounwind {947; CHECK-LABEL: test_atomic_store_monotonic_i8:948; CHECK: // %bb.0:949; CHECK-NEXT: adrp x8, var8950; CHECK-NEXT: strb w0, [x8, :lo12:var8]951; CHECK-NEXT: ret952 store atomic i8 %val, ptr @var8 monotonic, align 1953 ret void954}955 956define dso_local void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind {957; CHECK-LABEL: test_atomic_store_monotonic_regoff_i8:958; CHECK: // %bb.0:959; CHECK-NEXT: strb w2, [x0, x1]960; CHECK-NEXT: ret961 %addr_int = add i64 %base, %off962 %addr = inttoptr i64 %addr_int to ptr963 store atomic i8 %val, ptr %addr monotonic, align 1964 ret void965}966define dso_local void @test_atomic_store_release_i8(i8 %val) nounwind {967; CHECK-LABEL: test_atomic_store_release_i8:968; CHECK: // %bb.0:969; CHECK-NEXT: adrp x8, var8970; CHECK-NEXT: add x8, x8, :lo12:var8971; CHECK-NEXT: stlrb w0, [x8]972; CHECK-NEXT: ret973 store atomic i8 %val, ptr @var8 release, align 1974 ret void975}976 977define dso_local void @test_atomic_store_seq_cst_i8(i8 %val) nounwind {978; CHECK-LABEL: test_atomic_store_seq_cst_i8:979; CHECK: // %bb.0:980; CHECK-NEXT: adrp x8, var8981; CHECK-NEXT: add x8, x8, :lo12:var8982; CHECK-NEXT: stlrb w0, [x8]983; CHECK-NEXT: dmb ish984; CHECK-NEXT: ret985 store atomic i8 %val, ptr @var8 seq_cst, align 1986 ret void987}988 989define dso_local void @test_atomic_store_monotonic_i16(i16 %val) nounwind {990; CHECK-LABEL: test_atomic_store_monotonic_i16:991; CHECK: // %bb.0:992; CHECK-NEXT: adrp x8, var16993; CHECK-NEXT: strh w0, [x8, :lo12:var16]994; CHECK-NEXT: ret995 store atomic i16 %val, ptr @var16 monotonic, align 2996 ret void997}998 999define dso_local void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind {1000; CHECK-LABEL: test_atomic_store_monotonic_regoff_i32:1001; CHECK: // %bb.0:1002; CHECK-NEXT: str w2, [x0, x1]1003; CHECK-NEXT: ret1004 %addr_int = add i64 %base, %off1005 %addr = inttoptr i64 %addr_int to ptr1006 store atomic i32 %val, ptr %addr monotonic, align 41007 ret void1008}1009 1010define dso_local void @test_atomic_store_release_i64(i64 %val) nounwind {1011; CHECK-LABEL: test_atomic_store_release_i64:1012; CHECK: // %bb.0:1013; CHECK-NEXT: adrp x8, var641014; CHECK-NEXT: add x8, x8, :lo12:var641015; CHECK-NEXT: stlr x0, [x8]1016; CHECK-NEXT: ret1017 store atomic i64 %val, ptr @var64 release, align 81018 ret void1019}1020