brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.3 KiB · be51210 Raw
725 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-LLSC-O13; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mattr=+outline-atomics -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-OUTLINE-LLSC-O14; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mattr=+lse -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-CAS-O15; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mattr=+lse,+outline-atomics -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-CAS-O16; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -O0 -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-LLSC-O07; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -O0 -mattr=+outline-atomics -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-OUTLINE-LLSC-O08; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -O0 -mattr=+lse -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-CAS-O09; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -O0 -mattr=+lse,+outline-atomics -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-CAS-O010@var = global i128 011 12define void @val_compare_and_swap(ptr %p, i128 %oldval, i128 %newval) {13; CHECK-LLSC-O1-LABEL: val_compare_and_swap:14; CHECK-LLSC-O1:       // %bb.0:15; CHECK-LLSC-O1-NEXT:  .LBB0_1: // =>This Inner Loop Header: Depth=116; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]17; CHECK-LLSC-O1-NEXT:    cmp x8, x218; CHECK-LLSC-O1-NEXT:    cset w10, ne19; CHECK-LLSC-O1-NEXT:    cmp x9, x320; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne21; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB0_322; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB0_1 Depth=123; CHECK-LLSC-O1-NEXT:    stxp w10, x8, x9, [x0]24; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB0_125; CHECK-LLSC-O1-NEXT:    b .LBB0_426; CHECK-LLSC-O1-NEXT:  .LBB0_3: // in Loop: Header=BB0_1 Depth=127; CHECK-LLSC-O1-NEXT:    stxp w10, x4, x5, [x0]28; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB0_129; CHECK-LLSC-O1-NEXT:  .LBB0_4:30; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x831; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x932; CHECK-LLSC-O1-NEXT:    str q0, [x0]33; CHECK-LLSC-O1-NEXT:    ret34;35; CHECK-OUTLINE-LLSC-O1-LABEL: val_compare_and_swap:36; CHECK-OUTLINE-LLSC-O1:       // %bb.0:37; CHECK-OUTLINE-LLSC-O1-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill38; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_def_cfa_offset 1639; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w19, -840; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w30, -1641; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x19, x042; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x0, x243; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x1, x344; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x2, x445; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x3, x546; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x4, x1947; CHECK-OUTLINE-LLSC-O1-NEXT:    bl __aarch64_cas16_acq48; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[0], x049; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[1], x150; CHECK-OUTLINE-LLSC-O1-NEXT:    str q0, [x19]51; CHECK-OUTLINE-LLSC-O1-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload52; CHECK-OUTLINE-LLSC-O1-NEXT:    ret53;54; CHECK-CAS-O1-LABEL: val_compare_and_swap:55; CHECK-CAS-O1:       // %bb.0:56; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x357; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x558; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x359; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x560; CHECK-CAS-O1-NEXT:    caspa x2, x3, x4, x5, [x0]61; CHECK-CAS-O1-NEXT:    mov v0.d[0], x262; CHECK-CAS-O1-NEXT:    mov v0.d[1], x363; CHECK-CAS-O1-NEXT:    str q0, [x0]64; CHECK-CAS-O1-NEXT:    ret65;66; CHECK-LLSC-O0-LABEL: val_compare_and_swap:67; CHECK-LLSC-O0:       // %bb.0:68; CHECK-LLSC-O0-NEXT:  .LBB0_1: // =>This Inner Loop Header: Depth=169; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]70; CHECK-LLSC-O0-NEXT:    cmp x9, x271; CHECK-LLSC-O0-NEXT:    cset w10, ne72; CHECK-LLSC-O0-NEXT:    cmp x8, x373; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne74; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB0_375; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB0_1 Depth=176; CHECK-LLSC-O0-NEXT:    stxp w10, x4, x5, [x0]77; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB0_178; CHECK-LLSC-O0-NEXT:    b .LBB0_479; CHECK-LLSC-O0-NEXT:  .LBB0_3: // in Loop: Header=BB0_1 Depth=180; CHECK-LLSC-O0-NEXT:    stxp w10, x9, x8, [x0]81; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB0_182; CHECK-LLSC-O0-NEXT:  .LBB0_4:83; CHECK-LLSC-O0-NEXT:    // implicit-def: $q084; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x985; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x886; CHECK-LLSC-O0-NEXT:    str q0, [x0]87; CHECK-LLSC-O0-NEXT:    ret88;89; CHECK-OUTLINE-LLSC-O0-LABEL: val_compare_and_swap:90; CHECK-OUTLINE-LLSC-O0:       // %bb.0:91; CHECK-OUTLINE-LLSC-O0-NEXT:    sub sp, sp, #3292; CHECK-OUTLINE-LLSC-O0-NEXT:    str x30, [sp, #16] // 8-byte Spill93; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_def_cfa_offset 3294; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_offset w30, -1695; CHECK-OUTLINE-LLSC-O0-NEXT:    str x0, [sp, #8] // 8-byte Spill96; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x0, x297; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x1, x398; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x2, x499; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x4, [sp, #8] // 8-byte Reload100; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x3, x5101; CHECK-OUTLINE-LLSC-O0-NEXT:    bl __aarch64_cas16_acq102; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x8, x0103; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x0, [sp, #8] // 8-byte Reload104; CHECK-OUTLINE-LLSC-O0-NEXT:    // implicit-def: $q0105; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[0], x8106; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[1], x1107; CHECK-OUTLINE-LLSC-O0-NEXT:    str q0, [x0]108; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x30, [sp, #16] // 8-byte Reload109; CHECK-OUTLINE-LLSC-O0-NEXT:    add sp, sp, #32110; CHECK-OUTLINE-LLSC-O0-NEXT:    ret111;112; CHECK-CAS-O0-LABEL: val_compare_and_swap:113; CHECK-CAS-O0:       // %bb.0:114; CHECK-CAS-O0-NEXT:    sub sp, sp, #16115; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16116; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Spill117; CHECK-CAS-O0-NEXT:    mov x1, x5118; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Reload119; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3120; CHECK-CAS-O0-NEXT:    mov x3, x5121; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5122; CHECK-CAS-O0-NEXT:    mov x5, x1123; CHECK-CAS-O0-NEXT:    caspa x2, x3, x4, x5, [x0]124; CHECK-CAS-O0-NEXT:    mov x9, x2125; CHECK-CAS-O0-NEXT:    mov x8, x3126; CHECK-CAS-O0-NEXT:    // implicit-def: $q0127; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9128; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8129; CHECK-CAS-O0-NEXT:    str q0, [x0]130; CHECK-CAS-O0-NEXT:    add sp, sp, #16131; CHECK-CAS-O0-NEXT:    ret132 133%pair = cmpxchg ptr %p, i128 %oldval, i128 %newval acquire acquire134  %val = extractvalue { i128, i1 } %pair, 0135  store i128 %val, ptr %p136  ret void137}138 139define void @val_compare_and_swap_monotonic_seqcst(ptr %p, i128 %oldval, i128 %newval) {140; CHECK-LLSC-O1-LABEL: val_compare_and_swap_monotonic_seqcst:141; CHECK-LLSC-O1:       // %bb.0:142; CHECK-LLSC-O1-NEXT:  .LBB1_1: // =>This Inner Loop Header: Depth=1143; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]144; CHECK-LLSC-O1-NEXT:    cmp x8, x2145; CHECK-LLSC-O1-NEXT:    cset w10, ne146; CHECK-LLSC-O1-NEXT:    cmp x9, x3147; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne148; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB1_3149; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB1_1 Depth=1150; CHECK-LLSC-O1-NEXT:    stlxp w10, x8, x9, [x0]151; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB1_1152; CHECK-LLSC-O1-NEXT:    b .LBB1_4153; CHECK-LLSC-O1-NEXT:  .LBB1_3: // in Loop: Header=BB1_1 Depth=1154; CHECK-LLSC-O1-NEXT:    stlxp w10, x4, x5, [x0]155; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB1_1156; CHECK-LLSC-O1-NEXT:  .LBB1_4:157; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8158; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9159; CHECK-LLSC-O1-NEXT:    str q0, [x0]160; CHECK-LLSC-O1-NEXT:    ret161;162; CHECK-OUTLINE-LLSC-O1-LABEL: val_compare_and_swap_monotonic_seqcst:163; CHECK-OUTLINE-LLSC-O1:       // %bb.0:164; CHECK-OUTLINE-LLSC-O1-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill165; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_def_cfa_offset 16166; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w19, -8167; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w30, -16168; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x19, x0169; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x0, x2170; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x1, x3171; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x2, x4172; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x3, x5173; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x4, x19174; CHECK-OUTLINE-LLSC-O1-NEXT:    bl __aarch64_cas16_acq_rel175; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[0], x0176; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[1], x1177; CHECK-OUTLINE-LLSC-O1-NEXT:    str q0, [x19]178; CHECK-OUTLINE-LLSC-O1-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload179; CHECK-OUTLINE-LLSC-O1-NEXT:    ret180;181; CHECK-CAS-O1-LABEL: val_compare_and_swap_monotonic_seqcst:182; CHECK-CAS-O1:       // %bb.0:183; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3184; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5185; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3186; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5187; CHECK-CAS-O1-NEXT:    caspal x2, x3, x4, x5, [x0]188; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2189; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3190; CHECK-CAS-O1-NEXT:    str q0, [x0]191; CHECK-CAS-O1-NEXT:    ret192;193; CHECK-LLSC-O0-LABEL: val_compare_and_swap_monotonic_seqcst:194; CHECK-LLSC-O0:       // %bb.0:195; CHECK-LLSC-O0-NEXT:  .LBB1_1: // =>This Inner Loop Header: Depth=1196; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]197; CHECK-LLSC-O0-NEXT:    cmp x9, x2198; CHECK-LLSC-O0-NEXT:    cset w10, ne199; CHECK-LLSC-O0-NEXT:    cmp x8, x3200; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne201; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB1_3202; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB1_1 Depth=1203; CHECK-LLSC-O0-NEXT:    stlxp w10, x4, x5, [x0]204; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB1_1205; CHECK-LLSC-O0-NEXT:    b .LBB1_4206; CHECK-LLSC-O0-NEXT:  .LBB1_3: // in Loop: Header=BB1_1 Depth=1207; CHECK-LLSC-O0-NEXT:    stlxp w10, x9, x8, [x0]208; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB1_1209; CHECK-LLSC-O0-NEXT:  .LBB1_4:210; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0211; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9212; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8213; CHECK-LLSC-O0-NEXT:    str q0, [x0]214; CHECK-LLSC-O0-NEXT:    ret215;216; CHECK-OUTLINE-LLSC-O0-LABEL: val_compare_and_swap_monotonic_seqcst:217; CHECK-OUTLINE-LLSC-O0:       // %bb.0:218; CHECK-OUTLINE-LLSC-O0-NEXT:    sub sp, sp, #32219; CHECK-OUTLINE-LLSC-O0-NEXT:    str x30, [sp, #16] // 8-byte Spill220; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_def_cfa_offset 32221; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_offset w30, -16222; CHECK-OUTLINE-LLSC-O0-NEXT:    str x0, [sp, #8] // 8-byte Spill223; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x0, x2224; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x1, x3225; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x2, x4226; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x4, [sp, #8] // 8-byte Reload227; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x3, x5228; CHECK-OUTLINE-LLSC-O0-NEXT:    bl __aarch64_cas16_acq_rel229; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x8, x0230; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x0, [sp, #8] // 8-byte Reload231; CHECK-OUTLINE-LLSC-O0-NEXT:    // implicit-def: $q0232; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[0], x8233; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[1], x1234; CHECK-OUTLINE-LLSC-O0-NEXT:    str q0, [x0]235; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x30, [sp, #16] // 8-byte Reload236; CHECK-OUTLINE-LLSC-O0-NEXT:    add sp, sp, #32237; CHECK-OUTLINE-LLSC-O0-NEXT:    ret238;239; CHECK-CAS-O0-LABEL: val_compare_and_swap_monotonic_seqcst:240; CHECK-CAS-O0:       // %bb.0:241; CHECK-CAS-O0-NEXT:    sub sp, sp, #16242; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16243; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Spill244; CHECK-CAS-O0-NEXT:    mov x1, x5245; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Reload246; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3247; CHECK-CAS-O0-NEXT:    mov x3, x5248; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5249; CHECK-CAS-O0-NEXT:    mov x5, x1250; CHECK-CAS-O0-NEXT:    caspal x2, x3, x4, x5, [x0]251; CHECK-CAS-O0-NEXT:    mov x9, x2252; CHECK-CAS-O0-NEXT:    mov x8, x3253; CHECK-CAS-O0-NEXT:    // implicit-def: $q0254; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9255; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8256; CHECK-CAS-O0-NEXT:    str q0, [x0]257; CHECK-CAS-O0-NEXT:    add sp, sp, #16258; CHECK-CAS-O0-NEXT:    ret259 260  %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval monotonic seq_cst261  %val = extractvalue { i128, i1 } %pair, 0262  store i128 %val, ptr %p263  ret void264}265 266define void @val_compare_and_swap_release_acquire(ptr %p, i128 %oldval, i128 %newval) {267; CHECK-LLSC-O1-LABEL: val_compare_and_swap_release_acquire:268; CHECK-LLSC-O1:       // %bb.0:269; CHECK-LLSC-O1-NEXT:  .LBB2_1: // =>This Inner Loop Header: Depth=1270; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]271; CHECK-LLSC-O1-NEXT:    cmp x8, x2272; CHECK-LLSC-O1-NEXT:    cset w10, ne273; CHECK-LLSC-O1-NEXT:    cmp x9, x3274; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne275; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB2_3276; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB2_1 Depth=1277; CHECK-LLSC-O1-NEXT:    stlxp w10, x8, x9, [x0]278; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB2_1279; CHECK-LLSC-O1-NEXT:    b .LBB2_4280; CHECK-LLSC-O1-NEXT:  .LBB2_3: // in Loop: Header=BB2_1 Depth=1281; CHECK-LLSC-O1-NEXT:    stlxp w10, x4, x5, [x0]282; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB2_1283; CHECK-LLSC-O1-NEXT:  .LBB2_4:284; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8285; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9286; CHECK-LLSC-O1-NEXT:    str q0, [x0]287; CHECK-LLSC-O1-NEXT:    ret288;289; CHECK-OUTLINE-LLSC-O1-LABEL: val_compare_and_swap_release_acquire:290; CHECK-OUTLINE-LLSC-O1:       // %bb.0:291; CHECK-OUTLINE-LLSC-O1-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill292; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_def_cfa_offset 16293; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w19, -8294; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w30, -16295; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x19, x0296; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x0, x2297; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x1, x3298; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x2, x4299; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x3, x5300; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x4, x19301; CHECK-OUTLINE-LLSC-O1-NEXT:    bl __aarch64_cas16_acq_rel302; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[0], x0303; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[1], x1304; CHECK-OUTLINE-LLSC-O1-NEXT:    str q0, [x19]305; CHECK-OUTLINE-LLSC-O1-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload306; CHECK-OUTLINE-LLSC-O1-NEXT:    ret307;308; CHECK-CAS-O1-LABEL: val_compare_and_swap_release_acquire:309; CHECK-CAS-O1:       // %bb.0:310; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3311; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5312; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3313; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5314; CHECK-CAS-O1-NEXT:    caspal x2, x3, x4, x5, [x0]315; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2316; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3317; CHECK-CAS-O1-NEXT:    str q0, [x0]318; CHECK-CAS-O1-NEXT:    ret319;320; CHECK-LLSC-O0-LABEL: val_compare_and_swap_release_acquire:321; CHECK-LLSC-O0:       // %bb.0:322; CHECK-LLSC-O0-NEXT:  .LBB2_1: // =>This Inner Loop Header: Depth=1323; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]324; CHECK-LLSC-O0-NEXT:    cmp x9, x2325; CHECK-LLSC-O0-NEXT:    cset w10, ne326; CHECK-LLSC-O0-NEXT:    cmp x8, x3327; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne328; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB2_3329; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB2_1 Depth=1330; CHECK-LLSC-O0-NEXT:    stlxp w10, x4, x5, [x0]331; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB2_1332; CHECK-LLSC-O0-NEXT:    b .LBB2_4333; CHECK-LLSC-O0-NEXT:  .LBB2_3: // in Loop: Header=BB2_1 Depth=1334; CHECK-LLSC-O0-NEXT:    stlxp w10, x9, x8, [x0]335; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB2_1336; CHECK-LLSC-O0-NEXT:  .LBB2_4:337; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0338; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9339; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8340; CHECK-LLSC-O0-NEXT:    str q0, [x0]341; CHECK-LLSC-O0-NEXT:    ret342;343; CHECK-OUTLINE-LLSC-O0-LABEL: val_compare_and_swap_release_acquire:344; CHECK-OUTLINE-LLSC-O0:       // %bb.0:345; CHECK-OUTLINE-LLSC-O0-NEXT:    sub sp, sp, #32346; CHECK-OUTLINE-LLSC-O0-NEXT:    str x30, [sp, #16] // 8-byte Spill347; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_def_cfa_offset 32348; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_offset w30, -16349; CHECK-OUTLINE-LLSC-O0-NEXT:    str x0, [sp, #8] // 8-byte Spill350; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x0, x2351; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x1, x3352; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x2, x4353; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x4, [sp, #8] // 8-byte Reload354; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x3, x5355; CHECK-OUTLINE-LLSC-O0-NEXT:    bl __aarch64_cas16_acq_rel356; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x8, x0357; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x0, [sp, #8] // 8-byte Reload358; CHECK-OUTLINE-LLSC-O0-NEXT:    // implicit-def: $q0359; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[0], x8360; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[1], x1361; CHECK-OUTLINE-LLSC-O0-NEXT:    str q0, [x0]362; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x30, [sp, #16] // 8-byte Reload363; CHECK-OUTLINE-LLSC-O0-NEXT:    add sp, sp, #32364; CHECK-OUTLINE-LLSC-O0-NEXT:    ret365;366; CHECK-CAS-O0-LABEL: val_compare_and_swap_release_acquire:367; CHECK-CAS-O0:       // %bb.0:368; CHECK-CAS-O0-NEXT:    sub sp, sp, #16369; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16370; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Spill371; CHECK-CAS-O0-NEXT:    mov x1, x5372; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Reload373; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3374; CHECK-CAS-O0-NEXT:    mov x3, x5375; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5376; CHECK-CAS-O0-NEXT:    mov x5, x1377; CHECK-CAS-O0-NEXT:    caspal x2, x3, x4, x5, [x0]378; CHECK-CAS-O0-NEXT:    mov x9, x2379; CHECK-CAS-O0-NEXT:    mov x8, x3380; CHECK-CAS-O0-NEXT:    // implicit-def: $q0381; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9382; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8383; CHECK-CAS-O0-NEXT:    str q0, [x0]384; CHECK-CAS-O0-NEXT:    add sp, sp, #16385; CHECK-CAS-O0-NEXT:    ret386 387  %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval release acquire388  %val = extractvalue { i128, i1 } %pair, 0389  store i128 %val, ptr %p390  ret void391}392 393define void @val_compare_and_swap_monotonic(ptr %p, i128 %oldval, i128 %newval) {394; CHECK-LLSC-O1-LABEL: val_compare_and_swap_monotonic:395; CHECK-LLSC-O1:       // %bb.0:396; CHECK-LLSC-O1-NEXT:  .LBB3_1: // =>This Inner Loop Header: Depth=1397; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]398; CHECK-LLSC-O1-NEXT:    cmp x8, x2399; CHECK-LLSC-O1-NEXT:    cset w10, ne400; CHECK-LLSC-O1-NEXT:    cmp x9, x3401; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne402; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB3_3403; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB3_1 Depth=1404; CHECK-LLSC-O1-NEXT:    stlxp w10, x8, x9, [x0]405; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB3_1406; CHECK-LLSC-O1-NEXT:    b .LBB3_4407; CHECK-LLSC-O1-NEXT:  .LBB3_3: // in Loop: Header=BB3_1 Depth=1408; CHECK-LLSC-O1-NEXT:    stlxp w10, x4, x5, [x0]409; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB3_1410; CHECK-LLSC-O1-NEXT:  .LBB3_4:411; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8412; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9413; CHECK-LLSC-O1-NEXT:    str q0, [x0]414; CHECK-LLSC-O1-NEXT:    ret415;416; CHECK-OUTLINE-LLSC-O1-LABEL: val_compare_and_swap_monotonic:417; CHECK-OUTLINE-LLSC-O1:       // %bb.0:418; CHECK-OUTLINE-LLSC-O1-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill419; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_def_cfa_offset 16420; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w19, -8421; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w30, -16422; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x19, x0423; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x0, x2424; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x1, x3425; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x2, x4426; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x3, x5427; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x4, x19428; CHECK-OUTLINE-LLSC-O1-NEXT:    bl __aarch64_cas16_acq_rel429; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[0], x0430; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[1], x1431; CHECK-OUTLINE-LLSC-O1-NEXT:    str q0, [x19]432; CHECK-OUTLINE-LLSC-O1-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload433; CHECK-OUTLINE-LLSC-O1-NEXT:    ret434;435; CHECK-CAS-O1-LABEL: val_compare_and_swap_monotonic:436; CHECK-CAS-O1:       // %bb.0:437; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3438; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5439; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3440; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5441; CHECK-CAS-O1-NEXT:    caspal x2, x3, x4, x5, [x0]442; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2443; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3444; CHECK-CAS-O1-NEXT:    str q0, [x0]445; CHECK-CAS-O1-NEXT:    ret446;447; CHECK-LLSC-O0-LABEL: val_compare_and_swap_monotonic:448; CHECK-LLSC-O0:       // %bb.0:449; CHECK-LLSC-O0-NEXT:  .LBB3_1: // =>This Inner Loop Header: Depth=1450; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]451; CHECK-LLSC-O0-NEXT:    cmp x9, x2452; CHECK-LLSC-O0-NEXT:    cset w10, ne453; CHECK-LLSC-O0-NEXT:    cmp x8, x3454; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne455; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB3_3456; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB3_1 Depth=1457; CHECK-LLSC-O0-NEXT:    stlxp w10, x4, x5, [x0]458; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB3_1459; CHECK-LLSC-O0-NEXT:    b .LBB3_4460; CHECK-LLSC-O0-NEXT:  .LBB3_3: // in Loop: Header=BB3_1 Depth=1461; CHECK-LLSC-O0-NEXT:    stlxp w10, x9, x8, [x0]462; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB3_1463; CHECK-LLSC-O0-NEXT:  .LBB3_4:464; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0465; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9466; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8467; CHECK-LLSC-O0-NEXT:    str q0, [x0]468; CHECK-LLSC-O0-NEXT:    ret469;470; CHECK-OUTLINE-LLSC-O0-LABEL: val_compare_and_swap_monotonic:471; CHECK-OUTLINE-LLSC-O0:       // %bb.0:472; CHECK-OUTLINE-LLSC-O0-NEXT:    sub sp, sp, #32473; CHECK-OUTLINE-LLSC-O0-NEXT:    str x30, [sp, #16] // 8-byte Spill474; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_def_cfa_offset 32475; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_offset w30, -16476; CHECK-OUTLINE-LLSC-O0-NEXT:    str x0, [sp, #8] // 8-byte Spill477; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x0, x2478; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x1, x3479; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x2, x4480; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x4, [sp, #8] // 8-byte Reload481; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x3, x5482; CHECK-OUTLINE-LLSC-O0-NEXT:    bl __aarch64_cas16_acq_rel483; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x8, x0484; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x0, [sp, #8] // 8-byte Reload485; CHECK-OUTLINE-LLSC-O0-NEXT:    // implicit-def: $q0486; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[0], x8487; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[1], x1488; CHECK-OUTLINE-LLSC-O0-NEXT:    str q0, [x0]489; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x30, [sp, #16] // 8-byte Reload490; CHECK-OUTLINE-LLSC-O0-NEXT:    add sp, sp, #32491; CHECK-OUTLINE-LLSC-O0-NEXT:    ret492;493; CHECK-CAS-O0-LABEL: val_compare_and_swap_monotonic:494; CHECK-CAS-O0:       // %bb.0:495; CHECK-CAS-O0-NEXT:    sub sp, sp, #16496; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16497; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Spill498; CHECK-CAS-O0-NEXT:    mov x1, x5499; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Reload500; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3501; CHECK-CAS-O0-NEXT:    mov x3, x5502; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5503; CHECK-CAS-O0-NEXT:    mov x5, x1504; CHECK-CAS-O0-NEXT:    caspal x2, x3, x4, x5, [x0]505; CHECK-CAS-O0-NEXT:    mov x9, x2506; CHECK-CAS-O0-NEXT:    mov x8, x3507; CHECK-CAS-O0-NEXT:    // implicit-def: $q0508; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9509; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8510; CHECK-CAS-O0-NEXT:    str q0, [x0]511; CHECK-CAS-O0-NEXT:    add sp, sp, #16512; CHECK-CAS-O0-NEXT:    ret513  %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval release acquire514  %val = extractvalue { i128, i1 } %pair, 0515  store i128 %val, ptr %p516  ret void517}518 519define void @atomic_load_relaxed(i64, i64, ptr %p, ptr %p2) {520; CHECK-LLSC-O1-LABEL: atomic_load_relaxed:521; CHECK-LLSC-O1:       // %bb.0:522; CHECK-LLSC-O1-NEXT:  .LBB4_1: // %atomicrmw.start523; CHECK-LLSC-O1-NEXT:    // =>This Inner Loop Header: Depth=1524; CHECK-LLSC-O1-NEXT:    ldxp x9, x8, [x2]525; CHECK-LLSC-O1-NEXT:    stxp w10, x9, x8, [x2]526; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB4_1527; CHECK-LLSC-O1-NEXT:  // %bb.2: // %atomicrmw.end528; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x9529; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x8530; CHECK-LLSC-O1-NEXT:    str q0, [x3]531; CHECK-LLSC-O1-NEXT:    ret532;533; CHECK-OUTLINE-LLSC-O1-LABEL: atomic_load_relaxed:534; CHECK-OUTLINE-LLSC-O1:       // %bb.0:535; CHECK-OUTLINE-LLSC-O1-NEXT:  .LBB4_1: // %atomicrmw.start536; CHECK-OUTLINE-LLSC-O1-NEXT:    // =>This Inner Loop Header: Depth=1537; CHECK-OUTLINE-LLSC-O1-NEXT:    ldxp x9, x8, [x2]538; CHECK-OUTLINE-LLSC-O1-NEXT:    stxp w10, x9, x8, [x2]539; CHECK-OUTLINE-LLSC-O1-NEXT:    cbnz w10, .LBB4_1540; CHECK-OUTLINE-LLSC-O1-NEXT:  // %bb.2: // %atomicrmw.end541; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[0], x9542; CHECK-OUTLINE-LLSC-O1-NEXT:    mov v0.d[1], x8543; CHECK-OUTLINE-LLSC-O1-NEXT:    str q0, [x3]544; CHECK-OUTLINE-LLSC-O1-NEXT:    ret545;546; CHECK-CAS-O1-LABEL: atomic_load_relaxed:547; CHECK-CAS-O1:       // %bb.0:548; CHECK-CAS-O1-NEXT:    mov x0, xzr549; CHECK-CAS-O1-NEXT:    mov x1, xzr550; CHECK-CAS-O1-NEXT:    casp x0, x1, x0, x1, [x2]551; CHECK-CAS-O1-NEXT:    mov v0.d[0], x0552; CHECK-CAS-O1-NEXT:    mov v0.d[1], x1553; CHECK-CAS-O1-NEXT:    str q0, [x3]554; CHECK-CAS-O1-NEXT:    ret555;556; CHECK-LLSC-O0-LABEL: atomic_load_relaxed:557; CHECK-LLSC-O0:       // %bb.0:558; CHECK-LLSC-O0-NEXT:    mov x11, xzr559; CHECK-LLSC-O0-NEXT:  .LBB4_1: // =>This Inner Loop Header: Depth=1560; CHECK-LLSC-O0-NEXT:    ldxp x9, x8, [x2]561; CHECK-LLSC-O0-NEXT:    cmp x9, x11562; CHECK-LLSC-O0-NEXT:    cset w10, ne563; CHECK-LLSC-O0-NEXT:    cmp x8, x11564; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne565; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB4_3566; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB4_1 Depth=1567; CHECK-LLSC-O0-NEXT:    stxp w10, x11, x11, [x2]568; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB4_1569; CHECK-LLSC-O0-NEXT:    b .LBB4_4570; CHECK-LLSC-O0-NEXT:  .LBB4_3: // in Loop: Header=BB4_1 Depth=1571; CHECK-LLSC-O0-NEXT:    stxp w10, x9, x8, [x2]572; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB4_1573; CHECK-LLSC-O0-NEXT:  .LBB4_4:574; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0575; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9576; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8577; CHECK-LLSC-O0-NEXT:    str q0, [x3]578; CHECK-LLSC-O0-NEXT:    ret579;580; CHECK-OUTLINE-LLSC-O0-LABEL: atomic_load_relaxed:581; CHECK-OUTLINE-LLSC-O0:       // %bb.0:582; CHECK-OUTLINE-LLSC-O0-NEXT:    sub sp, sp, #32583; CHECK-OUTLINE-LLSC-O0-NEXT:    str x30, [sp, #16] // 8-byte Spill584; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_def_cfa_offset 32585; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_offset w30, -16586; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x4, x2587; CHECK-OUTLINE-LLSC-O0-NEXT:    str x3, [sp, #8] // 8-byte Spill588; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x3, xzr589; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x0, x3590; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x1, x3591; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x2, x3592; CHECK-OUTLINE-LLSC-O0-NEXT:    bl __aarch64_cas16_relax593; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x3, [sp, #8] // 8-byte Reload594; CHECK-OUTLINE-LLSC-O0-NEXT:    // implicit-def: $q0595; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[0], x0596; CHECK-OUTLINE-LLSC-O0-NEXT:    mov v0.d[1], x1597; CHECK-OUTLINE-LLSC-O0-NEXT:    str q0, [x3]598; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x30, [sp, #16] // 8-byte Reload599; CHECK-OUTLINE-LLSC-O0-NEXT:    add sp, sp, #32600; CHECK-OUTLINE-LLSC-O0-NEXT:    ret601;602; CHECK-CAS-O0-LABEL: atomic_load_relaxed:603; CHECK-CAS-O0:       // %bb.0:604; CHECK-CAS-O0-NEXT:    mov x8, xzr605; CHECK-CAS-O0-NEXT:    mov x0, x8606; CHECK-CAS-O0-NEXT:    mov x1, x8607; CHECK-CAS-O0-NEXT:    mov x4, x8608; CHECK-CAS-O0-NEXT:    mov x5, x8609; CHECK-CAS-O0-NEXT:    casp x0, x1, x4, x5, [x2]610; CHECK-CAS-O0-NEXT:    mov x9, x0611; CHECK-CAS-O0-NEXT:    mov x8, x1612; CHECK-CAS-O0-NEXT:    // implicit-def: $q0613; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9614; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8615; CHECK-CAS-O0-NEXT:    str q0, [x3]616; CHECK-CAS-O0-NEXT:    ret617 618    %r = load atomic i128, ptr %p monotonic, align 16619    store i128 %r, ptr %p2620    ret void621}622 623define i128 @val_compare_and_swap_return(ptr %p, i128 %oldval, i128 %newval) {624; CHECK-LLSC-O1-LABEL: val_compare_and_swap_return:625; CHECK-LLSC-O1:       // %bb.0:626; CHECK-LLSC-O1-NEXT:  .LBB5_1: // =>This Inner Loop Header: Depth=1627; CHECK-LLSC-O1-NEXT:    ldaxp x8, x1, [x0]628; CHECK-LLSC-O1-NEXT:    cmp x8, x2629; CHECK-LLSC-O1-NEXT:    cset w9, ne630; CHECK-LLSC-O1-NEXT:    cmp x1, x3631; CHECK-LLSC-O1-NEXT:    cinc w9, w9, ne632; CHECK-LLSC-O1-NEXT:    cbz w9, .LBB5_3633; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB5_1 Depth=1634; CHECK-LLSC-O1-NEXT:    stxp w9, x8, x1, [x0]635; CHECK-LLSC-O1-NEXT:    cbnz w9, .LBB5_1636; CHECK-LLSC-O1-NEXT:    b .LBB5_4637; CHECK-LLSC-O1-NEXT:  .LBB5_3: // in Loop: Header=BB5_1 Depth=1638; CHECK-LLSC-O1-NEXT:    stxp w9, x4, x5, [x0]639; CHECK-LLSC-O1-NEXT:    cbnz w9, .LBB5_1640; CHECK-LLSC-O1-NEXT:  .LBB5_4:641; CHECK-LLSC-O1-NEXT:    mov x0, x8642; CHECK-LLSC-O1-NEXT:    ret643;644; CHECK-OUTLINE-LLSC-O1-LABEL: val_compare_and_swap_return:645; CHECK-OUTLINE-LLSC-O1:       // %bb.0:646; CHECK-OUTLINE-LLSC-O1-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill647; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_def_cfa_offset 16648; CHECK-OUTLINE-LLSC-O1-NEXT:    .cfi_offset w30, -16649; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x6, x0650; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x0, x2651; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x1, x3652; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x2, x4653; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x3, x5654; CHECK-OUTLINE-LLSC-O1-NEXT:    mov x4, x6655; CHECK-OUTLINE-LLSC-O1-NEXT:    bl __aarch64_cas16_acq656; CHECK-OUTLINE-LLSC-O1-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload657; CHECK-OUTLINE-LLSC-O1-NEXT:    ret658;659; CHECK-CAS-O1-LABEL: val_compare_and_swap_return:660; CHECK-CAS-O1:       // %bb.0:661; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3662; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5663; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3664; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5665; CHECK-CAS-O1-NEXT:    caspa x2, x3, x4, x5, [x0]666; CHECK-CAS-O1-NEXT:    mov x0, x2667; CHECK-CAS-O1-NEXT:    mov x1, x3668; CHECK-CAS-O1-NEXT:    ret669;670; CHECK-LLSC-O0-LABEL: val_compare_and_swap_return:671; CHECK-LLSC-O0:       // %bb.0:672; CHECK-LLSC-O0-NEXT:    mov x9, x0673; CHECK-LLSC-O0-NEXT:  .LBB5_1: // =>This Inner Loop Header: Depth=1674; CHECK-LLSC-O0-NEXT:    ldaxp x0, x1, [x9]675; CHECK-LLSC-O0-NEXT:    cmp x0, x2676; CHECK-LLSC-O0-NEXT:    cset w8, ne677; CHECK-LLSC-O0-NEXT:    cmp x1, x3678; CHECK-LLSC-O0-NEXT:    cinc w8, w8, ne679; CHECK-LLSC-O0-NEXT:    cbnz w8, .LBB5_3680; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB5_1 Depth=1681; CHECK-LLSC-O0-NEXT:    stxp w8, x4, x5, [x9]682; CHECK-LLSC-O0-NEXT:    cbnz w8, .LBB5_1683; CHECK-LLSC-O0-NEXT:    b .LBB5_4684; CHECK-LLSC-O0-NEXT:  .LBB5_3: // in Loop: Header=BB5_1 Depth=1685; CHECK-LLSC-O0-NEXT:    stxp w8, x0, x1, [x9]686; CHECK-LLSC-O0-NEXT:    cbnz w8, .LBB5_1687; CHECK-LLSC-O0-NEXT:  .LBB5_4:688; CHECK-LLSC-O0-NEXT:    ret689;690; CHECK-OUTLINE-LLSC-O0-LABEL: val_compare_and_swap_return:691; CHECK-OUTLINE-LLSC-O0:       // %bb.0:692; CHECK-OUTLINE-LLSC-O0-NEXT:    sub sp, sp, #32693; CHECK-OUTLINE-LLSC-O0-NEXT:    str x30, [sp, #16] // 8-byte Spill694; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_def_cfa_offset 32695; CHECK-OUTLINE-LLSC-O0-NEXT:    .cfi_offset w30, -16696; CHECK-OUTLINE-LLSC-O0-NEXT:    str x0, [sp, #8] // 8-byte Spill697; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x0, x2698; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x1, x3699; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x2, x4700; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x4, [sp, #8] // 8-byte Reload701; CHECK-OUTLINE-LLSC-O0-NEXT:    mov x3, x5702; CHECK-OUTLINE-LLSC-O0-NEXT:    bl __aarch64_cas16_acq703; CHECK-OUTLINE-LLSC-O0-NEXT:    ldr x30, [sp, #16] // 8-byte Reload704; CHECK-OUTLINE-LLSC-O0-NEXT:    add sp, sp, #32705; CHECK-OUTLINE-LLSC-O0-NEXT:    ret706;707; CHECK-CAS-O0-LABEL: val_compare_and_swap_return:708; CHECK-CAS-O0:       // %bb.0:709; CHECK-CAS-O0-NEXT:    mov x8, x0710; CHECK-CAS-O0-NEXT:    mov x1, x3711; CHECK-CAS-O0-NEXT:    mov x0, x4712; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3713; CHECK-CAS-O0-NEXT:    mov x3, x1714; CHECK-CAS-O0-NEXT:    // kill: def $x0 killed $x0 def $x0_x1715; CHECK-CAS-O0-NEXT:    mov x1, x5716; CHECK-CAS-O0-NEXT:    caspa x2, x3, x0, x1, [x8]717; CHECK-CAS-O0-NEXT:    mov x0, x2718; CHECK-CAS-O0-NEXT:    mov x1, x3719; CHECK-CAS-O0-NEXT:    ret720 721  %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval acquire acquire722  %val = extractvalue { i128, i1 } %pair, 0723  ret i128 %val724}725