6652 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-NOLSE,CHECK-NOLSE-O13; RUN: llc < %s -mtriple=arm64-apple-ios -mattr=+outline-atomics -global-isel -global-isel-abort=1 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-OUTLINE,CHECK-OUTLINE-O14; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-NOLSE,CHECK-NOLSE-O05; RUN: llc < %s -mtriple=arm64-apple-ios -mattr=+outline-atomics -global-isel -global-isel-abort=1 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-OUTLINE,CHECK-OUTLINE-O06; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mcpu=apple-a13 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O17; RUN: llc < %s -mtriple=arm64-apple-ios -mattr=+outline-atomics -global-isel -global-isel-abort=1 -mcpu=apple-a13 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O18; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mcpu=apple-a13 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O09; RUN: llc < %s -mtriple=arm64-apple-ios -mattr=+outline-atomics -global-isel -global-isel-abort=1 -mcpu=apple-a13 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O010 11define i32 @val_compare_and_swap(ptr %p, i32 %cmp, i32 %new) #0 {12; CHECK-NOLSE-O1-LABEL: val_compare_and_swap:13; CHECK-NOLSE-O1: ; %bb.0:14; CHECK-NOLSE-O1-NEXT: LBB0_1: ; %cmpxchg.start15; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=116; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]17; CHECK-NOLSE-O1-NEXT: cmp w8, w118; CHECK-NOLSE-O1-NEXT: b.ne LBB0_419; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore20; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB0_1 Depth=121; CHECK-NOLSE-O1-NEXT: stxr w9, w2, [x0]22; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB0_123; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end24; CHECK-NOLSE-O1-NEXT: mov w0, w825; CHECK-NOLSE-O1-NEXT: ret26; CHECK-NOLSE-O1-NEXT: LBB0_4: ; %cmpxchg.nostore27; CHECK-NOLSE-O1-NEXT: clrex28; CHECK-NOLSE-O1-NEXT: mov w0, w829; CHECK-NOLSE-O1-NEXT: ret30;31; CHECK-OUTLINE-O1-LABEL: val_compare_and_swap:32; CHECK-OUTLINE-O1: ; %bb.0:33; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill34; CHECK-OUTLINE-O1-NEXT: mov x3, x035; CHECK-OUTLINE-O1-NEXT: mov w0, w136; CHECK-OUTLINE-O1-NEXT: mov w1, w237; CHECK-OUTLINE-O1-NEXT: mov x2, x338; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas4_acq39; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload40; CHECK-OUTLINE-O1-NEXT: ret41;42; CHECK-NOLSE-O0-LABEL: val_compare_and_swap:43; CHECK-NOLSE-O0: ; %bb.0:44; CHECK-NOLSE-O0-NEXT: mov x9, x045; CHECK-NOLSE-O0-NEXT: LBB0_1: ; =>This Inner Loop Header: Depth=146; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9]47; CHECK-NOLSE-O0-NEXT: cmp w0, w148; CHECK-NOLSE-O0-NEXT: b.ne LBB0_349; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB0_1 Depth=150; CHECK-NOLSE-O0-NEXT: stlxr w8, w2, [x9]51; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB0_152; CHECK-NOLSE-O0-NEXT: LBB0_3:53; CHECK-NOLSE-O0-NEXT: ret54;55; CHECK-OUTLINE-O0-LABEL: val_compare_and_swap:56; CHECK-OUTLINE-O0: ; %bb.0:57; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #3258; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill59; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill60; CHECK-OUTLINE-O0-NEXT: mov w0, w161; CHECK-OUTLINE-O0-NEXT: mov w1, w262; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #8] ; 8-byte Reload63; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_acq64; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload65; CHECK-OUTLINE-O0-NEXT: add sp, sp, #3266; CHECK-OUTLINE-O0-NEXT: ret67;68; CHECK-LSE-O1-LABEL: val_compare_and_swap:69; CHECK-LSE-O1: ; %bb.0:70; CHECK-LSE-O1-NEXT: casa w1, w2, [x0]71; CHECK-LSE-O1-NEXT: mov x0, x172; CHECK-LSE-O1-NEXT: ret73;74; CHECK-LSE-O0-LABEL: val_compare_and_swap:75; CHECK-LSE-O0: ; %bb.0:76; CHECK-LSE-O0-NEXT: mov x8, x077; CHECK-LSE-O0-NEXT: mov x0, x178; CHECK-LSE-O0-NEXT: casa w0, w2, [x8]79; CHECK-LSE-O0-NEXT: ret80 %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acquire acquire81 %val = extractvalue { i32, i1 } %pair, 082 ret i32 %val83}84 85define i32 @val_compare_and_swap_from_load(ptr %p, i32 %cmp, ptr %pnew) #0 {86; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_from_load:87; CHECK-NOLSE-O1: ; %bb.0:88; CHECK-NOLSE-O1-NEXT: ldr w9, [x2]89; CHECK-NOLSE-O1-NEXT: LBB1_1: ; %cmpxchg.start90; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=191; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]92; CHECK-NOLSE-O1-NEXT: cmp w8, w193; CHECK-NOLSE-O1-NEXT: b.ne LBB1_494; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore95; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB1_1 Depth=196; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0]97; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB1_198; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end99; CHECK-NOLSE-O1-NEXT: mov w0, w8100; CHECK-NOLSE-O1-NEXT: ret101; CHECK-NOLSE-O1-NEXT: LBB1_4: ; %cmpxchg.nostore102; CHECK-NOLSE-O1-NEXT: clrex103; CHECK-NOLSE-O1-NEXT: mov w0, w8104; CHECK-NOLSE-O1-NEXT: ret105;106; CHECK-OUTLINE-O1-LABEL: val_compare_and_swap_from_load:107; CHECK-OUTLINE-O1: ; %bb.0:108; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill109; CHECK-OUTLINE-O1-NEXT: ldr w8, [x2]110; CHECK-OUTLINE-O1-NEXT: mov x3, x0111; CHECK-OUTLINE-O1-NEXT: mov w0, w1112; CHECK-OUTLINE-O1-NEXT: mov x2, x3113; CHECK-OUTLINE-O1-NEXT: mov w1, w8114; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas4_acq115; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload116; CHECK-OUTLINE-O1-NEXT: ret117;118; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_from_load:119; CHECK-NOLSE-O0: ; %bb.0:120; CHECK-NOLSE-O0-NEXT: mov x9, x0121; CHECK-NOLSE-O0-NEXT: ldr w10, [x2]122; CHECK-NOLSE-O0-NEXT: LBB1_1: ; =>This Inner Loop Header: Depth=1123; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9]124; CHECK-NOLSE-O0-NEXT: cmp w0, w1125; CHECK-NOLSE-O0-NEXT: b.ne LBB1_3126; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB1_1 Depth=1127; CHECK-NOLSE-O0-NEXT: stlxr w8, w10, [x9]128; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB1_1129; CHECK-NOLSE-O0-NEXT: LBB1_3:130; CHECK-NOLSE-O0-NEXT: ret131;132; CHECK-OUTLINE-O0-LABEL: val_compare_and_swap_from_load:133; CHECK-OUTLINE-O0: ; %bb.0:134; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #32135; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill136; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill137; CHECK-OUTLINE-O0-NEXT: mov w0, w1138; CHECK-OUTLINE-O0-NEXT: mov x8, x2139; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #8] ; 8-byte Reload140; CHECK-OUTLINE-O0-NEXT: ldr w1, [x8]141; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_acq142; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload143; CHECK-OUTLINE-O0-NEXT: add sp, sp, #32144; CHECK-OUTLINE-O0-NEXT: ret145;146; CHECK-LSE-O1-LABEL: val_compare_and_swap_from_load:147; CHECK-LSE-O1: ; %bb.0:148; CHECK-LSE-O1-NEXT: ldr w8, [x2]149; CHECK-LSE-O1-NEXT: casa w1, w8, [x0]150; CHECK-LSE-O1-NEXT: mov x0, x1151; CHECK-LSE-O1-NEXT: ret152;153; CHECK-LSE-O0-LABEL: val_compare_and_swap_from_load:154; CHECK-LSE-O0: ; %bb.0:155; CHECK-LSE-O0-NEXT: mov x9, x0156; CHECK-LSE-O0-NEXT: mov x0, x1157; CHECK-LSE-O0-NEXT: ldr w8, [x2]158; CHECK-LSE-O0-NEXT: casa w0, w8, [x9]159; CHECK-LSE-O0-NEXT: ret160 %new = load i32, ptr %pnew161 %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acquire acquire162 %val = extractvalue { i32, i1 } %pair, 0163 ret i32 %val164}165 166define i32 @val_compare_and_swap_rel(ptr %p, i32 %cmp, i32 %new) #0 {167; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_rel:168; CHECK-NOLSE-O1: ; %bb.0:169; CHECK-NOLSE-O1-NEXT: LBB2_1: ; %cmpxchg.start170; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1171; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]172; CHECK-NOLSE-O1-NEXT: cmp w8, w1173; CHECK-NOLSE-O1-NEXT: b.ne LBB2_4174; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore175; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB2_1 Depth=1176; CHECK-NOLSE-O1-NEXT: stlxr w9, w2, [x0]177; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB2_1178; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end179; CHECK-NOLSE-O1-NEXT: mov w0, w8180; CHECK-NOLSE-O1-NEXT: ret181; CHECK-NOLSE-O1-NEXT: LBB2_4: ; %cmpxchg.nostore182; CHECK-NOLSE-O1-NEXT: clrex183; CHECK-NOLSE-O1-NEXT: mov w0, w8184; CHECK-NOLSE-O1-NEXT: ret185;186; CHECK-OUTLINE-O1-LABEL: val_compare_and_swap_rel:187; CHECK-OUTLINE-O1: ; %bb.0:188; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill189; CHECK-OUTLINE-O1-NEXT: mov x3, x0190; CHECK-OUTLINE-O1-NEXT: mov w0, w1191; CHECK-OUTLINE-O1-NEXT: mov w1, w2192; CHECK-OUTLINE-O1-NEXT: mov x2, x3193; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas4_acq_rel194; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload195; CHECK-OUTLINE-O1-NEXT: ret196;197; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_rel:198; CHECK-NOLSE-O0: ; %bb.0:199; CHECK-NOLSE-O0-NEXT: mov x9, x0200; CHECK-NOLSE-O0-NEXT: LBB2_1: ; =>This Inner Loop Header: Depth=1201; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9]202; CHECK-NOLSE-O0-NEXT: cmp w0, w1203; CHECK-NOLSE-O0-NEXT: b.ne LBB2_3204; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB2_1 Depth=1205; CHECK-NOLSE-O0-NEXT: stlxr w8, w2, [x9]206; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB2_1207; CHECK-NOLSE-O0-NEXT: LBB2_3:208; CHECK-NOLSE-O0-NEXT: ret209;210; CHECK-OUTLINE-O0-LABEL: val_compare_and_swap_rel:211; CHECK-OUTLINE-O0: ; %bb.0:212; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #32213; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill214; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill215; CHECK-OUTLINE-O0-NEXT: mov w0, w1216; CHECK-OUTLINE-O0-NEXT: mov w1, w2217; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #8] ; 8-byte Reload218; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_acq_rel219; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload220; CHECK-OUTLINE-O0-NEXT: add sp, sp, #32221; CHECK-OUTLINE-O0-NEXT: ret222;223; CHECK-LSE-O1-LABEL: val_compare_and_swap_rel:224; CHECK-LSE-O1: ; %bb.0:225; CHECK-LSE-O1-NEXT: casal w1, w2, [x0]226; CHECK-LSE-O1-NEXT: mov x0, x1227; CHECK-LSE-O1-NEXT: ret228;229; CHECK-LSE-O0-LABEL: val_compare_and_swap_rel:230; CHECK-LSE-O0: ; %bb.0:231; CHECK-LSE-O0-NEXT: mov x8, x0232; CHECK-LSE-O0-NEXT: mov x0, x1233; CHECK-LSE-O0-NEXT: casal w0, w2, [x8]234; CHECK-LSE-O0-NEXT: ret235 %pair = cmpxchg ptr %p, i32 %cmp, i32 %new acq_rel monotonic236 %val = extractvalue { i32, i1 } %pair, 0237 ret i32 %val238}239 240define i64 @val_compare_and_swap_64(ptr %p, i64 %cmp, i64 %new) #0 {241; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64:242; CHECK-NOLSE-O1: ; %bb.0:243; CHECK-NOLSE-O1-NEXT: LBB3_1: ; %cmpxchg.start244; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1245; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]246; CHECK-NOLSE-O1-NEXT: cmp x8, x1247; CHECK-NOLSE-O1-NEXT: b.ne LBB3_4248; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore249; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB3_1 Depth=1250; CHECK-NOLSE-O1-NEXT: stxr w9, x2, [x0]251; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB3_1252; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end253; CHECK-NOLSE-O1-NEXT: mov x0, x8254; CHECK-NOLSE-O1-NEXT: ret255; CHECK-NOLSE-O1-NEXT: LBB3_4: ; %cmpxchg.nostore256; CHECK-NOLSE-O1-NEXT: clrex257; CHECK-NOLSE-O1-NEXT: mov x0, x8258; CHECK-NOLSE-O1-NEXT: ret259;260; CHECK-OUTLINE-O1-LABEL: val_compare_and_swap_64:261; CHECK-OUTLINE-O1: ; %bb.0:262; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill263; CHECK-OUTLINE-O1-NEXT: mov x3, x0264; CHECK-OUTLINE-O1-NEXT: mov x0, x1265; CHECK-OUTLINE-O1-NEXT: mov x1, x2266; CHECK-OUTLINE-O1-NEXT: mov x2, x3267; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas8_relax268; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload269; CHECK-OUTLINE-O1-NEXT: ret270;271; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64:272; CHECK-NOLSE-O0: ; %bb.0:273; CHECK-NOLSE-O0-NEXT: mov x9, x0274; CHECK-NOLSE-O0-NEXT: LBB3_1: ; =>This Inner Loop Header: Depth=1275; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9]276; CHECK-NOLSE-O0-NEXT: cmp x0, x1277; CHECK-NOLSE-O0-NEXT: b.ne LBB3_3278; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB3_1 Depth=1279; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9]280; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB3_1281; CHECK-NOLSE-O0-NEXT: LBB3_3:282; CHECK-NOLSE-O0-NEXT: ret283;284; CHECK-OUTLINE-O0-LABEL: val_compare_and_swap_64:285; CHECK-OUTLINE-O0: ; %bb.0:286; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #32287; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill288; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill289; CHECK-OUTLINE-O0-NEXT: mov x0, x1290; CHECK-OUTLINE-O0-NEXT: mov x1, x2291; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #8] ; 8-byte Reload292; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_relax293; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload294; CHECK-OUTLINE-O0-NEXT: add sp, sp, #32295; CHECK-OUTLINE-O0-NEXT: ret296;297; CHECK-LSE-O1-LABEL: val_compare_and_swap_64:298; CHECK-LSE-O1: ; %bb.0:299; CHECK-LSE-O1-NEXT: cas x1, x2, [x0]300; CHECK-LSE-O1-NEXT: mov x0, x1301; CHECK-LSE-O1-NEXT: ret302;303; CHECK-LSE-O0-LABEL: val_compare_and_swap_64:304; CHECK-LSE-O0: ; %bb.0:305; CHECK-LSE-O0-NEXT: mov x8, x0306; CHECK-LSE-O0-NEXT: mov x0, x1307; CHECK-LSE-O0-NEXT: cas x0, x2, [x8]308; CHECK-LSE-O0-NEXT: ret309 %pair = cmpxchg ptr %p, i64 %cmp, i64 %new monotonic monotonic310 %val = extractvalue { i64, i1 } %pair, 0311 ret i64 %val312}313 314define i64 @val_compare_and_swap_64_monotonic_seqcst(ptr %p, i64 %cmp, i64 %new) #0 {315; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:316; CHECK-NOLSE-O1: ; %bb.0:317; CHECK-NOLSE-O1-NEXT: LBB4_1: ; %cmpxchg.start318; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1319; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]320; CHECK-NOLSE-O1-NEXT: cmp x8, x1321; CHECK-NOLSE-O1-NEXT: b.ne LBB4_4322; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore323; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB4_1 Depth=1324; CHECK-NOLSE-O1-NEXT: stlxr w9, x2, [x0]325; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB4_1326; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end327; CHECK-NOLSE-O1-NEXT: mov x0, x8328; CHECK-NOLSE-O1-NEXT: ret329; CHECK-NOLSE-O1-NEXT: LBB4_4: ; %cmpxchg.nostore330; CHECK-NOLSE-O1-NEXT: clrex331; CHECK-NOLSE-O1-NEXT: mov x0, x8332; CHECK-NOLSE-O1-NEXT: ret333;334; CHECK-OUTLINE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:335; CHECK-OUTLINE-O1: ; %bb.0:336; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill337; CHECK-OUTLINE-O1-NEXT: mov x3, x0338; CHECK-OUTLINE-O1-NEXT: mov x0, x1339; CHECK-OUTLINE-O1-NEXT: mov x1, x2340; CHECK-OUTLINE-O1-NEXT: mov x2, x3341; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas8_acq_rel342; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload343; CHECK-OUTLINE-O1-NEXT: ret344;345; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:346; CHECK-NOLSE-O0: ; %bb.0:347; CHECK-NOLSE-O0-NEXT: mov x9, x0348; CHECK-NOLSE-O0-NEXT: LBB4_1: ; =>This Inner Loop Header: Depth=1349; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9]350; CHECK-NOLSE-O0-NEXT: cmp x0, x1351; CHECK-NOLSE-O0-NEXT: b.ne LBB4_3352; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB4_1 Depth=1353; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9]354; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB4_1355; CHECK-NOLSE-O0-NEXT: LBB4_3:356; CHECK-NOLSE-O0-NEXT: ret357;358; CHECK-OUTLINE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:359; CHECK-OUTLINE-O0: ; %bb.0:360; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #32361; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill362; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill363; CHECK-OUTLINE-O0-NEXT: mov x0, x1364; CHECK-OUTLINE-O0-NEXT: mov x1, x2365; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #8] ; 8-byte Reload366; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_acq_rel367; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload368; CHECK-OUTLINE-O0-NEXT: add sp, sp, #32369; CHECK-OUTLINE-O0-NEXT: ret370;371; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst:372; CHECK-LSE-O1: ; %bb.0:373; CHECK-LSE-O1-NEXT: casal x1, x2, [x0]374; CHECK-LSE-O1-NEXT: mov x0, x1375; CHECK-LSE-O1-NEXT: ret376;377; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst:378; CHECK-LSE-O0: ; %bb.0:379; CHECK-LSE-O0-NEXT: mov x8, x0380; CHECK-LSE-O0-NEXT: mov x0, x1381; CHECK-LSE-O0-NEXT: casal x0, x2, [x8]382; CHECK-LSE-O0-NEXT: ret383 %pair = cmpxchg ptr %p, i64 %cmp, i64 %new monotonic seq_cst384 %val = extractvalue { i64, i1 } %pair, 0385 ret i64 %val386}387 388define i64 @val_compare_and_swap_64_release_acquire(ptr %p, i64 %cmp, i64 %new) #0 {389; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_release_acquire:390; CHECK-NOLSE-O1: ; %bb.0:391; CHECK-NOLSE-O1-NEXT: LBB5_1: ; %cmpxchg.start392; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1393; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]394; CHECK-NOLSE-O1-NEXT: cmp x8, x1395; CHECK-NOLSE-O1-NEXT: b.ne LBB5_4396; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore397; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB5_1 Depth=1398; CHECK-NOLSE-O1-NEXT: stlxr w9, x2, [x0]399; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB5_1400; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end401; CHECK-NOLSE-O1-NEXT: mov x0, x8402; CHECK-NOLSE-O1-NEXT: ret403; CHECK-NOLSE-O1-NEXT: LBB5_4: ; %cmpxchg.nostore404; CHECK-NOLSE-O1-NEXT: clrex405; CHECK-NOLSE-O1-NEXT: mov x0, x8406; CHECK-NOLSE-O1-NEXT: ret407;408; CHECK-OUTLINE-O1-LABEL: val_compare_and_swap_64_release_acquire:409; CHECK-OUTLINE-O1: ; %bb.0:410; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill411; CHECK-OUTLINE-O1-NEXT: mov x3, x0412; CHECK-OUTLINE-O1-NEXT: mov x0, x1413; CHECK-OUTLINE-O1-NEXT: mov x1, x2414; CHECK-OUTLINE-O1-NEXT: mov x2, x3415; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas8_acq_rel416; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload417; CHECK-OUTLINE-O1-NEXT: ret418;419; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_release_acquire:420; CHECK-NOLSE-O0: ; %bb.0:421; CHECK-NOLSE-O0-NEXT: mov x9, x0422; CHECK-NOLSE-O0-NEXT: LBB5_1: ; =>This Inner Loop Header: Depth=1423; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9]424; CHECK-NOLSE-O0-NEXT: cmp x0, x1425; CHECK-NOLSE-O0-NEXT: b.ne LBB5_3426; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB5_1 Depth=1427; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9]428; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB5_1429; CHECK-NOLSE-O0-NEXT: LBB5_3:430; CHECK-NOLSE-O0-NEXT: ret431;432; CHECK-OUTLINE-O0-LABEL: val_compare_and_swap_64_release_acquire:433; CHECK-OUTLINE-O0: ; %bb.0:434; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #32435; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill436; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill437; CHECK-OUTLINE-O0-NEXT: mov x0, x1438; CHECK-OUTLINE-O0-NEXT: mov x1, x2439; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #8] ; 8-byte Reload440; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_acq_rel441; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload442; CHECK-OUTLINE-O0-NEXT: add sp, sp, #32443; CHECK-OUTLINE-O0-NEXT: ret444;445; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_release_acquire:446; CHECK-LSE-O1: ; %bb.0:447; CHECK-LSE-O1-NEXT: casal x1, x2, [x0]448; CHECK-LSE-O1-NEXT: mov x0, x1449; CHECK-LSE-O1-NEXT: ret450;451; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_release_acquire:452; CHECK-LSE-O0: ; %bb.0:453; CHECK-LSE-O0-NEXT: mov x8, x0454; CHECK-LSE-O0-NEXT: mov x0, x1455; CHECK-LSE-O0-NEXT: casal x0, x2, [x8]456; CHECK-LSE-O0-NEXT: ret457 %pair = cmpxchg ptr %p, i64 %cmp, i64 %new release acquire458 %val = extractvalue { i64, i1 } %pair, 0459 ret i64 %val460}461 462define i32 @fetch_and_nand(ptr %p) #0 {463; CHECK-NOLSE-O1-LABEL: fetch_and_nand:464; CHECK-NOLSE-O1: ; %bb.0:465; CHECK-NOLSE-O1-NEXT: LBB6_1: ; %atomicrmw.start466; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1467; CHECK-NOLSE-O1-NEXT: ldxr w8, [x0]468; CHECK-NOLSE-O1-NEXT: and w9, w8, #0x7469; CHECK-NOLSE-O1-NEXT: mvn w9, w9470; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]471; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB6_1472; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end473; CHECK-NOLSE-O1-NEXT: mov w0, w8474; CHECK-NOLSE-O1-NEXT: ret475;476; CHECK-OUTLINE-O1-LABEL: fetch_and_nand:477; CHECK-OUTLINE-O1: ; %bb.0:478; CHECK-OUTLINE-O1-NEXT: LBB6_1: ; %atomicrmw.start479; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=1480; CHECK-OUTLINE-O1-NEXT: ldxr w8, [x0]481; CHECK-OUTLINE-O1-NEXT: and w9, w8, #0x7482; CHECK-OUTLINE-O1-NEXT: mvn w9, w9483; CHECK-OUTLINE-O1-NEXT: stlxr w10, w9, [x0]484; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB6_1485; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end486; CHECK-OUTLINE-O1-NEXT: mov w0, w8487; CHECK-OUTLINE-O1-NEXT: ret488;489; CHECK-NOLSE-O0-LABEL: fetch_and_nand:490; CHECK-NOLSE-O0: ; %bb.0:491; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32492; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill493; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]494; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill495; CHECK-NOLSE-O0-NEXT: b LBB6_1496; CHECK-NOLSE-O0-NEXT: LBB6_1: ; %atomicrmw.start497; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1498; CHECK-NOLSE-O0-NEXT: ; Child Loop BB6_2 Depth 2499; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload500; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload501; CHECK-NOLSE-O0-NEXT: and w9, w8, #0x7502; CHECK-NOLSE-O0-NEXT: mvn w12, w9503; CHECK-NOLSE-O0-NEXT: LBB6_2: ; %atomicrmw.start504; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB6_1 Depth=1505; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2506; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]507; CHECK-NOLSE-O0-NEXT: cmp w9, w8508; CHECK-NOLSE-O0-NEXT: b.ne LBB6_4509; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start510; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB6_2 Depth=2511; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]512; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB6_2513; CHECK-NOLSE-O0-NEXT: LBB6_4: ; %atomicrmw.start514; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB6_1 Depth=1515; CHECK-NOLSE-O0-NEXT: subs w8, w9, w8516; CHECK-NOLSE-O0-NEXT: cset w8, eq517; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill518; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill519; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB6_1520; CHECK-NOLSE-O0-NEXT: b LBB6_5521; CHECK-NOLSE-O0-NEXT: LBB6_5: ; %atomicrmw.end522; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload523; CHECK-NOLSE-O0-NEXT: add sp, sp, #32524; CHECK-NOLSE-O0-NEXT: ret525;526; CHECK-OUTLINE-O0-LABEL: fetch_and_nand:527; CHECK-OUTLINE-O0: ; %bb.0:528; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #48529; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill530; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill531; CHECK-OUTLINE-O0-NEXT: ldr w0, [x0]532; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill533; CHECK-OUTLINE-O0-NEXT: b LBB6_1534; CHECK-OUTLINE-O0-NEXT: LBB6_1: ; %atomicrmw.start535; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=1536; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload537; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload538; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill539; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0x7540; CHECK-OUTLINE-O0-NEXT: mvn w1, w8541; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_rel542; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload543; CHECK-OUTLINE-O0-NEXT: subs w8, w0, w8544; CHECK-OUTLINE-O0-NEXT: cset w8, eq545; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill546; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill547; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB6_1548; CHECK-OUTLINE-O0-NEXT: b LBB6_2549; CHECK-OUTLINE-O0-NEXT: LBB6_2: ; %atomicrmw.end550; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload551; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload552; CHECK-OUTLINE-O0-NEXT: add sp, sp, #48553; CHECK-OUTLINE-O0-NEXT: ret554;555; CHECK-LSE-O1-LABEL: fetch_and_nand:556; CHECK-LSE-O1: ; %bb.0:557; CHECK-LSE-O1-NEXT: mov x8, x0558; CHECK-LSE-O1-NEXT: ldr w0, [x0]559; CHECK-LSE-O1-NEXT: LBB6_1: ; %atomicrmw.start560; CHECK-LSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1561; CHECK-LSE-O1-NEXT: mov x9, x0562; CHECK-LSE-O1-NEXT: and w10, w0, #0x7563; CHECK-LSE-O1-NEXT: mvn w10, w10564; CHECK-LSE-O1-NEXT: casl w0, w10, [x8]565; CHECK-LSE-O1-NEXT: cmp w0, w9566; CHECK-LSE-O1-NEXT: b.ne LBB6_1567; CHECK-LSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end568; CHECK-LSE-O1-NEXT: ret569;570; CHECK-LSE-O0-LABEL: fetch_and_nand:571; CHECK-LSE-O0: ; %bb.0:572; CHECK-LSE-O0-NEXT: sub sp, sp, #32573; CHECK-LSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill574; CHECK-LSE-O0-NEXT: ldr w8, [x0]575; CHECK-LSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill576; CHECK-LSE-O0-NEXT: b LBB6_1577; CHECK-LSE-O0-NEXT: LBB6_1: ; %atomicrmw.start578; CHECK-LSE-O0-NEXT: ; =>This Inner Loop Header: Depth=1579; CHECK-LSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload580; CHECK-LSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload581; CHECK-LSE-O0-NEXT: and w9, w8, #0x7582; CHECK-LSE-O0-NEXT: mvn w10, w9583; CHECK-LSE-O0-NEXT: mov x9, x8584; CHECK-LSE-O0-NEXT: casl w9, w10, [x11]585; CHECK-LSE-O0-NEXT: subs w8, w9, w8586; CHECK-LSE-O0-NEXT: cset w8, eq587; CHECK-LSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill588; CHECK-LSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill589; CHECK-LSE-O0-NEXT: tbz w8, #0, LBB6_1590; CHECK-LSE-O0-NEXT: b LBB6_2591; CHECK-LSE-O0-NEXT: LBB6_2: ; %atomicrmw.end592; CHECK-LSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload593; CHECK-LSE-O0-NEXT: add sp, sp, #32594; CHECK-LSE-O0-NEXT: ret595 %val = atomicrmw nand ptr %p, i32 7 release596 ret i32 %val597}598 599define i64 @fetch_and_nand_64(ptr %p) #0 {600; CHECK-NOLSE-O1-LABEL: fetch_and_nand_64:601; CHECK-NOLSE-O1: ; %bb.0:602; CHECK-NOLSE-O1-NEXT: LBB7_1: ; %atomicrmw.start603; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1604; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]605; CHECK-NOLSE-O1-NEXT: and x9, x8, #0x7606; CHECK-NOLSE-O1-NEXT: mvn x9, x9607; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]608; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB7_1609; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end610; CHECK-NOLSE-O1-NEXT: mov x0, x8611; CHECK-NOLSE-O1-NEXT: ret612;613; CHECK-OUTLINE-O1-LABEL: fetch_and_nand_64:614; CHECK-OUTLINE-O1: ; %bb.0:615; CHECK-OUTLINE-O1-NEXT: LBB7_1: ; %atomicrmw.start616; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=1617; CHECK-OUTLINE-O1-NEXT: ldaxr x8, [x0]618; CHECK-OUTLINE-O1-NEXT: and x9, x8, #0x7619; CHECK-OUTLINE-O1-NEXT: mvn x9, x9620; CHECK-OUTLINE-O1-NEXT: stlxr w10, x9, [x0]621; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB7_1622; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end623; CHECK-OUTLINE-O1-NEXT: mov x0, x8624; CHECK-OUTLINE-O1-NEXT: ret625;626; CHECK-NOLSE-O0-LABEL: fetch_and_nand_64:627; CHECK-NOLSE-O0: ; %bb.0:628; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32629; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill630; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]631; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill632; CHECK-NOLSE-O0-NEXT: b LBB7_1633; CHECK-NOLSE-O0-NEXT: LBB7_1: ; %atomicrmw.start634; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1635; CHECK-NOLSE-O0-NEXT: ; Child Loop BB7_2 Depth 2636; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload637; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload638; CHECK-NOLSE-O0-NEXT: and x9, x8, #0x7639; CHECK-NOLSE-O0-NEXT: mvn x12, x9640; CHECK-NOLSE-O0-NEXT: LBB7_2: ; %atomicrmw.start641; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB7_1 Depth=1642; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2643; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]644; CHECK-NOLSE-O0-NEXT: cmp x9, x8645; CHECK-NOLSE-O0-NEXT: b.ne LBB7_4646; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start647; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB7_2 Depth=2648; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]649; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB7_2650; CHECK-NOLSE-O0-NEXT: LBB7_4: ; %atomicrmw.start651; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB7_1 Depth=1652; CHECK-NOLSE-O0-NEXT: subs x8, x9, x8653; CHECK-NOLSE-O0-NEXT: cset w8, eq654; CHECK-NOLSE-O0-NEXT: str x9, [sp, #8] ; 8-byte Spill655; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill656; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB7_1657; CHECK-NOLSE-O0-NEXT: b LBB7_5658; CHECK-NOLSE-O0-NEXT: LBB7_5: ; %atomicrmw.end659; CHECK-NOLSE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Reload660; CHECK-NOLSE-O0-NEXT: add sp, sp, #32661; CHECK-NOLSE-O0-NEXT: ret662;663; CHECK-OUTLINE-O0-LABEL: fetch_and_nand_64:664; CHECK-OUTLINE-O0: ; %bb.0:665; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #48666; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill667; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill668; CHECK-OUTLINE-O0-NEXT: ldr x0, [x0]669; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #24] ; 8-byte Spill670; CHECK-OUTLINE-O0-NEXT: b LBB7_1671; CHECK-OUTLINE-O0-NEXT: LBB7_1: ; %atomicrmw.start672; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=1673; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #24] ; 8-byte Reload674; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload675; CHECK-OUTLINE-O0-NEXT: str x0, [sp] ; 8-byte Spill676; CHECK-OUTLINE-O0-NEXT: and x8, x0, #0x7677; CHECK-OUTLINE-O0-NEXT: mvn x1, x8678; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_acq_rel679; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp] ; 8-byte Reload680; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x8681; CHECK-OUTLINE-O0-NEXT: cset w8, eq682; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill683; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #24] ; 8-byte Spill684; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB7_1685; CHECK-OUTLINE-O0-NEXT: b LBB7_2686; CHECK-OUTLINE-O0-NEXT: LBB7_2: ; %atomicrmw.end687; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Reload688; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload689; CHECK-OUTLINE-O0-NEXT: add sp, sp, #48690; CHECK-OUTLINE-O0-NEXT: ret691;692; CHECK-LSE-O1-LABEL: fetch_and_nand_64:693; CHECK-LSE-O1: ; %bb.0:694; CHECK-LSE-O1-NEXT: mov x8, x0695; CHECK-LSE-O1-NEXT: ldr x0, [x0]696; CHECK-LSE-O1-NEXT: LBB7_1: ; %atomicrmw.start697; CHECK-LSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1698; CHECK-LSE-O1-NEXT: mov x9, x0699; CHECK-LSE-O1-NEXT: and x10, x0, #0x7700; CHECK-LSE-O1-NEXT: mvn x10, x10701; CHECK-LSE-O1-NEXT: casal x0, x10, [x8]702; CHECK-LSE-O1-NEXT: cmp x0, x9703; CHECK-LSE-O1-NEXT: b.ne LBB7_1704; CHECK-LSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end705; CHECK-LSE-O1-NEXT: ret706;707; CHECK-LSE-O0-LABEL: fetch_and_nand_64:708; CHECK-LSE-O0: ; %bb.0:709; CHECK-LSE-O0-NEXT: sub sp, sp, #32710; CHECK-LSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill711; CHECK-LSE-O0-NEXT: ldr x8, [x0]712; CHECK-LSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill713; CHECK-LSE-O0-NEXT: b LBB7_1714; CHECK-LSE-O0-NEXT: LBB7_1: ; %atomicrmw.start715; CHECK-LSE-O0-NEXT: ; =>This Inner Loop Header: Depth=1716; CHECK-LSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload717; CHECK-LSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload718; CHECK-LSE-O0-NEXT: and x9, x8, #0x7719; CHECK-LSE-O0-NEXT: mvn x10, x9720; CHECK-LSE-O0-NEXT: mov x9, x8721; CHECK-LSE-O0-NEXT: casal x9, x10, [x11]722; CHECK-LSE-O0-NEXT: subs x8, x9, x8723; CHECK-LSE-O0-NEXT: cset w8, eq724; CHECK-LSE-O0-NEXT: str x9, [sp, #8] ; 8-byte Spill725; CHECK-LSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill726; CHECK-LSE-O0-NEXT: tbz w8, #0, LBB7_1727; CHECK-LSE-O0-NEXT: b LBB7_2728; CHECK-LSE-O0-NEXT: LBB7_2: ; %atomicrmw.end729; CHECK-LSE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Reload730; CHECK-LSE-O0-NEXT: add sp, sp, #32731; CHECK-LSE-O0-NEXT: ret732 %val = atomicrmw nand ptr %p, i64 7 acq_rel733 ret i64 %val734}735 736define i32 @fetch_and_or(ptr %p) #0 {737; CHECK-NOLSE-O1-LABEL: fetch_and_or:738; CHECK-NOLSE-O1: ; %bb.0:739; CHECK-NOLSE-O1-NEXT: mov w9, #5 ; =0x5740; CHECK-NOLSE-O1-NEXT: LBB8_1: ; %atomicrmw.start741; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1742; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]743; CHECK-NOLSE-O1-NEXT: orr w10, w8, w9744; CHECK-NOLSE-O1-NEXT: stlxr w11, w10, [x0]745; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB8_1746; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end747; CHECK-NOLSE-O1-NEXT: mov w0, w8748; CHECK-NOLSE-O1-NEXT: ret749;750; CHECK-OUTLINE-LABEL: fetch_and_or:751; CHECK-OUTLINE: ; %bb.0:752; CHECK-OUTLINE-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill753; CHECK-OUTLINE-NEXT: mov x1, x0754; CHECK-OUTLINE-NEXT: mov w0, #5 ; =0x5755; CHECK-OUTLINE-NEXT: bl ___aarch64_ldset4_acq_rel756; CHECK-OUTLINE-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload757; CHECK-OUTLINE-NEXT: ret758;759; CHECK-NOLSE-O0-LABEL: fetch_and_or:760; CHECK-NOLSE-O0: ; %bb.0:761; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32762; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill763; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]764; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill765; CHECK-NOLSE-O0-NEXT: b LBB8_1766; CHECK-NOLSE-O0-NEXT: LBB8_1: ; %atomicrmw.start767; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1768; CHECK-NOLSE-O0-NEXT: ; Child Loop BB8_2 Depth 2769; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload770; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload771; CHECK-NOLSE-O0-NEXT: mov w9, #5 ; =0x5772; CHECK-NOLSE-O0-NEXT: orr w12, w8, w9773; CHECK-NOLSE-O0-NEXT: LBB8_2: ; %atomicrmw.start774; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB8_1 Depth=1775; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2776; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]777; CHECK-NOLSE-O0-NEXT: cmp w9, w8778; CHECK-NOLSE-O0-NEXT: b.ne LBB8_4779; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start780; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB8_2 Depth=2781; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]782; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB8_2783; CHECK-NOLSE-O0-NEXT: LBB8_4: ; %atomicrmw.start784; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB8_1 Depth=1785; CHECK-NOLSE-O0-NEXT: subs w8, w9, w8786; CHECK-NOLSE-O0-NEXT: cset w8, eq787; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill788; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill789; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB8_1790; CHECK-NOLSE-O0-NEXT: b LBB8_5791; CHECK-NOLSE-O0-NEXT: LBB8_5: ; %atomicrmw.end792; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload793; CHECK-NOLSE-O0-NEXT: add sp, sp, #32794; CHECK-NOLSE-O0-NEXT: ret795;796; CHECK-LSE-O1-LABEL: fetch_and_or:797; CHECK-LSE-O1: ; %bb.0:798; CHECK-LSE-O1-NEXT: mov w8, #5 ; =0x5799; CHECK-LSE-O1-NEXT: ldsetal w8, w0, [x0]800; CHECK-LSE-O1-NEXT: ret801;802; CHECK-LSE-O0-LABEL: fetch_and_or:803; CHECK-LSE-O0: ; %bb.0:804; CHECK-LSE-O0-NEXT: mov w8, #5 ; =0x5805; CHECK-LSE-O0-NEXT: ldsetal w8, w0, [x0]806; CHECK-LSE-O0-NEXT: ret807 %val = atomicrmw or ptr %p, i32 5 seq_cst808 ret i32 %val809}810 811define i64 @fetch_and_or_64(ptr %p) #0 {812; CHECK-NOLSE-O1-LABEL: fetch_and_or_64:813; CHECK-NOLSE-O1: ; %bb.0:814; CHECK-NOLSE-O1-NEXT: LBB9_1: ; %atomicrmw.start815; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1816; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]817; CHECK-NOLSE-O1-NEXT: orr x9, x8, #0x7818; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0]819; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB9_1820; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end821; CHECK-NOLSE-O1-NEXT: mov x0, x8822; CHECK-NOLSE-O1-NEXT: ret823;824; CHECK-OUTLINE-O1-LABEL: fetch_and_or_64:825; CHECK-OUTLINE-O1: ; %bb.0:826; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill827; CHECK-OUTLINE-O1-NEXT: mov x1, x0828; CHECK-OUTLINE-O1-NEXT: mov w0, #7 ; =0x7829; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldset8_relax830; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload831; CHECK-OUTLINE-O1-NEXT: ret832;833; CHECK-NOLSE-O0-LABEL: fetch_and_or_64:834; CHECK-NOLSE-O0: ; %bb.0:835; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32836; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill837; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]838; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill839; CHECK-NOLSE-O0-NEXT: b LBB9_1840; CHECK-NOLSE-O0-NEXT: LBB9_1: ; %atomicrmw.start841; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1842; CHECK-NOLSE-O0-NEXT: ; Child Loop BB9_2 Depth 2843; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload844; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload845; CHECK-NOLSE-O0-NEXT: orr x12, x8, #0x7846; CHECK-NOLSE-O0-NEXT: LBB9_2: ; %atomicrmw.start847; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB9_1 Depth=1848; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2849; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]850; CHECK-NOLSE-O0-NEXT: cmp x9, x8851; CHECK-NOLSE-O0-NEXT: b.ne LBB9_4852; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start853; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB9_2 Depth=2854; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]855; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB9_2856; CHECK-NOLSE-O0-NEXT: LBB9_4: ; %atomicrmw.start857; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB9_1 Depth=1858; CHECK-NOLSE-O0-NEXT: subs x8, x9, x8859; CHECK-NOLSE-O0-NEXT: cset w8, eq860; CHECK-NOLSE-O0-NEXT: str x9, [sp, #8] ; 8-byte Spill861; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill862; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB9_1863; CHECK-NOLSE-O0-NEXT: b LBB9_5864; CHECK-NOLSE-O0-NEXT: LBB9_5: ; %atomicrmw.end865; CHECK-NOLSE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Reload866; CHECK-NOLSE-O0-NEXT: add sp, sp, #32867; CHECK-NOLSE-O0-NEXT: ret868;869; CHECK-OUTLINE-O0-LABEL: fetch_and_or_64:870; CHECK-OUTLINE-O0: ; %bb.0:871; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill872; CHECK-OUTLINE-O0-NEXT: mov x1, x0873; CHECK-OUTLINE-O0-NEXT: mov w8, #7 ; =0x7874; CHECK-OUTLINE-O0-NEXT: mov w0, w8875; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldset8_relax876; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload877; CHECK-OUTLINE-O0-NEXT: ret878;879; CHECK-LSE-O1-LABEL: fetch_and_or_64:880; CHECK-LSE-O1: ; %bb.0:881; CHECK-LSE-O1-NEXT: mov w8, #7 ; =0x7882; CHECK-LSE-O1-NEXT: ldset x8, x0, [x0]883; CHECK-LSE-O1-NEXT: ret884;885; CHECK-LSE-O0-LABEL: fetch_and_or_64:886; CHECK-LSE-O0: ; %bb.0:887; CHECK-LSE-O0-NEXT: mov w8, #7 ; =0x7888; CHECK-LSE-O0-NEXT: ; kill: def $x8 killed $w8889; CHECK-LSE-O0-NEXT: ldset x8, x0, [x0]890; CHECK-LSE-O0-NEXT: ret891 %val = atomicrmw or ptr %p, i64 7 monotonic892 ret i64 %val893}894 895define void @acquire_fence() #0 {896; CHECK-NOLSE-LABEL: acquire_fence:897; CHECK-NOLSE: ; %bb.0:898; CHECK-NOLSE-NEXT: dmb ishld899; CHECK-NOLSE-NEXT: ret900;901; CHECK-OUTLINE-LABEL: acquire_fence:902; CHECK-OUTLINE: ; %bb.0:903; CHECK-OUTLINE-NEXT: dmb ishld904; CHECK-OUTLINE-NEXT: ret905;906; CHECK-LSE-O1-LABEL: acquire_fence:907; CHECK-LSE-O1: ; %bb.0:908; CHECK-LSE-O1-NEXT: dmb ishld909; CHECK-LSE-O1-NEXT: ret910;911; CHECK-LSE-O0-LABEL: acquire_fence:912; CHECK-LSE-O0: ; %bb.0:913; CHECK-LSE-O0-NEXT: dmb ishld914; CHECK-LSE-O0-NEXT: ret915 fence acquire916 ret void917}918 919define void @release_fence() #0 {920; CHECK-NOLSE-LABEL: release_fence:921; CHECK-NOLSE: ; %bb.0:922; CHECK-NOLSE-NEXT: dmb ish923; CHECK-NOLSE-NEXT: ret924;925; CHECK-OUTLINE-LABEL: release_fence:926; CHECK-OUTLINE: ; %bb.0:927; CHECK-OUTLINE-NEXT: dmb ish928; CHECK-OUTLINE-NEXT: ret929;930; CHECK-LSE-O1-LABEL: release_fence:931; CHECK-LSE-O1: ; %bb.0:932; CHECK-LSE-O1-NEXT: dmb ish933; CHECK-LSE-O1-NEXT: ret934;935; CHECK-LSE-O0-LABEL: release_fence:936; CHECK-LSE-O0: ; %bb.0:937; CHECK-LSE-O0-NEXT: dmb ish938; CHECK-LSE-O0-NEXT: ret939 fence release940 ret void941}942 943define void @seq_cst_fence() #0 {944; CHECK-NOLSE-LABEL: seq_cst_fence:945; CHECK-NOLSE: ; %bb.0:946; CHECK-NOLSE-NEXT: dmb ish947; CHECK-NOLSE-NEXT: ret948;949; CHECK-OUTLINE-LABEL: seq_cst_fence:950; CHECK-OUTLINE: ; %bb.0:951; CHECK-OUTLINE-NEXT: dmb ish952; CHECK-OUTLINE-NEXT: ret953;954; CHECK-LSE-O1-LABEL: seq_cst_fence:955; CHECK-LSE-O1: ; %bb.0:956; CHECK-LSE-O1-NEXT: dmb ish957; CHECK-LSE-O1-NEXT: ret958;959; CHECK-LSE-O0-LABEL: seq_cst_fence:960; CHECK-LSE-O0: ; %bb.0:961; CHECK-LSE-O0-NEXT: dmb ish962; CHECK-LSE-O0-NEXT: ret963 fence seq_cst964 ret void965}966 967define i32 @atomic_load(ptr %p) #0 {968; CHECK-NOLSE-LABEL: atomic_load:969; CHECK-NOLSE: ; %bb.0:970; CHECK-NOLSE-NEXT: ldar w0, [x0]971; CHECK-NOLSE-NEXT: ret972;973; CHECK-OUTLINE-LABEL: atomic_load:974; CHECK-OUTLINE: ; %bb.0:975; CHECK-OUTLINE-NEXT: ldar w0, [x0]976; CHECK-OUTLINE-NEXT: ret977;978; CHECK-LSE-O1-LABEL: atomic_load:979; CHECK-LSE-O1: ; %bb.0:980; CHECK-LSE-O1-NEXT: ldar w0, [x0]981; CHECK-LSE-O1-NEXT: ret982;983; CHECK-LSE-O0-LABEL: atomic_load:984; CHECK-LSE-O0: ; %bb.0:985; CHECK-LSE-O0-NEXT: ldar w0, [x0]986; CHECK-LSE-O0-NEXT: ret987 %r = load atomic i32, ptr %p seq_cst, align 4988 ret i32 %r989}990 991define i8 @atomic_load_relaxed_8(ptr %p, i32 %off32) #0 {992; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_8:993; CHECK-NOLSE-O1: ; %bb.0:994; CHECK-NOLSE-O1-NEXT: ldrb w8, [x0, #4095]995; CHECK-NOLSE-O1-NEXT: ldrb w9, [x0, w1, sxtw]996; CHECK-NOLSE-O1-NEXT: ldurb w10, [x0, #-256]997; CHECK-NOLSE-O1-NEXT: add w8, w9, w8, uxtb998; CHECK-NOLSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =1191936999; CHECK-NOLSE-O1-NEXT: ldrb w9, [x9]1000; CHECK-NOLSE-O1-NEXT: add w8, w8, w10, uxtb1001; CHECK-NOLSE-O1-NEXT: add w0, w8, w9, uxtb1002; CHECK-NOLSE-O1-NEXT: ret1003;1004; CHECK-OUTLINE-O1-LABEL: atomic_load_relaxed_8:1005; CHECK-OUTLINE-O1: ; %bb.0:1006; CHECK-OUTLINE-O1-NEXT: ldrb w8, [x0, #4095]1007; CHECK-OUTLINE-O1-NEXT: ldrb w9, [x0, w1, sxtw]1008; CHECK-OUTLINE-O1-NEXT: ldurb w10, [x0, #-256]1009; CHECK-OUTLINE-O1-NEXT: add w8, w9, w8, uxtb1010; CHECK-OUTLINE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361011; CHECK-OUTLINE-O1-NEXT: ldrb w9, [x9]1012; CHECK-OUTLINE-O1-NEXT: add w8, w8, w10, uxtb1013; CHECK-OUTLINE-O1-NEXT: add w0, w8, w9, uxtb1014; CHECK-OUTLINE-O1-NEXT: ret1015;1016; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_8:1017; CHECK-NOLSE-O0: ; %bb.0:1018; CHECK-NOLSE-O0-NEXT: ldrb w9, [x0, #4095]1019; CHECK-NOLSE-O0-NEXT: add x8, x0, w1, sxtw1020; CHECK-NOLSE-O0-NEXT: ldrb w8, [x8]1021; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxtb1022; CHECK-NOLSE-O0-NEXT: subs x9, x0, #2561023; CHECK-NOLSE-O0-NEXT: ldrb w9, [x9]1024; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxtb1025; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361026; CHECK-NOLSE-O0-NEXT: ldrb w9, [x9]1027; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, uxtb1028; CHECK-NOLSE-O0-NEXT: ret1029;1030; CHECK-OUTLINE-O0-LABEL: atomic_load_relaxed_8:1031; CHECK-OUTLINE-O0: ; %bb.0:1032; CHECK-OUTLINE-O0-NEXT: ldrb w9, [x0, #4095]1033; CHECK-OUTLINE-O0-NEXT: add x8, x0, w1, sxtw1034; CHECK-OUTLINE-O0-NEXT: ldrb w8, [x8]1035; CHECK-OUTLINE-O0-NEXT: add w8, w8, w9, uxtb1036; CHECK-OUTLINE-O0-NEXT: subs x9, x0, #2561037; CHECK-OUTLINE-O0-NEXT: ldrb w9, [x9]1038; CHECK-OUTLINE-O0-NEXT: add w8, w8, w9, uxtb1039; CHECK-OUTLINE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361040; CHECK-OUTLINE-O0-NEXT: ldrb w9, [x9]1041; CHECK-OUTLINE-O0-NEXT: add w0, w8, w9, uxtb1042; CHECK-OUTLINE-O0-NEXT: ret1043;1044; CHECK-LSE-O1-LABEL: atomic_load_relaxed_8:1045; CHECK-LSE-O1: ; %bb.0:1046; CHECK-LSE-O1-NEXT: ldrb w8, [x0, #4095]1047; CHECK-LSE-O1-NEXT: ldrb w9, [x0, w1, sxtw]1048; CHECK-LSE-O1-NEXT: add w8, w9, w8, uxtb1049; CHECK-LSE-O1-NEXT: ldurb w9, [x0, #-256]1050; CHECK-LSE-O1-NEXT: add w8, w8, w9, uxtb1051; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361052; CHECK-LSE-O1-NEXT: ldrb w9, [x9]1053; CHECK-LSE-O1-NEXT: add w0, w8, w9, uxtb1054; CHECK-LSE-O1-NEXT: ret1055;1056; CHECK-LSE-O0-LABEL: atomic_load_relaxed_8:1057; CHECK-LSE-O0: ; %bb.0:1058; CHECK-LSE-O0-NEXT: ldrb w9, [x0, #4095]1059; CHECK-LSE-O0-NEXT: add x8, x0, w1, sxtw1060; CHECK-LSE-O0-NEXT: ldrb w8, [x8]1061; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxtb1062; CHECK-LSE-O0-NEXT: subs x9, x0, #2561063; CHECK-LSE-O0-NEXT: ldrb w9, [x9]1064; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxtb1065; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361066; CHECK-LSE-O0-NEXT: ldrb w9, [x9]1067; CHECK-LSE-O0-NEXT: add w0, w8, w9, uxtb1068; CHECK-LSE-O0-NEXT: ret1069 %ptr_unsigned = getelementptr i8, ptr %p, i32 40951070 %val_unsigned = load atomic i8, ptr %ptr_unsigned monotonic, align 11071 1072 %ptr_regoff = getelementptr i8, ptr %p, i32 %off321073 %val_regoff = load atomic i8, ptr %ptr_regoff unordered, align 11074 %tot1 = add i8 %val_unsigned, %val_regoff1075 1076 %ptr_unscaled = getelementptr i8, ptr %p, i32 -2561077 %val_unscaled = load atomic i8, ptr %ptr_unscaled monotonic, align 11078 %tot2 = add i8 %tot1, %val_unscaled1079 1080 %ptr_random = getelementptr i8, ptr %p, i32 1191936 ; 0x123000 (i.e. ADD imm)1081 %val_random = load atomic i8, ptr %ptr_random unordered, align 11082 %tot3 = add i8 %tot2, %val_random1083 1084 ret i8 %tot31085}1086 1087define i16 @atomic_load_relaxed_16(ptr %p, i32 %off32) #0 {1088; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_16:1089; CHECK-NOLSE-O1: ; %bb.0:1090; CHECK-NOLSE-O1-NEXT: ldrh w8, [x0, #8190]1091; CHECK-NOLSE-O1-NEXT: ldrh w9, [x0, w1, sxtw #1]1092; CHECK-NOLSE-O1-NEXT: ldurh w10, [x0, #-256]1093; CHECK-NOLSE-O1-NEXT: add w8, w9, w8, uxth1094; CHECK-NOLSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361095; CHECK-NOLSE-O1-NEXT: ldrh w9, [x9]1096; CHECK-NOLSE-O1-NEXT: add w8, w8, w10, uxth1097; CHECK-NOLSE-O1-NEXT: add w0, w8, w9, uxth1098; CHECK-NOLSE-O1-NEXT: ret1099;1100; CHECK-OUTLINE-O1-LABEL: atomic_load_relaxed_16:1101; CHECK-OUTLINE-O1: ; %bb.0:1102; CHECK-OUTLINE-O1-NEXT: ldrh w8, [x0, #8190]1103; CHECK-OUTLINE-O1-NEXT: ldrh w9, [x0, w1, sxtw #1]1104; CHECK-OUTLINE-O1-NEXT: ldurh w10, [x0, #-256]1105; CHECK-OUTLINE-O1-NEXT: add w8, w9, w8, uxth1106; CHECK-OUTLINE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361107; CHECK-OUTLINE-O1-NEXT: ldrh w9, [x9]1108; CHECK-OUTLINE-O1-NEXT: add w8, w8, w10, uxth1109; CHECK-OUTLINE-O1-NEXT: add w0, w8, w9, uxth1110; CHECK-OUTLINE-O1-NEXT: ret1111;1112; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_16:1113; CHECK-NOLSE-O0: ; %bb.0:1114; CHECK-NOLSE-O0-NEXT: ldrh w9, [x0, #8190]1115; CHECK-NOLSE-O0-NEXT: add x8, x0, w1, sxtw #11116; CHECK-NOLSE-O0-NEXT: ldrh w8, [x8]1117; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxth1118; CHECK-NOLSE-O0-NEXT: subs x9, x0, #2561119; CHECK-NOLSE-O0-NEXT: ldrh w9, [x9]1120; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxth1121; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361122; CHECK-NOLSE-O0-NEXT: ldrh w9, [x9]1123; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, uxth1124; CHECK-NOLSE-O0-NEXT: ret1125;1126; CHECK-OUTLINE-O0-LABEL: atomic_load_relaxed_16:1127; CHECK-OUTLINE-O0: ; %bb.0:1128; CHECK-OUTLINE-O0-NEXT: ldrh w9, [x0, #8190]1129; CHECK-OUTLINE-O0-NEXT: add x8, x0, w1, sxtw #11130; CHECK-OUTLINE-O0-NEXT: ldrh w8, [x8]1131; CHECK-OUTLINE-O0-NEXT: add w8, w8, w9, uxth1132; CHECK-OUTLINE-O0-NEXT: subs x9, x0, #2561133; CHECK-OUTLINE-O0-NEXT: ldrh w9, [x9]1134; CHECK-OUTLINE-O0-NEXT: add w8, w8, w9, uxth1135; CHECK-OUTLINE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361136; CHECK-OUTLINE-O0-NEXT: ldrh w9, [x9]1137; CHECK-OUTLINE-O0-NEXT: add w0, w8, w9, uxth1138; CHECK-OUTLINE-O0-NEXT: ret1139;1140; CHECK-LSE-O1-LABEL: atomic_load_relaxed_16:1141; CHECK-LSE-O1: ; %bb.0:1142; CHECK-LSE-O1-NEXT: ldrh w8, [x0, #8190]1143; CHECK-LSE-O1-NEXT: ldrh w9, [x0, w1, sxtw #1]1144; CHECK-LSE-O1-NEXT: add w8, w9, w8, uxth1145; CHECK-LSE-O1-NEXT: ldurh w9, [x0, #-256]1146; CHECK-LSE-O1-NEXT: add w8, w8, w9, uxth1147; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361148; CHECK-LSE-O1-NEXT: ldrh w9, [x9]1149; CHECK-LSE-O1-NEXT: add w0, w8, w9, uxth1150; CHECK-LSE-O1-NEXT: ret1151;1152; CHECK-LSE-O0-LABEL: atomic_load_relaxed_16:1153; CHECK-LSE-O0: ; %bb.0:1154; CHECK-LSE-O0-NEXT: ldrh w9, [x0, #8190]1155; CHECK-LSE-O0-NEXT: add x8, x0, w1, sxtw #11156; CHECK-LSE-O0-NEXT: ldrh w8, [x8]1157; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxth1158; CHECK-LSE-O0-NEXT: subs x9, x0, #2561159; CHECK-LSE-O0-NEXT: ldrh w9, [x9]1160; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxth1161; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361162; CHECK-LSE-O0-NEXT: ldrh w9, [x9]1163; CHECK-LSE-O0-NEXT: add w0, w8, w9, uxth1164; CHECK-LSE-O0-NEXT: ret1165 %ptr_unsigned = getelementptr i16, ptr %p, i32 40951166 %val_unsigned = load atomic i16, ptr %ptr_unsigned monotonic, align 21167 1168 %ptr_regoff = getelementptr i16, ptr %p, i32 %off321169 %val_regoff = load atomic i16, ptr %ptr_regoff unordered, align 21170 %tot1 = add i16 %val_unsigned, %val_regoff1171 1172 %ptr_unscaled = getelementptr i16, ptr %p, i32 -1281173 %val_unscaled = load atomic i16, ptr %ptr_unscaled monotonic, align 21174 %tot2 = add i16 %tot1, %val_unscaled1175 1176 %ptr_random = getelementptr i16, ptr %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)1177 %val_random = load atomic i16, ptr %ptr_random unordered, align 21178 %tot3 = add i16 %tot2, %val_random1179 1180 ret i16 %tot31181}1182 1183define i32 @atomic_load_relaxed_32(ptr %p, i32 %off32) #0 {1184; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_32:1185; CHECK-NOLSE-O1: ; %bb.0:1186; CHECK-NOLSE-O1-NEXT: ldr w8, [x0, #16380]1187; CHECK-NOLSE-O1-NEXT: ldr w9, [x0, w1, sxtw #2]1188; CHECK-NOLSE-O1-NEXT: add x11, x0, #291, lsl #12 ; =11919361189; CHECK-NOLSE-O1-NEXT: ldur w10, [x0, #-256]1190; CHECK-NOLSE-O1-NEXT: add w8, w8, w91191; CHECK-NOLSE-O1-NEXT: ldr w9, [x11]1192; CHECK-NOLSE-O1-NEXT: add w8, w8, w101193; CHECK-NOLSE-O1-NEXT: add w0, w8, w91194; CHECK-NOLSE-O1-NEXT: ret1195;1196; CHECK-OUTLINE-O1-LABEL: atomic_load_relaxed_32:1197; CHECK-OUTLINE-O1: ; %bb.0:1198; CHECK-OUTLINE-O1-NEXT: ldr w8, [x0, #16380]1199; CHECK-OUTLINE-O1-NEXT: ldr w9, [x0, w1, sxtw #2]1200; CHECK-OUTLINE-O1-NEXT: add x11, x0, #291, lsl #12 ; =11919361201; CHECK-OUTLINE-O1-NEXT: ldur w10, [x0, #-256]1202; CHECK-OUTLINE-O1-NEXT: add w8, w8, w91203; CHECK-OUTLINE-O1-NEXT: ldr w9, [x11]1204; CHECK-OUTLINE-O1-NEXT: add w8, w8, w101205; CHECK-OUTLINE-O1-NEXT: add w0, w8, w91206; CHECK-OUTLINE-O1-NEXT: ret1207;1208; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_32:1209; CHECK-NOLSE-O0: ; %bb.0:1210; CHECK-NOLSE-O0-NEXT: ldr w8, [x0, #16380]1211; CHECK-NOLSE-O0-NEXT: ldr w9, [x0, w1, sxtw #2]1212; CHECK-NOLSE-O0-NEXT: add w8, w8, w91213; CHECK-NOLSE-O0-NEXT: ldur w9, [x0, #-256]1214; CHECK-NOLSE-O0-NEXT: add w8, w8, w91215; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361216; CHECK-NOLSE-O0-NEXT: ldr w9, [x9]1217; CHECK-NOLSE-O0-NEXT: add w0, w8, w91218; CHECK-NOLSE-O0-NEXT: ret1219;1220; CHECK-OUTLINE-O0-LABEL: atomic_load_relaxed_32:1221; CHECK-OUTLINE-O0: ; %bb.0:1222; CHECK-OUTLINE-O0-NEXT: ldr w8, [x0, #16380]1223; CHECK-OUTLINE-O0-NEXT: ldr w9, [x0, w1, sxtw #2]1224; CHECK-OUTLINE-O0-NEXT: add w8, w8, w91225; CHECK-OUTLINE-O0-NEXT: ldur w9, [x0, #-256]1226; CHECK-OUTLINE-O0-NEXT: add w8, w8, w91227; CHECK-OUTLINE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361228; CHECK-OUTLINE-O0-NEXT: ldr w9, [x9]1229; CHECK-OUTLINE-O0-NEXT: add w0, w8, w91230; CHECK-OUTLINE-O0-NEXT: ret1231;1232; CHECK-LSE-O1-LABEL: atomic_load_relaxed_32:1233; CHECK-LSE-O1: ; %bb.0:1234; CHECK-LSE-O1-NEXT: ldr w8, [x0, #16380]1235; CHECK-LSE-O1-NEXT: ldr w9, [x0, w1, sxtw #2]1236; CHECK-LSE-O1-NEXT: ldur w10, [x0, #-256]1237; CHECK-LSE-O1-NEXT: add w8, w8, w101238; CHECK-LSE-O1-NEXT: add w8, w8, w91239; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361240; CHECK-LSE-O1-NEXT: ldr w9, [x9]1241; CHECK-LSE-O1-NEXT: add w0, w8, w91242; CHECK-LSE-O1-NEXT: ret1243;1244; CHECK-LSE-O0-LABEL: atomic_load_relaxed_32:1245; CHECK-LSE-O0: ; %bb.0:1246; CHECK-LSE-O0-NEXT: ldr w8, [x0, #16380]1247; CHECK-LSE-O0-NEXT: ldr w9, [x0, w1, sxtw #2]1248; CHECK-LSE-O0-NEXT: add w8, w8, w91249; CHECK-LSE-O0-NEXT: ldur w9, [x0, #-256]1250; CHECK-LSE-O0-NEXT: add w8, w8, w91251; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361252; CHECK-LSE-O0-NEXT: ldr w9, [x9]1253; CHECK-LSE-O0-NEXT: add w0, w8, w91254; CHECK-LSE-O0-NEXT: ret1255 %ptr_unsigned = getelementptr i32, ptr %p, i32 40951256 %val_unsigned = load atomic i32, ptr %ptr_unsigned monotonic, align 41257 1258 %ptr_regoff = getelementptr i32, ptr %p, i32 %off321259 %val_regoff = load atomic i32, ptr %ptr_regoff unordered, align 41260 %tot1 = add i32 %val_unsigned, %val_regoff1261 1262 %ptr_unscaled = getelementptr i32, ptr %p, i32 -641263 %val_unscaled = load atomic i32, ptr %ptr_unscaled monotonic, align 41264 %tot2 = add i32 %tot1, %val_unscaled1265 1266 %ptr_random = getelementptr i32, ptr %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)1267 %val_random = load atomic i32, ptr %ptr_random unordered, align 41268 %tot3 = add i32 %tot2, %val_random1269 1270 ret i32 %tot31271}1272 1273define i64 @atomic_load_relaxed_64(ptr %p, i32 %off32) #0 {1274; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_64:1275; CHECK-NOLSE-O1: ; %bb.0:1276; CHECK-NOLSE-O1-NEXT: ldr x8, [x0, #32760]1277; CHECK-NOLSE-O1-NEXT: ldr x9, [x0, w1, sxtw #3]1278; CHECK-NOLSE-O1-NEXT: add x11, x0, #291, lsl #12 ; =11919361279; CHECK-NOLSE-O1-NEXT: ldur x10, [x0, #-256]1280; CHECK-NOLSE-O1-NEXT: add x8, x8, x91281; CHECK-NOLSE-O1-NEXT: ldr x9, [x11]1282; CHECK-NOLSE-O1-NEXT: add x8, x8, x101283; CHECK-NOLSE-O1-NEXT: add x0, x8, x91284; CHECK-NOLSE-O1-NEXT: ret1285;1286; CHECK-OUTLINE-O1-LABEL: atomic_load_relaxed_64:1287; CHECK-OUTLINE-O1: ; %bb.0:1288; CHECK-OUTLINE-O1-NEXT: ldr x8, [x0, #32760]1289; CHECK-OUTLINE-O1-NEXT: ldr x9, [x0, w1, sxtw #3]1290; CHECK-OUTLINE-O1-NEXT: add x11, x0, #291, lsl #12 ; =11919361291; CHECK-OUTLINE-O1-NEXT: ldur x10, [x0, #-256]1292; CHECK-OUTLINE-O1-NEXT: add x8, x8, x91293; CHECK-OUTLINE-O1-NEXT: ldr x9, [x11]1294; CHECK-OUTLINE-O1-NEXT: add x8, x8, x101295; CHECK-OUTLINE-O1-NEXT: add x0, x8, x91296; CHECK-OUTLINE-O1-NEXT: ret1297;1298; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_64:1299; CHECK-NOLSE-O0: ; %bb.0:1300; CHECK-NOLSE-O0-NEXT: ldr x8, [x0, #32760]1301; CHECK-NOLSE-O0-NEXT: ldr x9, [x0, w1, sxtw #3]1302; CHECK-NOLSE-O0-NEXT: add x8, x8, x91303; CHECK-NOLSE-O0-NEXT: ldur x9, [x0, #-256]1304; CHECK-NOLSE-O0-NEXT: add x8, x8, x91305; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361306; CHECK-NOLSE-O0-NEXT: ldr x9, [x9]1307; CHECK-NOLSE-O0-NEXT: add x0, x8, x91308; CHECK-NOLSE-O0-NEXT: ret1309;1310; CHECK-OUTLINE-O0-LABEL: atomic_load_relaxed_64:1311; CHECK-OUTLINE-O0: ; %bb.0:1312; CHECK-OUTLINE-O0-NEXT: ldr x8, [x0, #32760]1313; CHECK-OUTLINE-O0-NEXT: ldr x9, [x0, w1, sxtw #3]1314; CHECK-OUTLINE-O0-NEXT: add x8, x8, x91315; CHECK-OUTLINE-O0-NEXT: ldur x9, [x0, #-256]1316; CHECK-OUTLINE-O0-NEXT: add x8, x8, x91317; CHECK-OUTLINE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361318; CHECK-OUTLINE-O0-NEXT: ldr x9, [x9]1319; CHECK-OUTLINE-O0-NEXT: add x0, x8, x91320; CHECK-OUTLINE-O0-NEXT: ret1321;1322; CHECK-LSE-O1-LABEL: atomic_load_relaxed_64:1323; CHECK-LSE-O1: ; %bb.0:1324; CHECK-LSE-O1-NEXT: ldr x8, [x0, #32760]1325; CHECK-LSE-O1-NEXT: ldr x9, [x0, w1, sxtw #3]1326; CHECK-LSE-O1-NEXT: ldur x10, [x0, #-256]1327; CHECK-LSE-O1-NEXT: add x8, x8, x101328; CHECK-LSE-O1-NEXT: add x8, x8, x91329; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =11919361330; CHECK-LSE-O1-NEXT: ldr x9, [x9]1331; CHECK-LSE-O1-NEXT: add x0, x8, x91332; CHECK-LSE-O1-NEXT: ret1333;1334; CHECK-LSE-O0-LABEL: atomic_load_relaxed_64:1335; CHECK-LSE-O0: ; %bb.0:1336; CHECK-LSE-O0-NEXT: ldr x8, [x0, #32760]1337; CHECK-LSE-O0-NEXT: ldr x9, [x0, w1, sxtw #3]1338; CHECK-LSE-O0-NEXT: add x8, x8, x91339; CHECK-LSE-O0-NEXT: ldur x9, [x0, #-256]1340; CHECK-LSE-O0-NEXT: add x8, x8, x91341; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =11919361342; CHECK-LSE-O0-NEXT: ldr x9, [x9]1343; CHECK-LSE-O0-NEXT: add x0, x8, x91344; CHECK-LSE-O0-NEXT: ret1345 %ptr_unsigned = getelementptr i64, ptr %p, i32 40951346 %val_unsigned = load atomic i64, ptr %ptr_unsigned monotonic, align 81347 1348 %ptr_regoff = getelementptr i64, ptr %p, i32 %off321349 %val_regoff = load atomic i64, ptr %ptr_regoff unordered, align 81350 %tot1 = add i64 %val_unsigned, %val_regoff1351 1352 %ptr_unscaled = getelementptr i64, ptr %p, i32 -321353 %val_unscaled = load atomic i64, ptr %ptr_unscaled monotonic, align 81354 %tot2 = add i64 %tot1, %val_unscaled1355 1356 %ptr_random = getelementptr i64, ptr %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)1357 %val_random = load atomic i64, ptr %ptr_random unordered, align 81358 %tot3 = add i64 %tot2, %val_random1359 1360 ret i64 %tot31361}1362 1363 1364define void @atomc_store(ptr %p) #0 {1365; CHECK-NOLSE-LABEL: atomc_store:1366; CHECK-NOLSE: ; %bb.0:1367; CHECK-NOLSE-NEXT: mov w8, #4 ; =0x41368; CHECK-NOLSE-NEXT: stlr w8, [x0]1369; CHECK-NOLSE-NEXT: ret1370;1371; CHECK-OUTLINE-LABEL: atomc_store:1372; CHECK-OUTLINE: ; %bb.0:1373; CHECK-OUTLINE-NEXT: mov w8, #4 ; =0x41374; CHECK-OUTLINE-NEXT: stlr w8, [x0]1375; CHECK-OUTLINE-NEXT: ret1376;1377; CHECK-LSE-O1-LABEL: atomc_store:1378; CHECK-LSE-O1: ; %bb.0:1379; CHECK-LSE-O1-NEXT: mov w8, #4 ; =0x41380; CHECK-LSE-O1-NEXT: stlr w8, [x0]1381; CHECK-LSE-O1-NEXT: ret1382;1383; CHECK-LSE-O0-LABEL: atomc_store:1384; CHECK-LSE-O0: ; %bb.0:1385; CHECK-LSE-O0-NEXT: mov w8, #4 ; =0x41386; CHECK-LSE-O0-NEXT: stlr w8, [x0]1387; CHECK-LSE-O0-NEXT: ret1388 store atomic i32 4, ptr %p seq_cst, align 41389 ret void1390}1391 1392define void @atomic_store_relaxed_8(ptr %p, i32 %off32, i8 %val) #0 {1393; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_8:1394; CHECK-NOLSE-O1: ; %bb.0:1395; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361396; CHECK-NOLSE-O1-NEXT: strb w2, [x0, #4095]1397; CHECK-NOLSE-O1-NEXT: strb w2, [x0, w1, sxtw]1398; CHECK-NOLSE-O1-NEXT: sturb w2, [x0, #-256]1399; CHECK-NOLSE-O1-NEXT: strb w2, [x8]1400; CHECK-NOLSE-O1-NEXT: ret1401;1402; CHECK-OUTLINE-O1-LABEL: atomic_store_relaxed_8:1403; CHECK-OUTLINE-O1: ; %bb.0:1404; CHECK-OUTLINE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361405; CHECK-OUTLINE-O1-NEXT: strb w2, [x0, #4095]1406; CHECK-OUTLINE-O1-NEXT: strb w2, [x0, w1, sxtw]1407; CHECK-OUTLINE-O1-NEXT: sturb w2, [x0, #-256]1408; CHECK-OUTLINE-O1-NEXT: strb w2, [x8]1409; CHECK-OUTLINE-O1-NEXT: ret1410;1411; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_8:1412; CHECK-NOLSE-O0: ; %bb.0:1413; CHECK-NOLSE-O0-NEXT: strb w2, [x0, #4095]1414; CHECK-NOLSE-O0-NEXT: strb w2, [x0, w1, sxtw]1415; CHECK-NOLSE-O0-NEXT: sturb w2, [x0, #-256]1416; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361417; CHECK-NOLSE-O0-NEXT: strb w2, [x8]1418; CHECK-NOLSE-O0-NEXT: ret1419;1420; CHECK-OUTLINE-O0-LABEL: atomic_store_relaxed_8:1421; CHECK-OUTLINE-O0: ; %bb.0:1422; CHECK-OUTLINE-O0-NEXT: strb w2, [x0, #4095]1423; CHECK-OUTLINE-O0-NEXT: strb w2, [x0, w1, sxtw]1424; CHECK-OUTLINE-O0-NEXT: sturb w2, [x0, #-256]1425; CHECK-OUTLINE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361426; CHECK-OUTLINE-O0-NEXT: strb w2, [x8]1427; CHECK-OUTLINE-O0-NEXT: ret1428;1429; CHECK-LSE-O1-LABEL: atomic_store_relaxed_8:1430; CHECK-LSE-O1: ; %bb.0:1431; CHECK-LSE-O1-NEXT: strb w2, [x0, #4095]1432; CHECK-LSE-O1-NEXT: strb w2, [x0, w1, sxtw]1433; CHECK-LSE-O1-NEXT: sturb w2, [x0, #-256]1434; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361435; CHECK-LSE-O1-NEXT: strb w2, [x8]1436; CHECK-LSE-O1-NEXT: ret1437;1438; CHECK-LSE-O0-LABEL: atomic_store_relaxed_8:1439; CHECK-LSE-O0: ; %bb.0:1440; CHECK-LSE-O0-NEXT: strb w2, [x0, #4095]1441; CHECK-LSE-O0-NEXT: strb w2, [x0, w1, sxtw]1442; CHECK-LSE-O0-NEXT: sturb w2, [x0, #-256]1443; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361444; CHECK-LSE-O0-NEXT: strb w2, [x8]1445; CHECK-LSE-O0-NEXT: ret1446 %ptr_unsigned = getelementptr i8, ptr %p, i32 40951447 store atomic i8 %val, ptr %ptr_unsigned monotonic, align 11448 1449 %ptr_regoff = getelementptr i8, ptr %p, i32 %off321450 store atomic i8 %val, ptr %ptr_regoff unordered, align 11451 1452 %ptr_unscaled = getelementptr i8, ptr %p, i32 -2561453 store atomic i8 %val, ptr %ptr_unscaled monotonic, align 11454 1455 %ptr_random = getelementptr i8, ptr %p, i32 1191936 ; 0x123000 (i.e. ADD imm)1456 store atomic i8 %val, ptr %ptr_random unordered, align 11457 1458 ret void1459}1460 1461define void @atomic_store_relaxed_16(ptr %p, i32 %off32, i16 %val) #0 {1462; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_16:1463; CHECK-NOLSE-O1: ; %bb.0:1464; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361465; CHECK-NOLSE-O1-NEXT: strh w2, [x0, #8190]1466; CHECK-NOLSE-O1-NEXT: strh w2, [x0, w1, sxtw #1]1467; CHECK-NOLSE-O1-NEXT: sturh w2, [x0, #-256]1468; CHECK-NOLSE-O1-NEXT: strh w2, [x8]1469; CHECK-NOLSE-O1-NEXT: ret1470;1471; CHECK-OUTLINE-O1-LABEL: atomic_store_relaxed_16:1472; CHECK-OUTLINE-O1: ; %bb.0:1473; CHECK-OUTLINE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361474; CHECK-OUTLINE-O1-NEXT: strh w2, [x0, #8190]1475; CHECK-OUTLINE-O1-NEXT: strh w2, [x0, w1, sxtw #1]1476; CHECK-OUTLINE-O1-NEXT: sturh w2, [x0, #-256]1477; CHECK-OUTLINE-O1-NEXT: strh w2, [x8]1478; CHECK-OUTLINE-O1-NEXT: ret1479;1480; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_16:1481; CHECK-NOLSE-O0: ; %bb.0:1482; CHECK-NOLSE-O0-NEXT: strh w2, [x0, #8190]1483; CHECK-NOLSE-O0-NEXT: strh w2, [x0, w1, sxtw #1]1484; CHECK-NOLSE-O0-NEXT: sturh w2, [x0, #-256]1485; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361486; CHECK-NOLSE-O0-NEXT: strh w2, [x8]1487; CHECK-NOLSE-O0-NEXT: ret1488;1489; CHECK-OUTLINE-O0-LABEL: atomic_store_relaxed_16:1490; CHECK-OUTLINE-O0: ; %bb.0:1491; CHECK-OUTLINE-O0-NEXT: strh w2, [x0, #8190]1492; CHECK-OUTLINE-O0-NEXT: strh w2, [x0, w1, sxtw #1]1493; CHECK-OUTLINE-O0-NEXT: sturh w2, [x0, #-256]1494; CHECK-OUTLINE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361495; CHECK-OUTLINE-O0-NEXT: strh w2, [x8]1496; CHECK-OUTLINE-O0-NEXT: ret1497;1498; CHECK-LSE-O1-LABEL: atomic_store_relaxed_16:1499; CHECK-LSE-O1: ; %bb.0:1500; CHECK-LSE-O1-NEXT: strh w2, [x0, #8190]1501; CHECK-LSE-O1-NEXT: strh w2, [x0, w1, sxtw #1]1502; CHECK-LSE-O1-NEXT: sturh w2, [x0, #-256]1503; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361504; CHECK-LSE-O1-NEXT: strh w2, [x8]1505; CHECK-LSE-O1-NEXT: ret1506;1507; CHECK-LSE-O0-LABEL: atomic_store_relaxed_16:1508; CHECK-LSE-O0: ; %bb.0:1509; CHECK-LSE-O0-NEXT: strh w2, [x0, #8190]1510; CHECK-LSE-O0-NEXT: strh w2, [x0, w1, sxtw #1]1511; CHECK-LSE-O0-NEXT: sturh w2, [x0, #-256]1512; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361513; CHECK-LSE-O0-NEXT: strh w2, [x8]1514; CHECK-LSE-O0-NEXT: ret1515 %ptr_unsigned = getelementptr i16, ptr %p, i32 40951516 store atomic i16 %val, ptr %ptr_unsigned monotonic, align 21517 1518 %ptr_regoff = getelementptr i16, ptr %p, i32 %off321519 store atomic i16 %val, ptr %ptr_regoff unordered, align 21520 1521 %ptr_unscaled = getelementptr i16, ptr %p, i32 -1281522 store atomic i16 %val, ptr %ptr_unscaled monotonic, align 21523 1524 %ptr_random = getelementptr i16, ptr %p, i32 595968 ; 0x123000/2 (i.e. ADD imm)1525 store atomic i16 %val, ptr %ptr_random unordered, align 21526 1527 ret void1528}1529 1530define void @atomic_store_relaxed_32(ptr %p, i32 %off32, i32 %val) #0 {1531; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_32:1532; CHECK-NOLSE-O1: ; %bb.0:1533; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361534; CHECK-NOLSE-O1-NEXT: str w2, [x0, #16380]1535; CHECK-NOLSE-O1-NEXT: str w2, [x0, w1, sxtw #2]1536; CHECK-NOLSE-O1-NEXT: stur w2, [x0, #-256]1537; CHECK-NOLSE-O1-NEXT: str w2, [x8]1538; CHECK-NOLSE-O1-NEXT: ret1539;1540; CHECK-OUTLINE-O1-LABEL: atomic_store_relaxed_32:1541; CHECK-OUTLINE-O1: ; %bb.0:1542; CHECK-OUTLINE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361543; CHECK-OUTLINE-O1-NEXT: str w2, [x0, #16380]1544; CHECK-OUTLINE-O1-NEXT: str w2, [x0, w1, sxtw #2]1545; CHECK-OUTLINE-O1-NEXT: stur w2, [x0, #-256]1546; CHECK-OUTLINE-O1-NEXT: str w2, [x8]1547; CHECK-OUTLINE-O1-NEXT: ret1548;1549; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_32:1550; CHECK-NOLSE-O0: ; %bb.0:1551; CHECK-NOLSE-O0-NEXT: str w2, [x0, #16380]1552; CHECK-NOLSE-O0-NEXT: str w2, [x0, w1, sxtw #2]1553; CHECK-NOLSE-O0-NEXT: stur w2, [x0, #-256]1554; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361555; CHECK-NOLSE-O0-NEXT: str w2, [x8]1556; CHECK-NOLSE-O0-NEXT: ret1557;1558; CHECK-OUTLINE-O0-LABEL: atomic_store_relaxed_32:1559; CHECK-OUTLINE-O0: ; %bb.0:1560; CHECK-OUTLINE-O0-NEXT: str w2, [x0, #16380]1561; CHECK-OUTLINE-O0-NEXT: str w2, [x0, w1, sxtw #2]1562; CHECK-OUTLINE-O0-NEXT: stur w2, [x0, #-256]1563; CHECK-OUTLINE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361564; CHECK-OUTLINE-O0-NEXT: str w2, [x8]1565; CHECK-OUTLINE-O0-NEXT: ret1566;1567; CHECK-LSE-O1-LABEL: atomic_store_relaxed_32:1568; CHECK-LSE-O1: ; %bb.0:1569; CHECK-LSE-O1-NEXT: str w2, [x0, #16380]1570; CHECK-LSE-O1-NEXT: str w2, [x0, w1, sxtw #2]1571; CHECK-LSE-O1-NEXT: stur w2, [x0, #-256]1572; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361573; CHECK-LSE-O1-NEXT: str w2, [x8]1574; CHECK-LSE-O1-NEXT: ret1575;1576; CHECK-LSE-O0-LABEL: atomic_store_relaxed_32:1577; CHECK-LSE-O0: ; %bb.0:1578; CHECK-LSE-O0-NEXT: str w2, [x0, #16380]1579; CHECK-LSE-O0-NEXT: str w2, [x0, w1, sxtw #2]1580; CHECK-LSE-O0-NEXT: stur w2, [x0, #-256]1581; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361582; CHECK-LSE-O0-NEXT: str w2, [x8]1583; CHECK-LSE-O0-NEXT: ret1584 %ptr_unsigned = getelementptr i32, ptr %p, i32 40951585 store atomic i32 %val, ptr %ptr_unsigned monotonic, align 41586 1587 %ptr_regoff = getelementptr i32, ptr %p, i32 %off321588 store atomic i32 %val, ptr %ptr_regoff unordered, align 41589 1590 %ptr_unscaled = getelementptr i32, ptr %p, i32 -641591 store atomic i32 %val, ptr %ptr_unscaled monotonic, align 41592 1593 %ptr_random = getelementptr i32, ptr %p, i32 297984 ; 0x123000/4 (i.e. ADD imm)1594 store atomic i32 %val, ptr %ptr_random unordered, align 41595 1596 ret void1597}1598 1599define void @atomic_store_relaxed_64(ptr %p, i32 %off32, i64 %val) #0 {1600; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_64:1601; CHECK-NOLSE-O1: ; %bb.0:1602; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361603; CHECK-NOLSE-O1-NEXT: str x2, [x0, #32760]1604; CHECK-NOLSE-O1-NEXT: str x2, [x0, w1, sxtw #3]1605; CHECK-NOLSE-O1-NEXT: stur x2, [x0, #-256]1606; CHECK-NOLSE-O1-NEXT: str x2, [x8]1607; CHECK-NOLSE-O1-NEXT: ret1608;1609; CHECK-OUTLINE-O1-LABEL: atomic_store_relaxed_64:1610; CHECK-OUTLINE-O1: ; %bb.0:1611; CHECK-OUTLINE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361612; CHECK-OUTLINE-O1-NEXT: str x2, [x0, #32760]1613; CHECK-OUTLINE-O1-NEXT: str x2, [x0, w1, sxtw #3]1614; CHECK-OUTLINE-O1-NEXT: stur x2, [x0, #-256]1615; CHECK-OUTLINE-O1-NEXT: str x2, [x8]1616; CHECK-OUTLINE-O1-NEXT: ret1617;1618; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_64:1619; CHECK-NOLSE-O0: ; %bb.0:1620; CHECK-NOLSE-O0-NEXT: str x2, [x0, #32760]1621; CHECK-NOLSE-O0-NEXT: str x2, [x0, w1, sxtw #3]1622; CHECK-NOLSE-O0-NEXT: stur x2, [x0, #-256]1623; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361624; CHECK-NOLSE-O0-NEXT: str x2, [x8]1625; CHECK-NOLSE-O0-NEXT: ret1626;1627; CHECK-OUTLINE-O0-LABEL: atomic_store_relaxed_64:1628; CHECK-OUTLINE-O0: ; %bb.0:1629; CHECK-OUTLINE-O0-NEXT: str x2, [x0, #32760]1630; CHECK-OUTLINE-O0-NEXT: str x2, [x0, w1, sxtw #3]1631; CHECK-OUTLINE-O0-NEXT: stur x2, [x0, #-256]1632; CHECK-OUTLINE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361633; CHECK-OUTLINE-O0-NEXT: str x2, [x8]1634; CHECK-OUTLINE-O0-NEXT: ret1635;1636; CHECK-LSE-O1-LABEL: atomic_store_relaxed_64:1637; CHECK-LSE-O1: ; %bb.0:1638; CHECK-LSE-O1-NEXT: str x2, [x0, #32760]1639; CHECK-LSE-O1-NEXT: str x2, [x0, w1, sxtw #3]1640; CHECK-LSE-O1-NEXT: stur x2, [x0, #-256]1641; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =11919361642; CHECK-LSE-O1-NEXT: str x2, [x8]1643; CHECK-LSE-O1-NEXT: ret1644;1645; CHECK-LSE-O0-LABEL: atomic_store_relaxed_64:1646; CHECK-LSE-O0: ; %bb.0:1647; CHECK-LSE-O0-NEXT: str x2, [x0, #32760]1648; CHECK-LSE-O0-NEXT: str x2, [x0, w1, sxtw #3]1649; CHECK-LSE-O0-NEXT: stur x2, [x0, #-256]1650; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =11919361651; CHECK-LSE-O0-NEXT: str x2, [x8]1652; CHECK-LSE-O0-NEXT: ret1653 %ptr_unsigned = getelementptr i64, ptr %p, i32 40951654 store atomic i64 %val, ptr %ptr_unsigned monotonic, align 81655 1656 %ptr_regoff = getelementptr i64, ptr %p, i32 %off321657 store atomic i64 %val, ptr %ptr_regoff unordered, align 81658 1659 %ptr_unscaled = getelementptr i64, ptr %p, i32 -321660 store atomic i64 %val, ptr %ptr_unscaled monotonic, align 81661 1662 %ptr_random = getelementptr i64, ptr %p, i32 148992 ; 0x123000/8 (i.e. ADD imm)1663 store atomic i64 %val, ptr %ptr_random unordered, align 81664 1665 ret void1666}1667 1668define i32 @load_zext(ptr %p8, ptr %p16) {1669; CHECK-NOLSE-O1-LABEL: load_zext:1670; CHECK-NOLSE-O1: ; %bb.0:1671; CHECK-NOLSE-O1-NEXT: ldarb w8, [x0]1672; CHECK-NOLSE-O1-NEXT: ldrh w9, [x1]1673; CHECK-NOLSE-O1-NEXT: add w0, w9, w8, uxtb1674; CHECK-NOLSE-O1-NEXT: ret1675;1676; CHECK-OUTLINE-O1-LABEL: load_zext:1677; CHECK-OUTLINE-O1: ; %bb.0:1678; CHECK-OUTLINE-O1-NEXT: ldarb w8, [x0]1679; CHECK-OUTLINE-O1-NEXT: ldrh w9, [x1]1680; CHECK-OUTLINE-O1-NEXT: add w0, w9, w8, uxtb1681; CHECK-OUTLINE-O1-NEXT: ret1682;1683; CHECK-NOLSE-O0-LABEL: load_zext:1684; CHECK-NOLSE-O0: ; %bb.0:1685; CHECK-NOLSE-O0-NEXT: ldarb w9, [x0]1686; CHECK-NOLSE-O0-NEXT: ldrh w8, [x1]1687; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, uxtb1688; CHECK-NOLSE-O0-NEXT: ret1689;1690; CHECK-OUTLINE-O0-LABEL: load_zext:1691; CHECK-OUTLINE-O0: ; %bb.0:1692; CHECK-OUTLINE-O0-NEXT: ldarb w9, [x0]1693; CHECK-OUTLINE-O0-NEXT: ldrh w8, [x1]1694; CHECK-OUTLINE-O0-NEXT: add w0, w8, w9, uxtb1695; CHECK-OUTLINE-O0-NEXT: ret1696;1697; CHECK-LSE-O1-LABEL: load_zext:1698; CHECK-LSE-O1: ; %bb.0:1699; CHECK-LSE-O1-NEXT: ldaprb w8, [x0]1700; CHECK-LSE-O1-NEXT: ldrh w9, [x1]1701; CHECK-LSE-O1-NEXT: add w0, w9, w8, uxtb1702; CHECK-LSE-O1-NEXT: ret1703;1704; CHECK-LSE-O0-LABEL: load_zext:1705; CHECK-LSE-O0: ; %bb.0:1706; CHECK-LSE-O0-NEXT: ldaprb w9, [x0]1707; CHECK-LSE-O0-NEXT: ldrh w8, [x1]1708; CHECK-LSE-O0-NEXT: add w0, w8, w9, uxtb1709; CHECK-LSE-O0-NEXT: ret1710 %val1.8 = load atomic i8, ptr %p8 acquire, align 11711 %val1 = zext i8 %val1.8 to i321712 1713 %val2.16 = load atomic i16, ptr %p16 unordered, align 21714 %val2 = zext i16 %val2.16 to i321715 1716 %res = add i32 %val1, %val21717 ret i32 %res1718}1719 1720define { i32, i64 } @load_acq(ptr %p32, ptr %p64) {1721; CHECK-NOLSE-LABEL: load_acq:1722; CHECK-NOLSE: ; %bb.0:1723; CHECK-NOLSE-NEXT: ldar w0, [x0]1724; CHECK-NOLSE-NEXT: ldar x1, [x1]1725; CHECK-NOLSE-NEXT: ret1726;1727; CHECK-OUTLINE-LABEL: load_acq:1728; CHECK-OUTLINE: ; %bb.0:1729; CHECK-OUTLINE-NEXT: ldar w0, [x0]1730; CHECK-OUTLINE-NEXT: ldar x1, [x1]1731; CHECK-OUTLINE-NEXT: ret1732;1733; CHECK-LSE-O1-LABEL: load_acq:1734; CHECK-LSE-O1: ; %bb.0:1735; CHECK-LSE-O1-NEXT: ldar w0, [x0]1736; CHECK-LSE-O1-NEXT: ldapr x1, [x1]1737; CHECK-LSE-O1-NEXT: ret1738;1739; CHECK-LSE-O0-LABEL: load_acq:1740; CHECK-LSE-O0: ; %bb.0:1741; CHECK-LSE-O0-NEXT: ldar w0, [x0]1742; CHECK-LSE-O0-NEXT: ldapr x1, [x1]1743; CHECK-LSE-O0-NEXT: ret1744 %val32 = load atomic i32, ptr %p32 seq_cst, align 41745 %tmp = insertvalue { i32, i64 } undef, i32 %val32, 01746 1747 %val64 = load atomic i64, ptr %p64 acquire, align 81748 %res = insertvalue { i32, i64 } %tmp, i64 %val64, 11749 1750 ret { i32, i64 } %res1751}1752 1753define i32 @load_sext(ptr %p8, ptr %p16) {1754; CHECK-NOLSE-O1-LABEL: load_sext:1755; CHECK-NOLSE-O1: ; %bb.0:1756; CHECK-NOLSE-O1-NEXT: ldarb w8, [x0]1757; CHECK-NOLSE-O1-NEXT: ldrh w9, [x1]1758; CHECK-NOLSE-O1-NEXT: sxth w9, w91759; CHECK-NOLSE-O1-NEXT: add w0, w9, w8, sxtb1760; CHECK-NOLSE-O1-NEXT: ret1761;1762; CHECK-OUTLINE-O1-LABEL: load_sext:1763; CHECK-OUTLINE-O1: ; %bb.0:1764; CHECK-OUTLINE-O1-NEXT: ldarb w8, [x0]1765; CHECK-OUTLINE-O1-NEXT: ldrh w9, [x1]1766; CHECK-OUTLINE-O1-NEXT: sxth w9, w91767; CHECK-OUTLINE-O1-NEXT: add w0, w9, w8, sxtb1768; CHECK-OUTLINE-O1-NEXT: ret1769;1770; CHECK-NOLSE-O0-LABEL: load_sext:1771; CHECK-NOLSE-O0: ; %bb.0:1772; CHECK-NOLSE-O0-NEXT: ldarb w9, [x0]1773; CHECK-NOLSE-O0-NEXT: ldrh w8, [x1]1774; CHECK-NOLSE-O0-NEXT: sxth w8, w81775; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, sxtb1776; CHECK-NOLSE-O0-NEXT: ret1777;1778; CHECK-OUTLINE-O0-LABEL: load_sext:1779; CHECK-OUTLINE-O0: ; %bb.0:1780; CHECK-OUTLINE-O0-NEXT: ldarb w9, [x0]1781; CHECK-OUTLINE-O0-NEXT: ldrh w8, [x1]1782; CHECK-OUTLINE-O0-NEXT: sxth w8, w81783; CHECK-OUTLINE-O0-NEXT: add w0, w8, w9, sxtb1784; CHECK-OUTLINE-O0-NEXT: ret1785;1786; CHECK-LSE-O1-LABEL: load_sext:1787; CHECK-LSE-O1: ; %bb.0:1788; CHECK-LSE-O1-NEXT: ldaprb w8, [x0]1789; CHECK-LSE-O1-NEXT: ldrh w9, [x1]1790; CHECK-LSE-O1-NEXT: sxth w9, w91791; CHECK-LSE-O1-NEXT: add w0, w9, w8, sxtb1792; CHECK-LSE-O1-NEXT: ret1793;1794; CHECK-LSE-O0-LABEL: load_sext:1795; CHECK-LSE-O0: ; %bb.0:1796; CHECK-LSE-O0-NEXT: ldaprb w9, [x0]1797; CHECK-LSE-O0-NEXT: ldrh w8, [x1]1798; CHECK-LSE-O0-NEXT: sxth w8, w81799; CHECK-LSE-O0-NEXT: add w0, w8, w9, sxtb1800; CHECK-LSE-O0-NEXT: ret1801 %val1.8 = load atomic i8, ptr %p8 acquire, align 11802 %val1 = sext i8 %val1.8 to i321803 1804 %val2.16 = load atomic i16, ptr %p16 unordered, align 21805 %val2 = sext i16 %val2.16 to i321806 1807 %res = add i32 %val1, %val21808 ret i32 %res1809}1810 1811define void @store_trunc(i32 %val, ptr %p8, ptr %p16) {1812; CHECK-NOLSE-LABEL: store_trunc:1813; CHECK-NOLSE: ; %bb.0:1814; CHECK-NOLSE-NEXT: stlrb w0, [x1]1815; CHECK-NOLSE-NEXT: strh w0, [x2]1816; CHECK-NOLSE-NEXT: ret1817;1818; CHECK-OUTLINE-LABEL: store_trunc:1819; CHECK-OUTLINE: ; %bb.0:1820; CHECK-OUTLINE-NEXT: stlrb w0, [x1]1821; CHECK-OUTLINE-NEXT: strh w0, [x2]1822; CHECK-OUTLINE-NEXT: ret1823;1824; CHECK-LSE-O1-LABEL: store_trunc:1825; CHECK-LSE-O1: ; %bb.0:1826; CHECK-LSE-O1-NEXT: stlrb w0, [x1]1827; CHECK-LSE-O1-NEXT: strh w0, [x2]1828; CHECK-LSE-O1-NEXT: ret1829;1830; CHECK-LSE-O0-LABEL: store_trunc:1831; CHECK-LSE-O0: ; %bb.0:1832; CHECK-LSE-O0-NEXT: stlrb w0, [x1]1833; CHECK-LSE-O0-NEXT: strh w0, [x2]1834; CHECK-LSE-O0-NEXT: ret1835 %val8 = trunc i32 %val to i81836 store atomic i8 %val8, ptr %p8 seq_cst, align 11837 1838 %val16 = trunc i32 %val to i161839 store atomic i16 %val16, ptr %p16 monotonic, align 21840 1841 ret void1842}1843 1844define i8 @atomicrmw_add_i8(ptr %ptr, i8 %rhs) {1845; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i8:1846; CHECK-NOLSE-O1: ; %bb.0:1847; CHECK-NOLSE-O1-NEXT: LBB27_1: ; %atomicrmw.start1848; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=11849; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]1850; CHECK-NOLSE-O1-NEXT: add w9, w8, w11851; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0]1852; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB27_11853; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end1854; CHECK-NOLSE-O1-NEXT: mov w0, w81855; CHECK-NOLSE-O1-NEXT: ret1856;1857; CHECK-OUTLINE-O1-LABEL: atomicrmw_add_i8:1858; CHECK-OUTLINE-O1: ; %bb.0:1859; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill1860; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 161861; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -81862; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -161863; CHECK-OUTLINE-O1-NEXT: mov x2, x01864; CHECK-OUTLINE-O1-NEXT: mov w0, w11865; CHECK-OUTLINE-O1-NEXT: mov x1, x21866; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd1_acq_rel1867; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload1868; CHECK-OUTLINE-O1-NEXT: ret1869;1870; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i8:1871; CHECK-NOLSE-O0: ; %bb.0:1872; CHECK-NOLSE-O0-NEXT: sub sp, sp, #321873; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 321874; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill1875; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill1876; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]1877; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill1878; CHECK-NOLSE-O0-NEXT: b LBB27_11879; CHECK-NOLSE-O0-NEXT: LBB27_1: ; %atomicrmw.start1880; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=11881; CHECK-NOLSE-O0-NEXT: ; Child Loop BB27_2 Depth 21882; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload1883; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload1884; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload1885; CHECK-NOLSE-O0-NEXT: add w12, w8, w10, uxth1886; CHECK-NOLSE-O0-NEXT: LBB27_2: ; %atomicrmw.start1887; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB27_1 Depth=11888; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=21889; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]1890; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb1891; CHECK-NOLSE-O0-NEXT: b.ne LBB27_41892; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start1893; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB27_2 Depth=21894; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]1895; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB27_21896; CHECK-NOLSE-O0-NEXT: LBB27_4: ; %atomicrmw.start1897; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB27_1 Depth=11898; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill1899; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff1900; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb1901; CHECK-NOLSE-O0-NEXT: cset w8, eq1902; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill1903; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB27_11904; CHECK-NOLSE-O0-NEXT: b LBB27_51905; CHECK-NOLSE-O0-NEXT: LBB27_5: ; %atomicrmw.end1906; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload1907; CHECK-NOLSE-O0-NEXT: add sp, sp, #321908; CHECK-NOLSE-O0-NEXT: ret1909;1910; CHECK-OUTLINE-O0-LABEL: atomicrmw_add_i8:1911; CHECK-OUTLINE-O0: ; %bb.0:1912; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #321913; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill1914; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 321915; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -81916; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -161917; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill1918; CHECK-OUTLINE-O0-NEXT: mov w0, w11919; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload1920; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd1_acq_rel1921; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload1922; CHECK-OUTLINE-O0-NEXT: add sp, sp, #321923; CHECK-OUTLINE-O0-NEXT: ret1924;1925; CHECK-LSE-O1-LABEL: atomicrmw_add_i8:1926; CHECK-LSE-O1: ; %bb.0:1927; CHECK-LSE-O1-NEXT: ldaddalb w1, w0, [x0]1928; CHECK-LSE-O1-NEXT: ret1929;1930; CHECK-LSE-O0-LABEL: atomicrmw_add_i8:1931; CHECK-LSE-O0: ; %bb.0:1932; CHECK-LSE-O0-NEXT: ldaddalb w1, w0, [x0]1933; CHECK-LSE-O0-NEXT: ret1934 %res = atomicrmw add ptr %ptr, i8 %rhs seq_cst1935 ret i8 %res1936}1937 1938define i8 @atomicrmw_xchg_i8(ptr %ptr, i8 %rhs) {1939; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i8:1940; CHECK-NOLSE-O1: ; %bb.0:1941; CHECK-NOLSE-O1-NEXT: LBB28_1: ; %atomicrmw.start1942; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=11943; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0]1944; CHECK-NOLSE-O1-NEXT: stxrb w9, w1, [x0]1945; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB28_11946; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end1947; CHECK-NOLSE-O1-NEXT: mov w0, w81948; CHECK-NOLSE-O1-NEXT: ret1949;1950; CHECK-OUTLINE-O1-LABEL: atomicrmw_xchg_i8:1951; CHECK-OUTLINE-O1: ; %bb.0:1952; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill1953; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 161954; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -81955; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -161956; CHECK-OUTLINE-O1-NEXT: mov x2, x01957; CHECK-OUTLINE-O1-NEXT: mov w0, w11958; CHECK-OUTLINE-O1-NEXT: mov x1, x21959; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_swp1_relax1960; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload1961; CHECK-OUTLINE-O1-NEXT: ret1962;1963; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i8:1964; CHECK-NOLSE-O0: ; %bb.0:1965; CHECK-NOLSE-O0-NEXT: sub sp, sp, #321966; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 321967; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill1968; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill1969; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]1970; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill1971; CHECK-NOLSE-O0-NEXT: b LBB28_11972; CHECK-NOLSE-O0-NEXT: LBB28_1: ; %atomicrmw.start1973; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=11974; CHECK-NOLSE-O0-NEXT: ; Child Loop BB28_2 Depth 21975; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload1976; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload1977; CHECK-NOLSE-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Reload1978; CHECK-NOLSE-O0-NEXT: LBB28_2: ; %atomicrmw.start1979; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB28_1 Depth=11980; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=21981; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]1982; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb1983; CHECK-NOLSE-O0-NEXT: b.ne LBB28_41984; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start1985; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB28_2 Depth=21986; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]1987; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB28_21988; CHECK-NOLSE-O0-NEXT: LBB28_4: ; %atomicrmw.start1989; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB28_1 Depth=11990; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill1991; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff1992; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb1993; CHECK-NOLSE-O0-NEXT: cset w8, eq1994; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill1995; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB28_11996; CHECK-NOLSE-O0-NEXT: b LBB28_51997; CHECK-NOLSE-O0-NEXT: LBB28_5: ; %atomicrmw.end1998; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload1999; CHECK-NOLSE-O0-NEXT: add sp, sp, #322000; CHECK-NOLSE-O0-NEXT: ret2001;2002; CHECK-OUTLINE-O0-LABEL: atomicrmw_xchg_i8:2003; CHECK-OUTLINE-O0: ; %bb.0:2004; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #322005; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill2006; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 322007; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82008; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162009; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill2010; CHECK-OUTLINE-O0-NEXT: mov w0, w12011; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload2012; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_swp1_relax2013; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload2014; CHECK-OUTLINE-O0-NEXT: add sp, sp, #322015; CHECK-OUTLINE-O0-NEXT: ret2016;2017; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i8:2018; CHECK-LSE-O1: ; %bb.0:2019; CHECK-LSE-O1-NEXT: swpb w1, w0, [x0]2020; CHECK-LSE-O1-NEXT: ret2021;2022; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i8:2023; CHECK-LSE-O0: ; %bb.0:2024; CHECK-LSE-O0-NEXT: swpb w1, w0, [x0]2025; CHECK-LSE-O0-NEXT: ret2026 %res = atomicrmw xchg ptr %ptr, i8 %rhs monotonic2027 ret i8 %res2028}2029 2030define i8 @atomicrmw_sub_i8(ptr %ptr, i8 %rhs) {2031; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i8:2032; CHECK-NOLSE-O1: ; %bb.0:2033; CHECK-NOLSE-O1-NEXT: LBB29_1: ; %atomicrmw.start2034; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12035; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]2036; CHECK-NOLSE-O1-NEXT: sub w9, w8, w12037; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0]2038; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB29_12039; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2040; CHECK-NOLSE-O1-NEXT: mov w0, w82041; CHECK-NOLSE-O1-NEXT: ret2042;2043; CHECK-OUTLINE-O1-LABEL: atomicrmw_sub_i8:2044; CHECK-OUTLINE-O1: ; %bb.0:2045; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill2046; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 162047; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -82048; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -162049; CHECK-OUTLINE-O1-NEXT: mov x2, x02050; CHECK-OUTLINE-O1-NEXT: neg w0, w12051; CHECK-OUTLINE-O1-NEXT: mov x1, x22052; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd1_acq2053; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload2054; CHECK-OUTLINE-O1-NEXT: ret2055;2056; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i8:2057; CHECK-NOLSE-O0: ; %bb.0:2058; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322059; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322060; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2061; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2062; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2063; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2064; CHECK-NOLSE-O0-NEXT: b LBB29_12065; CHECK-NOLSE-O0-NEXT: LBB29_1: ; %atomicrmw.start2066; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12067; CHECK-NOLSE-O0-NEXT: ; Child Loop BB29_2 Depth 22068; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2069; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2070; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2071; CHECK-NOLSE-O0-NEXT: subs w12, w10, w82072; CHECK-NOLSE-O0-NEXT: LBB29_2: ; %atomicrmw.start2073; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB29_1 Depth=12074; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22075; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2076; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2077; CHECK-NOLSE-O0-NEXT: b.ne LBB29_42078; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2079; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB29_2 Depth=22080; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2081; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB29_22082; CHECK-NOLSE-O0-NEXT: LBB29_4: ; %atomicrmw.start2083; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB29_1 Depth=12084; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2085; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2086; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2087; CHECK-NOLSE-O0-NEXT: cset w8, eq2088; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2089; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB29_12090; CHECK-NOLSE-O0-NEXT: b LBB29_52091; CHECK-NOLSE-O0-NEXT: LBB29_5: ; %atomicrmw.end2092; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2093; CHECK-NOLSE-O0-NEXT: add sp, sp, #322094; CHECK-NOLSE-O0-NEXT: ret2095;2096; CHECK-OUTLINE-O0-LABEL: atomicrmw_sub_i8:2097; CHECK-OUTLINE-O0: ; %bb.0:2098; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #322099; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill2100; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 322101; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82102; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162103; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill2104; CHECK-OUTLINE-O0-NEXT: mov w9, w12105; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload2106; CHECK-OUTLINE-O0-NEXT: mov w8, wzr2107; CHECK-OUTLINE-O0-NEXT: subs w0, w8, w92108; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd1_acq2109; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload2110; CHECK-OUTLINE-O0-NEXT: add sp, sp, #322111; CHECK-OUTLINE-O0-NEXT: ret2112;2113; CHECK-LSE-O1-LABEL: atomicrmw_sub_i8:2114; CHECK-LSE-O1: ; %bb.0:2115; CHECK-LSE-O1-NEXT: neg w8, w12116; CHECK-LSE-O1-NEXT: ldaddab w8, w0, [x0]2117; CHECK-LSE-O1-NEXT: ret2118;2119; CHECK-LSE-O0-LABEL: atomicrmw_sub_i8:2120; CHECK-LSE-O0: ; %bb.0:2121; CHECK-LSE-O0-NEXT: neg w8, w12122; CHECK-LSE-O0-NEXT: ldaddab w8, w0, [x0]2123; CHECK-LSE-O0-NEXT: ret2124 %res = atomicrmw sub ptr %ptr, i8 %rhs acquire2125 ret i8 %res2126}2127 2128define i8 @atomicrmw_and_i8(ptr %ptr, i8 %rhs) {2129; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i8:2130; CHECK-NOLSE-O1: ; %bb.0:2131; CHECK-NOLSE-O1-NEXT: LBB30_1: ; %atomicrmw.start2132; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12133; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0]2134; CHECK-NOLSE-O1-NEXT: and w9, w8, w12135; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0]2136; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB30_12137; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2138; CHECK-NOLSE-O1-NEXT: mov w0, w82139; CHECK-NOLSE-O1-NEXT: ret2140;2141; CHECK-OUTLINE-O1-LABEL: atomicrmw_and_i8:2142; CHECK-OUTLINE-O1: ; %bb.0:2143; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill2144; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 162145; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -82146; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -162147; CHECK-OUTLINE-O1-NEXT: mov x2, x02148; CHECK-OUTLINE-O1-NEXT: mvn w0, w12149; CHECK-OUTLINE-O1-NEXT: mov x1, x22150; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldclr1_rel2151; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload2152; CHECK-OUTLINE-O1-NEXT: ret2153;2154; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i8:2155; CHECK-NOLSE-O0: ; %bb.0:2156; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322157; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322158; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2159; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2160; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2161; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2162; CHECK-NOLSE-O0-NEXT: b LBB30_12163; CHECK-NOLSE-O0-NEXT: LBB30_1: ; %atomicrmw.start2164; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12165; CHECK-NOLSE-O0-NEXT: ; Child Loop BB30_2 Depth 22166; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2167; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2168; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2169; CHECK-NOLSE-O0-NEXT: and w12, w10, w82170; CHECK-NOLSE-O0-NEXT: LBB30_2: ; %atomicrmw.start2171; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB30_1 Depth=12172; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22173; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2174; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2175; CHECK-NOLSE-O0-NEXT: b.ne LBB30_42176; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2177; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB30_2 Depth=22178; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2179; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB30_22180; CHECK-NOLSE-O0-NEXT: LBB30_4: ; %atomicrmw.start2181; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB30_1 Depth=12182; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2183; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2184; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2185; CHECK-NOLSE-O0-NEXT: cset w8, eq2186; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2187; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB30_12188; CHECK-NOLSE-O0-NEXT: b LBB30_52189; CHECK-NOLSE-O0-NEXT: LBB30_5: ; %atomicrmw.end2190; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2191; CHECK-NOLSE-O0-NEXT: add sp, sp, #322192; CHECK-NOLSE-O0-NEXT: ret2193;2194; CHECK-OUTLINE-O0-LABEL: atomicrmw_and_i8:2195; CHECK-OUTLINE-O0: ; %bb.0:2196; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #322197; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill2198; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 322199; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82200; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162201; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill2202; CHECK-OUTLINE-O0-NEXT: mov w9, w12203; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload2204; CHECK-OUTLINE-O0-NEXT: mov w8, #-1 ; =0xffffffff2205; CHECK-OUTLINE-O0-NEXT: eor w0, w8, w92206; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldclr1_rel2207; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload2208; CHECK-OUTLINE-O0-NEXT: add sp, sp, #322209; CHECK-OUTLINE-O0-NEXT: ret2210;2211; CHECK-LSE-O1-LABEL: atomicrmw_and_i8:2212; CHECK-LSE-O1: ; %bb.0:2213; CHECK-LSE-O1-NEXT: mvn w8, w12214; CHECK-LSE-O1-NEXT: ldclrlb w8, w0, [x0]2215; CHECK-LSE-O1-NEXT: ret2216;2217; CHECK-LSE-O0-LABEL: atomicrmw_and_i8:2218; CHECK-LSE-O0: ; %bb.0:2219; CHECK-LSE-O0-NEXT: mvn w8, w12220; CHECK-LSE-O0-NEXT: ldclrlb w8, w0, [x0]2221; CHECK-LSE-O0-NEXT: ret2222 %res = atomicrmw and ptr %ptr, i8 %rhs release2223 ret i8 %res2224}2225 2226define i8 @atomicrmw_or_i8(ptr %ptr, i8 %rhs) {2227; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i8:2228; CHECK-NOLSE-O1: ; %bb.0:2229; CHECK-NOLSE-O1-NEXT: LBB31_1: ; %atomicrmw.start2230; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12231; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]2232; CHECK-NOLSE-O1-NEXT: orr w9, w8, w12233; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0]2234; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB31_12235; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2236; CHECK-NOLSE-O1-NEXT: mov w0, w82237; CHECK-NOLSE-O1-NEXT: ret2238;2239; CHECK-OUTLINE-O1-LABEL: atomicrmw_or_i8:2240; CHECK-OUTLINE-O1: ; %bb.0:2241; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill2242; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 162243; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -82244; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -162245; CHECK-OUTLINE-O1-NEXT: mov x2, x02246; CHECK-OUTLINE-O1-NEXT: mov w0, w12247; CHECK-OUTLINE-O1-NEXT: mov x1, x22248; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldset1_acq_rel2249; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload2250; CHECK-OUTLINE-O1-NEXT: ret2251;2252; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i8:2253; CHECK-NOLSE-O0: ; %bb.0:2254; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322255; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322256; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2257; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2258; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2259; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2260; CHECK-NOLSE-O0-NEXT: b LBB31_12261; CHECK-NOLSE-O0-NEXT: LBB31_1: ; %atomicrmw.start2262; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12263; CHECK-NOLSE-O0-NEXT: ; Child Loop BB31_2 Depth 22264; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2265; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2266; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2267; CHECK-NOLSE-O0-NEXT: orr w12, w10, w82268; CHECK-NOLSE-O0-NEXT: LBB31_2: ; %atomicrmw.start2269; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB31_1 Depth=12270; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22271; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2272; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2273; CHECK-NOLSE-O0-NEXT: b.ne LBB31_42274; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2275; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB31_2 Depth=22276; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2277; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB31_22278; CHECK-NOLSE-O0-NEXT: LBB31_4: ; %atomicrmw.start2279; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB31_1 Depth=12280; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2281; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2282; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2283; CHECK-NOLSE-O0-NEXT: cset w8, eq2284; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2285; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB31_12286; CHECK-NOLSE-O0-NEXT: b LBB31_52287; CHECK-NOLSE-O0-NEXT: LBB31_5: ; %atomicrmw.end2288; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2289; CHECK-NOLSE-O0-NEXT: add sp, sp, #322290; CHECK-NOLSE-O0-NEXT: ret2291;2292; CHECK-OUTLINE-O0-LABEL: atomicrmw_or_i8:2293; CHECK-OUTLINE-O0: ; %bb.0:2294; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #322295; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill2296; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 322297; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82298; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162299; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill2300; CHECK-OUTLINE-O0-NEXT: mov w0, w12301; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload2302; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldset1_acq_rel2303; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload2304; CHECK-OUTLINE-O0-NEXT: add sp, sp, #322305; CHECK-OUTLINE-O0-NEXT: ret2306;2307; CHECK-LSE-O1-LABEL: atomicrmw_or_i8:2308; CHECK-LSE-O1: ; %bb.0:2309; CHECK-LSE-O1-NEXT: ldsetalb w1, w0, [x0]2310; CHECK-LSE-O1-NEXT: ret2311;2312; CHECK-LSE-O0-LABEL: atomicrmw_or_i8:2313; CHECK-LSE-O0: ; %bb.0:2314; CHECK-LSE-O0-NEXT: ldsetalb w1, w0, [x0]2315; CHECK-LSE-O0-NEXT: ret2316 %res = atomicrmw or ptr %ptr, i8 %rhs seq_cst2317 ret i8 %res2318}2319 2320define i8 @atomicrmw_xor_i8(ptr %ptr, i8 %rhs) {2321; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i8:2322; CHECK-NOLSE-O1: ; %bb.0:2323; CHECK-NOLSE-O1-NEXT: LBB32_1: ; %atomicrmw.start2324; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12325; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0]2326; CHECK-NOLSE-O1-NEXT: eor w9, w8, w12327; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0]2328; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB32_12329; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2330; CHECK-NOLSE-O1-NEXT: mov w0, w82331; CHECK-NOLSE-O1-NEXT: ret2332;2333; CHECK-OUTLINE-O1-LABEL: atomicrmw_xor_i8:2334; CHECK-OUTLINE-O1: ; %bb.0:2335; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill2336; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 162337; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -82338; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -162339; CHECK-OUTLINE-O1-NEXT: mov x2, x02340; CHECK-OUTLINE-O1-NEXT: mov w0, w12341; CHECK-OUTLINE-O1-NEXT: mov x1, x22342; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldeor1_relax2343; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload2344; CHECK-OUTLINE-O1-NEXT: ret2345;2346; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i8:2347; CHECK-NOLSE-O0: ; %bb.0:2348; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322349; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322350; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2351; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2352; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2353; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2354; CHECK-NOLSE-O0-NEXT: b LBB32_12355; CHECK-NOLSE-O0-NEXT: LBB32_1: ; %atomicrmw.start2356; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12357; CHECK-NOLSE-O0-NEXT: ; Child Loop BB32_2 Depth 22358; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2359; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2360; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2361; CHECK-NOLSE-O0-NEXT: eor w12, w10, w82362; CHECK-NOLSE-O0-NEXT: LBB32_2: ; %atomicrmw.start2363; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB32_1 Depth=12364; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22365; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2366; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2367; CHECK-NOLSE-O0-NEXT: b.ne LBB32_42368; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2369; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB32_2 Depth=22370; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2371; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB32_22372; CHECK-NOLSE-O0-NEXT: LBB32_4: ; %atomicrmw.start2373; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB32_1 Depth=12374; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2375; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2376; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2377; CHECK-NOLSE-O0-NEXT: cset w8, eq2378; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2379; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB32_12380; CHECK-NOLSE-O0-NEXT: b LBB32_52381; CHECK-NOLSE-O0-NEXT: LBB32_5: ; %atomicrmw.end2382; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2383; CHECK-NOLSE-O0-NEXT: add sp, sp, #322384; CHECK-NOLSE-O0-NEXT: ret2385;2386; CHECK-OUTLINE-O0-LABEL: atomicrmw_xor_i8:2387; CHECK-OUTLINE-O0: ; %bb.0:2388; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #322389; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill2390; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 322391; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82392; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162393; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill2394; CHECK-OUTLINE-O0-NEXT: mov w0, w12395; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload2396; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldeor1_relax2397; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload2398; CHECK-OUTLINE-O0-NEXT: add sp, sp, #322399; CHECK-OUTLINE-O0-NEXT: ret2400;2401; CHECK-LSE-O1-LABEL: atomicrmw_xor_i8:2402; CHECK-LSE-O1: ; %bb.0:2403; CHECK-LSE-O1-NEXT: ldeorb w1, w0, [x0]2404; CHECK-LSE-O1-NEXT: ret2405;2406; CHECK-LSE-O0-LABEL: atomicrmw_xor_i8:2407; CHECK-LSE-O0: ; %bb.0:2408; CHECK-LSE-O0-NEXT: ldeorb w1, w0, [x0]2409; CHECK-LSE-O0-NEXT: ret2410 %res = atomicrmw xor ptr %ptr, i8 %rhs monotonic2411 ret i8 %res2412}2413 2414define i8 @atomicrmw_min_i8(ptr %ptr, i8 %rhs) {2415; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i8:2416; CHECK-NOLSE-O1: ; %bb.0:2417; CHECK-NOLSE-O1-NEXT: LBB33_1: ; %atomicrmw.start2418; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12419; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]2420; CHECK-NOLSE-O1-NEXT: sxtb w9, w82421; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxtb2422; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lt2423; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0]2424; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB33_12425; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2426; CHECK-NOLSE-O1-NEXT: mov w0, w82427; CHECK-NOLSE-O1-NEXT: ret2428;2429; CHECK-OUTLINE-O1-LABEL: atomicrmw_min_i8:2430; CHECK-OUTLINE-O1: ; %bb.0:2431; CHECK-OUTLINE-O1-NEXT: LBB33_1: ; %atomicrmw.start2432; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=12433; CHECK-OUTLINE-O1-NEXT: ldaxrb w8, [x0]2434; CHECK-OUTLINE-O1-NEXT: sxtb w9, w82435; CHECK-OUTLINE-O1-NEXT: cmp w9, w1, sxtb2436; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lt2437; CHECK-OUTLINE-O1-NEXT: stxrb w10, w9, [x0]2438; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB33_12439; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2440; CHECK-OUTLINE-O1-NEXT: mov w0, w82441; CHECK-OUTLINE-O1-NEXT: ret2442;2443; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i8:2444; CHECK-NOLSE-O0: ; %bb.0:2445; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322446; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322447; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2448; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2449; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2450; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2451; CHECK-NOLSE-O0-NEXT: b LBB33_12452; CHECK-NOLSE-O0-NEXT: LBB33_1: ; %atomicrmw.start2453; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12454; CHECK-NOLSE-O0-NEXT: ; Child Loop BB33_2 Depth 22455; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2456; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2457; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2458; CHECK-NOLSE-O0-NEXT: sxtb w9, w102459; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, sxtb2460; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, le2461; CHECK-NOLSE-O0-NEXT: LBB33_2: ; %atomicrmw.start2462; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB33_1 Depth=12463; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22464; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2465; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2466; CHECK-NOLSE-O0-NEXT: b.ne LBB33_42467; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2468; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB33_2 Depth=22469; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2470; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB33_22471; CHECK-NOLSE-O0-NEXT: LBB33_4: ; %atomicrmw.start2472; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB33_1 Depth=12473; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2474; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2475; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2476; CHECK-NOLSE-O0-NEXT: cset w8, eq2477; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2478; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB33_12479; CHECK-NOLSE-O0-NEXT: b LBB33_52480; CHECK-NOLSE-O0-NEXT: LBB33_5: ; %atomicrmw.end2481; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2482; CHECK-NOLSE-O0-NEXT: add sp, sp, #322483; CHECK-NOLSE-O0-NEXT: ret2484;2485; CHECK-OUTLINE-O0-LABEL: atomicrmw_min_i8:2486; CHECK-OUTLINE-O0: ; %bb.0:2487; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #482488; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill2489; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 482490; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82491; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162492; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2493; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2494; CHECK-OUTLINE-O0-NEXT: ldrb w0, [x0]2495; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2496; CHECK-OUTLINE-O0-NEXT: b LBB33_12497; CHECK-OUTLINE-O0-NEXT: LBB33_1: ; %atomicrmw.start2498; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=12499; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload2500; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload2501; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2502; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill2503; CHECK-OUTLINE-O0-NEXT: sxtb w9, w02504; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, sxtb2505; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, le2506; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas1_acq2507; CHECK-OUTLINE-O0-NEXT: ldr w9, [sp, #8] ; 4-byte Reload2508; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill2509; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0xff2510; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w9, uxtb2511; CHECK-OUTLINE-O0-NEXT: cset w8, eq2512; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2513; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB33_12514; CHECK-OUTLINE-O0-NEXT: b LBB33_22515; CHECK-OUTLINE-O0-NEXT: LBB33_2: ; %atomicrmw.end2516; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2517; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload2518; CHECK-OUTLINE-O0-NEXT: add sp, sp, #482519; CHECK-OUTLINE-O0-NEXT: ret2520;2521; CHECK-LSE-O1-LABEL: atomicrmw_min_i8:2522; CHECK-LSE-O1: ; %bb.0:2523; CHECK-LSE-O1-NEXT: ldsminab w1, w0, [x0]2524; CHECK-LSE-O1-NEXT: ret2525;2526; CHECK-LSE-O0-LABEL: atomicrmw_min_i8:2527; CHECK-LSE-O0: ; %bb.0:2528; CHECK-LSE-O0-NEXT: ldsminab w1, w0, [x0]2529; CHECK-LSE-O0-NEXT: ret2530 %res = atomicrmw min ptr %ptr, i8 %rhs acquire2531 ret i8 %res2532}2533 2534define i8 @atomicrmw_max_i8(ptr %ptr, i8 %rhs) {2535; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i8:2536; CHECK-NOLSE-O1: ; %bb.0:2537; CHECK-NOLSE-O1-NEXT: LBB34_1: ; %atomicrmw.start2538; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12539; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0]2540; CHECK-NOLSE-O1-NEXT: sxtb w9, w82541; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxtb2542; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, gt2543; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0]2544; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB34_12545; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2546; CHECK-NOLSE-O1-NEXT: mov w0, w82547; CHECK-NOLSE-O1-NEXT: ret2548;2549; CHECK-OUTLINE-O1-LABEL: atomicrmw_max_i8:2550; CHECK-OUTLINE-O1: ; %bb.0:2551; CHECK-OUTLINE-O1-NEXT: LBB34_1: ; %atomicrmw.start2552; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=12553; CHECK-OUTLINE-O1-NEXT: ldxrb w8, [x0]2554; CHECK-OUTLINE-O1-NEXT: sxtb w9, w82555; CHECK-OUTLINE-O1-NEXT: cmp w9, w1, sxtb2556; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, gt2557; CHECK-OUTLINE-O1-NEXT: stlxrb w10, w9, [x0]2558; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB34_12559; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2560; CHECK-OUTLINE-O1-NEXT: mov w0, w82561; CHECK-OUTLINE-O1-NEXT: ret2562;2563; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i8:2564; CHECK-NOLSE-O0: ; %bb.0:2565; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322566; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322567; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2568; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2569; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2570; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2571; CHECK-NOLSE-O0-NEXT: b LBB34_12572; CHECK-NOLSE-O0-NEXT: LBB34_1: ; %atomicrmw.start2573; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12574; CHECK-NOLSE-O0-NEXT: ; Child Loop BB34_2 Depth 22575; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2576; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2577; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2578; CHECK-NOLSE-O0-NEXT: sxtb w9, w102579; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, sxtb2580; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, gt2581; CHECK-NOLSE-O0-NEXT: LBB34_2: ; %atomicrmw.start2582; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB34_1 Depth=12583; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22584; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2585; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2586; CHECK-NOLSE-O0-NEXT: b.ne LBB34_42587; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2588; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB34_2 Depth=22589; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2590; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB34_22591; CHECK-NOLSE-O0-NEXT: LBB34_4: ; %atomicrmw.start2592; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB34_1 Depth=12593; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2594; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2595; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2596; CHECK-NOLSE-O0-NEXT: cset w8, eq2597; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2598; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB34_12599; CHECK-NOLSE-O0-NEXT: b LBB34_52600; CHECK-NOLSE-O0-NEXT: LBB34_5: ; %atomicrmw.end2601; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2602; CHECK-NOLSE-O0-NEXT: add sp, sp, #322603; CHECK-NOLSE-O0-NEXT: ret2604;2605; CHECK-OUTLINE-O0-LABEL: atomicrmw_max_i8:2606; CHECK-OUTLINE-O0: ; %bb.0:2607; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #482608; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill2609; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 482610; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82611; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162612; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2613; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2614; CHECK-OUTLINE-O0-NEXT: ldrb w0, [x0]2615; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2616; CHECK-OUTLINE-O0-NEXT: b LBB34_12617; CHECK-OUTLINE-O0-NEXT: LBB34_1: ; %atomicrmw.start2618; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=12619; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload2620; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload2621; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2622; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill2623; CHECK-OUTLINE-O0-NEXT: sxtb w9, w02624; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, sxtb2625; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, gt2626; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas1_rel2627; CHECK-OUTLINE-O0-NEXT: ldr w9, [sp, #8] ; 4-byte Reload2628; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill2629; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0xff2630; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w9, uxtb2631; CHECK-OUTLINE-O0-NEXT: cset w8, eq2632; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2633; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB34_12634; CHECK-OUTLINE-O0-NEXT: b LBB34_22635; CHECK-OUTLINE-O0-NEXT: LBB34_2: ; %atomicrmw.end2636; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2637; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload2638; CHECK-OUTLINE-O0-NEXT: add sp, sp, #482639; CHECK-OUTLINE-O0-NEXT: ret2640;2641; CHECK-LSE-O1-LABEL: atomicrmw_max_i8:2642; CHECK-LSE-O1: ; %bb.0:2643; CHECK-LSE-O1-NEXT: ldsmaxlb w1, w0, [x0]2644; CHECK-LSE-O1-NEXT: ret2645;2646; CHECK-LSE-O0-LABEL: atomicrmw_max_i8:2647; CHECK-LSE-O0: ; %bb.0:2648; CHECK-LSE-O0-NEXT: ldsmaxlb w1, w0, [x0]2649; CHECK-LSE-O0-NEXT: ret2650 %res = atomicrmw max ptr %ptr, i8 %rhs release2651 ret i8 %res2652}2653 2654define i8 @atomicrmw_umin_i8(ptr %ptr, i8 %rhs) {2655; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i8:2656; CHECK-NOLSE-O1: ; %bb.0:2657; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xff2658; CHECK-NOLSE-O1-NEXT: LBB35_1: ; %atomicrmw.start2659; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12660; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0]2661; CHECK-NOLSE-O1-NEXT: and w8, w8, #0xff2662; CHECK-NOLSE-O1-NEXT: cmp w8, w92663; CHECK-NOLSE-O1-NEXT: csel w10, w8, w9, lo2664; CHECK-NOLSE-O1-NEXT: stlxrb w11, w10, [x0]2665; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB35_12666; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2667; CHECK-NOLSE-O1-NEXT: mov w0, w82668; CHECK-NOLSE-O1-NEXT: ret2669;2670; CHECK-OUTLINE-O1-LABEL: atomicrmw_umin_i8:2671; CHECK-OUTLINE-O1: ; %bb.0:2672; CHECK-OUTLINE-O1-NEXT: and w9, w1, #0xff2673; CHECK-OUTLINE-O1-NEXT: LBB35_1: ; %atomicrmw.start2674; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=12675; CHECK-OUTLINE-O1-NEXT: ldaxrb w8, [x0]2676; CHECK-OUTLINE-O1-NEXT: and w8, w8, #0xff2677; CHECK-OUTLINE-O1-NEXT: cmp w8, w92678; CHECK-OUTLINE-O1-NEXT: csel w10, w8, w9, lo2679; CHECK-OUTLINE-O1-NEXT: stlxrb w11, w10, [x0]2680; CHECK-OUTLINE-O1-NEXT: cbnz w11, LBB35_12681; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2682; CHECK-OUTLINE-O1-NEXT: mov w0, w82683; CHECK-OUTLINE-O1-NEXT: ret2684;2685; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i8:2686; CHECK-NOLSE-O0: ; %bb.0:2687; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322688; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322689; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2690; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2691; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2692; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2693; CHECK-NOLSE-O0-NEXT: b LBB35_12694; CHECK-NOLSE-O0-NEXT: LBB35_1: ; %atomicrmw.start2695; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12696; CHECK-NOLSE-O0-NEXT: ; Child Loop BB35_2 Depth 22697; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2698; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2699; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2700; CHECK-NOLSE-O0-NEXT: and w9, w10, #0xff2701; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, uxtb2702; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, ls2703; CHECK-NOLSE-O0-NEXT: LBB35_2: ; %atomicrmw.start2704; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB35_1 Depth=12705; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22706; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2707; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2708; CHECK-NOLSE-O0-NEXT: b.ne LBB35_42709; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2710; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB35_2 Depth=22711; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2712; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB35_22713; CHECK-NOLSE-O0-NEXT: LBB35_4: ; %atomicrmw.start2714; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB35_1 Depth=12715; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2716; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2717; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2718; CHECK-NOLSE-O0-NEXT: cset w8, eq2719; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2720; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB35_12721; CHECK-NOLSE-O0-NEXT: b LBB35_52722; CHECK-NOLSE-O0-NEXT: LBB35_5: ; %atomicrmw.end2723; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2724; CHECK-NOLSE-O0-NEXT: add sp, sp, #322725; CHECK-NOLSE-O0-NEXT: ret2726;2727; CHECK-OUTLINE-O0-LABEL: atomicrmw_umin_i8:2728; CHECK-OUTLINE-O0: ; %bb.0:2729; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #482730; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill2731; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 482732; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82733; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162734; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2735; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2736; CHECK-OUTLINE-O0-NEXT: ldrb w0, [x0]2737; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2738; CHECK-OUTLINE-O0-NEXT: b LBB35_12739; CHECK-OUTLINE-O0-NEXT: LBB35_1: ; %atomicrmw.start2740; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=12741; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload2742; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload2743; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2744; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill2745; CHECK-OUTLINE-O0-NEXT: and w9, w0, #0xff2746; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, uxtb2747; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, ls2748; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas1_acq_rel2749; CHECK-OUTLINE-O0-NEXT: ldr w9, [sp, #8] ; 4-byte Reload2750; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill2751; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0xff2752; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w9, uxtb2753; CHECK-OUTLINE-O0-NEXT: cset w8, eq2754; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2755; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB35_12756; CHECK-OUTLINE-O0-NEXT: b LBB35_22757; CHECK-OUTLINE-O0-NEXT: LBB35_2: ; %atomicrmw.end2758; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2759; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload2760; CHECK-OUTLINE-O0-NEXT: add sp, sp, #482761; CHECK-OUTLINE-O0-NEXT: ret2762;2763; CHECK-LSE-O1-LABEL: atomicrmw_umin_i8:2764; CHECK-LSE-O1: ; %bb.0:2765; CHECK-LSE-O1-NEXT: lduminalb w1, w0, [x0]2766; CHECK-LSE-O1-NEXT: ret2767;2768; CHECK-LSE-O0-LABEL: atomicrmw_umin_i8:2769; CHECK-LSE-O0: ; %bb.0:2770; CHECK-LSE-O0-NEXT: lduminalb w1, w0, [x0]2771; CHECK-LSE-O0-NEXT: ret2772 %res = atomicrmw umin ptr %ptr, i8 %rhs seq_cst2773 ret i8 %res2774}2775 2776define i8 @atomicrmw_umax_i8(ptr %ptr, i8 %rhs) {2777; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i8:2778; CHECK-NOLSE-O1: ; %bb.0:2779; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xff2780; CHECK-NOLSE-O1-NEXT: LBB36_1: ; %atomicrmw.start2781; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12782; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0]2783; CHECK-NOLSE-O1-NEXT: and w8, w8, #0xff2784; CHECK-NOLSE-O1-NEXT: cmp w8, w92785; CHECK-NOLSE-O1-NEXT: csel w10, w8, w9, hi2786; CHECK-NOLSE-O1-NEXT: stxrb w11, w10, [x0]2787; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB36_12788; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2789; CHECK-NOLSE-O1-NEXT: mov w0, w82790; CHECK-NOLSE-O1-NEXT: ret2791;2792; CHECK-OUTLINE-O1-LABEL: atomicrmw_umax_i8:2793; CHECK-OUTLINE-O1: ; %bb.0:2794; CHECK-OUTLINE-O1-NEXT: and w9, w1, #0xff2795; CHECK-OUTLINE-O1-NEXT: LBB36_1: ; %atomicrmw.start2796; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=12797; CHECK-OUTLINE-O1-NEXT: ldxrb w8, [x0]2798; CHECK-OUTLINE-O1-NEXT: and w8, w8, #0xff2799; CHECK-OUTLINE-O1-NEXT: cmp w8, w92800; CHECK-OUTLINE-O1-NEXT: csel w10, w8, w9, hi2801; CHECK-OUTLINE-O1-NEXT: stxrb w11, w10, [x0]2802; CHECK-OUTLINE-O1-NEXT: cbnz w11, LBB36_12803; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2804; CHECK-OUTLINE-O1-NEXT: mov w0, w82805; CHECK-OUTLINE-O1-NEXT: ret2806;2807; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i8:2808; CHECK-NOLSE-O0: ; %bb.0:2809; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322810; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322811; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2812; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2813; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0]2814; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2815; CHECK-NOLSE-O0-NEXT: b LBB36_12816; CHECK-NOLSE-O0-NEXT: LBB36_1: ; %atomicrmw.start2817; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12818; CHECK-NOLSE-O0-NEXT: ; Child Loop BB36_2 Depth 22819; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Reload2820; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2821; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2822; CHECK-NOLSE-O0-NEXT: and w9, w10, #0xff2823; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, uxtb2824; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, hi2825; CHECK-NOLSE-O0-NEXT: LBB36_2: ; %atomicrmw.start2826; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB36_1 Depth=12827; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22828; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11]2829; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb2830; CHECK-NOLSE-O0-NEXT: b.ne LBB36_42831; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2832; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB36_2 Depth=22833; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11]2834; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB36_22835; CHECK-NOLSE-O0-NEXT: LBB36_4: ; %atomicrmw.start2836; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB36_1 Depth=12837; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2838; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff2839; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb2840; CHECK-NOLSE-O0-NEXT: cset w8, eq2841; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2842; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB36_12843; CHECK-NOLSE-O0-NEXT: b LBB36_52844; CHECK-NOLSE-O0-NEXT: LBB36_5: ; %atomicrmw.end2845; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2846; CHECK-NOLSE-O0-NEXT: add sp, sp, #322847; CHECK-NOLSE-O0-NEXT: ret2848;2849; CHECK-OUTLINE-O0-LABEL: atomicrmw_umax_i8:2850; CHECK-OUTLINE-O0: ; %bb.0:2851; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #482852; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill2853; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 482854; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82855; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162856; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2857; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2858; CHECK-OUTLINE-O0-NEXT: ldrb w0, [x0]2859; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2860; CHECK-OUTLINE-O0-NEXT: b LBB36_12861; CHECK-OUTLINE-O0-NEXT: LBB36_1: ; %atomicrmw.start2862; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=12863; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload2864; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload2865; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload2866; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill2867; CHECK-OUTLINE-O0-NEXT: and w9, w0, #0xff2868; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, uxtb2869; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, hi2870; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas1_relax2871; CHECK-OUTLINE-O0-NEXT: ldr w9, [sp, #8] ; 4-byte Reload2872; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill2873; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0xff2874; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w9, uxtb2875; CHECK-OUTLINE-O0-NEXT: cset w8, eq2876; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill2877; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB36_12878; CHECK-OUTLINE-O0-NEXT: b LBB36_22879; CHECK-OUTLINE-O0-NEXT: LBB36_2: ; %atomicrmw.end2880; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2881; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload2882; CHECK-OUTLINE-O0-NEXT: add sp, sp, #482883; CHECK-OUTLINE-O0-NEXT: ret2884;2885; CHECK-LSE-O1-LABEL: atomicrmw_umax_i8:2886; CHECK-LSE-O1: ; %bb.0:2887; CHECK-LSE-O1-NEXT: ldumaxb w1, w0, [x0]2888; CHECK-LSE-O1-NEXT: ret2889;2890; CHECK-LSE-O0-LABEL: atomicrmw_umax_i8:2891; CHECK-LSE-O0: ; %bb.0:2892; CHECK-LSE-O0-NEXT: ldumaxb w1, w0, [x0]2893; CHECK-LSE-O0-NEXT: ret2894 %res = atomicrmw umax ptr %ptr, i8 %rhs monotonic2895 ret i8 %res2896}2897 2898define i16 @atomicrmw_add_i16(ptr %ptr, i16 %rhs) {2899; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i16:2900; CHECK-NOLSE-O1: ; %bb.0:2901; CHECK-NOLSE-O1-NEXT: LBB37_1: ; %atomicrmw.start2902; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12903; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]2904; CHECK-NOLSE-O1-NEXT: add w9, w8, w12905; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0]2906; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB37_12907; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end2908; CHECK-NOLSE-O1-NEXT: mov w0, w82909; CHECK-NOLSE-O1-NEXT: ret2910;2911; CHECK-OUTLINE-O1-LABEL: atomicrmw_add_i16:2912; CHECK-OUTLINE-O1: ; %bb.0:2913; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill2914; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 162915; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -82916; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -162917; CHECK-OUTLINE-O1-NEXT: mov x2, x02918; CHECK-OUTLINE-O1-NEXT: mov w0, w12919; CHECK-OUTLINE-O1-NEXT: mov x1, x22920; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd2_acq_rel2921; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload2922; CHECK-OUTLINE-O1-NEXT: ret2923;2924; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i16:2925; CHECK-NOLSE-O0: ; %bb.0:2926; CHECK-NOLSE-O0-NEXT: sub sp, sp, #322927; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 322928; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill2929; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill2930; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]2931; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill2932; CHECK-NOLSE-O0-NEXT: b LBB37_12933; CHECK-NOLSE-O0-NEXT: LBB37_1: ; %atomicrmw.start2934; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=12935; CHECK-NOLSE-O0-NEXT: ; Child Loop BB37_2 Depth 22936; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload2937; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload2938; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload2939; CHECK-NOLSE-O0-NEXT: add w12, w9, w8, uxth2940; CHECK-NOLSE-O0-NEXT: LBB37_2: ; %atomicrmw.start2941; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB37_1 Depth=12942; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=22943; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]2944; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth2945; CHECK-NOLSE-O0-NEXT: b.ne LBB37_42946; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start2947; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB37_2 Depth=22948; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]2949; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB37_22950; CHECK-NOLSE-O0-NEXT: LBB37_4: ; %atomicrmw.start2951; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB37_1 Depth=12952; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill2953; CHECK-NOLSE-O0-NEXT: uxth w8, w82954; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth2955; CHECK-NOLSE-O0-NEXT: cset w8, eq2956; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill2957; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB37_12958; CHECK-NOLSE-O0-NEXT: b LBB37_52959; CHECK-NOLSE-O0-NEXT: LBB37_5: ; %atomicrmw.end2960; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload2961; CHECK-NOLSE-O0-NEXT: add sp, sp, #322962; CHECK-NOLSE-O0-NEXT: ret2963;2964; CHECK-OUTLINE-O0-LABEL: atomicrmw_add_i16:2965; CHECK-OUTLINE-O0: ; %bb.0:2966; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #322967; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill2968; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 322969; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -82970; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -162971; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill2972; CHECK-OUTLINE-O0-NEXT: mov w0, w12973; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload2974; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd2_acq_rel2975; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload2976; CHECK-OUTLINE-O0-NEXT: add sp, sp, #322977; CHECK-OUTLINE-O0-NEXT: ret2978;2979; CHECK-LSE-O1-LABEL: atomicrmw_add_i16:2980; CHECK-LSE-O1: ; %bb.0:2981; CHECK-LSE-O1-NEXT: ldaddalh w1, w0, [x0]2982; CHECK-LSE-O1-NEXT: ret2983;2984; CHECK-LSE-O0-LABEL: atomicrmw_add_i16:2985; CHECK-LSE-O0: ; %bb.0:2986; CHECK-LSE-O0-NEXT: ldaddalh w1, w0, [x0]2987; CHECK-LSE-O0-NEXT: ret2988 %res = atomicrmw add ptr %ptr, i16 %rhs seq_cst2989 ret i16 %res2990}2991 2992define i16 @atomicrmw_xchg_i16(ptr %ptr, i16 %rhs) {2993; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i16:2994; CHECK-NOLSE-O1: ; %bb.0:2995; CHECK-NOLSE-O1-NEXT: LBB38_1: ; %atomicrmw.start2996; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=12997; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0]2998; CHECK-NOLSE-O1-NEXT: stxrh w9, w1, [x0]2999; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB38_13000; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3001; CHECK-NOLSE-O1-NEXT: mov w0, w83002; CHECK-NOLSE-O1-NEXT: ret3003;3004; CHECK-OUTLINE-O1-LABEL: atomicrmw_xchg_i16:3005; CHECK-OUTLINE-O1: ; %bb.0:3006; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill3007; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 163008; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -83009; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -163010; CHECK-OUTLINE-O1-NEXT: mov x2, x03011; CHECK-OUTLINE-O1-NEXT: mov w0, w13012; CHECK-OUTLINE-O1-NEXT: mov x1, x23013; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_swp2_relax3014; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload3015; CHECK-OUTLINE-O1-NEXT: ret3016;3017; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i16:3018; CHECK-NOLSE-O0: ; %bb.0:3019; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323020; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323021; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3022; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3023; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3024; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3025; CHECK-NOLSE-O0-NEXT: b LBB38_13026; CHECK-NOLSE-O0-NEXT: LBB38_1: ; %atomicrmw.start3027; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13028; CHECK-NOLSE-O0-NEXT: ; Child Loop BB38_2 Depth 23029; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3030; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3031; CHECK-NOLSE-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Reload3032; CHECK-NOLSE-O0-NEXT: LBB38_2: ; %atomicrmw.start3033; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB38_1 Depth=13034; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23035; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3036; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3037; CHECK-NOLSE-O0-NEXT: b.ne LBB38_43038; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3039; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB38_2 Depth=23040; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3041; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB38_23042; CHECK-NOLSE-O0-NEXT: LBB38_4: ; %atomicrmw.start3043; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB38_1 Depth=13044; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3045; CHECK-NOLSE-O0-NEXT: uxth w8, w83046; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3047; CHECK-NOLSE-O0-NEXT: cset w8, eq3048; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3049; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB38_13050; CHECK-NOLSE-O0-NEXT: b LBB38_53051; CHECK-NOLSE-O0-NEXT: LBB38_5: ; %atomicrmw.end3052; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3053; CHECK-NOLSE-O0-NEXT: add sp, sp, #323054; CHECK-NOLSE-O0-NEXT: ret3055;3056; CHECK-OUTLINE-O0-LABEL: atomicrmw_xchg_i16:3057; CHECK-OUTLINE-O0: ; %bb.0:3058; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #323059; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill3060; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 323061; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83062; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163063; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill3064; CHECK-OUTLINE-O0-NEXT: mov w0, w13065; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload3066; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_swp2_relax3067; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload3068; CHECK-OUTLINE-O0-NEXT: add sp, sp, #323069; CHECK-OUTLINE-O0-NEXT: ret3070;3071; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i16:3072; CHECK-LSE-O1: ; %bb.0:3073; CHECK-LSE-O1-NEXT: swph w1, w0, [x0]3074; CHECK-LSE-O1-NEXT: ret3075;3076; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i16:3077; CHECK-LSE-O0: ; %bb.0:3078; CHECK-LSE-O0-NEXT: swph w1, w0, [x0]3079; CHECK-LSE-O0-NEXT: ret3080 %res = atomicrmw xchg ptr %ptr, i16 %rhs monotonic3081 ret i16 %res3082}3083 3084define i16 @atomicrmw_sub_i16(ptr %ptr, i16 %rhs) {3085; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i16:3086; CHECK-NOLSE-O1: ; %bb.0:3087; CHECK-NOLSE-O1-NEXT: LBB39_1: ; %atomicrmw.start3088; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13089; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]3090; CHECK-NOLSE-O1-NEXT: sub w9, w8, w13091; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0]3092; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB39_13093; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3094; CHECK-NOLSE-O1-NEXT: mov w0, w83095; CHECK-NOLSE-O1-NEXT: ret3096;3097; CHECK-OUTLINE-O1-LABEL: atomicrmw_sub_i16:3098; CHECK-OUTLINE-O1: ; %bb.0:3099; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill3100; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 163101; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -83102; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -163103; CHECK-OUTLINE-O1-NEXT: mov x2, x03104; CHECK-OUTLINE-O1-NEXT: neg w0, w13105; CHECK-OUTLINE-O1-NEXT: mov x1, x23106; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd2_acq3107; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload3108; CHECK-OUTLINE-O1-NEXT: ret3109;3110; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i16:3111; CHECK-NOLSE-O0: ; %bb.0:3112; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323113; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323114; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3115; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3116; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3117; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3118; CHECK-NOLSE-O0-NEXT: b LBB39_13119; CHECK-NOLSE-O0-NEXT: LBB39_1: ; %atomicrmw.start3120; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13121; CHECK-NOLSE-O0-NEXT: ; Child Loop BB39_2 Depth 23122; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3123; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3124; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3125; CHECK-NOLSE-O0-NEXT: subs w12, w8, w93126; CHECK-NOLSE-O0-NEXT: LBB39_2: ; %atomicrmw.start3127; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB39_1 Depth=13128; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23129; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3130; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3131; CHECK-NOLSE-O0-NEXT: b.ne LBB39_43132; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3133; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB39_2 Depth=23134; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3135; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB39_23136; CHECK-NOLSE-O0-NEXT: LBB39_4: ; %atomicrmw.start3137; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB39_1 Depth=13138; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3139; CHECK-NOLSE-O0-NEXT: uxth w8, w83140; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3141; CHECK-NOLSE-O0-NEXT: cset w8, eq3142; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3143; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB39_13144; CHECK-NOLSE-O0-NEXT: b LBB39_53145; CHECK-NOLSE-O0-NEXT: LBB39_5: ; %atomicrmw.end3146; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3147; CHECK-NOLSE-O0-NEXT: add sp, sp, #323148; CHECK-NOLSE-O0-NEXT: ret3149;3150; CHECK-OUTLINE-O0-LABEL: atomicrmw_sub_i16:3151; CHECK-OUTLINE-O0: ; %bb.0:3152; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #323153; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill3154; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 323155; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83156; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163157; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill3158; CHECK-OUTLINE-O0-NEXT: mov w9, w13159; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload3160; CHECK-OUTLINE-O0-NEXT: mov w8, wzr3161; CHECK-OUTLINE-O0-NEXT: subs w0, w8, w93162; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd2_acq3163; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload3164; CHECK-OUTLINE-O0-NEXT: add sp, sp, #323165; CHECK-OUTLINE-O0-NEXT: ret3166;3167; CHECK-LSE-O1-LABEL: atomicrmw_sub_i16:3168; CHECK-LSE-O1: ; %bb.0:3169; CHECK-LSE-O1-NEXT: neg w8, w13170; CHECK-LSE-O1-NEXT: ldaddah w8, w0, [x0]3171; CHECK-LSE-O1-NEXT: ret3172;3173; CHECK-LSE-O0-LABEL: atomicrmw_sub_i16:3174; CHECK-LSE-O0: ; %bb.0:3175; CHECK-LSE-O0-NEXT: neg w8, w13176; CHECK-LSE-O0-NEXT: ldaddah w8, w0, [x0]3177; CHECK-LSE-O0-NEXT: ret3178 %res = atomicrmw sub ptr %ptr, i16 %rhs acquire3179 ret i16 %res3180}3181 3182define i16 @atomicrmw_and_i16(ptr %ptr, i16 %rhs) {3183; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i16:3184; CHECK-NOLSE-O1: ; %bb.0:3185; CHECK-NOLSE-O1-NEXT: LBB40_1: ; %atomicrmw.start3186; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13187; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0]3188; CHECK-NOLSE-O1-NEXT: and w9, w8, w13189; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0]3190; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB40_13191; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3192; CHECK-NOLSE-O1-NEXT: mov w0, w83193; CHECK-NOLSE-O1-NEXT: ret3194;3195; CHECK-OUTLINE-O1-LABEL: atomicrmw_and_i16:3196; CHECK-OUTLINE-O1: ; %bb.0:3197; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill3198; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 163199; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -83200; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -163201; CHECK-OUTLINE-O1-NEXT: mov x2, x03202; CHECK-OUTLINE-O1-NEXT: mvn w0, w13203; CHECK-OUTLINE-O1-NEXT: mov x1, x23204; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldclr2_rel3205; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload3206; CHECK-OUTLINE-O1-NEXT: ret3207;3208; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i16:3209; CHECK-NOLSE-O0: ; %bb.0:3210; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323211; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323212; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3213; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3214; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3215; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3216; CHECK-NOLSE-O0-NEXT: b LBB40_13217; CHECK-NOLSE-O0-NEXT: LBB40_1: ; %atomicrmw.start3218; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13219; CHECK-NOLSE-O0-NEXT: ; Child Loop BB40_2 Depth 23220; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3221; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3222; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3223; CHECK-NOLSE-O0-NEXT: and w12, w8, w93224; CHECK-NOLSE-O0-NEXT: LBB40_2: ; %atomicrmw.start3225; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB40_1 Depth=13226; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23227; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3228; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3229; CHECK-NOLSE-O0-NEXT: b.ne LBB40_43230; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3231; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB40_2 Depth=23232; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3233; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB40_23234; CHECK-NOLSE-O0-NEXT: LBB40_4: ; %atomicrmw.start3235; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB40_1 Depth=13236; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3237; CHECK-NOLSE-O0-NEXT: uxth w8, w83238; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3239; CHECK-NOLSE-O0-NEXT: cset w8, eq3240; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3241; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB40_13242; CHECK-NOLSE-O0-NEXT: b LBB40_53243; CHECK-NOLSE-O0-NEXT: LBB40_5: ; %atomicrmw.end3244; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3245; CHECK-NOLSE-O0-NEXT: add sp, sp, #323246; CHECK-NOLSE-O0-NEXT: ret3247;3248; CHECK-OUTLINE-O0-LABEL: atomicrmw_and_i16:3249; CHECK-OUTLINE-O0: ; %bb.0:3250; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #323251; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill3252; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 323253; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83254; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163255; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill3256; CHECK-OUTLINE-O0-NEXT: mov w9, w13257; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload3258; CHECK-OUTLINE-O0-NEXT: mov w8, #-1 ; =0xffffffff3259; CHECK-OUTLINE-O0-NEXT: eor w0, w8, w93260; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldclr2_rel3261; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload3262; CHECK-OUTLINE-O0-NEXT: add sp, sp, #323263; CHECK-OUTLINE-O0-NEXT: ret3264;3265; CHECK-LSE-O1-LABEL: atomicrmw_and_i16:3266; CHECK-LSE-O1: ; %bb.0:3267; CHECK-LSE-O1-NEXT: mvn w8, w13268; CHECK-LSE-O1-NEXT: ldclrlh w8, w0, [x0]3269; CHECK-LSE-O1-NEXT: ret3270;3271; CHECK-LSE-O0-LABEL: atomicrmw_and_i16:3272; CHECK-LSE-O0: ; %bb.0:3273; CHECK-LSE-O0-NEXT: mvn w8, w13274; CHECK-LSE-O0-NEXT: ldclrlh w8, w0, [x0]3275; CHECK-LSE-O0-NEXT: ret3276 %res = atomicrmw and ptr %ptr, i16 %rhs release3277 ret i16 %res3278}3279 3280define i16 @atomicrmw_or_i16(ptr %ptr, i16 %rhs) {3281; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i16:3282; CHECK-NOLSE-O1: ; %bb.0:3283; CHECK-NOLSE-O1-NEXT: LBB41_1: ; %atomicrmw.start3284; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13285; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]3286; CHECK-NOLSE-O1-NEXT: orr w9, w8, w13287; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0]3288; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB41_13289; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3290; CHECK-NOLSE-O1-NEXT: mov w0, w83291; CHECK-NOLSE-O1-NEXT: ret3292;3293; CHECK-OUTLINE-O1-LABEL: atomicrmw_or_i16:3294; CHECK-OUTLINE-O1: ; %bb.0:3295; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill3296; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 163297; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -83298; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -163299; CHECK-OUTLINE-O1-NEXT: mov x2, x03300; CHECK-OUTLINE-O1-NEXT: mov w0, w13301; CHECK-OUTLINE-O1-NEXT: mov x1, x23302; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldset2_acq_rel3303; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload3304; CHECK-OUTLINE-O1-NEXT: ret3305;3306; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i16:3307; CHECK-NOLSE-O0: ; %bb.0:3308; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323309; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323310; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3311; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3312; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3313; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3314; CHECK-NOLSE-O0-NEXT: b LBB41_13315; CHECK-NOLSE-O0-NEXT: LBB41_1: ; %atomicrmw.start3316; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13317; CHECK-NOLSE-O0-NEXT: ; Child Loop BB41_2 Depth 23318; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3319; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3320; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3321; CHECK-NOLSE-O0-NEXT: orr w12, w8, w93322; CHECK-NOLSE-O0-NEXT: LBB41_2: ; %atomicrmw.start3323; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB41_1 Depth=13324; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23325; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3326; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3327; CHECK-NOLSE-O0-NEXT: b.ne LBB41_43328; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3329; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB41_2 Depth=23330; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3331; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB41_23332; CHECK-NOLSE-O0-NEXT: LBB41_4: ; %atomicrmw.start3333; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB41_1 Depth=13334; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3335; CHECK-NOLSE-O0-NEXT: uxth w8, w83336; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3337; CHECK-NOLSE-O0-NEXT: cset w8, eq3338; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3339; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB41_13340; CHECK-NOLSE-O0-NEXT: b LBB41_53341; CHECK-NOLSE-O0-NEXT: LBB41_5: ; %atomicrmw.end3342; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3343; CHECK-NOLSE-O0-NEXT: add sp, sp, #323344; CHECK-NOLSE-O0-NEXT: ret3345;3346; CHECK-OUTLINE-O0-LABEL: atomicrmw_or_i16:3347; CHECK-OUTLINE-O0: ; %bb.0:3348; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #323349; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill3350; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 323351; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83352; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163353; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill3354; CHECK-OUTLINE-O0-NEXT: mov w0, w13355; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload3356; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldset2_acq_rel3357; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload3358; CHECK-OUTLINE-O0-NEXT: add sp, sp, #323359; CHECK-OUTLINE-O0-NEXT: ret3360;3361; CHECK-LSE-O1-LABEL: atomicrmw_or_i16:3362; CHECK-LSE-O1: ; %bb.0:3363; CHECK-LSE-O1-NEXT: ldsetalh w1, w0, [x0]3364; CHECK-LSE-O1-NEXT: ret3365;3366; CHECK-LSE-O0-LABEL: atomicrmw_or_i16:3367; CHECK-LSE-O0: ; %bb.0:3368; CHECK-LSE-O0-NEXT: ldsetalh w1, w0, [x0]3369; CHECK-LSE-O0-NEXT: ret3370 %res = atomicrmw or ptr %ptr, i16 %rhs seq_cst3371 ret i16 %res3372}3373 3374define i16 @atomicrmw_xor_i16(ptr %ptr, i16 %rhs) {3375; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i16:3376; CHECK-NOLSE-O1: ; %bb.0:3377; CHECK-NOLSE-O1-NEXT: LBB42_1: ; %atomicrmw.start3378; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13379; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0]3380; CHECK-NOLSE-O1-NEXT: eor w9, w8, w13381; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0]3382; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB42_13383; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3384; CHECK-NOLSE-O1-NEXT: mov w0, w83385; CHECK-NOLSE-O1-NEXT: ret3386;3387; CHECK-OUTLINE-O1-LABEL: atomicrmw_xor_i16:3388; CHECK-OUTLINE-O1: ; %bb.0:3389; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill3390; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 163391; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -83392; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -163393; CHECK-OUTLINE-O1-NEXT: mov x2, x03394; CHECK-OUTLINE-O1-NEXT: mov w0, w13395; CHECK-OUTLINE-O1-NEXT: mov x1, x23396; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldeor2_relax3397; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload3398; CHECK-OUTLINE-O1-NEXT: ret3399;3400; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i16:3401; CHECK-NOLSE-O0: ; %bb.0:3402; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323403; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323404; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3405; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3406; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3407; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3408; CHECK-NOLSE-O0-NEXT: b LBB42_13409; CHECK-NOLSE-O0-NEXT: LBB42_1: ; %atomicrmw.start3410; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13411; CHECK-NOLSE-O0-NEXT: ; Child Loop BB42_2 Depth 23412; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3413; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3414; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3415; CHECK-NOLSE-O0-NEXT: eor w12, w8, w93416; CHECK-NOLSE-O0-NEXT: LBB42_2: ; %atomicrmw.start3417; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB42_1 Depth=13418; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23419; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3420; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3421; CHECK-NOLSE-O0-NEXT: b.ne LBB42_43422; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3423; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB42_2 Depth=23424; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3425; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB42_23426; CHECK-NOLSE-O0-NEXT: LBB42_4: ; %atomicrmw.start3427; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB42_1 Depth=13428; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3429; CHECK-NOLSE-O0-NEXT: uxth w8, w83430; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3431; CHECK-NOLSE-O0-NEXT: cset w8, eq3432; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3433; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB42_13434; CHECK-NOLSE-O0-NEXT: b LBB42_53435; CHECK-NOLSE-O0-NEXT: LBB42_5: ; %atomicrmw.end3436; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3437; CHECK-NOLSE-O0-NEXT: add sp, sp, #323438; CHECK-NOLSE-O0-NEXT: ret3439;3440; CHECK-OUTLINE-O0-LABEL: atomicrmw_xor_i16:3441; CHECK-OUTLINE-O0: ; %bb.0:3442; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #323443; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill3444; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 323445; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83446; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163447; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill3448; CHECK-OUTLINE-O0-NEXT: mov w0, w13449; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload3450; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldeor2_relax3451; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload3452; CHECK-OUTLINE-O0-NEXT: add sp, sp, #323453; CHECK-OUTLINE-O0-NEXT: ret3454;3455; CHECK-LSE-O1-LABEL: atomicrmw_xor_i16:3456; CHECK-LSE-O1: ; %bb.0:3457; CHECK-LSE-O1-NEXT: ldeorh w1, w0, [x0]3458; CHECK-LSE-O1-NEXT: ret3459;3460; CHECK-LSE-O0-LABEL: atomicrmw_xor_i16:3461; CHECK-LSE-O0: ; %bb.0:3462; CHECK-LSE-O0-NEXT: ldeorh w1, w0, [x0]3463; CHECK-LSE-O0-NEXT: ret3464 %res = atomicrmw xor ptr %ptr, i16 %rhs monotonic3465 ret i16 %res3466}3467 3468define i16 @atomicrmw_min_i16(ptr %ptr, i16 %rhs) {3469; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i16:3470; CHECK-NOLSE-O1: ; %bb.0:3471; CHECK-NOLSE-O1-NEXT: LBB43_1: ; %atomicrmw.start3472; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13473; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]3474; CHECK-NOLSE-O1-NEXT: sxth w9, w83475; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxth3476; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lt3477; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0]3478; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB43_13479; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3480; CHECK-NOLSE-O1-NEXT: mov w0, w83481; CHECK-NOLSE-O1-NEXT: ret3482;3483; CHECK-OUTLINE-O1-LABEL: atomicrmw_min_i16:3484; CHECK-OUTLINE-O1: ; %bb.0:3485; CHECK-OUTLINE-O1-NEXT: LBB43_1: ; %atomicrmw.start3486; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=13487; CHECK-OUTLINE-O1-NEXT: ldaxrh w8, [x0]3488; CHECK-OUTLINE-O1-NEXT: sxth w9, w83489; CHECK-OUTLINE-O1-NEXT: cmp w9, w1, sxth3490; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lt3491; CHECK-OUTLINE-O1-NEXT: stxrh w10, w9, [x0]3492; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB43_13493; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3494; CHECK-OUTLINE-O1-NEXT: mov w0, w83495; CHECK-OUTLINE-O1-NEXT: ret3496;3497; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i16:3498; CHECK-NOLSE-O0: ; %bb.0:3499; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323500; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323501; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3502; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3503; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3504; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3505; CHECK-NOLSE-O0-NEXT: b LBB43_13506; CHECK-NOLSE-O0-NEXT: LBB43_1: ; %atomicrmw.start3507; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13508; CHECK-NOLSE-O0-NEXT: ; Child Loop BB43_2 Depth 23509; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3510; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3511; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3512; CHECK-NOLSE-O0-NEXT: sxth w10, w83513; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, sxth3514; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, le3515; CHECK-NOLSE-O0-NEXT: LBB43_2: ; %atomicrmw.start3516; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB43_1 Depth=13517; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23518; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3519; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3520; CHECK-NOLSE-O0-NEXT: b.ne LBB43_43521; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3522; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB43_2 Depth=23523; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3524; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB43_23525; CHECK-NOLSE-O0-NEXT: LBB43_4: ; %atomicrmw.start3526; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB43_1 Depth=13527; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3528; CHECK-NOLSE-O0-NEXT: uxth w8, w83529; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3530; CHECK-NOLSE-O0-NEXT: cset w8, eq3531; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3532; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB43_13533; CHECK-NOLSE-O0-NEXT: b LBB43_53534; CHECK-NOLSE-O0-NEXT: LBB43_5: ; %atomicrmw.end3535; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3536; CHECK-NOLSE-O0-NEXT: add sp, sp, #323537; CHECK-NOLSE-O0-NEXT: ret3538;3539; CHECK-OUTLINE-O0-LABEL: atomicrmw_min_i16:3540; CHECK-OUTLINE-O0: ; %bb.0:3541; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #483542; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill3543; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 483544; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83545; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163546; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3547; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3548; CHECK-OUTLINE-O0-NEXT: ldrh w0, [x0]3549; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3550; CHECK-OUTLINE-O0-NEXT: b LBB43_13551; CHECK-OUTLINE-O0-NEXT: LBB43_1: ; %atomicrmw.start3552; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=13553; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload3554; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload3555; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload3556; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill3557; CHECK-OUTLINE-O0-NEXT: sxth w9, w03558; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, sxth3559; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, le3560; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas2_acq3561; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload3562; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill3563; CHECK-OUTLINE-O0-NEXT: uxth w8, w83564; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w0, uxth3565; CHECK-OUTLINE-O0-NEXT: cset w8, eq3566; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3567; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB43_13568; CHECK-OUTLINE-O0-NEXT: b LBB43_23569; CHECK-OUTLINE-O0-NEXT: LBB43_2: ; %atomicrmw.end3570; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3571; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload3572; CHECK-OUTLINE-O0-NEXT: add sp, sp, #483573; CHECK-OUTLINE-O0-NEXT: ret3574;3575; CHECK-LSE-O1-LABEL: atomicrmw_min_i16:3576; CHECK-LSE-O1: ; %bb.0:3577; CHECK-LSE-O1-NEXT: ldsminah w1, w0, [x0]3578; CHECK-LSE-O1-NEXT: ret3579;3580; CHECK-LSE-O0-LABEL: atomicrmw_min_i16:3581; CHECK-LSE-O0: ; %bb.0:3582; CHECK-LSE-O0-NEXT: ldsminah w1, w0, [x0]3583; CHECK-LSE-O0-NEXT: ret3584 %res = atomicrmw min ptr %ptr, i16 %rhs acquire3585 ret i16 %res3586}3587 3588define i16 @atomicrmw_max_i16(ptr %ptr, i16 %rhs) {3589; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i16:3590; CHECK-NOLSE-O1: ; %bb.0:3591; CHECK-NOLSE-O1-NEXT: LBB44_1: ; %atomicrmw.start3592; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13593; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0]3594; CHECK-NOLSE-O1-NEXT: sxth w9, w83595; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxth3596; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, gt3597; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0]3598; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB44_13599; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3600; CHECK-NOLSE-O1-NEXT: mov w0, w83601; CHECK-NOLSE-O1-NEXT: ret3602;3603; CHECK-OUTLINE-O1-LABEL: atomicrmw_max_i16:3604; CHECK-OUTLINE-O1: ; %bb.0:3605; CHECK-OUTLINE-O1-NEXT: LBB44_1: ; %atomicrmw.start3606; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=13607; CHECK-OUTLINE-O1-NEXT: ldxrh w8, [x0]3608; CHECK-OUTLINE-O1-NEXT: sxth w9, w83609; CHECK-OUTLINE-O1-NEXT: cmp w9, w1, sxth3610; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, gt3611; CHECK-OUTLINE-O1-NEXT: stlxrh w10, w9, [x0]3612; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB44_13613; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3614; CHECK-OUTLINE-O1-NEXT: mov w0, w83615; CHECK-OUTLINE-O1-NEXT: ret3616;3617; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i16:3618; CHECK-NOLSE-O0: ; %bb.0:3619; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323620; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323621; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3622; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3623; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3624; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3625; CHECK-NOLSE-O0-NEXT: b LBB44_13626; CHECK-NOLSE-O0-NEXT: LBB44_1: ; %atomicrmw.start3627; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13628; CHECK-NOLSE-O0-NEXT: ; Child Loop BB44_2 Depth 23629; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3630; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3631; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3632; CHECK-NOLSE-O0-NEXT: sxth w10, w83633; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, sxth3634; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, gt3635; CHECK-NOLSE-O0-NEXT: LBB44_2: ; %atomicrmw.start3636; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB44_1 Depth=13637; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23638; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3639; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3640; CHECK-NOLSE-O0-NEXT: b.ne LBB44_43641; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3642; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB44_2 Depth=23643; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3644; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB44_23645; CHECK-NOLSE-O0-NEXT: LBB44_4: ; %atomicrmw.start3646; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB44_1 Depth=13647; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3648; CHECK-NOLSE-O0-NEXT: uxth w8, w83649; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3650; CHECK-NOLSE-O0-NEXT: cset w8, eq3651; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3652; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB44_13653; CHECK-NOLSE-O0-NEXT: b LBB44_53654; CHECK-NOLSE-O0-NEXT: LBB44_5: ; %atomicrmw.end3655; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3656; CHECK-NOLSE-O0-NEXT: add sp, sp, #323657; CHECK-NOLSE-O0-NEXT: ret3658;3659; CHECK-OUTLINE-O0-LABEL: atomicrmw_max_i16:3660; CHECK-OUTLINE-O0: ; %bb.0:3661; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #483662; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill3663; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 483664; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83665; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163666; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3667; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3668; CHECK-OUTLINE-O0-NEXT: ldrh w0, [x0]3669; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3670; CHECK-OUTLINE-O0-NEXT: b LBB44_13671; CHECK-OUTLINE-O0-NEXT: LBB44_1: ; %atomicrmw.start3672; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=13673; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload3674; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload3675; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload3676; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill3677; CHECK-OUTLINE-O0-NEXT: sxth w9, w03678; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, sxth3679; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, gt3680; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas2_rel3681; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload3682; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill3683; CHECK-OUTLINE-O0-NEXT: uxth w8, w83684; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w0, uxth3685; CHECK-OUTLINE-O0-NEXT: cset w8, eq3686; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3687; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB44_13688; CHECK-OUTLINE-O0-NEXT: b LBB44_23689; CHECK-OUTLINE-O0-NEXT: LBB44_2: ; %atomicrmw.end3690; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3691; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload3692; CHECK-OUTLINE-O0-NEXT: add sp, sp, #483693; CHECK-OUTLINE-O0-NEXT: ret3694;3695; CHECK-LSE-O1-LABEL: atomicrmw_max_i16:3696; CHECK-LSE-O1: ; %bb.0:3697; CHECK-LSE-O1-NEXT: ldsmaxlh w1, w0, [x0]3698; CHECK-LSE-O1-NEXT: ret3699;3700; CHECK-LSE-O0-LABEL: atomicrmw_max_i16:3701; CHECK-LSE-O0: ; %bb.0:3702; CHECK-LSE-O0-NEXT: ldsmaxlh w1, w0, [x0]3703; CHECK-LSE-O0-NEXT: ret3704 %res = atomicrmw max ptr %ptr, i16 %rhs release3705 ret i16 %res3706}3707 3708define i16 @atomicrmw_umin_i16(ptr %ptr, i16 %rhs) {3709; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i16:3710; CHECK-NOLSE-O1: ; %bb.0:3711; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xffff3712; CHECK-NOLSE-O1-NEXT: LBB45_1: ; %atomicrmw.start3713; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13714; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0]3715; CHECK-NOLSE-O1-NEXT: and w8, w8, #0xffff3716; CHECK-NOLSE-O1-NEXT: cmp w8, w93717; CHECK-NOLSE-O1-NEXT: csel w10, w8, w9, lo3718; CHECK-NOLSE-O1-NEXT: stlxrh w11, w10, [x0]3719; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB45_13720; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3721; CHECK-NOLSE-O1-NEXT: mov w0, w83722; CHECK-NOLSE-O1-NEXT: ret3723;3724; CHECK-OUTLINE-O1-LABEL: atomicrmw_umin_i16:3725; CHECK-OUTLINE-O1: ; %bb.0:3726; CHECK-OUTLINE-O1-NEXT: and w9, w1, #0xffff3727; CHECK-OUTLINE-O1-NEXT: LBB45_1: ; %atomicrmw.start3728; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=13729; CHECK-OUTLINE-O1-NEXT: ldaxrh w8, [x0]3730; CHECK-OUTLINE-O1-NEXT: and w8, w8, #0xffff3731; CHECK-OUTLINE-O1-NEXT: cmp w8, w93732; CHECK-OUTLINE-O1-NEXT: csel w10, w8, w9, lo3733; CHECK-OUTLINE-O1-NEXT: stlxrh w11, w10, [x0]3734; CHECK-OUTLINE-O1-NEXT: cbnz w11, LBB45_13735; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3736; CHECK-OUTLINE-O1-NEXT: mov w0, w83737; CHECK-OUTLINE-O1-NEXT: ret3738;3739; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i16:3740; CHECK-NOLSE-O0: ; %bb.0:3741; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323742; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323743; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3744; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3745; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3746; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3747; CHECK-NOLSE-O0-NEXT: b LBB45_13748; CHECK-NOLSE-O0-NEXT: LBB45_1: ; %atomicrmw.start3749; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13750; CHECK-NOLSE-O0-NEXT: ; Child Loop BB45_2 Depth 23751; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3752; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3753; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3754; CHECK-NOLSE-O0-NEXT: uxth w10, w83755; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, uxth3756; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, ls3757; CHECK-NOLSE-O0-NEXT: LBB45_2: ; %atomicrmw.start3758; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB45_1 Depth=13759; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23760; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3761; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3762; CHECK-NOLSE-O0-NEXT: b.ne LBB45_43763; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3764; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB45_2 Depth=23765; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3766; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB45_23767; CHECK-NOLSE-O0-NEXT: LBB45_4: ; %atomicrmw.start3768; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB45_1 Depth=13769; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3770; CHECK-NOLSE-O0-NEXT: uxth w8, w83771; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3772; CHECK-NOLSE-O0-NEXT: cset w8, eq3773; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3774; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB45_13775; CHECK-NOLSE-O0-NEXT: b LBB45_53776; CHECK-NOLSE-O0-NEXT: LBB45_5: ; %atomicrmw.end3777; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3778; CHECK-NOLSE-O0-NEXT: add sp, sp, #323779; CHECK-NOLSE-O0-NEXT: ret3780;3781; CHECK-OUTLINE-O0-LABEL: atomicrmw_umin_i16:3782; CHECK-OUTLINE-O0: ; %bb.0:3783; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #483784; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill3785; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 483786; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83787; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163788; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3789; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3790; CHECK-OUTLINE-O0-NEXT: ldrh w0, [x0]3791; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3792; CHECK-OUTLINE-O0-NEXT: b LBB45_13793; CHECK-OUTLINE-O0-NEXT: LBB45_1: ; %atomicrmw.start3794; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=13795; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload3796; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload3797; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload3798; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill3799; CHECK-OUTLINE-O0-NEXT: uxth w9, w03800; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, uxth3801; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, ls3802; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas2_acq_rel3803; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload3804; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill3805; CHECK-OUTLINE-O0-NEXT: uxth w8, w83806; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w0, uxth3807; CHECK-OUTLINE-O0-NEXT: cset w8, eq3808; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3809; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB45_13810; CHECK-OUTLINE-O0-NEXT: b LBB45_23811; CHECK-OUTLINE-O0-NEXT: LBB45_2: ; %atomicrmw.end3812; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3813; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload3814; CHECK-OUTLINE-O0-NEXT: add sp, sp, #483815; CHECK-OUTLINE-O0-NEXT: ret3816;3817; CHECK-LSE-O1-LABEL: atomicrmw_umin_i16:3818; CHECK-LSE-O1: ; %bb.0:3819; CHECK-LSE-O1-NEXT: lduminalh w1, w0, [x0]3820; CHECK-LSE-O1-NEXT: ret3821;3822; CHECK-LSE-O0-LABEL: atomicrmw_umin_i16:3823; CHECK-LSE-O0: ; %bb.0:3824; CHECK-LSE-O0-NEXT: lduminalh w1, w0, [x0]3825; CHECK-LSE-O0-NEXT: ret3826 %res = atomicrmw umin ptr %ptr, i16 %rhs seq_cst3827 ret i16 %res3828}3829 3830define i16 @atomicrmw_umax_i16(ptr %ptr, i16 %rhs) {3831; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i16:3832; CHECK-NOLSE-O1: ; %bb.0:3833; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xffff3834; CHECK-NOLSE-O1-NEXT: LBB46_1: ; %atomicrmw.start3835; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13836; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0]3837; CHECK-NOLSE-O1-NEXT: and w8, w8, #0xffff3838; CHECK-NOLSE-O1-NEXT: cmp w8, w93839; CHECK-NOLSE-O1-NEXT: csel w10, w8, w9, hi3840; CHECK-NOLSE-O1-NEXT: stxrh w11, w10, [x0]3841; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB46_13842; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3843; CHECK-NOLSE-O1-NEXT: mov w0, w83844; CHECK-NOLSE-O1-NEXT: ret3845;3846; CHECK-OUTLINE-O1-LABEL: atomicrmw_umax_i16:3847; CHECK-OUTLINE-O1: ; %bb.0:3848; CHECK-OUTLINE-O1-NEXT: and w9, w1, #0xffff3849; CHECK-OUTLINE-O1-NEXT: LBB46_1: ; %atomicrmw.start3850; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=13851; CHECK-OUTLINE-O1-NEXT: ldxrh w8, [x0]3852; CHECK-OUTLINE-O1-NEXT: and w8, w8, #0xffff3853; CHECK-OUTLINE-O1-NEXT: cmp w8, w93854; CHECK-OUTLINE-O1-NEXT: csel w10, w8, w9, hi3855; CHECK-OUTLINE-O1-NEXT: stxrh w11, w10, [x0]3856; CHECK-OUTLINE-O1-NEXT: cbnz w11, LBB46_13857; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3858; CHECK-OUTLINE-O1-NEXT: mov w0, w83859; CHECK-OUTLINE-O1-NEXT: ret3860;3861; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i16:3862; CHECK-NOLSE-O0: ; %bb.0:3863; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323864; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323865; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3866; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3867; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0]3868; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3869; CHECK-NOLSE-O0-NEXT: b LBB46_13870; CHECK-NOLSE-O0-NEXT: LBB46_1: ; %atomicrmw.start3871; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13872; CHECK-NOLSE-O0-NEXT: ; Child Loop BB46_2 Depth 23873; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3874; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3875; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3876; CHECK-NOLSE-O0-NEXT: uxth w10, w83877; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, uxth3878; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, hi3879; CHECK-NOLSE-O0-NEXT: LBB46_2: ; %atomicrmw.start3880; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB46_1 Depth=13881; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23882; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11]3883; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth3884; CHECK-NOLSE-O0-NEXT: b.ne LBB46_43885; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start3886; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB46_2 Depth=23887; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11]3888; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB46_23889; CHECK-NOLSE-O0-NEXT: LBB46_4: ; %atomicrmw.start3890; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB46_1 Depth=13891; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill3892; CHECK-NOLSE-O0-NEXT: uxth w8, w83893; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth3894; CHECK-NOLSE-O0-NEXT: cset w8, eq3895; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill3896; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB46_13897; CHECK-NOLSE-O0-NEXT: b LBB46_53898; CHECK-NOLSE-O0-NEXT: LBB46_5: ; %atomicrmw.end3899; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3900; CHECK-NOLSE-O0-NEXT: add sp, sp, #323901; CHECK-NOLSE-O0-NEXT: ret3902;3903; CHECK-OUTLINE-O0-LABEL: atomicrmw_umax_i16:3904; CHECK-OUTLINE-O0: ; %bb.0:3905; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #483906; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill3907; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 483908; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -83909; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -163910; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3911; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3912; CHECK-OUTLINE-O0-NEXT: ldrh w0, [x0]3913; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3914; CHECK-OUTLINE-O0-NEXT: b LBB46_13915; CHECK-OUTLINE-O0-NEXT: LBB46_1: ; %atomicrmw.start3916; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=13917; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload3918; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload3919; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload3920; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill3921; CHECK-OUTLINE-O0-NEXT: uxth w9, w03922; CHECK-OUTLINE-O0-NEXT: subs w9, w9, w8, uxth3923; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, hi3924; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas2_relax3925; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload3926; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill3927; CHECK-OUTLINE-O0-NEXT: uxth w8, w83928; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w0, uxth3929; CHECK-OUTLINE-O0-NEXT: cset w8, eq3930; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill3931; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB46_13932; CHECK-OUTLINE-O0-NEXT: b LBB46_23933; CHECK-OUTLINE-O0-NEXT: LBB46_2: ; %atomicrmw.end3934; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload3935; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload3936; CHECK-OUTLINE-O0-NEXT: add sp, sp, #483937; CHECK-OUTLINE-O0-NEXT: ret3938;3939; CHECK-LSE-O1-LABEL: atomicrmw_umax_i16:3940; CHECK-LSE-O1: ; %bb.0:3941; CHECK-LSE-O1-NEXT: ldumaxh w1, w0, [x0]3942; CHECK-LSE-O1-NEXT: ret3943;3944; CHECK-LSE-O0-LABEL: atomicrmw_umax_i16:3945; CHECK-LSE-O0: ; %bb.0:3946; CHECK-LSE-O0-NEXT: ldumaxh w1, w0, [x0]3947; CHECK-LSE-O0-NEXT: ret3948 %res = atomicrmw umax ptr %ptr, i16 %rhs monotonic3949 ret i16 %res3950}3951 3952define i32 @atomicrmw_add_i32(ptr %ptr, i32 %rhs) {3953; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i32:3954; CHECK-NOLSE-O1: ; %bb.0:3955; CHECK-NOLSE-O1-NEXT: LBB47_1: ; %atomicrmw.start3956; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=13957; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]3958; CHECK-NOLSE-O1-NEXT: add w9, w8, w13959; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]3960; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB47_13961; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end3962; CHECK-NOLSE-O1-NEXT: mov w0, w83963; CHECK-NOLSE-O1-NEXT: ret3964;3965; CHECK-OUTLINE-O1-LABEL: atomicrmw_add_i32:3966; CHECK-OUTLINE-O1: ; %bb.0:3967; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill3968; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 163969; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -83970; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -163971; CHECK-OUTLINE-O1-NEXT: mov x2, x03972; CHECK-OUTLINE-O1-NEXT: mov w0, w13973; CHECK-OUTLINE-O1-NEXT: mov x1, x23974; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd4_acq_rel3975; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload3976; CHECK-OUTLINE-O1-NEXT: ret3977;3978; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i32:3979; CHECK-NOLSE-O0: ; %bb.0:3980; CHECK-NOLSE-O0-NEXT: sub sp, sp, #323981; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 323982; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill3983; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill3984; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]3985; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill3986; CHECK-NOLSE-O0-NEXT: b LBB47_13987; CHECK-NOLSE-O0-NEXT: LBB47_1: ; %atomicrmw.start3988; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=13989; CHECK-NOLSE-O0-NEXT: ; Child Loop BB47_2 Depth 23990; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload3991; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload3992; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload3993; CHECK-NOLSE-O0-NEXT: add w12, w8, w93994; CHECK-NOLSE-O0-NEXT: LBB47_2: ; %atomicrmw.start3995; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB47_1 Depth=13996; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=23997; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]3998; CHECK-NOLSE-O0-NEXT: cmp w9, w83999; CHECK-NOLSE-O0-NEXT: b.ne LBB47_44000; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4001; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB47_2 Depth=24002; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4003; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB47_24004; CHECK-NOLSE-O0-NEXT: LBB47_4: ; %atomicrmw.start4005; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB47_1 Depth=14006; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84007; CHECK-NOLSE-O0-NEXT: cset w8, eq4008; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4009; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4010; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB47_14011; CHECK-NOLSE-O0-NEXT: b LBB47_54012; CHECK-NOLSE-O0-NEXT: LBB47_5: ; %atomicrmw.end4013; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4014; CHECK-NOLSE-O0-NEXT: add sp, sp, #324015; CHECK-NOLSE-O0-NEXT: ret4016;4017; CHECK-OUTLINE-O0-LABEL: atomicrmw_add_i32:4018; CHECK-OUTLINE-O0: ; %bb.0:4019; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #324020; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill4021; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 324022; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84023; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164024; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill4025; CHECK-OUTLINE-O0-NEXT: mov w0, w14026; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload4027; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd4_acq_rel4028; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload4029; CHECK-OUTLINE-O0-NEXT: add sp, sp, #324030; CHECK-OUTLINE-O0-NEXT: ret4031;4032; CHECK-LSE-O1-LABEL: atomicrmw_add_i32:4033; CHECK-LSE-O1: ; %bb.0:4034; CHECK-LSE-O1-NEXT: ldaddal w1, w0, [x0]4035; CHECK-LSE-O1-NEXT: ret4036;4037; CHECK-LSE-O0-LABEL: atomicrmw_add_i32:4038; CHECK-LSE-O0: ; %bb.0:4039; CHECK-LSE-O0-NEXT: ldaddal w1, w0, [x0]4040; CHECK-LSE-O0-NEXT: ret4041 %res = atomicrmw add ptr %ptr, i32 %rhs seq_cst4042 ret i32 %res4043}4044 4045define i32 @atomicrmw_xchg_i32(ptr %ptr, i32 %rhs) {4046; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i32:4047; CHECK-NOLSE-O1: ; %bb.0:4048; CHECK-NOLSE-O1-NEXT: mov x8, x04049; CHECK-NOLSE-O1-NEXT: LBB48_1: ; %atomicrmw.start4050; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14051; CHECK-NOLSE-O1-NEXT: ldxr w0, [x8]4052; CHECK-NOLSE-O1-NEXT: stxr w9, w1, [x8]4053; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB48_14054; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4055; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x04056; CHECK-NOLSE-O1-NEXT: ret4057;4058; CHECK-OUTLINE-O1-LABEL: atomicrmw_xchg_i32:4059; CHECK-OUTLINE-O1: ; %bb.0:4060; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill4061; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 164062; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -84063; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -164064; CHECK-OUTLINE-O1-NEXT: mov x2, x04065; CHECK-OUTLINE-O1-NEXT: mov w0, w14066; CHECK-OUTLINE-O1-NEXT: mov x1, x24067; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_swp4_relax4068; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload4069; CHECK-OUTLINE-O1-NEXT: ret4070;4071; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i32:4072; CHECK-NOLSE-O0: ; %bb.0:4073; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324074; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324075; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4076; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4077; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4078; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4079; CHECK-NOLSE-O0-NEXT: b LBB48_14080; CHECK-NOLSE-O0-NEXT: LBB48_1: ; %atomicrmw.start4081; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14082; CHECK-NOLSE-O0-NEXT: ; Child Loop BB48_2 Depth 24083; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4084; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4085; CHECK-NOLSE-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Reload4086; CHECK-NOLSE-O0-NEXT: LBB48_2: ; %atomicrmw.start4087; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB48_1 Depth=14088; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24089; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4090; CHECK-NOLSE-O0-NEXT: cmp w9, w84091; CHECK-NOLSE-O0-NEXT: b.ne LBB48_44092; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4093; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB48_2 Depth=24094; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4095; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB48_24096; CHECK-NOLSE-O0-NEXT: LBB48_4: ; %atomicrmw.start4097; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB48_1 Depth=14098; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84099; CHECK-NOLSE-O0-NEXT: cset w8, eq4100; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4101; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4102; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB48_14103; CHECK-NOLSE-O0-NEXT: b LBB48_54104; CHECK-NOLSE-O0-NEXT: LBB48_5: ; %atomicrmw.end4105; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4106; CHECK-NOLSE-O0-NEXT: add sp, sp, #324107; CHECK-NOLSE-O0-NEXT: ret4108;4109; CHECK-OUTLINE-O0-LABEL: atomicrmw_xchg_i32:4110; CHECK-OUTLINE-O0: ; %bb.0:4111; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #324112; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill4113; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 324114; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84115; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164116; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill4117; CHECK-OUTLINE-O0-NEXT: mov w0, w14118; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload4119; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_swp4_relax4120; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload4121; CHECK-OUTLINE-O0-NEXT: add sp, sp, #324122; CHECK-OUTLINE-O0-NEXT: ret4123;4124; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i32:4125; CHECK-LSE-O1: ; %bb.0:4126; CHECK-LSE-O1-NEXT: swp w1, w0, [x0]4127; CHECK-LSE-O1-NEXT: ret4128;4129; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i32:4130; CHECK-LSE-O0: ; %bb.0:4131; CHECK-LSE-O0-NEXT: swp w1, w0, [x0]4132; CHECK-LSE-O0-NEXT: ret4133 %res = atomicrmw xchg ptr %ptr, i32 %rhs monotonic4134 ret i32 %res4135}4136 4137define i32 @atomicrmw_sub_i32(ptr %ptr, i32 %rhs) {4138; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i32:4139; CHECK-NOLSE-O1: ; %bb.0:4140; CHECK-NOLSE-O1-NEXT: LBB49_1: ; %atomicrmw.start4141; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14142; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]4143; CHECK-NOLSE-O1-NEXT: sub w9, w8, w14144; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0]4145; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB49_14146; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4147; CHECK-NOLSE-O1-NEXT: mov w0, w84148; CHECK-NOLSE-O1-NEXT: ret4149;4150; CHECK-OUTLINE-O1-LABEL: atomicrmw_sub_i32:4151; CHECK-OUTLINE-O1: ; %bb.0:4152; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill4153; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 164154; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -84155; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -164156; CHECK-OUTLINE-O1-NEXT: mov x2, x04157; CHECK-OUTLINE-O1-NEXT: neg w0, w14158; CHECK-OUTLINE-O1-NEXT: mov x1, x24159; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd4_acq4160; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload4161; CHECK-OUTLINE-O1-NEXT: ret4162;4163; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i32:4164; CHECK-NOLSE-O0: ; %bb.0:4165; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324166; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324167; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4168; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4169; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4170; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4171; CHECK-NOLSE-O0-NEXT: b LBB49_14172; CHECK-NOLSE-O0-NEXT: LBB49_1: ; %atomicrmw.start4173; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14174; CHECK-NOLSE-O0-NEXT: ; Child Loop BB49_2 Depth 24175; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4176; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4177; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4178; CHECK-NOLSE-O0-NEXT: subs w12, w8, w94179; CHECK-NOLSE-O0-NEXT: LBB49_2: ; %atomicrmw.start4180; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB49_1 Depth=14181; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24182; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4183; CHECK-NOLSE-O0-NEXT: cmp w9, w84184; CHECK-NOLSE-O0-NEXT: b.ne LBB49_44185; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4186; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB49_2 Depth=24187; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4188; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB49_24189; CHECK-NOLSE-O0-NEXT: LBB49_4: ; %atomicrmw.start4190; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB49_1 Depth=14191; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84192; CHECK-NOLSE-O0-NEXT: cset w8, eq4193; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4194; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4195; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB49_14196; CHECK-NOLSE-O0-NEXT: b LBB49_54197; CHECK-NOLSE-O0-NEXT: LBB49_5: ; %atomicrmw.end4198; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4199; CHECK-NOLSE-O0-NEXT: add sp, sp, #324200; CHECK-NOLSE-O0-NEXT: ret4201;4202; CHECK-OUTLINE-O0-LABEL: atomicrmw_sub_i32:4203; CHECK-OUTLINE-O0: ; %bb.0:4204; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #324205; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill4206; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 324207; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84208; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164209; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill4210; CHECK-OUTLINE-O0-NEXT: mov w9, w14211; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload4212; CHECK-OUTLINE-O0-NEXT: mov w8, wzr4213; CHECK-OUTLINE-O0-NEXT: subs w0, w8, w94214; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd4_acq4215; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload4216; CHECK-OUTLINE-O0-NEXT: add sp, sp, #324217; CHECK-OUTLINE-O0-NEXT: ret4218;4219; CHECK-LSE-O1-LABEL: atomicrmw_sub_i32:4220; CHECK-LSE-O1: ; %bb.0:4221; CHECK-LSE-O1-NEXT: neg w8, w14222; CHECK-LSE-O1-NEXT: ldadda w8, w0, [x0]4223; CHECK-LSE-O1-NEXT: ret4224;4225; CHECK-LSE-O0-LABEL: atomicrmw_sub_i32:4226; CHECK-LSE-O0: ; %bb.0:4227; CHECK-LSE-O0-NEXT: neg w8, w14228; CHECK-LSE-O0-NEXT: ldadda w8, w0, [x0]4229; CHECK-LSE-O0-NEXT: ret4230 %res = atomicrmw sub ptr %ptr, i32 %rhs acquire4231 ret i32 %res4232}4233 4234define i32 @atomicrmw_and_i32(ptr %ptr, i32 %rhs) {4235; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i32:4236; CHECK-NOLSE-O1: ; %bb.0:4237; CHECK-NOLSE-O1-NEXT: LBB50_1: ; %atomicrmw.start4238; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14239; CHECK-NOLSE-O1-NEXT: ldxr w8, [x0]4240; CHECK-NOLSE-O1-NEXT: and w9, w8, w14241; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]4242; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB50_14243; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4244; CHECK-NOLSE-O1-NEXT: mov w0, w84245; CHECK-NOLSE-O1-NEXT: ret4246;4247; CHECK-OUTLINE-O1-LABEL: atomicrmw_and_i32:4248; CHECK-OUTLINE-O1: ; %bb.0:4249; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill4250; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 164251; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -84252; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -164253; CHECK-OUTLINE-O1-NEXT: mov x2, x04254; CHECK-OUTLINE-O1-NEXT: mvn w0, w14255; CHECK-OUTLINE-O1-NEXT: mov x1, x24256; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldclr4_rel4257; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload4258; CHECK-OUTLINE-O1-NEXT: ret4259;4260; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i32:4261; CHECK-NOLSE-O0: ; %bb.0:4262; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324263; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324264; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4265; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4266; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4267; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4268; CHECK-NOLSE-O0-NEXT: b LBB50_14269; CHECK-NOLSE-O0-NEXT: LBB50_1: ; %atomicrmw.start4270; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14271; CHECK-NOLSE-O0-NEXT: ; Child Loop BB50_2 Depth 24272; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4273; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4274; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4275; CHECK-NOLSE-O0-NEXT: and w12, w8, w94276; CHECK-NOLSE-O0-NEXT: LBB50_2: ; %atomicrmw.start4277; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB50_1 Depth=14278; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24279; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4280; CHECK-NOLSE-O0-NEXT: cmp w9, w84281; CHECK-NOLSE-O0-NEXT: b.ne LBB50_44282; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4283; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB50_2 Depth=24284; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4285; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB50_24286; CHECK-NOLSE-O0-NEXT: LBB50_4: ; %atomicrmw.start4287; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB50_1 Depth=14288; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84289; CHECK-NOLSE-O0-NEXT: cset w8, eq4290; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4291; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4292; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB50_14293; CHECK-NOLSE-O0-NEXT: b LBB50_54294; CHECK-NOLSE-O0-NEXT: LBB50_5: ; %atomicrmw.end4295; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4296; CHECK-NOLSE-O0-NEXT: add sp, sp, #324297; CHECK-NOLSE-O0-NEXT: ret4298;4299; CHECK-OUTLINE-O0-LABEL: atomicrmw_and_i32:4300; CHECK-OUTLINE-O0: ; %bb.0:4301; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #324302; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill4303; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 324304; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84305; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164306; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill4307; CHECK-OUTLINE-O0-NEXT: mov w9, w14308; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload4309; CHECK-OUTLINE-O0-NEXT: mov w8, #-1 ; =0xffffffff4310; CHECK-OUTLINE-O0-NEXT: eor w0, w8, w94311; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldclr4_rel4312; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload4313; CHECK-OUTLINE-O0-NEXT: add sp, sp, #324314; CHECK-OUTLINE-O0-NEXT: ret4315;4316; CHECK-LSE-O1-LABEL: atomicrmw_and_i32:4317; CHECK-LSE-O1: ; %bb.0:4318; CHECK-LSE-O1-NEXT: mvn w8, w14319; CHECK-LSE-O1-NEXT: ldclrl w8, w0, [x0]4320; CHECK-LSE-O1-NEXT: ret4321;4322; CHECK-LSE-O0-LABEL: atomicrmw_and_i32:4323; CHECK-LSE-O0: ; %bb.0:4324; CHECK-LSE-O0-NEXT: mvn w8, w14325; CHECK-LSE-O0-NEXT: ldclrl w8, w0, [x0]4326; CHECK-LSE-O0-NEXT: ret4327 %res = atomicrmw and ptr %ptr, i32 %rhs release4328 ret i32 %res4329}4330 4331define i32 @atomicrmw_or_i32(ptr %ptr, i32 %rhs) {4332; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i32:4333; CHECK-NOLSE-O1: ; %bb.0:4334; CHECK-NOLSE-O1-NEXT: LBB51_1: ; %atomicrmw.start4335; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14336; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]4337; CHECK-NOLSE-O1-NEXT: orr w9, w8, w14338; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]4339; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB51_14340; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4341; CHECK-NOLSE-O1-NEXT: mov w0, w84342; CHECK-NOLSE-O1-NEXT: ret4343;4344; CHECK-OUTLINE-O1-LABEL: atomicrmw_or_i32:4345; CHECK-OUTLINE-O1: ; %bb.0:4346; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill4347; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 164348; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -84349; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -164350; CHECK-OUTLINE-O1-NEXT: mov x2, x04351; CHECK-OUTLINE-O1-NEXT: mov w0, w14352; CHECK-OUTLINE-O1-NEXT: mov x1, x24353; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldset4_acq_rel4354; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload4355; CHECK-OUTLINE-O1-NEXT: ret4356;4357; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i32:4358; CHECK-NOLSE-O0: ; %bb.0:4359; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324360; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324361; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4362; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4363; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4364; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4365; CHECK-NOLSE-O0-NEXT: b LBB51_14366; CHECK-NOLSE-O0-NEXT: LBB51_1: ; %atomicrmw.start4367; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14368; CHECK-NOLSE-O0-NEXT: ; Child Loop BB51_2 Depth 24369; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4370; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4371; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4372; CHECK-NOLSE-O0-NEXT: orr w12, w8, w94373; CHECK-NOLSE-O0-NEXT: LBB51_2: ; %atomicrmw.start4374; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB51_1 Depth=14375; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24376; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4377; CHECK-NOLSE-O0-NEXT: cmp w9, w84378; CHECK-NOLSE-O0-NEXT: b.ne LBB51_44379; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4380; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB51_2 Depth=24381; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4382; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB51_24383; CHECK-NOLSE-O0-NEXT: LBB51_4: ; %atomicrmw.start4384; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB51_1 Depth=14385; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84386; CHECK-NOLSE-O0-NEXT: cset w8, eq4387; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4388; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4389; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB51_14390; CHECK-NOLSE-O0-NEXT: b LBB51_54391; CHECK-NOLSE-O0-NEXT: LBB51_5: ; %atomicrmw.end4392; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4393; CHECK-NOLSE-O0-NEXT: add sp, sp, #324394; CHECK-NOLSE-O0-NEXT: ret4395;4396; CHECK-OUTLINE-O0-LABEL: atomicrmw_or_i32:4397; CHECK-OUTLINE-O0: ; %bb.0:4398; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #324399; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill4400; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 324401; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84402; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164403; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill4404; CHECK-OUTLINE-O0-NEXT: mov w0, w14405; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload4406; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldset4_acq_rel4407; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload4408; CHECK-OUTLINE-O0-NEXT: add sp, sp, #324409; CHECK-OUTLINE-O0-NEXT: ret4410;4411; CHECK-LSE-O1-LABEL: atomicrmw_or_i32:4412; CHECK-LSE-O1: ; %bb.0:4413; CHECK-LSE-O1-NEXT: ldsetal w1, w0, [x0]4414; CHECK-LSE-O1-NEXT: ret4415;4416; CHECK-LSE-O0-LABEL: atomicrmw_or_i32:4417; CHECK-LSE-O0: ; %bb.0:4418; CHECK-LSE-O0-NEXT: ldsetal w1, w0, [x0]4419; CHECK-LSE-O0-NEXT: ret4420 %res = atomicrmw or ptr %ptr, i32 %rhs seq_cst4421 ret i32 %res4422}4423 4424define i32 @atomicrmw_xor_i32(ptr %ptr, i32 %rhs) {4425; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i32:4426; CHECK-NOLSE-O1: ; %bb.0:4427; CHECK-NOLSE-O1-NEXT: LBB52_1: ; %atomicrmw.start4428; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14429; CHECK-NOLSE-O1-NEXT: ldxr w8, [x0]4430; CHECK-NOLSE-O1-NEXT: eor w9, w8, w14431; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0]4432; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB52_14433; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4434; CHECK-NOLSE-O1-NEXT: mov w0, w84435; CHECK-NOLSE-O1-NEXT: ret4436;4437; CHECK-OUTLINE-O1-LABEL: atomicrmw_xor_i32:4438; CHECK-OUTLINE-O1: ; %bb.0:4439; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill4440; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 164441; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -84442; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -164443; CHECK-OUTLINE-O1-NEXT: mov x2, x04444; CHECK-OUTLINE-O1-NEXT: mov w0, w14445; CHECK-OUTLINE-O1-NEXT: mov x1, x24446; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldeor4_relax4447; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload4448; CHECK-OUTLINE-O1-NEXT: ret4449;4450; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i32:4451; CHECK-NOLSE-O0: ; %bb.0:4452; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324453; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324454; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4455; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4456; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4457; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4458; CHECK-NOLSE-O0-NEXT: b LBB52_14459; CHECK-NOLSE-O0-NEXT: LBB52_1: ; %atomicrmw.start4460; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14461; CHECK-NOLSE-O0-NEXT: ; Child Loop BB52_2 Depth 24462; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4463; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4464; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4465; CHECK-NOLSE-O0-NEXT: eor w12, w8, w94466; CHECK-NOLSE-O0-NEXT: LBB52_2: ; %atomicrmw.start4467; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB52_1 Depth=14468; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24469; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4470; CHECK-NOLSE-O0-NEXT: cmp w9, w84471; CHECK-NOLSE-O0-NEXT: b.ne LBB52_44472; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4473; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB52_2 Depth=24474; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4475; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB52_24476; CHECK-NOLSE-O0-NEXT: LBB52_4: ; %atomicrmw.start4477; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB52_1 Depth=14478; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84479; CHECK-NOLSE-O0-NEXT: cset w8, eq4480; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4481; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4482; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB52_14483; CHECK-NOLSE-O0-NEXT: b LBB52_54484; CHECK-NOLSE-O0-NEXT: LBB52_5: ; %atomicrmw.end4485; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4486; CHECK-NOLSE-O0-NEXT: add sp, sp, #324487; CHECK-NOLSE-O0-NEXT: ret4488;4489; CHECK-OUTLINE-O0-LABEL: atomicrmw_xor_i32:4490; CHECK-OUTLINE-O0: ; %bb.0:4491; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #324492; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill4493; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 324494; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84495; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164496; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill4497; CHECK-OUTLINE-O0-NEXT: mov w0, w14498; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload4499; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldeor4_relax4500; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload4501; CHECK-OUTLINE-O0-NEXT: add sp, sp, #324502; CHECK-OUTLINE-O0-NEXT: ret4503;4504; CHECK-LSE-O1-LABEL: atomicrmw_xor_i32:4505; CHECK-LSE-O1: ; %bb.0:4506; CHECK-LSE-O1-NEXT: ldeor w1, w0, [x0]4507; CHECK-LSE-O1-NEXT: ret4508;4509; CHECK-LSE-O0-LABEL: atomicrmw_xor_i32:4510; CHECK-LSE-O0: ; %bb.0:4511; CHECK-LSE-O0-NEXT: ldeor w1, w0, [x0]4512; CHECK-LSE-O0-NEXT: ret4513 %res = atomicrmw xor ptr %ptr, i32 %rhs monotonic4514 ret i32 %res4515}4516 4517define i32 @atomicrmw_min_i32(ptr %ptr, i32 %rhs) {4518; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i32:4519; CHECK-NOLSE-O1: ; %bb.0:4520; CHECK-NOLSE-O1-NEXT: LBB53_1: ; %atomicrmw.start4521; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14522; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]4523; CHECK-NOLSE-O1-NEXT: cmp w8, w14524; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lt4525; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0]4526; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB53_14527; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4528; CHECK-NOLSE-O1-NEXT: mov w0, w84529; CHECK-NOLSE-O1-NEXT: ret4530;4531; CHECK-OUTLINE-O1-LABEL: atomicrmw_min_i32:4532; CHECK-OUTLINE-O1: ; %bb.0:4533; CHECK-OUTLINE-O1-NEXT: LBB53_1: ; %atomicrmw.start4534; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=14535; CHECK-OUTLINE-O1-NEXT: ldaxr w8, [x0]4536; CHECK-OUTLINE-O1-NEXT: cmp w8, w14537; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lt4538; CHECK-OUTLINE-O1-NEXT: stxr w10, w9, [x0]4539; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB53_14540; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4541; CHECK-OUTLINE-O1-NEXT: mov w0, w84542; CHECK-OUTLINE-O1-NEXT: ret4543;4544; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i32:4545; CHECK-NOLSE-O0: ; %bb.0:4546; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324547; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324548; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4549; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4550; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4551; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4552; CHECK-NOLSE-O0-NEXT: b LBB53_14553; CHECK-NOLSE-O0-NEXT: LBB53_1: ; %atomicrmw.start4554; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14555; CHECK-NOLSE-O0-NEXT: ; Child Loop BB53_2 Depth 24556; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4557; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4558; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4559; CHECK-NOLSE-O0-NEXT: subs w10, w8, w94560; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, le4561; CHECK-NOLSE-O0-NEXT: LBB53_2: ; %atomicrmw.start4562; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB53_1 Depth=14563; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24564; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4565; CHECK-NOLSE-O0-NEXT: cmp w9, w84566; CHECK-NOLSE-O0-NEXT: b.ne LBB53_44567; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4568; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB53_2 Depth=24569; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4570; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB53_24571; CHECK-NOLSE-O0-NEXT: LBB53_4: ; %atomicrmw.start4572; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB53_1 Depth=14573; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84574; CHECK-NOLSE-O0-NEXT: cset w8, eq4575; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4576; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4577; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB53_14578; CHECK-NOLSE-O0-NEXT: b LBB53_54579; CHECK-NOLSE-O0-NEXT: LBB53_5: ; %atomicrmw.end4580; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4581; CHECK-NOLSE-O0-NEXT: add sp, sp, #324582; CHECK-NOLSE-O0-NEXT: ret4583;4584; CHECK-OUTLINE-O0-LABEL: atomicrmw_min_i32:4585; CHECK-OUTLINE-O0: ; %bb.0:4586; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #484587; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill4588; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 484589; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84590; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164591; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4592; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4593; CHECK-OUTLINE-O0-NEXT: ldr w0, [x0]4594; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4595; CHECK-OUTLINE-O0-NEXT: b LBB53_14596; CHECK-OUTLINE-O0-NEXT: LBB53_1: ; %atomicrmw.start4597; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=14598; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload4599; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload4600; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload4601; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill4602; CHECK-OUTLINE-O0-NEXT: subs w9, w0, w84603; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, le4604; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_acq4605; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload4606; CHECK-OUTLINE-O0-NEXT: subs w8, w0, w84607; CHECK-OUTLINE-O0-NEXT: cset w8, eq4608; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill4609; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4610; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB53_14611; CHECK-OUTLINE-O0-NEXT: b LBB53_24612; CHECK-OUTLINE-O0-NEXT: LBB53_2: ; %atomicrmw.end4613; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4614; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload4615; CHECK-OUTLINE-O0-NEXT: add sp, sp, #484616; CHECK-OUTLINE-O0-NEXT: ret4617;4618; CHECK-LSE-O1-LABEL: atomicrmw_min_i32:4619; CHECK-LSE-O1: ; %bb.0:4620; CHECK-LSE-O1-NEXT: ldsmina w1, w0, [x0]4621; CHECK-LSE-O1-NEXT: ret4622;4623; CHECK-LSE-O0-LABEL: atomicrmw_min_i32:4624; CHECK-LSE-O0: ; %bb.0:4625; CHECK-LSE-O0-NEXT: ldsmina w1, w0, [x0]4626; CHECK-LSE-O0-NEXT: ret4627 %res = atomicrmw min ptr %ptr, i32 %rhs acquire4628 ret i32 %res4629}4630 4631define i32 @atomicrmw_max_i32(ptr %ptr, i32 %rhs) {4632; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i32:4633; CHECK-NOLSE-O1: ; %bb.0:4634; CHECK-NOLSE-O1-NEXT: LBB54_1: ; %atomicrmw.start4635; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14636; CHECK-NOLSE-O1-NEXT: ldxr w8, [x0]4637; CHECK-NOLSE-O1-NEXT: cmp w8, w14638; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, gt4639; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]4640; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB54_14641; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4642; CHECK-NOLSE-O1-NEXT: mov w0, w84643; CHECK-NOLSE-O1-NEXT: ret4644;4645; CHECK-OUTLINE-O1-LABEL: atomicrmw_max_i32:4646; CHECK-OUTLINE-O1: ; %bb.0:4647; CHECK-OUTLINE-O1-NEXT: LBB54_1: ; %atomicrmw.start4648; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=14649; CHECK-OUTLINE-O1-NEXT: ldxr w8, [x0]4650; CHECK-OUTLINE-O1-NEXT: cmp w8, w14651; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, gt4652; CHECK-OUTLINE-O1-NEXT: stlxr w10, w9, [x0]4653; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB54_14654; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4655; CHECK-OUTLINE-O1-NEXT: mov w0, w84656; CHECK-OUTLINE-O1-NEXT: ret4657;4658; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i32:4659; CHECK-NOLSE-O0: ; %bb.0:4660; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324661; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324662; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4663; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4664; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4665; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4666; CHECK-NOLSE-O0-NEXT: b LBB54_14667; CHECK-NOLSE-O0-NEXT: LBB54_1: ; %atomicrmw.start4668; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14669; CHECK-NOLSE-O0-NEXT: ; Child Loop BB54_2 Depth 24670; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4671; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4672; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4673; CHECK-NOLSE-O0-NEXT: subs w10, w8, w94674; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, gt4675; CHECK-NOLSE-O0-NEXT: LBB54_2: ; %atomicrmw.start4676; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB54_1 Depth=14677; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24678; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4679; CHECK-NOLSE-O0-NEXT: cmp w9, w84680; CHECK-NOLSE-O0-NEXT: b.ne LBB54_44681; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4682; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB54_2 Depth=24683; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4684; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB54_24685; CHECK-NOLSE-O0-NEXT: LBB54_4: ; %atomicrmw.start4686; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB54_1 Depth=14687; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84688; CHECK-NOLSE-O0-NEXT: cset w8, eq4689; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4690; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4691; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB54_14692; CHECK-NOLSE-O0-NEXT: b LBB54_54693; CHECK-NOLSE-O0-NEXT: LBB54_5: ; %atomicrmw.end4694; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4695; CHECK-NOLSE-O0-NEXT: add sp, sp, #324696; CHECK-NOLSE-O0-NEXT: ret4697;4698; CHECK-OUTLINE-O0-LABEL: atomicrmw_max_i32:4699; CHECK-OUTLINE-O0: ; %bb.0:4700; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #484701; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill4702; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 484703; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84704; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164705; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4706; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4707; CHECK-OUTLINE-O0-NEXT: ldr w0, [x0]4708; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4709; CHECK-OUTLINE-O0-NEXT: b LBB54_14710; CHECK-OUTLINE-O0-NEXT: LBB54_1: ; %atomicrmw.start4711; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=14712; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload4713; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload4714; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload4715; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill4716; CHECK-OUTLINE-O0-NEXT: subs w9, w0, w84717; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, gt4718; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_rel4719; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload4720; CHECK-OUTLINE-O0-NEXT: subs w8, w0, w84721; CHECK-OUTLINE-O0-NEXT: cset w8, eq4722; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill4723; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4724; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB54_14725; CHECK-OUTLINE-O0-NEXT: b LBB54_24726; CHECK-OUTLINE-O0-NEXT: LBB54_2: ; %atomicrmw.end4727; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4728; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload4729; CHECK-OUTLINE-O0-NEXT: add sp, sp, #484730; CHECK-OUTLINE-O0-NEXT: ret4731;4732; CHECK-LSE-O1-LABEL: atomicrmw_max_i32:4733; CHECK-LSE-O1: ; %bb.0:4734; CHECK-LSE-O1-NEXT: ldsmaxl w1, w0, [x0]4735; CHECK-LSE-O1-NEXT: ret4736;4737; CHECK-LSE-O0-LABEL: atomicrmw_max_i32:4738; CHECK-LSE-O0: ; %bb.0:4739; CHECK-LSE-O0-NEXT: ldsmaxl w1, w0, [x0]4740; CHECK-LSE-O0-NEXT: ret4741 %res = atomicrmw max ptr %ptr, i32 %rhs release4742 ret i32 %res4743}4744 4745define i32 @atomicrmw_umin_i32(ptr %ptr, i32 %rhs) {4746; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i32:4747; CHECK-NOLSE-O1: ; %bb.0:4748; CHECK-NOLSE-O1-NEXT: LBB55_1: ; %atomicrmw.start4749; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14750; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0]4751; CHECK-NOLSE-O1-NEXT: cmp w8, w14752; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, lo4753; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0]4754; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB55_14755; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4756; CHECK-NOLSE-O1-NEXT: mov w0, w84757; CHECK-NOLSE-O1-NEXT: ret4758;4759; CHECK-OUTLINE-O1-LABEL: atomicrmw_umin_i32:4760; CHECK-OUTLINE-O1: ; %bb.0:4761; CHECK-OUTLINE-O1-NEXT: LBB55_1: ; %atomicrmw.start4762; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=14763; CHECK-OUTLINE-O1-NEXT: ldaxr w8, [x0]4764; CHECK-OUTLINE-O1-NEXT: cmp w8, w14765; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, lo4766; CHECK-OUTLINE-O1-NEXT: stlxr w10, w9, [x0]4767; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB55_14768; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4769; CHECK-OUTLINE-O1-NEXT: mov w0, w84770; CHECK-OUTLINE-O1-NEXT: ret4771;4772; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i32:4773; CHECK-NOLSE-O0: ; %bb.0:4774; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324775; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324776; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4777; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4778; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4779; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4780; CHECK-NOLSE-O0-NEXT: b LBB55_14781; CHECK-NOLSE-O0-NEXT: LBB55_1: ; %atomicrmw.start4782; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14783; CHECK-NOLSE-O0-NEXT: ; Child Loop BB55_2 Depth 24784; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4785; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4786; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4787; CHECK-NOLSE-O0-NEXT: subs w10, w8, w94788; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, ls4789; CHECK-NOLSE-O0-NEXT: LBB55_2: ; %atomicrmw.start4790; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB55_1 Depth=14791; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24792; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4793; CHECK-NOLSE-O0-NEXT: cmp w9, w84794; CHECK-NOLSE-O0-NEXT: b.ne LBB55_44795; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4796; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB55_2 Depth=24797; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4798; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB55_24799; CHECK-NOLSE-O0-NEXT: LBB55_4: ; %atomicrmw.start4800; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB55_1 Depth=14801; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84802; CHECK-NOLSE-O0-NEXT: cset w8, eq4803; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4804; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4805; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB55_14806; CHECK-NOLSE-O0-NEXT: b LBB55_54807; CHECK-NOLSE-O0-NEXT: LBB55_5: ; %atomicrmw.end4808; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4809; CHECK-NOLSE-O0-NEXT: add sp, sp, #324810; CHECK-NOLSE-O0-NEXT: ret4811;4812; CHECK-OUTLINE-O0-LABEL: atomicrmw_umin_i32:4813; CHECK-OUTLINE-O0: ; %bb.0:4814; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #484815; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill4816; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 484817; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84818; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164819; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4820; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4821; CHECK-OUTLINE-O0-NEXT: ldr w0, [x0]4822; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4823; CHECK-OUTLINE-O0-NEXT: b LBB55_14824; CHECK-OUTLINE-O0-NEXT: LBB55_1: ; %atomicrmw.start4825; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=14826; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload4827; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload4828; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload4829; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill4830; CHECK-OUTLINE-O0-NEXT: subs w9, w0, w84831; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, ls4832; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_acq_rel4833; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload4834; CHECK-OUTLINE-O0-NEXT: subs w8, w0, w84835; CHECK-OUTLINE-O0-NEXT: cset w8, eq4836; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill4837; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4838; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB55_14839; CHECK-OUTLINE-O0-NEXT: b LBB55_24840; CHECK-OUTLINE-O0-NEXT: LBB55_2: ; %atomicrmw.end4841; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4842; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload4843; CHECK-OUTLINE-O0-NEXT: add sp, sp, #484844; CHECK-OUTLINE-O0-NEXT: ret4845;4846; CHECK-LSE-O1-LABEL: atomicrmw_umin_i32:4847; CHECK-LSE-O1: ; %bb.0:4848; CHECK-LSE-O1-NEXT: lduminal w1, w0, [x0]4849; CHECK-LSE-O1-NEXT: ret4850;4851; CHECK-LSE-O0-LABEL: atomicrmw_umin_i32:4852; CHECK-LSE-O0: ; %bb.0:4853; CHECK-LSE-O0-NEXT: lduminal w1, w0, [x0]4854; CHECK-LSE-O0-NEXT: ret4855 %res = atomicrmw umin ptr %ptr, i32 %rhs seq_cst4856 ret i32 %res4857}4858 4859define i32 @atomicrmw_umax_i32(ptr %ptr, i32 %rhs) {4860; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i32:4861; CHECK-NOLSE-O1: ; %bb.0:4862; CHECK-NOLSE-O1-NEXT: LBB56_1: ; %atomicrmw.start4863; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14864; CHECK-NOLSE-O1-NEXT: ldxr w8, [x0]4865; CHECK-NOLSE-O1-NEXT: cmp w8, w14866; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, hi4867; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0]4868; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB56_14869; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4870; CHECK-NOLSE-O1-NEXT: mov w0, w84871; CHECK-NOLSE-O1-NEXT: ret4872;4873; CHECK-OUTLINE-O1-LABEL: atomicrmw_umax_i32:4874; CHECK-OUTLINE-O1: ; %bb.0:4875; CHECK-OUTLINE-O1-NEXT: LBB56_1: ; %atomicrmw.start4876; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=14877; CHECK-OUTLINE-O1-NEXT: ldxr w8, [x0]4878; CHECK-OUTLINE-O1-NEXT: cmp w8, w14879; CHECK-OUTLINE-O1-NEXT: csel w9, w8, w1, hi4880; CHECK-OUTLINE-O1-NEXT: stxr w10, w9, [x0]4881; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB56_14882; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4883; CHECK-OUTLINE-O1-NEXT: mov w0, w84884; CHECK-OUTLINE-O1-NEXT: ret4885;4886; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i32:4887; CHECK-NOLSE-O0: ; %bb.0:4888; CHECK-NOLSE-O0-NEXT: sub sp, sp, #324889; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 324890; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4891; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4892; CHECK-NOLSE-O0-NEXT: ldr w8, [x0]4893; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Spill4894; CHECK-NOLSE-O0-NEXT: b LBB56_14895; CHECK-NOLSE-O0-NEXT: LBB56_1: ; %atomicrmw.start4896; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=14897; CHECK-NOLSE-O0-NEXT: ; Child Loop BB56_2 Depth 24898; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Reload4899; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Reload4900; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Reload4901; CHECK-NOLSE-O0-NEXT: subs w10, w8, w94902; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, hi4903; CHECK-NOLSE-O0-NEXT: LBB56_2: ; %atomicrmw.start4904; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB56_1 Depth=14905; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=24906; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11]4907; CHECK-NOLSE-O0-NEXT: cmp w9, w84908; CHECK-NOLSE-O0-NEXT: b.ne LBB56_44909; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start4910; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB56_2 Depth=24911; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11]4912; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB56_24913; CHECK-NOLSE-O0-NEXT: LBB56_4: ; %atomicrmw.start4914; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB56_1 Depth=14915; CHECK-NOLSE-O0-NEXT: subs w8, w9, w84916; CHECK-NOLSE-O0-NEXT: cset w8, eq4917; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Spill4918; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Spill4919; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB56_14920; CHECK-NOLSE-O0-NEXT: b LBB56_54921; CHECK-NOLSE-O0-NEXT: LBB56_5: ; %atomicrmw.end4922; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4923; CHECK-NOLSE-O0-NEXT: add sp, sp, #324924; CHECK-NOLSE-O0-NEXT: ret4925;4926; CHECK-OUTLINE-O0-LABEL: atomicrmw_umax_i32:4927; CHECK-OUTLINE-O0: ; %bb.0:4928; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #484929; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill4930; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 484931; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -84932; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -164933; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill4934; CHECK-OUTLINE-O0-NEXT: str w1, [sp, #24] ; 4-byte Spill4935; CHECK-OUTLINE-O0-NEXT: ldr w0, [x0]4936; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4937; CHECK-OUTLINE-O0-NEXT: b LBB56_14938; CHECK-OUTLINE-O0-NEXT: LBB56_1: ; %atomicrmw.start4939; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=14940; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #28] ; 4-byte Reload4941; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #16] ; 8-byte Reload4942; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Reload4943; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #8] ; 4-byte Spill4944; CHECK-OUTLINE-O0-NEXT: subs w9, w0, w84945; CHECK-OUTLINE-O0-NEXT: csel w1, w0, w8, hi4946; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_relax4947; CHECK-OUTLINE-O0-NEXT: ldr w8, [sp, #8] ; 4-byte Reload4948; CHECK-OUTLINE-O0-NEXT: subs w8, w0, w84949; CHECK-OUTLINE-O0-NEXT: cset w8, eq4950; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill4951; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #28] ; 4-byte Spill4952; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB56_14953; CHECK-OUTLINE-O0-NEXT: b LBB56_24954; CHECK-OUTLINE-O0-NEXT: LBB56_2: ; %atomicrmw.end4955; CHECK-OUTLINE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Reload4956; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload4957; CHECK-OUTLINE-O0-NEXT: add sp, sp, #484958; CHECK-OUTLINE-O0-NEXT: ret4959;4960; CHECK-LSE-O1-LABEL: atomicrmw_umax_i32:4961; CHECK-LSE-O1: ; %bb.0:4962; CHECK-LSE-O1-NEXT: ldumax w1, w0, [x0]4963; CHECK-LSE-O1-NEXT: ret4964;4965; CHECK-LSE-O0-LABEL: atomicrmw_umax_i32:4966; CHECK-LSE-O0: ; %bb.0:4967; CHECK-LSE-O0-NEXT: ldumax w1, w0, [x0]4968; CHECK-LSE-O0-NEXT: ret4969 %res = atomicrmw umax ptr %ptr, i32 %rhs monotonic4970 ret i32 %res4971}4972 4973define i64 @atomicrmw_add_i64(ptr %ptr, i64 %rhs) {4974; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i64:4975; CHECK-NOLSE-O1: ; %bb.0:4976; CHECK-NOLSE-O1-NEXT: LBB57_1: ; %atomicrmw.start4977; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=14978; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]4979; CHECK-NOLSE-O1-NEXT: add x9, x8, x14980; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]4981; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB57_14982; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end4983; CHECK-NOLSE-O1-NEXT: mov x0, x84984; CHECK-NOLSE-O1-NEXT: ret4985;4986; CHECK-OUTLINE-O1-LABEL: atomicrmw_add_i64:4987; CHECK-OUTLINE-O1: ; %bb.0:4988; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill4989; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 164990; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -84991; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -164992; CHECK-OUTLINE-O1-NEXT: mov x2, x04993; CHECK-OUTLINE-O1-NEXT: mov x0, x14994; CHECK-OUTLINE-O1-NEXT: mov x1, x24995; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd8_acq_rel4996; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload4997; CHECK-OUTLINE-O1-NEXT: ret4998;4999; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i64:5000; CHECK-NOLSE-O0: ; %bb.0:5001; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325002; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325003; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5004; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5005; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5006; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5007; CHECK-NOLSE-O0-NEXT: b LBB57_15008; CHECK-NOLSE-O0-NEXT: LBB57_1: ; %atomicrmw.start5009; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15010; CHECK-NOLSE-O0-NEXT: ; Child Loop BB57_2 Depth 25011; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5012; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5013; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5014; CHECK-NOLSE-O0-NEXT: add x12, x8, x95015; CHECK-NOLSE-O0-NEXT: LBB57_2: ; %atomicrmw.start5016; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB57_1 Depth=15017; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25018; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5019; CHECK-NOLSE-O0-NEXT: cmp x9, x85020; CHECK-NOLSE-O0-NEXT: b.ne LBB57_45021; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5022; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB57_2 Depth=25023; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5024; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB57_25025; CHECK-NOLSE-O0-NEXT: LBB57_4: ; %atomicrmw.start5026; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB57_1 Depth=15027; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85028; CHECK-NOLSE-O0-NEXT: cset w8, eq5029; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5030; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5031; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB57_15032; CHECK-NOLSE-O0-NEXT: b LBB57_55033; CHECK-NOLSE-O0-NEXT: LBB57_5: ; %atomicrmw.end5034; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5035; CHECK-NOLSE-O0-NEXT: add sp, sp, #325036; CHECK-NOLSE-O0-NEXT: ret5037;5038; CHECK-OUTLINE-O0-LABEL: atomicrmw_add_i64:5039; CHECK-OUTLINE-O0: ; %bb.0:5040; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #325041; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill5042; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 325043; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85044; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165045; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5046; CHECK-OUTLINE-O0-NEXT: mov x0, x15047; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload5048; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd8_acq_rel5049; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload5050; CHECK-OUTLINE-O0-NEXT: add sp, sp, #325051; CHECK-OUTLINE-O0-NEXT: ret5052;5053; CHECK-LSE-O1-LABEL: atomicrmw_add_i64:5054; CHECK-LSE-O1: ; %bb.0:5055; CHECK-LSE-O1-NEXT: ldaddal x1, x0, [x0]5056; CHECK-LSE-O1-NEXT: ret5057;5058; CHECK-LSE-O0-LABEL: atomicrmw_add_i64:5059; CHECK-LSE-O0: ; %bb.0:5060; CHECK-LSE-O0-NEXT: ldaddal x1, x0, [x0]5061; CHECK-LSE-O0-NEXT: ret5062 %res = atomicrmw add ptr %ptr, i64 %rhs seq_cst5063 ret i64 %res5064}5065 5066define i64 @atomicrmw_xchg_i64(ptr %ptr, i64 %rhs) {5067; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i64:5068; CHECK-NOLSE-O1: ; %bb.0:5069; CHECK-NOLSE-O1-NEXT: LBB58_1: ; %atomicrmw.start5070; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15071; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]5072; CHECK-NOLSE-O1-NEXT: stxr w9, x1, [x0]5073; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB58_15074; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5075; CHECK-NOLSE-O1-NEXT: mov x0, x85076; CHECK-NOLSE-O1-NEXT: ret5077;5078; CHECK-OUTLINE-O1-LABEL: atomicrmw_xchg_i64:5079; CHECK-OUTLINE-O1: ; %bb.0:5080; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill5081; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 165082; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -85083; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -165084; CHECK-OUTLINE-O1-NEXT: mov x2, x05085; CHECK-OUTLINE-O1-NEXT: mov x0, x15086; CHECK-OUTLINE-O1-NEXT: mov x1, x25087; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_swp8_relax5088; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload5089; CHECK-OUTLINE-O1-NEXT: ret5090;5091; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i64:5092; CHECK-NOLSE-O0: ; %bb.0:5093; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325094; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325095; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5096; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5097; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5098; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5099; CHECK-NOLSE-O0-NEXT: b LBB58_15100; CHECK-NOLSE-O0-NEXT: LBB58_1: ; %atomicrmw.start5101; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15102; CHECK-NOLSE-O0-NEXT: ; Child Loop BB58_2 Depth 25103; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5104; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5105; CHECK-NOLSE-O0-NEXT: ldr x12, [sp, #16] ; 8-byte Reload5106; CHECK-NOLSE-O0-NEXT: LBB58_2: ; %atomicrmw.start5107; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB58_1 Depth=15108; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25109; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5110; CHECK-NOLSE-O0-NEXT: cmp x9, x85111; CHECK-NOLSE-O0-NEXT: b.ne LBB58_45112; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5113; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB58_2 Depth=25114; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5115; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB58_25116; CHECK-NOLSE-O0-NEXT: LBB58_4: ; %atomicrmw.start5117; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB58_1 Depth=15118; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85119; CHECK-NOLSE-O0-NEXT: cset w8, eq5120; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5121; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5122; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB58_15123; CHECK-NOLSE-O0-NEXT: b LBB58_55124; CHECK-NOLSE-O0-NEXT: LBB58_5: ; %atomicrmw.end5125; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5126; CHECK-NOLSE-O0-NEXT: add sp, sp, #325127; CHECK-NOLSE-O0-NEXT: ret5128;5129; CHECK-OUTLINE-O0-LABEL: atomicrmw_xchg_i64:5130; CHECK-OUTLINE-O0: ; %bb.0:5131; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #325132; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill5133; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 325134; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85135; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165136; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5137; CHECK-OUTLINE-O0-NEXT: mov x0, x15138; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload5139; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_swp8_relax5140; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload5141; CHECK-OUTLINE-O0-NEXT: add sp, sp, #325142; CHECK-OUTLINE-O0-NEXT: ret5143;5144; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i64:5145; CHECK-LSE-O1: ; %bb.0:5146; CHECK-LSE-O1-NEXT: swp x1, x0, [x0]5147; CHECK-LSE-O1-NEXT: ret5148;5149; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i64:5150; CHECK-LSE-O0: ; %bb.0:5151; CHECK-LSE-O0-NEXT: swp x1, x0, [x0]5152; CHECK-LSE-O0-NEXT: ret5153 %res = atomicrmw xchg ptr %ptr, i64 %rhs monotonic5154 ret i64 %res5155}5156 5157define i64 @atomicrmw_sub_i64(ptr %ptr, i64 %rhs) {5158; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i64:5159; CHECK-NOLSE-O1: ; %bb.0:5160; CHECK-NOLSE-O1-NEXT: LBB59_1: ; %atomicrmw.start5161; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15162; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]5163; CHECK-NOLSE-O1-NEXT: sub x9, x8, x15164; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0]5165; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB59_15166; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5167; CHECK-NOLSE-O1-NEXT: mov x0, x85168; CHECK-NOLSE-O1-NEXT: ret5169;5170; CHECK-OUTLINE-O1-LABEL: atomicrmw_sub_i64:5171; CHECK-OUTLINE-O1: ; %bb.0:5172; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill5173; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 165174; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -85175; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -165176; CHECK-OUTLINE-O1-NEXT: mov x2, x05177; CHECK-OUTLINE-O1-NEXT: neg x0, x15178; CHECK-OUTLINE-O1-NEXT: mov x1, x25179; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldadd8_acq5180; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload5181; CHECK-OUTLINE-O1-NEXT: ret5182;5183; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i64:5184; CHECK-NOLSE-O0: ; %bb.0:5185; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325186; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325187; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5188; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5189; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5190; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5191; CHECK-NOLSE-O0-NEXT: b LBB59_15192; CHECK-NOLSE-O0-NEXT: LBB59_1: ; %atomicrmw.start5193; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15194; CHECK-NOLSE-O0-NEXT: ; Child Loop BB59_2 Depth 25195; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5196; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5197; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5198; CHECK-NOLSE-O0-NEXT: subs x12, x8, x95199; CHECK-NOLSE-O0-NEXT: LBB59_2: ; %atomicrmw.start5200; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB59_1 Depth=15201; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25202; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5203; CHECK-NOLSE-O0-NEXT: cmp x9, x85204; CHECK-NOLSE-O0-NEXT: b.ne LBB59_45205; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5206; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB59_2 Depth=25207; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5208; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB59_25209; CHECK-NOLSE-O0-NEXT: LBB59_4: ; %atomicrmw.start5210; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB59_1 Depth=15211; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85212; CHECK-NOLSE-O0-NEXT: cset w8, eq5213; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5214; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5215; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB59_15216; CHECK-NOLSE-O0-NEXT: b LBB59_55217; CHECK-NOLSE-O0-NEXT: LBB59_5: ; %atomicrmw.end5218; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5219; CHECK-NOLSE-O0-NEXT: add sp, sp, #325220; CHECK-NOLSE-O0-NEXT: ret5221;5222; CHECK-OUTLINE-O0-LABEL: atomicrmw_sub_i64:5223; CHECK-OUTLINE-O0: ; %bb.0:5224; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #325225; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill5226; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 325227; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85228; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165229; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5230; CHECK-OUTLINE-O0-NEXT: mov x9, x15231; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload5232; CHECK-OUTLINE-O0-NEXT: mov x8, xzr5233; CHECK-OUTLINE-O0-NEXT: subs x0, x8, x95234; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldadd8_acq5235; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload5236; CHECK-OUTLINE-O0-NEXT: add sp, sp, #325237; CHECK-OUTLINE-O0-NEXT: ret5238;5239; CHECK-LSE-O1-LABEL: atomicrmw_sub_i64:5240; CHECK-LSE-O1: ; %bb.0:5241; CHECK-LSE-O1-NEXT: neg x8, x15242; CHECK-LSE-O1-NEXT: ldadda x8, x0, [x0]5243; CHECK-LSE-O1-NEXT: ret5244;5245; CHECK-LSE-O0-LABEL: atomicrmw_sub_i64:5246; CHECK-LSE-O0: ; %bb.0:5247; CHECK-LSE-O0-NEXT: neg x8, x15248; CHECK-LSE-O0-NEXT: ldadda x8, x0, [x0]5249; CHECK-LSE-O0-NEXT: ret5250 %res = atomicrmw sub ptr %ptr, i64 %rhs acquire5251 ret i64 %res5252}5253 5254define i64 @atomicrmw_and_i64(ptr %ptr, i64 %rhs) {5255; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i64:5256; CHECK-NOLSE-O1: ; %bb.0:5257; CHECK-NOLSE-O1-NEXT: LBB60_1: ; %atomicrmw.start5258; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15259; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]5260; CHECK-NOLSE-O1-NEXT: and x9, x8, x15261; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]5262; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB60_15263; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5264; CHECK-NOLSE-O1-NEXT: mov x0, x85265; CHECK-NOLSE-O1-NEXT: ret5266;5267; CHECK-OUTLINE-O1-LABEL: atomicrmw_and_i64:5268; CHECK-OUTLINE-O1: ; %bb.0:5269; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill5270; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 165271; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -85272; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -165273; CHECK-OUTLINE-O1-NEXT: mov x2, x05274; CHECK-OUTLINE-O1-NEXT: mvn x0, x15275; CHECK-OUTLINE-O1-NEXT: mov x1, x25276; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldclr8_rel5277; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload5278; CHECK-OUTLINE-O1-NEXT: ret5279;5280; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i64:5281; CHECK-NOLSE-O0: ; %bb.0:5282; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325283; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325284; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5285; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5286; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5287; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5288; CHECK-NOLSE-O0-NEXT: b LBB60_15289; CHECK-NOLSE-O0-NEXT: LBB60_1: ; %atomicrmw.start5290; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15291; CHECK-NOLSE-O0-NEXT: ; Child Loop BB60_2 Depth 25292; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5293; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5294; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5295; CHECK-NOLSE-O0-NEXT: and x12, x8, x95296; CHECK-NOLSE-O0-NEXT: LBB60_2: ; %atomicrmw.start5297; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB60_1 Depth=15298; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25299; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5300; CHECK-NOLSE-O0-NEXT: cmp x9, x85301; CHECK-NOLSE-O0-NEXT: b.ne LBB60_45302; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5303; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB60_2 Depth=25304; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5305; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB60_25306; CHECK-NOLSE-O0-NEXT: LBB60_4: ; %atomicrmw.start5307; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB60_1 Depth=15308; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85309; CHECK-NOLSE-O0-NEXT: cset w8, eq5310; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5311; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5312; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB60_15313; CHECK-NOLSE-O0-NEXT: b LBB60_55314; CHECK-NOLSE-O0-NEXT: LBB60_5: ; %atomicrmw.end5315; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5316; CHECK-NOLSE-O0-NEXT: add sp, sp, #325317; CHECK-NOLSE-O0-NEXT: ret5318;5319; CHECK-OUTLINE-O0-LABEL: atomicrmw_and_i64:5320; CHECK-OUTLINE-O0: ; %bb.0:5321; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #325322; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill5323; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 325324; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85325; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165326; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5327; CHECK-OUTLINE-O0-NEXT: mov x9, x15328; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload5329; CHECK-OUTLINE-O0-NEXT: mov x8, #-1 ; =0xffffffffffffffff5330; CHECK-OUTLINE-O0-NEXT: eor x0, x8, x95331; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldclr8_rel5332; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload5333; CHECK-OUTLINE-O0-NEXT: add sp, sp, #325334; CHECK-OUTLINE-O0-NEXT: ret5335;5336; CHECK-LSE-O1-LABEL: atomicrmw_and_i64:5337; CHECK-LSE-O1: ; %bb.0:5338; CHECK-LSE-O1-NEXT: mvn x8, x15339; CHECK-LSE-O1-NEXT: ldclrl x8, x0, [x0]5340; CHECK-LSE-O1-NEXT: ret5341;5342; CHECK-LSE-O0-LABEL: atomicrmw_and_i64:5343; CHECK-LSE-O0: ; %bb.0:5344; CHECK-LSE-O0-NEXT: mvn x8, x15345; CHECK-LSE-O0-NEXT: ldclrl x8, x0, [x0]5346; CHECK-LSE-O0-NEXT: ret5347 %res = atomicrmw and ptr %ptr, i64 %rhs release5348 ret i64 %res5349}5350 5351define i64 @atomicrmw_or_i64(ptr %ptr, i64 %rhs) {5352; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i64:5353; CHECK-NOLSE-O1: ; %bb.0:5354; CHECK-NOLSE-O1-NEXT: LBB61_1: ; %atomicrmw.start5355; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15356; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]5357; CHECK-NOLSE-O1-NEXT: orr x9, x8, x15358; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]5359; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB61_15360; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5361; CHECK-NOLSE-O1-NEXT: mov x0, x85362; CHECK-NOLSE-O1-NEXT: ret5363;5364; CHECK-OUTLINE-O1-LABEL: atomicrmw_or_i64:5365; CHECK-OUTLINE-O1: ; %bb.0:5366; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill5367; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 165368; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -85369; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -165370; CHECK-OUTLINE-O1-NEXT: mov x2, x05371; CHECK-OUTLINE-O1-NEXT: mov x0, x15372; CHECK-OUTLINE-O1-NEXT: mov x1, x25373; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldset8_acq_rel5374; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload5375; CHECK-OUTLINE-O1-NEXT: ret5376;5377; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i64:5378; CHECK-NOLSE-O0: ; %bb.0:5379; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325380; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325381; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5382; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5383; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5384; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5385; CHECK-NOLSE-O0-NEXT: b LBB61_15386; CHECK-NOLSE-O0-NEXT: LBB61_1: ; %atomicrmw.start5387; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15388; CHECK-NOLSE-O0-NEXT: ; Child Loop BB61_2 Depth 25389; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5390; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5391; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5392; CHECK-NOLSE-O0-NEXT: orr x12, x8, x95393; CHECK-NOLSE-O0-NEXT: LBB61_2: ; %atomicrmw.start5394; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB61_1 Depth=15395; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25396; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5397; CHECK-NOLSE-O0-NEXT: cmp x9, x85398; CHECK-NOLSE-O0-NEXT: b.ne LBB61_45399; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5400; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB61_2 Depth=25401; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5402; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB61_25403; CHECK-NOLSE-O0-NEXT: LBB61_4: ; %atomicrmw.start5404; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB61_1 Depth=15405; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85406; CHECK-NOLSE-O0-NEXT: cset w8, eq5407; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5408; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5409; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB61_15410; CHECK-NOLSE-O0-NEXT: b LBB61_55411; CHECK-NOLSE-O0-NEXT: LBB61_5: ; %atomicrmw.end5412; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5413; CHECK-NOLSE-O0-NEXT: add sp, sp, #325414; CHECK-NOLSE-O0-NEXT: ret5415;5416; CHECK-OUTLINE-O0-LABEL: atomicrmw_or_i64:5417; CHECK-OUTLINE-O0: ; %bb.0:5418; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #325419; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill5420; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 325421; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85422; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165423; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5424; CHECK-OUTLINE-O0-NEXT: mov x0, x15425; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload5426; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldset8_acq_rel5427; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload5428; CHECK-OUTLINE-O0-NEXT: add sp, sp, #325429; CHECK-OUTLINE-O0-NEXT: ret5430;5431; CHECK-LSE-O1-LABEL: atomicrmw_or_i64:5432; CHECK-LSE-O1: ; %bb.0:5433; CHECK-LSE-O1-NEXT: ldsetal x1, x0, [x0]5434; CHECK-LSE-O1-NEXT: ret5435;5436; CHECK-LSE-O0-LABEL: atomicrmw_or_i64:5437; CHECK-LSE-O0: ; %bb.0:5438; CHECK-LSE-O0-NEXT: ldsetal x1, x0, [x0]5439; CHECK-LSE-O0-NEXT: ret5440 %res = atomicrmw or ptr %ptr, i64 %rhs seq_cst5441 ret i64 %res5442}5443 5444define i64 @atomicrmw_xor_i64(ptr %ptr, i64 %rhs) {5445; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i64:5446; CHECK-NOLSE-O1: ; %bb.0:5447; CHECK-NOLSE-O1-NEXT: LBB62_1: ; %atomicrmw.start5448; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15449; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]5450; CHECK-NOLSE-O1-NEXT: eor x9, x8, x15451; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0]5452; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB62_15453; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5454; CHECK-NOLSE-O1-NEXT: mov x0, x85455; CHECK-NOLSE-O1-NEXT: ret5456;5457; CHECK-OUTLINE-O1-LABEL: atomicrmw_xor_i64:5458; CHECK-OUTLINE-O1: ; %bb.0:5459; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill5460; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 165461; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -85462; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -165463; CHECK-OUTLINE-O1-NEXT: mov x2, x05464; CHECK-OUTLINE-O1-NEXT: mov x0, x15465; CHECK-OUTLINE-O1-NEXT: mov x1, x25466; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_ldeor8_relax5467; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload5468; CHECK-OUTLINE-O1-NEXT: ret5469;5470; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i64:5471; CHECK-NOLSE-O0: ; %bb.0:5472; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325473; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325474; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5475; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5476; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5477; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5478; CHECK-NOLSE-O0-NEXT: b LBB62_15479; CHECK-NOLSE-O0-NEXT: LBB62_1: ; %atomicrmw.start5480; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15481; CHECK-NOLSE-O0-NEXT: ; Child Loop BB62_2 Depth 25482; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5483; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5484; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5485; CHECK-NOLSE-O0-NEXT: eor x12, x8, x95486; CHECK-NOLSE-O0-NEXT: LBB62_2: ; %atomicrmw.start5487; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB62_1 Depth=15488; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25489; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5490; CHECK-NOLSE-O0-NEXT: cmp x9, x85491; CHECK-NOLSE-O0-NEXT: b.ne LBB62_45492; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5493; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB62_2 Depth=25494; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5495; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB62_25496; CHECK-NOLSE-O0-NEXT: LBB62_4: ; %atomicrmw.start5497; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB62_1 Depth=15498; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85499; CHECK-NOLSE-O0-NEXT: cset w8, eq5500; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5501; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5502; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB62_15503; CHECK-NOLSE-O0-NEXT: b LBB62_55504; CHECK-NOLSE-O0-NEXT: LBB62_5: ; %atomicrmw.end5505; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5506; CHECK-NOLSE-O0-NEXT: add sp, sp, #325507; CHECK-NOLSE-O0-NEXT: ret5508;5509; CHECK-OUTLINE-O0-LABEL: atomicrmw_xor_i64:5510; CHECK-OUTLINE-O0: ; %bb.0:5511; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #325512; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill5513; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 325514; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85515; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165516; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5517; CHECK-OUTLINE-O0-NEXT: mov x0, x15518; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload5519; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_ldeor8_relax5520; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload5521; CHECK-OUTLINE-O0-NEXT: add sp, sp, #325522; CHECK-OUTLINE-O0-NEXT: ret5523;5524; CHECK-LSE-O1-LABEL: atomicrmw_xor_i64:5525; CHECK-LSE-O1: ; %bb.0:5526; CHECK-LSE-O1-NEXT: ldeor x1, x0, [x0]5527; CHECK-LSE-O1-NEXT: ret5528;5529; CHECK-LSE-O0-LABEL: atomicrmw_xor_i64:5530; CHECK-LSE-O0: ; %bb.0:5531; CHECK-LSE-O0-NEXT: ldeor x1, x0, [x0]5532; CHECK-LSE-O0-NEXT: ret5533 %res = atomicrmw xor ptr %ptr, i64 %rhs monotonic5534 ret i64 %res5535}5536 5537define i64 @atomicrmw_min_i64(ptr %ptr, i64 %rhs) {5538; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i64:5539; CHECK-NOLSE-O1: ; %bb.0:5540; CHECK-NOLSE-O1-NEXT: LBB63_1: ; %atomicrmw.start5541; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15542; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]5543; CHECK-NOLSE-O1-NEXT: cmp x8, x15544; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, lt5545; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0]5546; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB63_15547; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5548; CHECK-NOLSE-O1-NEXT: mov x0, x85549; CHECK-NOLSE-O1-NEXT: ret5550;5551; CHECK-OUTLINE-O1-LABEL: atomicrmw_min_i64:5552; CHECK-OUTLINE-O1: ; %bb.0:5553; CHECK-OUTLINE-O1-NEXT: LBB63_1: ; %atomicrmw.start5554; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=15555; CHECK-OUTLINE-O1-NEXT: ldaxr x8, [x0]5556; CHECK-OUTLINE-O1-NEXT: cmp x8, x15557; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, lt5558; CHECK-OUTLINE-O1-NEXT: stxr w10, x9, [x0]5559; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB63_15560; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5561; CHECK-OUTLINE-O1-NEXT: mov x0, x85562; CHECK-OUTLINE-O1-NEXT: ret5563;5564; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i64:5565; CHECK-NOLSE-O0: ; %bb.0:5566; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325567; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325568; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5569; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5570; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5571; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5572; CHECK-NOLSE-O0-NEXT: b LBB63_15573; CHECK-NOLSE-O0-NEXT: LBB63_1: ; %atomicrmw.start5574; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15575; CHECK-NOLSE-O0-NEXT: ; Child Loop BB63_2 Depth 25576; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5577; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5578; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5579; CHECK-NOLSE-O0-NEXT: subs x10, x8, x95580; CHECK-NOLSE-O0-NEXT: csel x12, x8, x9, le5581; CHECK-NOLSE-O0-NEXT: LBB63_2: ; %atomicrmw.start5582; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB63_1 Depth=15583; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25584; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5585; CHECK-NOLSE-O0-NEXT: cmp x9, x85586; CHECK-NOLSE-O0-NEXT: b.ne LBB63_45587; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5588; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB63_2 Depth=25589; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5590; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB63_25591; CHECK-NOLSE-O0-NEXT: LBB63_4: ; %atomicrmw.start5592; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB63_1 Depth=15593; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85594; CHECK-NOLSE-O0-NEXT: cset w8, eq5595; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5596; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5597; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB63_15598; CHECK-NOLSE-O0-NEXT: b LBB63_55599; CHECK-NOLSE-O0-NEXT: LBB63_5: ; %atomicrmw.end5600; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5601; CHECK-NOLSE-O0-NEXT: add sp, sp, #325602; CHECK-NOLSE-O0-NEXT: ret5603;5604; CHECK-OUTLINE-O0-LABEL: atomicrmw_min_i64:5605; CHECK-OUTLINE-O0: ; %bb.0:5606; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #645607; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #48] ; 16-byte Folded Spill5608; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 645609; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85610; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165611; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #24] ; 8-byte Spill5612; CHECK-OUTLINE-O0-NEXT: str x1, [sp, #32] ; 8-byte Spill5613; CHECK-OUTLINE-O0-NEXT: ldr x0, [x0]5614; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5615; CHECK-OUTLINE-O0-NEXT: b LBB63_15616; CHECK-OUTLINE-O0-NEXT: LBB63_1: ; %atomicrmw.start5617; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=15618; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #40] ; 8-byte Reload5619; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #24] ; 8-byte Reload5620; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #32] ; 8-byte Reload5621; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5622; CHECK-OUTLINE-O0-NEXT: subs x9, x0, x85623; CHECK-OUTLINE-O0-NEXT: csel x1, x0, x8, le5624; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_acq5625; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #8] ; 8-byte Reload5626; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x85627; CHECK-OUTLINE-O0-NEXT: cset w8, eq5628; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill5629; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5630; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB63_15631; CHECK-OUTLINE-O0-NEXT: b LBB63_25632; CHECK-OUTLINE-O0-NEXT: LBB63_2: ; %atomicrmw.end5633; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #16] ; 8-byte Reload5634; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #48] ; 16-byte Folded Reload5635; CHECK-OUTLINE-O0-NEXT: add sp, sp, #645636; CHECK-OUTLINE-O0-NEXT: ret5637;5638; CHECK-LSE-O1-LABEL: atomicrmw_min_i64:5639; CHECK-LSE-O1: ; %bb.0:5640; CHECK-LSE-O1-NEXT: ldsmina x1, x0, [x0]5641; CHECK-LSE-O1-NEXT: ret5642;5643; CHECK-LSE-O0-LABEL: atomicrmw_min_i64:5644; CHECK-LSE-O0: ; %bb.0:5645; CHECK-LSE-O0-NEXT: ldsmina x1, x0, [x0]5646; CHECK-LSE-O0-NEXT: ret5647 %res = atomicrmw min ptr %ptr, i64 %rhs acquire5648 ret i64 %res5649}5650 5651define i64 @atomicrmw_max_i64(ptr %ptr, i64 %rhs) {5652; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i64:5653; CHECK-NOLSE-O1: ; %bb.0:5654; CHECK-NOLSE-O1-NEXT: LBB64_1: ; %atomicrmw.start5655; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15656; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]5657; CHECK-NOLSE-O1-NEXT: cmp x8, x15658; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, gt5659; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]5660; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB64_15661; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5662; CHECK-NOLSE-O1-NEXT: mov x0, x85663; CHECK-NOLSE-O1-NEXT: ret5664;5665; CHECK-OUTLINE-O1-LABEL: atomicrmw_max_i64:5666; CHECK-OUTLINE-O1: ; %bb.0:5667; CHECK-OUTLINE-O1-NEXT: LBB64_1: ; %atomicrmw.start5668; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=15669; CHECK-OUTLINE-O1-NEXT: ldxr x8, [x0]5670; CHECK-OUTLINE-O1-NEXT: cmp x8, x15671; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, gt5672; CHECK-OUTLINE-O1-NEXT: stlxr w10, x9, [x0]5673; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB64_15674; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5675; CHECK-OUTLINE-O1-NEXT: mov x0, x85676; CHECK-OUTLINE-O1-NEXT: ret5677;5678; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i64:5679; CHECK-NOLSE-O0: ; %bb.0:5680; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325681; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325682; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5683; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5684; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5685; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5686; CHECK-NOLSE-O0-NEXT: b LBB64_15687; CHECK-NOLSE-O0-NEXT: LBB64_1: ; %atomicrmw.start5688; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15689; CHECK-NOLSE-O0-NEXT: ; Child Loop BB64_2 Depth 25690; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5691; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5692; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5693; CHECK-NOLSE-O0-NEXT: subs x10, x8, x95694; CHECK-NOLSE-O0-NEXT: csel x12, x8, x9, gt5695; CHECK-NOLSE-O0-NEXT: LBB64_2: ; %atomicrmw.start5696; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB64_1 Depth=15697; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25698; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5699; CHECK-NOLSE-O0-NEXT: cmp x9, x85700; CHECK-NOLSE-O0-NEXT: b.ne LBB64_45701; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5702; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB64_2 Depth=25703; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5704; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB64_25705; CHECK-NOLSE-O0-NEXT: LBB64_4: ; %atomicrmw.start5706; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB64_1 Depth=15707; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85708; CHECK-NOLSE-O0-NEXT: cset w8, eq5709; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5710; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5711; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB64_15712; CHECK-NOLSE-O0-NEXT: b LBB64_55713; CHECK-NOLSE-O0-NEXT: LBB64_5: ; %atomicrmw.end5714; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5715; CHECK-NOLSE-O0-NEXT: add sp, sp, #325716; CHECK-NOLSE-O0-NEXT: ret5717;5718; CHECK-OUTLINE-O0-LABEL: atomicrmw_max_i64:5719; CHECK-OUTLINE-O0: ; %bb.0:5720; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #645721; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #48] ; 16-byte Folded Spill5722; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 645723; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85724; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165725; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #24] ; 8-byte Spill5726; CHECK-OUTLINE-O0-NEXT: str x1, [sp, #32] ; 8-byte Spill5727; CHECK-OUTLINE-O0-NEXT: ldr x0, [x0]5728; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5729; CHECK-OUTLINE-O0-NEXT: b LBB64_15730; CHECK-OUTLINE-O0-NEXT: LBB64_1: ; %atomicrmw.start5731; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=15732; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #40] ; 8-byte Reload5733; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #24] ; 8-byte Reload5734; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #32] ; 8-byte Reload5735; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5736; CHECK-OUTLINE-O0-NEXT: subs x9, x0, x85737; CHECK-OUTLINE-O0-NEXT: csel x1, x0, x8, gt5738; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_rel5739; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #8] ; 8-byte Reload5740; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x85741; CHECK-OUTLINE-O0-NEXT: cset w8, eq5742; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill5743; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5744; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB64_15745; CHECK-OUTLINE-O0-NEXT: b LBB64_25746; CHECK-OUTLINE-O0-NEXT: LBB64_2: ; %atomicrmw.end5747; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #16] ; 8-byte Reload5748; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #48] ; 16-byte Folded Reload5749; CHECK-OUTLINE-O0-NEXT: add sp, sp, #645750; CHECK-OUTLINE-O0-NEXT: ret5751;5752; CHECK-LSE-O1-LABEL: atomicrmw_max_i64:5753; CHECK-LSE-O1: ; %bb.0:5754; CHECK-LSE-O1-NEXT: ldsmaxl x1, x0, [x0]5755; CHECK-LSE-O1-NEXT: ret5756;5757; CHECK-LSE-O0-LABEL: atomicrmw_max_i64:5758; CHECK-LSE-O0: ; %bb.0:5759; CHECK-LSE-O0-NEXT: ldsmaxl x1, x0, [x0]5760; CHECK-LSE-O0-NEXT: ret5761 %res = atomicrmw max ptr %ptr, i64 %rhs release5762 ret i64 %res5763}5764 5765define i64 @atomicrmw_umin_i64(ptr %ptr, i64 %rhs) {5766; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i64:5767; CHECK-NOLSE-O1: ; %bb.0:5768; CHECK-NOLSE-O1-NEXT: LBB65_1: ; %atomicrmw.start5769; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15770; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0]5771; CHECK-NOLSE-O1-NEXT: cmp x8, x15772; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, lo5773; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0]5774; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB65_15775; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5776; CHECK-NOLSE-O1-NEXT: mov x0, x85777; CHECK-NOLSE-O1-NEXT: ret5778;5779; CHECK-OUTLINE-O1-LABEL: atomicrmw_umin_i64:5780; CHECK-OUTLINE-O1: ; %bb.0:5781; CHECK-OUTLINE-O1-NEXT: LBB65_1: ; %atomicrmw.start5782; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=15783; CHECK-OUTLINE-O1-NEXT: ldaxr x8, [x0]5784; CHECK-OUTLINE-O1-NEXT: cmp x8, x15785; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, lo5786; CHECK-OUTLINE-O1-NEXT: stlxr w10, x9, [x0]5787; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB65_15788; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5789; CHECK-OUTLINE-O1-NEXT: mov x0, x85790; CHECK-OUTLINE-O1-NEXT: ret5791;5792; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i64:5793; CHECK-NOLSE-O0: ; %bb.0:5794; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325795; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325796; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5797; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5798; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5799; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5800; CHECK-NOLSE-O0-NEXT: b LBB65_15801; CHECK-NOLSE-O0-NEXT: LBB65_1: ; %atomicrmw.start5802; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15803; CHECK-NOLSE-O0-NEXT: ; Child Loop BB65_2 Depth 25804; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5805; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5806; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5807; CHECK-NOLSE-O0-NEXT: subs x10, x8, x95808; CHECK-NOLSE-O0-NEXT: csel x12, x8, x9, ls5809; CHECK-NOLSE-O0-NEXT: LBB65_2: ; %atomicrmw.start5810; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB65_1 Depth=15811; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25812; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5813; CHECK-NOLSE-O0-NEXT: cmp x9, x85814; CHECK-NOLSE-O0-NEXT: b.ne LBB65_45815; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5816; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB65_2 Depth=25817; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5818; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB65_25819; CHECK-NOLSE-O0-NEXT: LBB65_4: ; %atomicrmw.start5820; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB65_1 Depth=15821; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85822; CHECK-NOLSE-O0-NEXT: cset w8, eq5823; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5824; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5825; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB65_15826; CHECK-NOLSE-O0-NEXT: b LBB65_55827; CHECK-NOLSE-O0-NEXT: LBB65_5: ; %atomicrmw.end5828; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5829; CHECK-NOLSE-O0-NEXT: add sp, sp, #325830; CHECK-NOLSE-O0-NEXT: ret5831;5832; CHECK-OUTLINE-O0-LABEL: atomicrmw_umin_i64:5833; CHECK-OUTLINE-O0: ; %bb.0:5834; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #645835; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #48] ; 16-byte Folded Spill5836; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 645837; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85838; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165839; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #24] ; 8-byte Spill5840; CHECK-OUTLINE-O0-NEXT: str x1, [sp, #32] ; 8-byte Spill5841; CHECK-OUTLINE-O0-NEXT: ldr x0, [x0]5842; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5843; CHECK-OUTLINE-O0-NEXT: b LBB65_15844; CHECK-OUTLINE-O0-NEXT: LBB65_1: ; %atomicrmw.start5845; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=15846; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #40] ; 8-byte Reload5847; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #24] ; 8-byte Reload5848; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #32] ; 8-byte Reload5849; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5850; CHECK-OUTLINE-O0-NEXT: subs x9, x0, x85851; CHECK-OUTLINE-O0-NEXT: csel x1, x0, x8, ls5852; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_acq_rel5853; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #8] ; 8-byte Reload5854; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x85855; CHECK-OUTLINE-O0-NEXT: cset w8, eq5856; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill5857; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5858; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB65_15859; CHECK-OUTLINE-O0-NEXT: b LBB65_25860; CHECK-OUTLINE-O0-NEXT: LBB65_2: ; %atomicrmw.end5861; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #16] ; 8-byte Reload5862; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #48] ; 16-byte Folded Reload5863; CHECK-OUTLINE-O0-NEXT: add sp, sp, #645864; CHECK-OUTLINE-O0-NEXT: ret5865;5866; CHECK-LSE-O1-LABEL: atomicrmw_umin_i64:5867; CHECK-LSE-O1: ; %bb.0:5868; CHECK-LSE-O1-NEXT: lduminal x1, x0, [x0]5869; CHECK-LSE-O1-NEXT: ret5870;5871; CHECK-LSE-O0-LABEL: atomicrmw_umin_i64:5872; CHECK-LSE-O0: ; %bb.0:5873; CHECK-LSE-O0-NEXT: lduminal x1, x0, [x0]5874; CHECK-LSE-O0-NEXT: ret5875 %res = atomicrmw umin ptr %ptr, i64 %rhs seq_cst5876 ret i64 %res5877}5878 5879define i64 @atomicrmw_umax_i64(ptr %ptr, i64 %rhs) {5880; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i64:5881; CHECK-NOLSE-O1: ; %bb.0:5882; CHECK-NOLSE-O1-NEXT: LBB66_1: ; %atomicrmw.start5883; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15884; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0]5885; CHECK-NOLSE-O1-NEXT: cmp x8, x15886; CHECK-NOLSE-O1-NEXT: csel x9, x8, x1, hi5887; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0]5888; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB66_15889; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5890; CHECK-NOLSE-O1-NEXT: mov x0, x85891; CHECK-NOLSE-O1-NEXT: ret5892;5893; CHECK-OUTLINE-O1-LABEL: atomicrmw_umax_i64:5894; CHECK-OUTLINE-O1: ; %bb.0:5895; CHECK-OUTLINE-O1-NEXT: LBB66_1: ; %atomicrmw.start5896; CHECK-OUTLINE-O1-NEXT: ; =>This Inner Loop Header: Depth=15897; CHECK-OUTLINE-O1-NEXT: ldxr x8, [x0]5898; CHECK-OUTLINE-O1-NEXT: cmp x8, x15899; CHECK-OUTLINE-O1-NEXT: csel x9, x8, x1, hi5900; CHECK-OUTLINE-O1-NEXT: stxr w10, x9, [x0]5901; CHECK-OUTLINE-O1-NEXT: cbnz w10, LBB66_15902; CHECK-OUTLINE-O1-NEXT: ; %bb.2: ; %atomicrmw.end5903; CHECK-OUTLINE-O1-NEXT: mov x0, x85904; CHECK-OUTLINE-O1-NEXT: ret5905;5906; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i64:5907; CHECK-NOLSE-O0: ; %bb.0:5908; CHECK-NOLSE-O0-NEXT: sub sp, sp, #325909; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 325910; CHECK-NOLSE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5911; CHECK-NOLSE-O0-NEXT: str x1, [sp, #16] ; 8-byte Spill5912; CHECK-NOLSE-O0-NEXT: ldr x8, [x0]5913; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Spill5914; CHECK-NOLSE-O0-NEXT: b LBB66_15915; CHECK-NOLSE-O0-NEXT: LBB66_1: ; %atomicrmw.start5916; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=15917; CHECK-NOLSE-O0-NEXT: ; Child Loop BB66_2 Depth 25918; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Reload5919; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #8] ; 8-byte Reload5920; CHECK-NOLSE-O0-NEXT: ldr x9, [sp, #16] ; 8-byte Reload5921; CHECK-NOLSE-O0-NEXT: subs x10, x8, x95922; CHECK-NOLSE-O0-NEXT: csel x12, x8, x9, hi5923; CHECK-NOLSE-O0-NEXT: LBB66_2: ; %atomicrmw.start5924; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB66_1 Depth=15925; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=25926; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11]5927; CHECK-NOLSE-O0-NEXT: cmp x9, x85928; CHECK-NOLSE-O0-NEXT: b.ne LBB66_45929; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start5930; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB66_2 Depth=25931; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11]5932; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB66_25933; CHECK-NOLSE-O0-NEXT: LBB66_4: ; %atomicrmw.start5934; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB66_1 Depth=15935; CHECK-NOLSE-O0-NEXT: subs x8, x9, x85936; CHECK-NOLSE-O0-NEXT: cset w8, eq5937; CHECK-NOLSE-O0-NEXT: str x9, [sp] ; 8-byte Spill5938; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Spill5939; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB66_15940; CHECK-NOLSE-O0-NEXT: b LBB66_55941; CHECK-NOLSE-O0-NEXT: LBB66_5: ; %atomicrmw.end5942; CHECK-NOLSE-O0-NEXT: ldr x0, [sp] ; 8-byte Reload5943; CHECK-NOLSE-O0-NEXT: add sp, sp, #325944; CHECK-NOLSE-O0-NEXT: ret5945;5946; CHECK-OUTLINE-O0-LABEL: atomicrmw_umax_i64:5947; CHECK-OUTLINE-O0: ; %bb.0:5948; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #645949; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #48] ; 16-byte Folded Spill5950; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 645951; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -85952; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -165953; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #24] ; 8-byte Spill5954; CHECK-OUTLINE-O0-NEXT: str x1, [sp, #32] ; 8-byte Spill5955; CHECK-OUTLINE-O0-NEXT: ldr x0, [x0]5956; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5957; CHECK-OUTLINE-O0-NEXT: b LBB66_15958; CHECK-OUTLINE-O0-NEXT: LBB66_1: ; %atomicrmw.start5959; CHECK-OUTLINE-O0-NEXT: ; =>This Inner Loop Header: Depth=15960; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #40] ; 8-byte Reload5961; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp, #24] ; 8-byte Reload5962; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #32] ; 8-byte Reload5963; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill5964; CHECK-OUTLINE-O0-NEXT: subs x9, x0, x85965; CHECK-OUTLINE-O0-NEXT: csel x1, x0, x8, hi5966; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_relax5967; CHECK-OUTLINE-O0-NEXT: ldr x8, [sp, #8] ; 8-byte Reload5968; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x85969; CHECK-OUTLINE-O0-NEXT: cset w8, eq5970; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #16] ; 8-byte Spill5971; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #40] ; 8-byte Spill5972; CHECK-OUTLINE-O0-NEXT: tbz w8, #0, LBB66_15973; CHECK-OUTLINE-O0-NEXT: b LBB66_25974; CHECK-OUTLINE-O0-NEXT: LBB66_2: ; %atomicrmw.end5975; CHECK-OUTLINE-O0-NEXT: ldr x0, [sp, #16] ; 8-byte Reload5976; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #48] ; 16-byte Folded Reload5977; CHECK-OUTLINE-O0-NEXT: add sp, sp, #645978; CHECK-OUTLINE-O0-NEXT: ret5979;5980; CHECK-LSE-O1-LABEL: atomicrmw_umax_i64:5981; CHECK-LSE-O1: ; %bb.0:5982; CHECK-LSE-O1-NEXT: ldumax x1, x0, [x0]5983; CHECK-LSE-O1-NEXT: ret5984;5985; CHECK-LSE-O0-LABEL: atomicrmw_umax_i64:5986; CHECK-LSE-O0: ; %bb.0:5987; CHECK-LSE-O0-NEXT: ldumax x1, x0, [x0]5988; CHECK-LSE-O0-NEXT: ret5989 %res = atomicrmw umax ptr %ptr, i64 %rhs monotonic5990 ret i64 %res5991}5992 5993define { i8, i1 } @cmpxchg_i8(ptr %ptr, i8 %desired, i8 %new) {5994; CHECK-NOLSE-O1-LABEL: cmpxchg_i8:5995; CHECK-NOLSE-O1: ; %bb.0:5996; CHECK-NOLSE-O1-NEXT: mov x8, x05997; CHECK-NOLSE-O1-NEXT: LBB67_1: ; %cmpxchg.start5998; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=15999; CHECK-NOLSE-O1-NEXT: ldxrb w0, [x8]6000; CHECK-NOLSE-O1-NEXT: and w9, w0, #0xff6001; CHECK-NOLSE-O1-NEXT: cmp w9, w1, uxtb6002; CHECK-NOLSE-O1-NEXT: b.ne LBB67_46003; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore6004; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB67_1 Depth=16005; CHECK-NOLSE-O1-NEXT: stxrb w10, w2, [x8]6006; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x16007; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB67_16008; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end6009; CHECK-NOLSE-O1-NEXT: mov w1, w96010; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x06011; CHECK-NOLSE-O1-NEXT: ret6012; CHECK-NOLSE-O1-NEXT: LBB67_4: ; %cmpxchg.nostore6013; CHECK-NOLSE-O1-NEXT: mov w9, wzr6014; CHECK-NOLSE-O1-NEXT: clrex6015; CHECK-NOLSE-O1-NEXT: mov w1, w96016; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x06017; CHECK-NOLSE-O1-NEXT: ret6018;6019; CHECK-OUTLINE-O1-LABEL: cmpxchg_i8:6020; CHECK-OUTLINE-O1: ; %bb.0:6021; CHECK-OUTLINE-O1-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill6022; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6023; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 326024; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -86025; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -166026; CHECK-OUTLINE-O1-NEXT: .cfi_offset w19, -246027; CHECK-OUTLINE-O1-NEXT: .cfi_offset w20, -326028; CHECK-OUTLINE-O1-NEXT: mov x3, x06029; CHECK-OUTLINE-O1-NEXT: mov w19, w16030; CHECK-OUTLINE-O1-NEXT: mov w1, w26031; CHECK-OUTLINE-O1-NEXT: mov w0, w196032; CHECK-OUTLINE-O1-NEXT: mov x2, x36033; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas1_relax6034; CHECK-OUTLINE-O1-NEXT: and w8, w0, #0xff6035; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6036; CHECK-OUTLINE-O1-NEXT: cmp w8, w19, uxtb6037; CHECK-OUTLINE-O1-NEXT: cset w1, eq6038; CHECK-OUTLINE-O1-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload6039; CHECK-OUTLINE-O1-NEXT: ret6040;6041; CHECK-NOLSE-O0-LABEL: cmpxchg_i8:6042; CHECK-NOLSE-O0: ; %bb.0:6043; CHECK-NOLSE-O0-NEXT: mov x9, x06044; CHECK-NOLSE-O0-NEXT: LBB67_1: ; =>This Inner Loop Header: Depth=16045; CHECK-NOLSE-O0-NEXT: ldaxrb w0, [x9]6046; CHECK-NOLSE-O0-NEXT: cmp w0, w1, uxtb6047; CHECK-NOLSE-O0-NEXT: b.ne LBB67_36048; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB67_1 Depth=16049; CHECK-NOLSE-O0-NEXT: stlxrb w8, w2, [x9]6050; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB67_16051; CHECK-NOLSE-O0-NEXT: LBB67_3:6052; CHECK-NOLSE-O0-NEXT: and w8, w0, #0xff6053; CHECK-NOLSE-O0-NEXT: subs w8, w8, w1, uxtb6054; CHECK-NOLSE-O0-NEXT: cset w1, eq6055; CHECK-NOLSE-O0-NEXT: ret6056;6057; CHECK-OUTLINE-O0-LABEL: cmpxchg_i8:6058; CHECK-OUTLINE-O0: ; %bb.0:6059; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #326060; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6061; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 326062; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -86063; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -166064; CHECK-OUTLINE-O0-NEXT: str x0, [sp] ; 8-byte Spill6065; CHECK-OUTLINE-O0-NEXT: mov w0, w16066; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill6067; CHECK-OUTLINE-O0-NEXT: mov w1, w26068; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp] ; 8-byte Reload6069; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas1_relax6070; CHECK-OUTLINE-O0-NEXT: ldr w1, [sp, #12] ; 4-byte Reload6071; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0xff6072; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w1, uxtb6073; CHECK-OUTLINE-O0-NEXT: cset w1, eq6074; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6075; CHECK-OUTLINE-O0-NEXT: add sp, sp, #326076; CHECK-OUTLINE-O0-NEXT: ret6077;6078; CHECK-LSE-O1-LABEL: cmpxchg_i8:6079; CHECK-LSE-O1: ; %bb.0:6080; CHECK-LSE-O1-NEXT: mov x8, x16081; CHECK-LSE-O1-NEXT: casb w8, w2, [x0]6082; CHECK-LSE-O1-NEXT: and w9, w8, #0xff6083; CHECK-LSE-O1-NEXT: cmp w9, w1, uxtb6084; CHECK-LSE-O1-NEXT: cset w1, eq6085; CHECK-LSE-O1-NEXT: mov x0, x86086; CHECK-LSE-O1-NEXT: ret6087;6088; CHECK-LSE-O0-LABEL: cmpxchg_i8:6089; CHECK-LSE-O0: ; %bb.0:6090; CHECK-LSE-O0-NEXT: mov x8, x06091; CHECK-LSE-O0-NEXT: mov x0, x16092; CHECK-LSE-O0-NEXT: casb w0, w2, [x8]6093; CHECK-LSE-O0-NEXT: and w8, w0, #0xff6094; CHECK-LSE-O0-NEXT: subs w8, w8, w1, uxtb6095; CHECK-LSE-O0-NEXT: cset w1, eq6096; CHECK-LSE-O0-NEXT: ret6097 %res = cmpxchg ptr %ptr, i8 %desired, i8 %new monotonic monotonic6098 ret { i8, i1 } %res6099}6100 6101define { i16, i1 } @cmpxchg_i16(ptr %ptr, i16 %desired, i16 %new) {6102; CHECK-NOLSE-O1-LABEL: cmpxchg_i16:6103; CHECK-NOLSE-O1: ; %bb.0:6104; CHECK-NOLSE-O1-NEXT: mov x8, x06105; CHECK-NOLSE-O1-NEXT: LBB68_1: ; %cmpxchg.start6106; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=16107; CHECK-NOLSE-O1-NEXT: ldxrh w0, [x8]6108; CHECK-NOLSE-O1-NEXT: and w9, w0, #0xffff6109; CHECK-NOLSE-O1-NEXT: cmp w9, w1, uxth6110; CHECK-NOLSE-O1-NEXT: b.ne LBB68_46111; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore6112; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB68_1 Depth=16113; CHECK-NOLSE-O1-NEXT: stxrh w10, w2, [x8]6114; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x16115; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB68_16116; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end6117; CHECK-NOLSE-O1-NEXT: mov w1, w96118; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x06119; CHECK-NOLSE-O1-NEXT: ret6120; CHECK-NOLSE-O1-NEXT: LBB68_4: ; %cmpxchg.nostore6121; CHECK-NOLSE-O1-NEXT: mov w9, wzr6122; CHECK-NOLSE-O1-NEXT: clrex6123; CHECK-NOLSE-O1-NEXT: mov w1, w96124; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x06125; CHECK-NOLSE-O1-NEXT: ret6126;6127; CHECK-OUTLINE-O1-LABEL: cmpxchg_i16:6128; CHECK-OUTLINE-O1: ; %bb.0:6129; CHECK-OUTLINE-O1-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill6130; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6131; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 326132; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -86133; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -166134; CHECK-OUTLINE-O1-NEXT: .cfi_offset w19, -246135; CHECK-OUTLINE-O1-NEXT: .cfi_offset w20, -326136; CHECK-OUTLINE-O1-NEXT: mov x3, x06137; CHECK-OUTLINE-O1-NEXT: mov w19, w16138; CHECK-OUTLINE-O1-NEXT: mov w1, w26139; CHECK-OUTLINE-O1-NEXT: mov w0, w196140; CHECK-OUTLINE-O1-NEXT: mov x2, x36141; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas2_relax6142; CHECK-OUTLINE-O1-NEXT: and w8, w0, #0xffff6143; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6144; CHECK-OUTLINE-O1-NEXT: cmp w8, w19, uxth6145; CHECK-OUTLINE-O1-NEXT: cset w1, eq6146; CHECK-OUTLINE-O1-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload6147; CHECK-OUTLINE-O1-NEXT: ret6148;6149; CHECK-NOLSE-O0-LABEL: cmpxchg_i16:6150; CHECK-NOLSE-O0: ; %bb.0:6151; CHECK-NOLSE-O0-NEXT: mov x9, x06152; CHECK-NOLSE-O0-NEXT: LBB68_1: ; =>This Inner Loop Header: Depth=16153; CHECK-NOLSE-O0-NEXT: ldaxrh w0, [x9]6154; CHECK-NOLSE-O0-NEXT: cmp w0, w1, uxth6155; CHECK-NOLSE-O0-NEXT: b.ne LBB68_36156; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB68_1 Depth=16157; CHECK-NOLSE-O0-NEXT: stlxrh w8, w2, [x9]6158; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB68_16159; CHECK-NOLSE-O0-NEXT: LBB68_3:6160; CHECK-NOLSE-O0-NEXT: and w8, w0, #0xffff6161; CHECK-NOLSE-O0-NEXT: subs w8, w8, w1, uxth6162; CHECK-NOLSE-O0-NEXT: cset w1, eq6163; CHECK-NOLSE-O0-NEXT: ret6164;6165; CHECK-OUTLINE-O0-LABEL: cmpxchg_i16:6166; CHECK-OUTLINE-O0: ; %bb.0:6167; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #326168; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6169; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 326170; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -86171; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -166172; CHECK-OUTLINE-O0-NEXT: str x0, [sp] ; 8-byte Spill6173; CHECK-OUTLINE-O0-NEXT: mov w0, w16174; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill6175; CHECK-OUTLINE-O0-NEXT: mov w1, w26176; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp] ; 8-byte Reload6177; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas2_relax6178; CHECK-OUTLINE-O0-NEXT: ldr w1, [sp, #12] ; 4-byte Reload6179; CHECK-OUTLINE-O0-NEXT: and w8, w0, #0xffff6180; CHECK-OUTLINE-O0-NEXT: subs w8, w8, w1, uxth6181; CHECK-OUTLINE-O0-NEXT: cset w1, eq6182; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6183; CHECK-OUTLINE-O0-NEXT: add sp, sp, #326184; CHECK-OUTLINE-O0-NEXT: ret6185;6186; CHECK-LSE-O1-LABEL: cmpxchg_i16:6187; CHECK-LSE-O1: ; %bb.0:6188; CHECK-LSE-O1-NEXT: mov x8, x16189; CHECK-LSE-O1-NEXT: cash w8, w2, [x0]6190; CHECK-LSE-O1-NEXT: and w9, w8, #0xffff6191; CHECK-LSE-O1-NEXT: cmp w9, w1, uxth6192; CHECK-LSE-O1-NEXT: cset w1, eq6193; CHECK-LSE-O1-NEXT: mov x0, x86194; CHECK-LSE-O1-NEXT: ret6195;6196; CHECK-LSE-O0-LABEL: cmpxchg_i16:6197; CHECK-LSE-O0: ; %bb.0:6198; CHECK-LSE-O0-NEXT: mov x8, x06199; CHECK-LSE-O0-NEXT: mov x0, x16200; CHECK-LSE-O0-NEXT: cash w0, w2, [x8]6201; CHECK-LSE-O0-NEXT: and w8, w0, #0xffff6202; CHECK-LSE-O0-NEXT: subs w8, w8, w1, uxth6203; CHECK-LSE-O0-NEXT: cset w1, eq6204; CHECK-LSE-O0-NEXT: ret6205 %res = cmpxchg ptr %ptr, i16 %desired, i16 %new monotonic monotonic6206 ret { i16, i1 } %res6207}6208 6209define { i32, i1 } @cmpxchg_i32(ptr %ptr, i32 %desired, i32 %new) {6210; CHECK-NOLSE-O1-LABEL: cmpxchg_i32:6211; CHECK-NOLSE-O1: ; %bb.0:6212; CHECK-NOLSE-O1-NEXT: mov x8, x06213; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x16214; CHECK-NOLSE-O1-NEXT: LBB69_1: ; %cmpxchg.start6215; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=16216; CHECK-NOLSE-O1-NEXT: ldxr w0, [x8]6217; CHECK-NOLSE-O1-NEXT: cmp w0, w16218; CHECK-NOLSE-O1-NEXT: b.ne LBB69_46219; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore6220; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB69_1 Depth=16221; CHECK-NOLSE-O1-NEXT: stxr w10, w2, [x8]6222; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB69_16223; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end6224; CHECK-NOLSE-O1-NEXT: mov w1, w96225; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x06226; CHECK-NOLSE-O1-NEXT: ret6227; CHECK-NOLSE-O1-NEXT: LBB69_4: ; %cmpxchg.nostore6228; CHECK-NOLSE-O1-NEXT: mov w9, wzr6229; CHECK-NOLSE-O1-NEXT: clrex6230; CHECK-NOLSE-O1-NEXT: mov w1, w96231; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x06232; CHECK-NOLSE-O1-NEXT: ret6233;6234; CHECK-OUTLINE-O1-LABEL: cmpxchg_i32:6235; CHECK-OUTLINE-O1: ; %bb.0:6236; CHECK-OUTLINE-O1-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill6237; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6238; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 326239; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -86240; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -166241; CHECK-OUTLINE-O1-NEXT: .cfi_offset w19, -246242; CHECK-OUTLINE-O1-NEXT: .cfi_offset w20, -326243; CHECK-OUTLINE-O1-NEXT: mov x3, x06244; CHECK-OUTLINE-O1-NEXT: mov w19, w16245; CHECK-OUTLINE-O1-NEXT: mov w1, w26246; CHECK-OUTLINE-O1-NEXT: mov w0, w196247; CHECK-OUTLINE-O1-NEXT: mov x2, x36248; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas4_relax6249; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6250; CHECK-OUTLINE-O1-NEXT: cmp w0, w196251; CHECK-OUTLINE-O1-NEXT: cset w1, eq6252; CHECK-OUTLINE-O1-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload6253; CHECK-OUTLINE-O1-NEXT: ret6254;6255; CHECK-NOLSE-O0-LABEL: cmpxchg_i32:6256; CHECK-NOLSE-O0: ; %bb.0:6257; CHECK-NOLSE-O0-NEXT: mov x9, x06258; CHECK-NOLSE-O0-NEXT: LBB69_1: ; =>This Inner Loop Header: Depth=16259; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9]6260; CHECK-NOLSE-O0-NEXT: cmp w0, w16261; CHECK-NOLSE-O0-NEXT: b.ne LBB69_36262; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB69_1 Depth=16263; CHECK-NOLSE-O0-NEXT: stlxr w8, w2, [x9]6264; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB69_16265; CHECK-NOLSE-O0-NEXT: LBB69_3:6266; CHECK-NOLSE-O0-NEXT: subs w8, w0, w16267; CHECK-NOLSE-O0-NEXT: cset w1, eq6268; CHECK-NOLSE-O0-NEXT: ret6269;6270; CHECK-OUTLINE-O0-LABEL: cmpxchg_i32:6271; CHECK-OUTLINE-O0: ; %bb.0:6272; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #326273; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6274; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 326275; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -86276; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -166277; CHECK-OUTLINE-O0-NEXT: str x0, [sp] ; 8-byte Spill6278; CHECK-OUTLINE-O0-NEXT: mov w0, w16279; CHECK-OUTLINE-O0-NEXT: str w0, [sp, #12] ; 4-byte Spill6280; CHECK-OUTLINE-O0-NEXT: mov w1, w26281; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp] ; 8-byte Reload6282; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas4_relax6283; CHECK-OUTLINE-O0-NEXT: ldr w1, [sp, #12] ; 4-byte Reload6284; CHECK-OUTLINE-O0-NEXT: subs w8, w0, w16285; CHECK-OUTLINE-O0-NEXT: cset w1, eq6286; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6287; CHECK-OUTLINE-O0-NEXT: add sp, sp, #326288; CHECK-OUTLINE-O0-NEXT: ret6289;6290; CHECK-LSE-O1-LABEL: cmpxchg_i32:6291; CHECK-LSE-O1: ; %bb.0:6292; CHECK-LSE-O1-NEXT: mov x8, x16293; CHECK-LSE-O1-NEXT: cas w8, w2, [x0]6294; CHECK-LSE-O1-NEXT: cmp w8, w16295; CHECK-LSE-O1-NEXT: cset w1, eq6296; CHECK-LSE-O1-NEXT: mov x0, x86297; CHECK-LSE-O1-NEXT: ret6298;6299; CHECK-LSE-O0-LABEL: cmpxchg_i32:6300; CHECK-LSE-O0: ; %bb.0:6301; CHECK-LSE-O0-NEXT: mov x8, x06302; CHECK-LSE-O0-NEXT: mov x0, x16303; CHECK-LSE-O0-NEXT: cas w0, w2, [x8]6304; CHECK-LSE-O0-NEXT: subs w8, w0, w16305; CHECK-LSE-O0-NEXT: cset w1, eq6306; CHECK-LSE-O0-NEXT: ret6307 %res = cmpxchg ptr %ptr, i32 %desired, i32 %new monotonic monotonic6308 ret { i32, i1 } %res6309}6310 6311define { i64, i1 } @cmpxchg_i64(ptr %ptr, i64 %desired, i64 %new) {6312; CHECK-NOLSE-O1-LABEL: cmpxchg_i64:6313; CHECK-NOLSE-O1: ; %bb.0:6314; CHECK-NOLSE-O1-NEXT: mov x8, x06315; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x16316; CHECK-NOLSE-O1-NEXT: LBB70_1: ; %cmpxchg.start6317; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=16318; CHECK-NOLSE-O1-NEXT: ldxr x0, [x8]6319; CHECK-NOLSE-O1-NEXT: cmp x0, x16320; CHECK-NOLSE-O1-NEXT: b.ne LBB70_46321; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore6322; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB70_1 Depth=16323; CHECK-NOLSE-O1-NEXT: stxr w10, x2, [x8]6324; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB70_16325; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end6326; CHECK-NOLSE-O1-NEXT: mov w1, w96327; CHECK-NOLSE-O1-NEXT: ret6328; CHECK-NOLSE-O1-NEXT: LBB70_4: ; %cmpxchg.nostore6329; CHECK-NOLSE-O1-NEXT: mov w9, wzr6330; CHECK-NOLSE-O1-NEXT: clrex6331; CHECK-NOLSE-O1-NEXT: mov w1, w96332; CHECK-NOLSE-O1-NEXT: ret6333;6334; CHECK-OUTLINE-O1-LABEL: cmpxchg_i64:6335; CHECK-OUTLINE-O1: ; %bb.0:6336; CHECK-OUTLINE-O1-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill6337; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6338; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 326339; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -86340; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -166341; CHECK-OUTLINE-O1-NEXT: .cfi_offset w19, -246342; CHECK-OUTLINE-O1-NEXT: .cfi_offset w20, -326343; CHECK-OUTLINE-O1-NEXT: mov x3, x06344; CHECK-OUTLINE-O1-NEXT: mov x19, x16345; CHECK-OUTLINE-O1-NEXT: mov x1, x26346; CHECK-OUTLINE-O1-NEXT: mov x0, x196347; CHECK-OUTLINE-O1-NEXT: mov x2, x36348; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas8_relax6349; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6350; CHECK-OUTLINE-O1-NEXT: cmp x0, x196351; CHECK-OUTLINE-O1-NEXT: cset w1, eq6352; CHECK-OUTLINE-O1-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload6353; CHECK-OUTLINE-O1-NEXT: ret6354;6355; CHECK-NOLSE-O0-LABEL: cmpxchg_i64:6356; CHECK-NOLSE-O0: ; %bb.0:6357; CHECK-NOLSE-O0-NEXT: mov x9, x06358; CHECK-NOLSE-O0-NEXT: LBB70_1: ; =>This Inner Loop Header: Depth=16359; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9]6360; CHECK-NOLSE-O0-NEXT: cmp x0, x16361; CHECK-NOLSE-O0-NEXT: b.ne LBB70_36362; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB70_1 Depth=16363; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9]6364; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB70_16365; CHECK-NOLSE-O0-NEXT: LBB70_3:6366; CHECK-NOLSE-O0-NEXT: subs x8, x0, x16367; CHECK-NOLSE-O0-NEXT: cset w1, eq6368; CHECK-NOLSE-O0-NEXT: ret6369;6370; CHECK-OUTLINE-O0-LABEL: cmpxchg_i64:6371; CHECK-OUTLINE-O0: ; %bb.0:6372; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #326373; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6374; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 326375; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -86376; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -166377; CHECK-OUTLINE-O0-NEXT: str x0, [sp] ; 8-byte Spill6378; CHECK-OUTLINE-O0-NEXT: mov x0, x16379; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill6380; CHECK-OUTLINE-O0-NEXT: mov x1, x26381; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp] ; 8-byte Reload6382; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_relax6383; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload6384; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x16385; CHECK-OUTLINE-O0-NEXT: cset w1, eq6386; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6387; CHECK-OUTLINE-O0-NEXT: add sp, sp, #326388; CHECK-OUTLINE-O0-NEXT: ret6389;6390; CHECK-LSE-O1-LABEL: cmpxchg_i64:6391; CHECK-LSE-O1: ; %bb.0:6392; CHECK-LSE-O1-NEXT: mov x8, x16393; CHECK-LSE-O1-NEXT: cas x8, x2, [x0]6394; CHECK-LSE-O1-NEXT: cmp x8, x16395; CHECK-LSE-O1-NEXT: cset w1, eq6396; CHECK-LSE-O1-NEXT: mov x0, x86397; CHECK-LSE-O1-NEXT: ret6398;6399; CHECK-LSE-O0-LABEL: cmpxchg_i64:6400; CHECK-LSE-O0: ; %bb.0:6401; CHECK-LSE-O0-NEXT: mov x8, x06402; CHECK-LSE-O0-NEXT: mov x0, x16403; CHECK-LSE-O0-NEXT: cas x0, x2, [x8]6404; CHECK-LSE-O0-NEXT: subs x8, x0, x16405; CHECK-LSE-O0-NEXT: cset w1, eq6406; CHECK-LSE-O0-NEXT: ret6407 %res = cmpxchg ptr %ptr, i64 %desired, i64 %new monotonic monotonic6408 ret { i64, i1 } %res6409}6410 6411define { ptr, i1 } @cmpxchg_ptr(ptr %ptr, ptr %desired, ptr %new) {6412; CHECK-NOLSE-O1-LABEL: cmpxchg_ptr:6413; CHECK-NOLSE-O1: ; %bb.0:6414; CHECK-NOLSE-O1-NEXT: mov x8, x06415; CHECK-NOLSE-O1-NEXT: mov w9, #1 ; =0x16416; CHECK-NOLSE-O1-NEXT: LBB71_1: ; %cmpxchg.start6417; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=16418; CHECK-NOLSE-O1-NEXT: ldxr x0, [x8]6419; CHECK-NOLSE-O1-NEXT: cmp x0, x16420; CHECK-NOLSE-O1-NEXT: b.ne LBB71_46421; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore6422; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB71_1 Depth=16423; CHECK-NOLSE-O1-NEXT: stxr w10, x2, [x8]6424; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB71_16425; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end6426; CHECK-NOLSE-O1-NEXT: mov w1, w96427; CHECK-NOLSE-O1-NEXT: ret6428; CHECK-NOLSE-O1-NEXT: LBB71_4: ; %cmpxchg.nostore6429; CHECK-NOLSE-O1-NEXT: mov w9, wzr6430; CHECK-NOLSE-O1-NEXT: clrex6431; CHECK-NOLSE-O1-NEXT: mov w1, w96432; CHECK-NOLSE-O1-NEXT: ret6433;6434; CHECK-OUTLINE-O1-LABEL: cmpxchg_ptr:6435; CHECK-OUTLINE-O1: ; %bb.0:6436; CHECK-OUTLINE-O1-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill6437; CHECK-OUTLINE-O1-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6438; CHECK-OUTLINE-O1-NEXT: .cfi_def_cfa_offset 326439; CHECK-OUTLINE-O1-NEXT: .cfi_offset w30, -86440; CHECK-OUTLINE-O1-NEXT: .cfi_offset w29, -166441; CHECK-OUTLINE-O1-NEXT: .cfi_offset w19, -246442; CHECK-OUTLINE-O1-NEXT: .cfi_offset w20, -326443; CHECK-OUTLINE-O1-NEXT: mov x3, x06444; CHECK-OUTLINE-O1-NEXT: mov x19, x16445; CHECK-OUTLINE-O1-NEXT: mov x1, x26446; CHECK-OUTLINE-O1-NEXT: mov x0, x196447; CHECK-OUTLINE-O1-NEXT: mov x2, x36448; CHECK-OUTLINE-O1-NEXT: bl ___aarch64_cas8_relax6449; CHECK-OUTLINE-O1-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6450; CHECK-OUTLINE-O1-NEXT: cmp x0, x196451; CHECK-OUTLINE-O1-NEXT: cset w1, eq6452; CHECK-OUTLINE-O1-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload6453; CHECK-OUTLINE-O1-NEXT: ret6454;6455; CHECK-NOLSE-O0-LABEL: cmpxchg_ptr:6456; CHECK-NOLSE-O0: ; %bb.0:6457; CHECK-NOLSE-O0-NEXT: mov x9, x06458; CHECK-NOLSE-O0-NEXT: LBB71_1: ; =>This Inner Loop Header: Depth=16459; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9]6460; CHECK-NOLSE-O0-NEXT: cmp x0, x16461; CHECK-NOLSE-O0-NEXT: b.ne LBB71_36462; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB71_1 Depth=16463; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9]6464; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB71_16465; CHECK-NOLSE-O0-NEXT: LBB71_3:6466; CHECK-NOLSE-O0-NEXT: subs x8, x0, x16467; CHECK-NOLSE-O0-NEXT: cset w1, eq6468; CHECK-NOLSE-O0-NEXT: ret6469;6470; CHECK-OUTLINE-O0-LABEL: cmpxchg_ptr:6471; CHECK-OUTLINE-O0: ; %bb.0:6472; CHECK-OUTLINE-O0-NEXT: sub sp, sp, #326473; CHECK-OUTLINE-O0-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill6474; CHECK-OUTLINE-O0-NEXT: .cfi_def_cfa_offset 326475; CHECK-OUTLINE-O0-NEXT: .cfi_offset w30, -86476; CHECK-OUTLINE-O0-NEXT: .cfi_offset w29, -166477; CHECK-OUTLINE-O0-NEXT: str x0, [sp] ; 8-byte Spill6478; CHECK-OUTLINE-O0-NEXT: mov x0, x16479; CHECK-OUTLINE-O0-NEXT: str x0, [sp, #8] ; 8-byte Spill6480; CHECK-OUTLINE-O0-NEXT: mov x1, x26481; CHECK-OUTLINE-O0-NEXT: ldr x2, [sp] ; 8-byte Reload6482; CHECK-OUTLINE-O0-NEXT: bl ___aarch64_cas8_relax6483; CHECK-OUTLINE-O0-NEXT: ldr x1, [sp, #8] ; 8-byte Reload6484; CHECK-OUTLINE-O0-NEXT: subs x8, x0, x16485; CHECK-OUTLINE-O0-NEXT: cset w1, eq6486; CHECK-OUTLINE-O0-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload6487; CHECK-OUTLINE-O0-NEXT: add sp, sp, #326488; CHECK-OUTLINE-O0-NEXT: ret6489;6490; CHECK-LSE-O1-LABEL: cmpxchg_ptr:6491; CHECK-LSE-O1: ; %bb.0:6492; CHECK-LSE-O1-NEXT: mov x8, x16493; CHECK-LSE-O1-NEXT: cas x8, x2, [x0]6494; CHECK-LSE-O1-NEXT: cmp x8, x16495; CHECK-LSE-O1-NEXT: cset w1, eq6496; CHECK-LSE-O1-NEXT: mov x0, x86497; CHECK-LSE-O1-NEXT: ret6498;6499; CHECK-LSE-O0-LABEL: cmpxchg_ptr:6500; CHECK-LSE-O0: ; %bb.0:6501; CHECK-LSE-O0-NEXT: mov x8, x06502; CHECK-LSE-O0-NEXT: mov x0, x16503; CHECK-LSE-O0-NEXT: cas x0, x2, [x8]6504; CHECK-LSE-O0-NEXT: subs x8, x0, x16505; CHECK-LSE-O0-NEXT: cset w1, eq6506; CHECK-LSE-O0-NEXT: ret6507 %res = cmpxchg ptr %ptr, ptr %desired, ptr %new monotonic monotonic6508 ret { ptr, i1 } %res6509}6510 6511define internal double @bitcast_to_double(ptr %ptr) {6512; CHECK-NOLSE-LABEL: bitcast_to_double:6513; CHECK-NOLSE: ; %bb.0:6514; CHECK-NOLSE-NEXT: ldar x8, [x0]6515; CHECK-NOLSE-NEXT: fmov d0, x86516; CHECK-NOLSE-NEXT: ret6517;6518; CHECK-OUTLINE-LABEL: bitcast_to_double:6519; CHECK-OUTLINE: ; %bb.0:6520; CHECK-OUTLINE-NEXT: ldar x8, [x0]6521; CHECK-OUTLINE-NEXT: fmov d0, x86522; CHECK-OUTLINE-NEXT: ret6523;6524; CHECK-LSE-O1-LABEL: bitcast_to_double:6525; CHECK-LSE-O1: ; %bb.0:6526; CHECK-LSE-O1-NEXT: ldar x8, [x0]6527; CHECK-LSE-O1-NEXT: fmov d0, x86528; CHECK-LSE-O1-NEXT: ret6529;6530; CHECK-LSE-O0-LABEL: bitcast_to_double:6531; CHECK-LSE-O0: ; %bb.0:6532; CHECK-LSE-O0-NEXT: ldar x8, [x0]6533; CHECK-LSE-O0-NEXT: fmov d0, x86534; CHECK-LSE-O0-NEXT: ret6535 %load = load atomic i64, ptr %ptr seq_cst, align 86536 %bitcast = bitcast i64 %load to double6537 ret double %bitcast6538}6539 6540define internal float @bitcast_to_float(ptr %ptr) {6541; CHECK-NOLSE-LABEL: bitcast_to_float:6542; CHECK-NOLSE: ; %bb.0:6543; CHECK-NOLSE-NEXT: ldar w8, [x0]6544; CHECK-NOLSE-NEXT: fmov s0, w86545; CHECK-NOLSE-NEXT: ret6546;6547; CHECK-OUTLINE-LABEL: bitcast_to_float:6548; CHECK-OUTLINE: ; %bb.0:6549; CHECK-OUTLINE-NEXT: ldar w8, [x0]6550; CHECK-OUTLINE-NEXT: fmov s0, w86551; CHECK-OUTLINE-NEXT: ret6552;6553; CHECK-LSE-O1-LABEL: bitcast_to_float:6554; CHECK-LSE-O1: ; %bb.0:6555; CHECK-LSE-O1-NEXT: ldar w8, [x0]6556; CHECK-LSE-O1-NEXT: fmov s0, w86557; CHECK-LSE-O1-NEXT: ret6558;6559; CHECK-LSE-O0-LABEL: bitcast_to_float:6560; CHECK-LSE-O0: ; %bb.0:6561; CHECK-LSE-O0-NEXT: ldar w8, [x0]6562; CHECK-LSE-O0-NEXT: fmov s0, w86563; CHECK-LSE-O0-NEXT: ret6564 %load = load atomic i32, ptr %ptr seq_cst, align 86565 %bitcast = bitcast i32 %load to float6566 ret float %bitcast6567}6568 6569define internal half @bitcast_to_half(ptr %ptr) {6570; CHECK-NOLSE-LABEL: bitcast_to_half:6571; CHECK-NOLSE: ; %bb.0:6572; CHECK-NOLSE-NEXT: ldarh w8, [x0]6573; CHECK-NOLSE-NEXT: fmov s0, w86574; CHECK-NOLSE-NEXT: ; kill: def $h0 killed $h0 killed $s06575; CHECK-NOLSE-NEXT: ret6576;6577; CHECK-OUTLINE-LABEL: bitcast_to_half:6578; CHECK-OUTLINE: ; %bb.0:6579; CHECK-OUTLINE-NEXT: ldarh w8, [x0]6580; CHECK-OUTLINE-NEXT: fmov s0, w86581; CHECK-OUTLINE-NEXT: ; kill: def $h0 killed $h0 killed $s06582; CHECK-OUTLINE-NEXT: ret6583;6584; CHECK-LSE-O1-LABEL: bitcast_to_half:6585; CHECK-LSE-O1: ; %bb.0:6586; CHECK-LSE-O1-NEXT: ldarh w8, [x0]6587; CHECK-LSE-O1-NEXT: fmov s0, w86588; CHECK-LSE-O1-NEXT: ; kill: def $h0 killed $h0 killed $s06589; CHECK-LSE-O1-NEXT: ret6590;6591; CHECK-LSE-O0-LABEL: bitcast_to_half:6592; CHECK-LSE-O0: ; %bb.0:6593; CHECK-LSE-O0-NEXT: ldarh w8, [x0]6594; CHECK-LSE-O0-NEXT: fmov s0, w86595; CHECK-LSE-O0-NEXT: ; kill: def $h0 killed $h0 killed $s06596; CHECK-LSE-O0-NEXT: ret6597 %load = load atomic i16, ptr %ptr seq_cst, align 86598 %bitcast = bitcast i16 %load to half6599 ret half %bitcast6600}6601 6602define internal ptr @inttoptr(ptr %ptr) {6603; CHECK-NOLSE-LABEL: inttoptr:6604; CHECK-NOLSE: ; %bb.0:6605; CHECK-NOLSE-NEXT: ldar x0, [x0]6606; CHECK-NOLSE-NEXT: ret6607;6608; CHECK-OUTLINE-LABEL: inttoptr:6609; CHECK-OUTLINE: ; %bb.0:6610; CHECK-OUTLINE-NEXT: ldar x0, [x0]6611; CHECK-OUTLINE-NEXT: ret6612;6613; CHECK-LSE-O1-LABEL: inttoptr:6614; CHECK-LSE-O1: ; %bb.0:6615; CHECK-LSE-O1-NEXT: ldar x0, [x0]6616; CHECK-LSE-O1-NEXT: ret6617;6618; CHECK-LSE-O0-LABEL: inttoptr:6619; CHECK-LSE-O0: ; %bb.0:6620; CHECK-LSE-O0-NEXT: ldar x0, [x0]6621; CHECK-LSE-O0-NEXT: ret6622 %load = load atomic i64, ptr %ptr seq_cst, align 86623 %bitcast = inttoptr i64 %load to ptr6624 ret ptr %bitcast6625}6626 6627define internal ptr @load_ptr(ptr %ptr) {6628; CHECK-NOLSE-LABEL: load_ptr:6629; CHECK-NOLSE: ; %bb.0:6630; CHECK-NOLSE-NEXT: ldar x0, [x0]6631; CHECK-NOLSE-NEXT: ret6632;6633; CHECK-OUTLINE-LABEL: load_ptr:6634; CHECK-OUTLINE: ; %bb.0:6635; CHECK-OUTLINE-NEXT: ldar x0, [x0]6636; CHECK-OUTLINE-NEXT: ret6637;6638; CHECK-LSE-O1-LABEL: load_ptr:6639; CHECK-LSE-O1: ; %bb.0:6640; CHECK-LSE-O1-NEXT: ldar x0, [x0]6641; CHECK-LSE-O1-NEXT: ret6642;6643; CHECK-LSE-O0-LABEL: load_ptr:6644; CHECK-LSE-O0: ; %bb.0:6645; CHECK-LSE-O0-NEXT: ldar x0, [x0]6646; CHECK-LSE-O0-NEXT: ret6647 %load = load atomic ptr, ptr %ptr seq_cst, align 86648 ret ptr %load6649}6650 6651attributes #0 = { nounwind }6652