933 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mcpu=cyclone | FileCheck %s -check-prefixes=NOOUTLINE3; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mcpu=cyclone -mattr=+outline-atomics | FileCheck %s -check-prefixes=OUTLINE4; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mcpu=cyclone -mattr=+lse | FileCheck %s -check-prefixes=LSE5 6@var = global i128 07 8define i128 @val_compare_and_swap(ptr %p, i128 %oldval, i128 %newval) {9; NOOUTLINE-LABEL: val_compare_and_swap:10; NOOUTLINE: // %bb.0:11; NOOUTLINE-NEXT: .LBB0_1: // =>This Inner Loop Header: Depth=112; NOOUTLINE-NEXT: ldaxp x8, x1, [x0]13; NOOUTLINE-NEXT: cmp x8, x214; NOOUTLINE-NEXT: cset w9, ne15; NOOUTLINE-NEXT: cmp x1, x316; NOOUTLINE-NEXT: cinc w9, w9, ne17; NOOUTLINE-NEXT: cbz w9, .LBB0_318; NOOUTLINE-NEXT: // %bb.2: // in Loop: Header=BB0_1 Depth=119; NOOUTLINE-NEXT: stxp w9, x8, x1, [x0]20; NOOUTLINE-NEXT: cbnz w9, .LBB0_121; NOOUTLINE-NEXT: b .LBB0_422; NOOUTLINE-NEXT: .LBB0_3: // in Loop: Header=BB0_1 Depth=123; NOOUTLINE-NEXT: stxp w9, x4, x5, [x0]24; NOOUTLINE-NEXT: cbnz w9, .LBB0_125; NOOUTLINE-NEXT: .LBB0_4:26; NOOUTLINE-NEXT: mov x0, x827; NOOUTLINE-NEXT: ret28;29; OUTLINE-LABEL: val_compare_and_swap:30; OUTLINE: // %bb.0:31; OUTLINE-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill32; OUTLINE-NEXT: .cfi_def_cfa_offset 1633; OUTLINE-NEXT: .cfi_offset w30, -1634; OUTLINE-NEXT: mov x1, x335; OUTLINE-NEXT: mov x8, x036; OUTLINE-NEXT: mov x0, x237; OUTLINE-NEXT: mov x2, x438; OUTLINE-NEXT: mov x3, x539; OUTLINE-NEXT: mov x4, x840; OUTLINE-NEXT: bl __aarch64_cas16_acq41; OUTLINE-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload42; OUTLINE-NEXT: ret43;44; LSE-LABEL: val_compare_and_swap:45; LSE: // %bb.0:46; LSE-NEXT: // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x547; LSE-NEXT: // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x348; LSE-NEXT: // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x549; LSE-NEXT: // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x350; LSE-NEXT: caspa x2, x3, x4, x5, [x0]51; LSE-NEXT: mov x0, x252; LSE-NEXT: mov x1, x353; LSE-NEXT: ret54 %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval acquire acquire55 %val = extractvalue { i128, i1 } %pair, 056 ret i128 %val57}58 59define i128 @val_compare_and_swap_seqcst(ptr %p, i128 %oldval, i128 %newval) {60; NOOUTLINE-LABEL: val_compare_and_swap_seqcst:61; NOOUTLINE: // %bb.0:62; NOOUTLINE-NEXT: .LBB1_1: // =>This Inner Loop Header: Depth=163; NOOUTLINE-NEXT: ldaxp x8, x1, [x0]64; NOOUTLINE-NEXT: cmp x8, x265; NOOUTLINE-NEXT: cset w9, ne66; NOOUTLINE-NEXT: cmp x1, x367; NOOUTLINE-NEXT: cinc w9, w9, ne68; NOOUTLINE-NEXT: cbz w9, .LBB1_369; NOOUTLINE-NEXT: // %bb.2: // in Loop: Header=BB1_1 Depth=170; NOOUTLINE-NEXT: stlxp w9, x8, x1, [x0]71; NOOUTLINE-NEXT: cbnz w9, .LBB1_172; NOOUTLINE-NEXT: b .LBB1_473; NOOUTLINE-NEXT: .LBB1_3: // in Loop: Header=BB1_1 Depth=174; NOOUTLINE-NEXT: stlxp w9, x4, x5, [x0]75; NOOUTLINE-NEXT: cbnz w9, .LBB1_176; NOOUTLINE-NEXT: .LBB1_4:77; NOOUTLINE-NEXT: mov x0, x878; NOOUTLINE-NEXT: ret79;80; OUTLINE-LABEL: val_compare_and_swap_seqcst:81; OUTLINE: // %bb.0:82; OUTLINE-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill83; OUTLINE-NEXT: .cfi_def_cfa_offset 1684; OUTLINE-NEXT: .cfi_offset w30, -1685; OUTLINE-NEXT: mov x1, x386; OUTLINE-NEXT: mov x8, x087; OUTLINE-NEXT: mov x0, x288; OUTLINE-NEXT: mov x2, x489; OUTLINE-NEXT: mov x3, x590; OUTLINE-NEXT: mov x4, x891; OUTLINE-NEXT: bl __aarch64_cas16_acq_rel92; OUTLINE-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload93; OUTLINE-NEXT: ret94;95; LSE-LABEL: val_compare_and_swap_seqcst:96; LSE: // %bb.0:97; LSE-NEXT: // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x598; LSE-NEXT: // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x399; LSE-NEXT: // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5100; LSE-NEXT: // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3101; LSE-NEXT: caspal x2, x3, x4, x5, [x0]102; LSE-NEXT: mov x0, x2103; LSE-NEXT: mov x1, x3104; LSE-NEXT: ret105 %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval seq_cst seq_cst106 %val = extractvalue { i128, i1 } %pair, 0107 ret i128 %val108}109 110define i128 @val_compare_and_swap_release(ptr %p, i128 %oldval, i128 %newval) {111; NOOUTLINE-LABEL: val_compare_and_swap_release:112; NOOUTLINE: // %bb.0:113; NOOUTLINE-NEXT: .LBB2_1: // =>This Inner Loop Header: Depth=1114; NOOUTLINE-NEXT: ldxp x8, x1, [x0]115; NOOUTLINE-NEXT: cmp x8, x2116; NOOUTLINE-NEXT: cset w9, ne117; NOOUTLINE-NEXT: cmp x1, x3118; NOOUTLINE-NEXT: cinc w9, w9, ne119; NOOUTLINE-NEXT: cbz w9, .LBB2_3120; NOOUTLINE-NEXT: // %bb.2: // in Loop: Header=BB2_1 Depth=1121; NOOUTLINE-NEXT: stlxp w9, x8, x1, [x0]122; NOOUTLINE-NEXT: cbnz w9, .LBB2_1123; NOOUTLINE-NEXT: b .LBB2_4124; NOOUTLINE-NEXT: .LBB2_3: // in Loop: Header=BB2_1 Depth=1125; NOOUTLINE-NEXT: stlxp w9, x4, x5, [x0]126; NOOUTLINE-NEXT: cbnz w9, .LBB2_1127; NOOUTLINE-NEXT: .LBB2_4:128; NOOUTLINE-NEXT: mov x0, x8129; NOOUTLINE-NEXT: ret130;131; OUTLINE-LABEL: val_compare_and_swap_release:132; OUTLINE: // %bb.0:133; OUTLINE-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill134; OUTLINE-NEXT: .cfi_def_cfa_offset 16135; OUTLINE-NEXT: .cfi_offset w30, -16136; OUTLINE-NEXT: mov x1, x3137; OUTLINE-NEXT: mov x8, x0138; OUTLINE-NEXT: mov x0, x2139; OUTLINE-NEXT: mov x2, x4140; OUTLINE-NEXT: mov x3, x5141; OUTLINE-NEXT: mov x4, x8142; OUTLINE-NEXT: bl __aarch64_cas16_rel143; OUTLINE-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload144; OUTLINE-NEXT: ret145;146; LSE-LABEL: val_compare_and_swap_release:147; LSE: // %bb.0:148; LSE-NEXT: // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5149; LSE-NEXT: // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3150; LSE-NEXT: // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5151; LSE-NEXT: // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3152; LSE-NEXT: caspl x2, x3, x4, x5, [x0]153; LSE-NEXT: mov x0, x2154; LSE-NEXT: mov x1, x3155; LSE-NEXT: ret156 %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval release monotonic157 %val = extractvalue { i128, i1 } %pair, 0158 ret i128 %val159}160 161define i128 @val_compare_and_swap_monotonic(ptr %p, i128 %oldval, i128 %newval) {162; NOOUTLINE-LABEL: val_compare_and_swap_monotonic:163; NOOUTLINE: // %bb.0:164; NOOUTLINE-NEXT: .LBB3_1: // =>This Inner Loop Header: Depth=1165; NOOUTLINE-NEXT: ldxp x8, x1, [x0]166; NOOUTLINE-NEXT: cmp x8, x2167; NOOUTLINE-NEXT: cset w9, ne168; NOOUTLINE-NEXT: cmp x1, x3169; NOOUTLINE-NEXT: cinc w9, w9, ne170; NOOUTLINE-NEXT: cbz w9, .LBB3_3171; NOOUTLINE-NEXT: // %bb.2: // in Loop: Header=BB3_1 Depth=1172; NOOUTLINE-NEXT: stxp w9, x8, x1, [x0]173; NOOUTLINE-NEXT: cbnz w9, .LBB3_1174; NOOUTLINE-NEXT: b .LBB3_4175; NOOUTLINE-NEXT: .LBB3_3: // in Loop: Header=BB3_1 Depth=1176; NOOUTLINE-NEXT: stxp w9, x4, x5, [x0]177; NOOUTLINE-NEXT: cbnz w9, .LBB3_1178; NOOUTLINE-NEXT: .LBB3_4:179; NOOUTLINE-NEXT: mov x0, x8180; NOOUTLINE-NEXT: ret181;182; OUTLINE-LABEL: val_compare_and_swap_monotonic:183; OUTLINE: // %bb.0:184; OUTLINE-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill185; OUTLINE-NEXT: .cfi_def_cfa_offset 16186; OUTLINE-NEXT: .cfi_offset w30, -16187; OUTLINE-NEXT: mov x1, x3188; OUTLINE-NEXT: mov x8, x0189; OUTLINE-NEXT: mov x0, x2190; OUTLINE-NEXT: mov x2, x4191; OUTLINE-NEXT: mov x3, x5192; OUTLINE-NEXT: mov x4, x8193; OUTLINE-NEXT: bl __aarch64_cas16_relax194; OUTLINE-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload195; OUTLINE-NEXT: ret196;197; LSE-LABEL: val_compare_and_swap_monotonic:198; LSE: // %bb.0:199; LSE-NEXT: // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5200; LSE-NEXT: // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3201; LSE-NEXT: // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5202; LSE-NEXT: // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3203; LSE-NEXT: casp x2, x3, x4, x5, [x0]204; LSE-NEXT: mov x0, x2205; LSE-NEXT: mov x1, x3206; LSE-NEXT: ret207 %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval monotonic monotonic208 %val = extractvalue { i128, i1 } %pair, 0209 ret i128 %val210}211 212define void @fetch_and_nand(ptr %p, i128 %bits) {213; NOOUTLINE-LABEL: fetch_and_nand:214; NOOUTLINE: // %bb.0:215; NOOUTLINE-NEXT: .LBB4_1: // %atomicrmw.start216; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1217; NOOUTLINE-NEXT: ldxp x9, x8, [x0]218; NOOUTLINE-NEXT: and x10, x9, x2219; NOOUTLINE-NEXT: and x11, x8, x3220; NOOUTLINE-NEXT: mvn x11, x11221; NOOUTLINE-NEXT: mvn x10, x10222; NOOUTLINE-NEXT: stlxp w12, x10, x11, [x0]223; NOOUTLINE-NEXT: cbnz w12, .LBB4_1224; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end225; NOOUTLINE-NEXT: adrp x10, :got:var226; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]227; NOOUTLINE-NEXT: stp x9, x8, [x10]228; NOOUTLINE-NEXT: ret229;230; OUTLINE-LABEL: fetch_and_nand:231; OUTLINE: // %bb.0:232; OUTLINE-NEXT: .LBB4_1: // %atomicrmw.start233; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1234; OUTLINE-NEXT: ldxp x9, x8, [x0]235; OUTLINE-NEXT: and x10, x9, x2236; OUTLINE-NEXT: and x11, x8, x3237; OUTLINE-NEXT: mvn x11, x11238; OUTLINE-NEXT: mvn x10, x10239; OUTLINE-NEXT: stlxp w12, x10, x11, [x0]240; OUTLINE-NEXT: cbnz w12, .LBB4_1241; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end242; OUTLINE-NEXT: adrp x10, :got:var243; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]244; OUTLINE-NEXT: stp x9, x8, [x10]245; OUTLINE-NEXT: ret246;247; LSE-LABEL: fetch_and_nand:248; LSE: // %bb.0:249; LSE-NEXT: ldp x4, x5, [x0]250; LSE-NEXT: .LBB4_1: // %atomicrmw.start251; LSE-NEXT: // =>This Inner Loop Header: Depth=1252; LSE-NEXT: mov x7, x5253; LSE-NEXT: mov x6, x4254; LSE-NEXT: and x8, x7, x3255; LSE-NEXT: and x9, x4, x2256; LSE-NEXT: mvn x10, x9257; LSE-NEXT: mvn x11, x8258; LSE-NEXT: mov x4, x6259; LSE-NEXT: mov x5, x7260; LSE-NEXT: caspl x4, x5, x10, x11, [x0]261; LSE-NEXT: cmp x5, x7262; LSE-NEXT: ccmp x4, x6, #0, eq263; LSE-NEXT: b.ne .LBB4_1264; LSE-NEXT: // %bb.2: // %atomicrmw.end265; LSE-NEXT: adrp x8, :got:var266; LSE-NEXT: ldr x8, [x8, :got_lo12:var]267; LSE-NEXT: stp x4, x5, [x8]268; LSE-NEXT: ret269 270 %val = atomicrmw nand ptr %p, i128 %bits release271 store i128 %val, ptr @var, align 16272 ret void273}274 275define void @fetch_and_or(ptr %p, i128 %bits) {276; NOOUTLINE-LABEL: fetch_and_or:277; NOOUTLINE: // %bb.0:278; NOOUTLINE-NEXT: .LBB5_1: // %atomicrmw.start279; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1280; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]281; NOOUTLINE-NEXT: orr x10, x8, x3282; NOOUTLINE-NEXT: orr x11, x9, x2283; NOOUTLINE-NEXT: stlxp w12, x11, x10, [x0]284; NOOUTLINE-NEXT: cbnz w12, .LBB5_1285; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end286; NOOUTLINE-NEXT: adrp x10, :got:var287; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]288; NOOUTLINE-NEXT: stp x9, x8, [x10]289; NOOUTLINE-NEXT: ret290;291; OUTLINE-LABEL: fetch_and_or:292; OUTLINE: // %bb.0:293; OUTLINE-NEXT: .LBB5_1: // %atomicrmw.start294; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1295; OUTLINE-NEXT: ldaxp x9, x8, [x0]296; OUTLINE-NEXT: orr x10, x8, x3297; OUTLINE-NEXT: orr x11, x9, x2298; OUTLINE-NEXT: stlxp w12, x11, x10, [x0]299; OUTLINE-NEXT: cbnz w12, .LBB5_1300; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end301; OUTLINE-NEXT: adrp x10, :got:var302; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]303; OUTLINE-NEXT: stp x9, x8, [x10]304; OUTLINE-NEXT: ret305;306; LSE-LABEL: fetch_and_or:307; LSE: // %bb.0:308; LSE-NEXT: ldp x4, x5, [x0]309; LSE-NEXT: .LBB5_1: // %atomicrmw.start310; LSE-NEXT: // =>This Inner Loop Header: Depth=1311; LSE-NEXT: mov x7, x5312; LSE-NEXT: mov x6, x4313; LSE-NEXT: orr x8, x4, x2314; LSE-NEXT: orr x9, x7, x3315; LSE-NEXT: mov x4, x6316; LSE-NEXT: mov x5, x7317; LSE-NEXT: caspal x4, x5, x8, x9, [x0]318; LSE-NEXT: cmp x5, x7319; LSE-NEXT: ccmp x4, x6, #0, eq320; LSE-NEXT: b.ne .LBB5_1321; LSE-NEXT: // %bb.2: // %atomicrmw.end322; LSE-NEXT: adrp x8, :got:var323; LSE-NEXT: ldr x8, [x8, :got_lo12:var]324; LSE-NEXT: stp x4, x5, [x8]325; LSE-NEXT: ret326 327 %val = atomicrmw or ptr %p, i128 %bits seq_cst328 store i128 %val, ptr @var, align 16329 ret void330}331 332define void @fetch_and_add(ptr %p, i128 %bits) {333; NOOUTLINE-LABEL: fetch_and_add:334; NOOUTLINE: // %bb.0:335; NOOUTLINE-NEXT: .LBB6_1: // %atomicrmw.start336; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1337; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]338; NOOUTLINE-NEXT: adds x10, x9, x2339; NOOUTLINE-NEXT: adc x11, x8, x3340; NOOUTLINE-NEXT: stlxp w12, x10, x11, [x0]341; NOOUTLINE-NEXT: cbnz w12, .LBB6_1342; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end343; NOOUTLINE-NEXT: adrp x10, :got:var344; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]345; NOOUTLINE-NEXT: stp x9, x8, [x10]346; NOOUTLINE-NEXT: ret347;348; OUTLINE-LABEL: fetch_and_add:349; OUTLINE: // %bb.0:350; OUTLINE-NEXT: .LBB6_1: // %atomicrmw.start351; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1352; OUTLINE-NEXT: ldaxp x9, x8, [x0]353; OUTLINE-NEXT: adds x10, x9, x2354; OUTLINE-NEXT: adc x11, x8, x3355; OUTLINE-NEXT: stlxp w12, x10, x11, [x0]356; OUTLINE-NEXT: cbnz w12, .LBB6_1357; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end358; OUTLINE-NEXT: adrp x10, :got:var359; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]360; OUTLINE-NEXT: stp x9, x8, [x10]361; OUTLINE-NEXT: ret362;363; LSE-LABEL: fetch_and_add:364; LSE: // %bb.0:365; LSE-NEXT: ldp x4, x5, [x0]366; LSE-NEXT: .LBB6_1: // %atomicrmw.start367; LSE-NEXT: // =>This Inner Loop Header: Depth=1368; LSE-NEXT: mov x7, x5369; LSE-NEXT: mov x6, x4370; LSE-NEXT: adds x8, x4, x2371; LSE-NEXT: adc x9, x7, x3372; LSE-NEXT: mov x4, x6373; LSE-NEXT: mov x5, x7374; LSE-NEXT: caspal x4, x5, x8, x9, [x0]375; LSE-NEXT: cmp x5, x7376; LSE-NEXT: ccmp x4, x6, #0, eq377; LSE-NEXT: b.ne .LBB6_1378; LSE-NEXT: // %bb.2: // %atomicrmw.end379; LSE-NEXT: adrp x8, :got:var380; LSE-NEXT: ldr x8, [x8, :got_lo12:var]381; LSE-NEXT: stp x4, x5, [x8]382; LSE-NEXT: ret383 %val = atomicrmw add ptr %p, i128 %bits seq_cst384 store i128 %val, ptr @var, align 16385 ret void386}387 388define void @fetch_and_sub(ptr %p, i128 %bits) {389; NOOUTLINE-LABEL: fetch_and_sub:390; NOOUTLINE: // %bb.0:391; NOOUTLINE-NEXT: .LBB7_1: // %atomicrmw.start392; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1393; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]394; NOOUTLINE-NEXT: subs x10, x9, x2395; NOOUTLINE-NEXT: sbc x11, x8, x3396; NOOUTLINE-NEXT: stlxp w12, x10, x11, [x0]397; NOOUTLINE-NEXT: cbnz w12, .LBB7_1398; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end399; NOOUTLINE-NEXT: adrp x10, :got:var400; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]401; NOOUTLINE-NEXT: stp x9, x8, [x10]402; NOOUTLINE-NEXT: ret403;404; OUTLINE-LABEL: fetch_and_sub:405; OUTLINE: // %bb.0:406; OUTLINE-NEXT: .LBB7_1: // %atomicrmw.start407; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1408; OUTLINE-NEXT: ldaxp x9, x8, [x0]409; OUTLINE-NEXT: subs x10, x9, x2410; OUTLINE-NEXT: sbc x11, x8, x3411; OUTLINE-NEXT: stlxp w12, x10, x11, [x0]412; OUTLINE-NEXT: cbnz w12, .LBB7_1413; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end414; OUTLINE-NEXT: adrp x10, :got:var415; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]416; OUTLINE-NEXT: stp x9, x8, [x10]417; OUTLINE-NEXT: ret418;419; LSE-LABEL: fetch_and_sub:420; LSE: // %bb.0:421; LSE-NEXT: ldp x4, x5, [x0]422; LSE-NEXT: .LBB7_1: // %atomicrmw.start423; LSE-NEXT: // =>This Inner Loop Header: Depth=1424; LSE-NEXT: mov x7, x5425; LSE-NEXT: mov x6, x4426; LSE-NEXT: subs x8, x4, x2427; LSE-NEXT: sbc x9, x7, x3428; LSE-NEXT: mov x4, x6429; LSE-NEXT: mov x5, x7430; LSE-NEXT: caspal x4, x5, x8, x9, [x0]431; LSE-NEXT: cmp x5, x7432; LSE-NEXT: ccmp x4, x6, #0, eq433; LSE-NEXT: b.ne .LBB7_1434; LSE-NEXT: // %bb.2: // %atomicrmw.end435; LSE-NEXT: adrp x8, :got:var436; LSE-NEXT: ldr x8, [x8, :got_lo12:var]437; LSE-NEXT: stp x4, x5, [x8]438; LSE-NEXT: ret439 %val = atomicrmw sub ptr %p, i128 %bits seq_cst440 store i128 %val, ptr @var, align 16441 ret void442}443 444define void @fetch_and_min(ptr %p, i128 %bits) {445; NOOUTLINE-LABEL: fetch_and_min:446; NOOUTLINE: // %bb.0:447; NOOUTLINE-NEXT: .LBB8_1: // %atomicrmw.start448; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1449; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]450; NOOUTLINE-NEXT: cmp x2, x9451; NOOUTLINE-NEXT: sbcs xzr, x3, x8452; NOOUTLINE-NEXT: csel x10, x8, x3, ge453; NOOUTLINE-NEXT: csel x11, x9, x2, ge454; NOOUTLINE-NEXT: stlxp w12, x11, x10, [x0]455; NOOUTLINE-NEXT: cbnz w12, .LBB8_1456; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end457; NOOUTLINE-NEXT: adrp x10, :got:var458; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]459; NOOUTLINE-NEXT: stp x9, x8, [x10]460; NOOUTLINE-NEXT: ret461;462; OUTLINE-LABEL: fetch_and_min:463; OUTLINE: // %bb.0:464; OUTLINE-NEXT: .LBB8_1: // %atomicrmw.start465; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1466; OUTLINE-NEXT: ldaxp x9, x8, [x0]467; OUTLINE-NEXT: cmp x2, x9468; OUTLINE-NEXT: sbcs xzr, x3, x8469; OUTLINE-NEXT: csel x10, x8, x3, ge470; OUTLINE-NEXT: csel x11, x9, x2, ge471; OUTLINE-NEXT: stlxp w12, x11, x10, [x0]472; OUTLINE-NEXT: cbnz w12, .LBB8_1473; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end474; OUTLINE-NEXT: adrp x10, :got:var475; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]476; OUTLINE-NEXT: stp x9, x8, [x10]477; OUTLINE-NEXT: ret478;479; LSE-LABEL: fetch_and_min:480; LSE: // %bb.0:481; LSE-NEXT: ldp x4, x5, [x0]482; LSE-NEXT: .LBB8_1: // %atomicrmw.start483; LSE-NEXT: // =>This Inner Loop Header: Depth=1484; LSE-NEXT: mov x7, x5485; LSE-NEXT: mov x6, x4486; LSE-NEXT: cmp x2, x4487; LSE-NEXT: sbcs xzr, x3, x7488; LSE-NEXT: csel x9, x7, x3, ge489; LSE-NEXT: csel x8, x4, x2, ge490; LSE-NEXT: mov x4, x6491; LSE-NEXT: mov x5, x7492; LSE-NEXT: caspal x4, x5, x8, x9, [x0]493; LSE-NEXT: cmp x5, x7494; LSE-NEXT: ccmp x4, x6, #0, eq495; LSE-NEXT: b.ne .LBB8_1496; LSE-NEXT: // %bb.2: // %atomicrmw.end497; LSE-NEXT: adrp x8, :got:var498; LSE-NEXT: ldr x8, [x8, :got_lo12:var]499; LSE-NEXT: stp x4, x5, [x8]500; LSE-NEXT: ret501 %val = atomicrmw min ptr %p, i128 %bits seq_cst502 store i128 %val, ptr @var, align 16503 ret void504}505 506define void @fetch_and_max(ptr %p, i128 %bits) {507; NOOUTLINE-LABEL: fetch_and_max:508; NOOUTLINE: // %bb.0:509; NOOUTLINE-NEXT: .LBB9_1: // %atomicrmw.start510; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1511; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]512; NOOUTLINE-NEXT: cmp x2, x9513; NOOUTLINE-NEXT: sbcs xzr, x3, x8514; NOOUTLINE-NEXT: csel x10, x8, x3, lt515; NOOUTLINE-NEXT: csel x11, x9, x2, lt516; NOOUTLINE-NEXT: stlxp w12, x11, x10, [x0]517; NOOUTLINE-NEXT: cbnz w12, .LBB9_1518; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end519; NOOUTLINE-NEXT: adrp x10, :got:var520; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]521; NOOUTLINE-NEXT: stp x9, x8, [x10]522; NOOUTLINE-NEXT: ret523;524; OUTLINE-LABEL: fetch_and_max:525; OUTLINE: // %bb.0:526; OUTLINE-NEXT: .LBB9_1: // %atomicrmw.start527; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1528; OUTLINE-NEXT: ldaxp x9, x8, [x0]529; OUTLINE-NEXT: cmp x2, x9530; OUTLINE-NEXT: sbcs xzr, x3, x8531; OUTLINE-NEXT: csel x10, x8, x3, lt532; OUTLINE-NEXT: csel x11, x9, x2, lt533; OUTLINE-NEXT: stlxp w12, x11, x10, [x0]534; OUTLINE-NEXT: cbnz w12, .LBB9_1535; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end536; OUTLINE-NEXT: adrp x10, :got:var537; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]538; OUTLINE-NEXT: stp x9, x8, [x10]539; OUTLINE-NEXT: ret540;541; LSE-LABEL: fetch_and_max:542; LSE: // %bb.0:543; LSE-NEXT: ldp x4, x5, [x0]544; LSE-NEXT: .LBB9_1: // %atomicrmw.start545; LSE-NEXT: // =>This Inner Loop Header: Depth=1546; LSE-NEXT: mov x7, x5547; LSE-NEXT: mov x6, x4548; LSE-NEXT: cmp x2, x4549; LSE-NEXT: sbcs xzr, x3, x7550; LSE-NEXT: csel x9, x7, x3, lt551; LSE-NEXT: csel x8, x4, x2, lt552; LSE-NEXT: mov x4, x6553; LSE-NEXT: mov x5, x7554; LSE-NEXT: caspal x4, x5, x8, x9, [x0]555; LSE-NEXT: cmp x5, x7556; LSE-NEXT: ccmp x4, x6, #0, eq557; LSE-NEXT: b.ne .LBB9_1558; LSE-NEXT: // %bb.2: // %atomicrmw.end559; LSE-NEXT: adrp x8, :got:var560; LSE-NEXT: ldr x8, [x8, :got_lo12:var]561; LSE-NEXT: stp x4, x5, [x8]562; LSE-NEXT: ret563 %val = atomicrmw max ptr %p, i128 %bits seq_cst564 store i128 %val, ptr @var, align 16565 ret void566}567 568define void @fetch_and_umin(ptr %p, i128 %bits) {569; NOOUTLINE-LABEL: fetch_and_umin:570; NOOUTLINE: // %bb.0:571; NOOUTLINE-NEXT: .LBB10_1: // %atomicrmw.start572; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1573; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]574; NOOUTLINE-NEXT: cmp x2, x9575; NOOUTLINE-NEXT: sbcs xzr, x3, x8576; NOOUTLINE-NEXT: csel x10, x8, x3, hs577; NOOUTLINE-NEXT: csel x11, x9, x2, hs578; NOOUTLINE-NEXT: stlxp w12, x11, x10, [x0]579; NOOUTLINE-NEXT: cbnz w12, .LBB10_1580; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end581; NOOUTLINE-NEXT: adrp x10, :got:var582; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]583; NOOUTLINE-NEXT: stp x9, x8, [x10]584; NOOUTLINE-NEXT: ret585;586; OUTLINE-LABEL: fetch_and_umin:587; OUTLINE: // %bb.0:588; OUTLINE-NEXT: .LBB10_1: // %atomicrmw.start589; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1590; OUTLINE-NEXT: ldaxp x9, x8, [x0]591; OUTLINE-NEXT: cmp x2, x9592; OUTLINE-NEXT: sbcs xzr, x3, x8593; OUTLINE-NEXT: csel x10, x8, x3, hs594; OUTLINE-NEXT: csel x11, x9, x2, hs595; OUTLINE-NEXT: stlxp w12, x11, x10, [x0]596; OUTLINE-NEXT: cbnz w12, .LBB10_1597; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end598; OUTLINE-NEXT: adrp x10, :got:var599; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]600; OUTLINE-NEXT: stp x9, x8, [x10]601; OUTLINE-NEXT: ret602;603; LSE-LABEL: fetch_and_umin:604; LSE: // %bb.0:605; LSE-NEXT: ldp x4, x5, [x0]606; LSE-NEXT: .LBB10_1: // %atomicrmw.start607; LSE-NEXT: // =>This Inner Loop Header: Depth=1608; LSE-NEXT: mov x7, x5609; LSE-NEXT: mov x6, x4610; LSE-NEXT: cmp x2, x4611; LSE-NEXT: sbcs xzr, x3, x7612; LSE-NEXT: csel x9, x7, x3, hs613; LSE-NEXT: csel x8, x4, x2, hs614; LSE-NEXT: mov x4, x6615; LSE-NEXT: mov x5, x7616; LSE-NEXT: caspal x4, x5, x8, x9, [x0]617; LSE-NEXT: cmp x5, x7618; LSE-NEXT: ccmp x4, x6, #0, eq619; LSE-NEXT: b.ne .LBB10_1620; LSE-NEXT: // %bb.2: // %atomicrmw.end621; LSE-NEXT: adrp x8, :got:var622; LSE-NEXT: ldr x8, [x8, :got_lo12:var]623; LSE-NEXT: stp x4, x5, [x8]624; LSE-NEXT: ret625 %val = atomicrmw umin ptr %p, i128 %bits seq_cst626 store i128 %val, ptr @var, align 16627 ret void628}629 630define void @fetch_and_umax(ptr %p, i128 %bits) {631; NOOUTLINE-LABEL: fetch_and_umax:632; NOOUTLINE: // %bb.0:633; NOOUTLINE-NEXT: .LBB11_1: // %atomicrmw.start634; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1635; NOOUTLINE-NEXT: ldaxp x9, x8, [x0]636; NOOUTLINE-NEXT: cmp x2, x9637; NOOUTLINE-NEXT: sbcs xzr, x3, x8638; NOOUTLINE-NEXT: csel x10, x8, x3, lo639; NOOUTLINE-NEXT: csel x11, x9, x2, lo640; NOOUTLINE-NEXT: stlxp w12, x11, x10, [x0]641; NOOUTLINE-NEXT: cbnz w12, .LBB11_1642; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end643; NOOUTLINE-NEXT: adrp x10, :got:var644; NOOUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]645; NOOUTLINE-NEXT: stp x9, x8, [x10]646; NOOUTLINE-NEXT: ret647;648; OUTLINE-LABEL: fetch_and_umax:649; OUTLINE: // %bb.0:650; OUTLINE-NEXT: .LBB11_1: // %atomicrmw.start651; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1652; OUTLINE-NEXT: ldaxp x9, x8, [x0]653; OUTLINE-NEXT: cmp x2, x9654; OUTLINE-NEXT: sbcs xzr, x3, x8655; OUTLINE-NEXT: csel x10, x8, x3, lo656; OUTLINE-NEXT: csel x11, x9, x2, lo657; OUTLINE-NEXT: stlxp w12, x11, x10, [x0]658; OUTLINE-NEXT: cbnz w12, .LBB11_1659; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end660; OUTLINE-NEXT: adrp x10, :got:var661; OUTLINE-NEXT: ldr x10, [x10, :got_lo12:var]662; OUTLINE-NEXT: stp x9, x8, [x10]663; OUTLINE-NEXT: ret664;665; LSE-LABEL: fetch_and_umax:666; LSE: // %bb.0:667; LSE-NEXT: ldp x4, x5, [x0]668; LSE-NEXT: .LBB11_1: // %atomicrmw.start669; LSE-NEXT: // =>This Inner Loop Header: Depth=1670; LSE-NEXT: mov x7, x5671; LSE-NEXT: mov x6, x4672; LSE-NEXT: cmp x2, x4673; LSE-NEXT: sbcs xzr, x3, x7674; LSE-NEXT: csel x9, x7, x3, lo675; LSE-NEXT: csel x8, x4, x2, lo676; LSE-NEXT: mov x4, x6677; LSE-NEXT: mov x5, x7678; LSE-NEXT: caspal x4, x5, x8, x9, [x0]679; LSE-NEXT: cmp x5, x7680; LSE-NEXT: ccmp x4, x6, #0, eq681; LSE-NEXT: b.ne .LBB11_1682; LSE-NEXT: // %bb.2: // %atomicrmw.end683; LSE-NEXT: adrp x8, :got:var684; LSE-NEXT: ldr x8, [x8, :got_lo12:var]685; LSE-NEXT: stp x4, x5, [x8]686; LSE-NEXT: ret687 %val = atomicrmw umax ptr %p, i128 %bits seq_cst688 store i128 %val, ptr @var, align 16689 ret void690}691 692define i128 @atomic_load_seq_cst(ptr %p) {693; NOOUTLINE-LABEL: atomic_load_seq_cst:694; NOOUTLINE: // %bb.0:695; NOOUTLINE-NEXT: mov x8, x0696; NOOUTLINE-NEXT: .LBB12_1: // %atomicrmw.start697; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1698; NOOUTLINE-NEXT: ldaxp x0, x1, [x8]699; NOOUTLINE-NEXT: stlxp w9, x0, x1, [x8]700; NOOUTLINE-NEXT: cbnz w9, .LBB12_1701; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end702; NOOUTLINE-NEXT: ret703;704; OUTLINE-LABEL: atomic_load_seq_cst:705; OUTLINE: // %bb.0:706; OUTLINE-NEXT: mov x8, x0707; OUTLINE-NEXT: .LBB12_1: // %atomicrmw.start708; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1709; OUTLINE-NEXT: ldaxp x0, x1, [x8]710; OUTLINE-NEXT: stlxp w9, x0, x1, [x8]711; OUTLINE-NEXT: cbnz w9, .LBB12_1712; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end713; OUTLINE-NEXT: ret714;715; LSE-LABEL: atomic_load_seq_cst:716; LSE: // %bb.0:717; LSE-NEXT: mov x2, #0718; LSE-NEXT: mov x3, #0719; LSE-NEXT: caspal x2, x3, x2, x3, [x0]720; LSE-NEXT: mov x0, x2721; LSE-NEXT: mov x1, x3722; LSE-NEXT: ret723 %r = load atomic i128, ptr %p seq_cst, align 16724 ret i128 %r725}726 727define i128 @atomic_load_relaxed(i64, i64, ptr %p) {728; NOOUTLINE-LABEL: atomic_load_relaxed:729; NOOUTLINE: // %bb.0:730; NOOUTLINE-NEXT: .LBB13_1: // %atomicrmw.start731; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1732; NOOUTLINE-NEXT: ldxp x0, x1, [x2]733; NOOUTLINE-NEXT: stxp w8, x0, x1, [x2]734; NOOUTLINE-NEXT: cbnz w8, .LBB13_1735; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end736; NOOUTLINE-NEXT: ret737;738; OUTLINE-LABEL: atomic_load_relaxed:739; OUTLINE: // %bb.0:740; OUTLINE-NEXT: .LBB13_1: // %atomicrmw.start741; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1742; OUTLINE-NEXT: ldxp x0, x1, [x2]743; OUTLINE-NEXT: stxp w8, x0, x1, [x2]744; OUTLINE-NEXT: cbnz w8, .LBB13_1745; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end746; OUTLINE-NEXT: ret747;748; LSE-LABEL: atomic_load_relaxed:749; LSE: // %bb.0:750; LSE-NEXT: mov x0, #0751; LSE-NEXT: mov x1, #0752; LSE-NEXT: casp x0, x1, x0, x1, [x2]753; LSE-NEXT: ret754 %r = load atomic i128, ptr %p monotonic, align 16755 ret i128 %r756}757 758 759define void @atomic_store_seq_cst(i128 %in, ptr %p) {760; NOOUTLINE-LABEL: atomic_store_seq_cst:761; NOOUTLINE: // %bb.0:762; NOOUTLINE-NEXT: .LBB14_1: // %atomicrmw.start763; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1764; NOOUTLINE-NEXT: ldaxp xzr, x8, [x2]765; NOOUTLINE-NEXT: stlxp w8, x0, x1, [x2]766; NOOUTLINE-NEXT: cbnz w8, .LBB14_1767; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end768; NOOUTLINE-NEXT: ret769;770; OUTLINE-LABEL: atomic_store_seq_cst:771; OUTLINE: // %bb.0:772; OUTLINE-NEXT: .LBB14_1: // %atomicrmw.start773; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1774; OUTLINE-NEXT: ldaxp xzr, x8, [x2]775; OUTLINE-NEXT: stlxp w8, x0, x1, [x2]776; OUTLINE-NEXT: cbnz w8, .LBB14_1777; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end778; OUTLINE-NEXT: ret779;780; LSE-LABEL: atomic_store_seq_cst:781; LSE: // %bb.0:782; LSE-NEXT: // kill: def $x1 killed $x1 killed $x0_x1 def $x0_x1783; LSE-NEXT: ldp x4, x5, [x2]784; LSE-NEXT: // kill: def $x0 killed $x0 killed $x0_x1 def $x0_x1785; LSE-NEXT: .LBB14_1: // %atomicrmw.start786; LSE-NEXT: // =>This Inner Loop Header: Depth=1787; LSE-NEXT: mov x6, x4788; LSE-NEXT: mov x7, x5789; LSE-NEXT: caspal x6, x7, x0, x1, [x2]790; LSE-NEXT: cmp x7, x5791; LSE-NEXT: ccmp x6, x4, #0, eq792; LSE-NEXT: mov x4, x6793; LSE-NEXT: mov x5, x7794; LSE-NEXT: b.ne .LBB14_1795; LSE-NEXT: // %bb.2: // %atomicrmw.end796; LSE-NEXT: ret797 store atomic i128 %in, ptr %p seq_cst, align 16798 ret void799}800 801define void @atomic_store_release(i128 %in, ptr %p) {802; NOOUTLINE-LABEL: atomic_store_release:803; NOOUTLINE: // %bb.0:804; NOOUTLINE-NEXT: .LBB15_1: // %atomicrmw.start805; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1806; NOOUTLINE-NEXT: ldxp xzr, x8, [x2]807; NOOUTLINE-NEXT: stlxp w8, x0, x1, [x2]808; NOOUTLINE-NEXT: cbnz w8, .LBB15_1809; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end810; NOOUTLINE-NEXT: ret811;812; OUTLINE-LABEL: atomic_store_release:813; OUTLINE: // %bb.0:814; OUTLINE-NEXT: .LBB15_1: // %atomicrmw.start815; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1816; OUTLINE-NEXT: ldxp xzr, x8, [x2]817; OUTLINE-NEXT: stlxp w8, x0, x1, [x2]818; OUTLINE-NEXT: cbnz w8, .LBB15_1819; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end820; OUTLINE-NEXT: ret821;822; LSE-LABEL: atomic_store_release:823; LSE: // %bb.0:824; LSE-NEXT: // kill: def $x1 killed $x1 killed $x0_x1 def $x0_x1825; LSE-NEXT: ldp x4, x5, [x2]826; LSE-NEXT: // kill: def $x0 killed $x0 killed $x0_x1 def $x0_x1827; LSE-NEXT: .LBB15_1: // %atomicrmw.start828; LSE-NEXT: // =>This Inner Loop Header: Depth=1829; LSE-NEXT: mov x6, x4830; LSE-NEXT: mov x7, x5831; LSE-NEXT: caspl x6, x7, x0, x1, [x2]832; LSE-NEXT: cmp x7, x5833; LSE-NEXT: ccmp x6, x4, #0, eq834; LSE-NEXT: mov x4, x6835; LSE-NEXT: mov x5, x7836; LSE-NEXT: b.ne .LBB15_1837; LSE-NEXT: // %bb.2: // %atomicrmw.end838; LSE-NEXT: ret839 store atomic i128 %in, ptr %p release, align 16840 ret void841}842 843define void @atomic_store_relaxed(i128 %in, ptr %p) {844; NOOUTLINE-LABEL: atomic_store_relaxed:845; NOOUTLINE: // %bb.0:846; NOOUTLINE-NEXT: .LBB16_1: // %atomicrmw.start847; NOOUTLINE-NEXT: // =>This Inner Loop Header: Depth=1848; NOOUTLINE-NEXT: ldxp xzr, x8, [x2]849; NOOUTLINE-NEXT: stxp w8, x0, x1, [x2]850; NOOUTLINE-NEXT: cbnz w8, .LBB16_1851; NOOUTLINE-NEXT: // %bb.2: // %atomicrmw.end852; NOOUTLINE-NEXT: ret853;854; OUTLINE-LABEL: atomic_store_relaxed:855; OUTLINE: // %bb.0:856; OUTLINE-NEXT: .LBB16_1: // %atomicrmw.start857; OUTLINE-NEXT: // =>This Inner Loop Header: Depth=1858; OUTLINE-NEXT: ldxp xzr, x8, [x2]859; OUTLINE-NEXT: stxp w8, x0, x1, [x2]860; OUTLINE-NEXT: cbnz w8, .LBB16_1861; OUTLINE-NEXT: // %bb.2: // %atomicrmw.end862; OUTLINE-NEXT: ret863;864; LSE-LABEL: atomic_store_relaxed:865; LSE: // %bb.0:866; LSE-NEXT: // kill: def $x1 killed $x1 killed $x0_x1 def $x0_x1867; LSE-NEXT: ldp x4, x5, [x2]868; LSE-NEXT: // kill: def $x0 killed $x0 killed $x0_x1 def $x0_x1869; LSE-NEXT: .LBB16_1: // %atomicrmw.start870; LSE-NEXT: // =>This Inner Loop Header: Depth=1871; LSE-NEXT: mov x6, x4872; LSE-NEXT: mov x7, x5873; LSE-NEXT: casp x6, x7, x0, x1, [x2]874; LSE-NEXT: cmp x7, x5875; LSE-NEXT: ccmp x6, x4, #0, eq876; LSE-NEXT: mov x4, x6877; LSE-NEXT: mov x5, x7878; LSE-NEXT: b.ne .LBB16_1879; LSE-NEXT: // %bb.2: // %atomicrmw.end880; LSE-NEXT: ret881 store atomic i128 %in, ptr %p unordered, align 16882 ret void883}884 885; Since we store the original value to ensure no tearing for the unsuccessful886; case, the register used must not be xzr.887define void @cmpxchg_dead(ptr %ptr, i128 %desired, i128 %new) {888; NOOUTLINE-LABEL: cmpxchg_dead:889; NOOUTLINE: // %bb.0:890; NOOUTLINE-NEXT: .LBB17_1: // =>This Inner Loop Header: Depth=1891; NOOUTLINE-NEXT: ldxp x8, x9, [x0]892; NOOUTLINE-NEXT: cmp x8, x2893; NOOUTLINE-NEXT: cset w10, ne894; NOOUTLINE-NEXT: cmp x9, x3895; NOOUTLINE-NEXT: cinc w10, w10, ne896; NOOUTLINE-NEXT: cbz w10, .LBB17_3897; NOOUTLINE-NEXT: // %bb.2: // in Loop: Header=BB17_1 Depth=1898; NOOUTLINE-NEXT: stxp w10, x8, x9, [x0]899; NOOUTLINE-NEXT: cbnz w10, .LBB17_1900; NOOUTLINE-NEXT: b .LBB17_4901; NOOUTLINE-NEXT: .LBB17_3: // in Loop: Header=BB17_1 Depth=1902; NOOUTLINE-NEXT: stxp w10, x4, x5, [x0]903; NOOUTLINE-NEXT: cbnz w10, .LBB17_1904; NOOUTLINE-NEXT: .LBB17_4:905; NOOUTLINE-NEXT: ret906;907; OUTLINE-LABEL: cmpxchg_dead:908; OUTLINE: // %bb.0:909; OUTLINE-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill910; OUTLINE-NEXT: .cfi_def_cfa_offset 16911; OUTLINE-NEXT: .cfi_offset w30, -16912; OUTLINE-NEXT: mov x1, x3913; OUTLINE-NEXT: mov x8, x0914; OUTLINE-NEXT: mov x0, x2915; OUTLINE-NEXT: mov x2, x4916; OUTLINE-NEXT: mov x3, x5917; OUTLINE-NEXT: mov x4, x8918; OUTLINE-NEXT: bl __aarch64_cas16_relax919; OUTLINE-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload920; OUTLINE-NEXT: ret921;922; LSE-LABEL: cmpxchg_dead:923; LSE: // %bb.0:924; LSE-NEXT: // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5925; LSE-NEXT: // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3926; LSE-NEXT: // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5927; LSE-NEXT: // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3928; LSE-NEXT: casp x2, x3, x4, x5, [x0]929; LSE-NEXT: ret930 cmpxchg ptr %ptr, i128 %desired, i128 %new monotonic monotonic931 ret void932}933