brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.3 KiB · 37c61d0 Raw
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