1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-NOLSE,CHECK-NOLSE-O1 3; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-NOLSE,CHECK-NOLSE-O0 4; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mcpu=apple-a13 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O1 5; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mcpu=apple-a13 -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LSE-O0 6; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mattr=+rcpc,+ldapr -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LDAPR-O1 7; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel -global-isel-abort=1 -mattr=+rcpc,+ldapr -O0 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK-LDAPR-O0 8 9define i32 @val_compare_and_swap(i32* %p, i32 %cmp, i32 %new) #0 { 10; CHECK-NOLSE-O1-LABEL: val_compare_and_swap: 11; CHECK-NOLSE-O1: ; %bb.0: 12; CHECK-NOLSE-O1-NEXT: LBB0_1: ; %cmpxchg.start 13; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 14; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0] 15; CHECK-NOLSE-O1-NEXT: cmp w8, w1 16; CHECK-NOLSE-O1-NEXT: b.ne LBB0_4 17; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 18; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB0_1 Depth=1 19; CHECK-NOLSE-O1-NEXT: stxr w9, w2, [x0] 20; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB0_1 21; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end 22; CHECK-NOLSE-O1-NEXT: mov w0, w8 23; CHECK-NOLSE-O1-NEXT: ret 24; CHECK-NOLSE-O1-NEXT: LBB0_4: ; %cmpxchg.nostore 25; CHECK-NOLSE-O1-NEXT: clrex 26; CHECK-NOLSE-O1-NEXT: mov w0, w8 27; CHECK-NOLSE-O1-NEXT: ret 28; 29; CHECK-NOLSE-O0-LABEL: val_compare_and_swap: 30; CHECK-NOLSE-O0: ; %bb.0: 31; CHECK-NOLSE-O0-NEXT: mov x9, x0 32; CHECK-NOLSE-O0-NEXT: LBB0_1: ; =>This Inner Loop Header: Depth=1 33; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9] 34; CHECK-NOLSE-O0-NEXT: cmp w0, w1 35; CHECK-NOLSE-O0-NEXT: b.ne LBB0_3 36; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB0_1 Depth=1 37; CHECK-NOLSE-O0-NEXT: stlxr w8, w2, [x9] 38; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB0_1 39; CHECK-NOLSE-O0-NEXT: LBB0_3: 40; CHECK-NOLSE-O0-NEXT: ret 41; 42; CHECK-LSE-O1-LABEL: val_compare_and_swap: 43; CHECK-LSE-O1: ; %bb.0: 44; CHECK-LSE-O1-NEXT: casa w1, w2, [x0] 45; CHECK-LSE-O1-NEXT: mov x0, x1 46; CHECK-LSE-O1-NEXT: ret 47; 48; CHECK-LSE-O0-LABEL: val_compare_and_swap: 49; CHECK-LSE-O0: ; %bb.0: 50; CHECK-LSE-O0-NEXT: mov x8, x0 51; CHECK-LSE-O0-NEXT: mov x0, x1 52; CHECK-LSE-O0-NEXT: casa w0, w2, [x8] 53; CHECK-LSE-O0-NEXT: ret 54; 55; CHECK-LDAPR-O1-LABEL: val_compare_and_swap: 56; CHECK-LDAPR-O1: ; %bb.0: 57; CHECK-LDAPR-O1-NEXT: LBB0_1: ; %cmpxchg.start 58; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 59; CHECK-LDAPR-O1-NEXT: ldaxr w8, [x0] 60; CHECK-LDAPR-O1-NEXT: cmp w8, w1 61; CHECK-LDAPR-O1-NEXT: b.ne LBB0_4 62; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 63; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB0_1 Depth=1 64; CHECK-LDAPR-O1-NEXT: stxr w9, w2, [x0] 65; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB0_1 66; CHECK-LDAPR-O1-NEXT: ; %bb.3: ; %cmpxchg.end 67; CHECK-LDAPR-O1-NEXT: mov w0, w8 68; CHECK-LDAPR-O1-NEXT: ret 69; CHECK-LDAPR-O1-NEXT: LBB0_4: ; %cmpxchg.nostore 70; CHECK-LDAPR-O1-NEXT: clrex 71; CHECK-LDAPR-O1-NEXT: mov w0, w8 72; CHECK-LDAPR-O1-NEXT: ret 73; 74; CHECK-LDAPR-O0-LABEL: val_compare_and_swap: 75; CHECK-LDAPR-O0: ; %bb.0: 76; CHECK-LDAPR-O0-NEXT: mov x9, x0 77; CHECK-LDAPR-O0-NEXT: LBB0_1: ; =>This Inner Loop Header: Depth=1 78; CHECK-LDAPR-O0-NEXT: ldaxr w0, [x9] 79; CHECK-LDAPR-O0-NEXT: cmp w0, w1 80; CHECK-LDAPR-O0-NEXT: b.ne LBB0_3 81; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB0_1 Depth=1 82; CHECK-LDAPR-O0-NEXT: stlxr w8, w2, [x9] 83; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB0_1 84; CHECK-LDAPR-O0-NEXT: LBB0_3: 85; CHECK-LDAPR-O0-NEXT: ret 86 %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acquire acquire 87 %val = extractvalue { i32, i1 } %pair, 0 88 ret i32 %val 89} 90 91define i32 @val_compare_and_swap_from_load(i32* %p, i32 %cmp, i32* %pnew) #0 { 92; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_from_load: 93; CHECK-NOLSE-O1: ; %bb.0: 94; CHECK-NOLSE-O1-NEXT: ldr w9, [x2] 95; CHECK-NOLSE-O1-NEXT: LBB1_1: ; %cmpxchg.start 96; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 97; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0] 98; CHECK-NOLSE-O1-NEXT: cmp w8, w1 99; CHECK-NOLSE-O1-NEXT: b.ne LBB1_4 100; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 101; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB1_1 Depth=1 102; CHECK-NOLSE-O1-NEXT: stxr w10, w9, [x0] 103; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB1_1 104; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end 105; CHECK-NOLSE-O1-NEXT: mov w0, w8 106; CHECK-NOLSE-O1-NEXT: ret 107; CHECK-NOLSE-O1-NEXT: LBB1_4: ; %cmpxchg.nostore 108; CHECK-NOLSE-O1-NEXT: clrex 109; CHECK-NOLSE-O1-NEXT: mov w0, w8 110; CHECK-NOLSE-O1-NEXT: ret 111; 112; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_from_load: 113; CHECK-NOLSE-O0: ; %bb.0: 114; CHECK-NOLSE-O0-NEXT: mov x9, x0 115; CHECK-NOLSE-O0-NEXT: ldr w10, [x2] 116; CHECK-NOLSE-O0-NEXT: LBB1_1: ; =>This Inner Loop Header: Depth=1 117; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9] 118; CHECK-NOLSE-O0-NEXT: cmp w0, w1 119; CHECK-NOLSE-O0-NEXT: b.ne LBB1_3 120; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB1_1 Depth=1 121; CHECK-NOLSE-O0-NEXT: stlxr w8, w10, [x9] 122; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB1_1 123; CHECK-NOLSE-O0-NEXT: LBB1_3: 124; CHECK-NOLSE-O0-NEXT: ret 125; 126; CHECK-LSE-O1-LABEL: val_compare_and_swap_from_load: 127; CHECK-LSE-O1: ; %bb.0: 128; CHECK-LSE-O1-NEXT: ldr w8, [x2] 129; CHECK-LSE-O1-NEXT: casa w1, w8, [x0] 130; CHECK-LSE-O1-NEXT: mov x0, x1 131; CHECK-LSE-O1-NEXT: ret 132; 133; CHECK-LSE-O0-LABEL: val_compare_and_swap_from_load: 134; CHECK-LSE-O0: ; %bb.0: 135; CHECK-LSE-O0-NEXT: mov x9, x0 136; CHECK-LSE-O0-NEXT: mov x0, x1 137; CHECK-LSE-O0-NEXT: ldr w8, [x2] 138; CHECK-LSE-O0-NEXT: casa w0, w8, [x9] 139; CHECK-LSE-O0-NEXT: ret 140; 141; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_from_load: 142; CHECK-LDAPR-O1: ; %bb.0: 143; CHECK-LDAPR-O1-NEXT: ldr w9, [x2] 144; CHECK-LDAPR-O1-NEXT: LBB1_1: ; %cmpxchg.start 145; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 146; CHECK-LDAPR-O1-NEXT: ldaxr w8, [x0] 147; CHECK-LDAPR-O1-NEXT: cmp w8, w1 148; CHECK-LDAPR-O1-NEXT: b.ne LBB1_4 149; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 150; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB1_1 Depth=1 151; CHECK-LDAPR-O1-NEXT: stxr w10, w9, [x0] 152; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB1_1 153; CHECK-LDAPR-O1-NEXT: ; %bb.3: ; %cmpxchg.end 154; CHECK-LDAPR-O1-NEXT: mov w0, w8 155; CHECK-LDAPR-O1-NEXT: ret 156; CHECK-LDAPR-O1-NEXT: LBB1_4: ; %cmpxchg.nostore 157; CHECK-LDAPR-O1-NEXT: clrex 158; CHECK-LDAPR-O1-NEXT: mov w0, w8 159; CHECK-LDAPR-O1-NEXT: ret 160; 161; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_from_load: 162; CHECK-LDAPR-O0: ; %bb.0: 163; CHECK-LDAPR-O0-NEXT: mov x9, x0 164; CHECK-LDAPR-O0-NEXT: ldr w10, [x2] 165; CHECK-LDAPR-O0-NEXT: LBB1_1: ; =>This Inner Loop Header: Depth=1 166; CHECK-LDAPR-O0-NEXT: ldaxr w0, [x9] 167; CHECK-LDAPR-O0-NEXT: cmp w0, w1 168; CHECK-LDAPR-O0-NEXT: b.ne LBB1_3 169; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB1_1 Depth=1 170; CHECK-LDAPR-O0-NEXT: stlxr w8, w10, [x9] 171; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB1_1 172; CHECK-LDAPR-O0-NEXT: LBB1_3: 173; CHECK-LDAPR-O0-NEXT: ret 174 %new = load i32, i32* %pnew 175 %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acquire acquire 176 %val = extractvalue { i32, i1 } %pair, 0 177 ret i32 %val 178} 179 180define i32 @val_compare_and_swap_rel(i32* %p, i32 %cmp, i32 %new) #0 { 181; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_rel: 182; CHECK-NOLSE-O1: ; %bb.0: 183; CHECK-NOLSE-O1-NEXT: LBB2_1: ; %cmpxchg.start 184; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 185; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0] 186; CHECK-NOLSE-O1-NEXT: cmp w8, w1 187; CHECK-NOLSE-O1-NEXT: b.ne LBB2_4 188; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 189; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB2_1 Depth=1 190; CHECK-NOLSE-O1-NEXT: stlxr w9, w2, [x0] 191; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB2_1 192; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end 193; CHECK-NOLSE-O1-NEXT: mov w0, w8 194; CHECK-NOLSE-O1-NEXT: ret 195; CHECK-NOLSE-O1-NEXT: LBB2_4: ; %cmpxchg.nostore 196; CHECK-NOLSE-O1-NEXT: clrex 197; CHECK-NOLSE-O1-NEXT: mov w0, w8 198; CHECK-NOLSE-O1-NEXT: ret 199; 200; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_rel: 201; CHECK-NOLSE-O0: ; %bb.0: 202; CHECK-NOLSE-O0-NEXT: mov x9, x0 203; CHECK-NOLSE-O0-NEXT: LBB2_1: ; =>This Inner Loop Header: Depth=1 204; CHECK-NOLSE-O0-NEXT: ldaxr w0, [x9] 205; CHECK-NOLSE-O0-NEXT: cmp w0, w1 206; CHECK-NOLSE-O0-NEXT: b.ne LBB2_3 207; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB2_1 Depth=1 208; CHECK-NOLSE-O0-NEXT: stlxr w8, w2, [x9] 209; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB2_1 210; CHECK-NOLSE-O0-NEXT: LBB2_3: 211; CHECK-NOLSE-O0-NEXT: ret 212; 213; CHECK-LSE-O1-LABEL: val_compare_and_swap_rel: 214; CHECK-LSE-O1: ; %bb.0: 215; CHECK-LSE-O1-NEXT: casal w1, w2, [x0] 216; CHECK-LSE-O1-NEXT: mov x0, x1 217; CHECK-LSE-O1-NEXT: ret 218; 219; CHECK-LSE-O0-LABEL: val_compare_and_swap_rel: 220; CHECK-LSE-O0: ; %bb.0: 221; CHECK-LSE-O0-NEXT: mov x8, x0 222; CHECK-LSE-O0-NEXT: mov x0, x1 223; CHECK-LSE-O0-NEXT: casal w0, w2, [x8] 224; CHECK-LSE-O0-NEXT: ret 225; 226; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_rel: 227; CHECK-LDAPR-O1: ; %bb.0: 228; CHECK-LDAPR-O1-NEXT: LBB2_1: ; %cmpxchg.start 229; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 230; CHECK-LDAPR-O1-NEXT: ldaxr w8, [x0] 231; CHECK-LDAPR-O1-NEXT: cmp w8, w1 232; CHECK-LDAPR-O1-NEXT: b.ne LBB2_4 233; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 234; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB2_1 Depth=1 235; CHECK-LDAPR-O1-NEXT: stlxr w9, w2, [x0] 236; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB2_1 237; CHECK-LDAPR-O1-NEXT: ; %bb.3: ; %cmpxchg.end 238; CHECK-LDAPR-O1-NEXT: mov w0, w8 239; CHECK-LDAPR-O1-NEXT: ret 240; CHECK-LDAPR-O1-NEXT: LBB2_4: ; %cmpxchg.nostore 241; CHECK-LDAPR-O1-NEXT: clrex 242; CHECK-LDAPR-O1-NEXT: mov w0, w8 243; CHECK-LDAPR-O1-NEXT: ret 244; 245; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_rel: 246; CHECK-LDAPR-O0: ; %bb.0: 247; CHECK-LDAPR-O0-NEXT: mov x9, x0 248; CHECK-LDAPR-O0-NEXT: LBB2_1: ; =>This Inner Loop Header: Depth=1 249; CHECK-LDAPR-O0-NEXT: ldaxr w0, [x9] 250; CHECK-LDAPR-O0-NEXT: cmp w0, w1 251; CHECK-LDAPR-O0-NEXT: b.ne LBB2_3 252; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB2_1 Depth=1 253; CHECK-LDAPR-O0-NEXT: stlxr w8, w2, [x9] 254; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB2_1 255; CHECK-LDAPR-O0-NEXT: LBB2_3: 256; CHECK-LDAPR-O0-NEXT: ret 257 %pair = cmpxchg i32* %p, i32 %cmp, i32 %new acq_rel monotonic 258 %val = extractvalue { i32, i1 } %pair, 0 259 ret i32 %val 260} 261 262define i64 @val_compare_and_swap_64(i64* %p, i64 %cmp, i64 %new) #0 { 263; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64: 264; CHECK-NOLSE-O1: ; %bb.0: 265; CHECK-NOLSE-O1-NEXT: LBB3_1: ; %cmpxchg.start 266; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 267; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0] 268; CHECK-NOLSE-O1-NEXT: cmp x8, x1 269; CHECK-NOLSE-O1-NEXT: b.ne LBB3_4 270; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 271; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB3_1 Depth=1 272; CHECK-NOLSE-O1-NEXT: stxr w9, x2, [x0] 273; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB3_1 274; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end 275; CHECK-NOLSE-O1-NEXT: mov x0, x8 276; CHECK-NOLSE-O1-NEXT: ret 277; CHECK-NOLSE-O1-NEXT: LBB3_4: ; %cmpxchg.nostore 278; CHECK-NOLSE-O1-NEXT: clrex 279; CHECK-NOLSE-O1-NEXT: mov x0, x8 280; CHECK-NOLSE-O1-NEXT: ret 281; 282; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64: 283; CHECK-NOLSE-O0: ; %bb.0: 284; CHECK-NOLSE-O0-NEXT: mov x9, x0 285; CHECK-NOLSE-O0-NEXT: LBB3_1: ; =>This Inner Loop Header: Depth=1 286; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9] 287; CHECK-NOLSE-O0-NEXT: cmp x0, x1 288; CHECK-NOLSE-O0-NEXT: b.ne LBB3_3 289; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB3_1 Depth=1 290; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9] 291; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB3_1 292; CHECK-NOLSE-O0-NEXT: LBB3_3: 293; CHECK-NOLSE-O0-NEXT: ret 294; 295; CHECK-LSE-O1-LABEL: val_compare_and_swap_64: 296; CHECK-LSE-O1: ; %bb.0: 297; CHECK-LSE-O1-NEXT: cas x1, x2, [x0] 298; CHECK-LSE-O1-NEXT: mov x0, x1 299; CHECK-LSE-O1-NEXT: ret 300; 301; CHECK-LSE-O0-LABEL: val_compare_and_swap_64: 302; CHECK-LSE-O0: ; %bb.0: 303; CHECK-LSE-O0-NEXT: mov x8, x0 304; CHECK-LSE-O0-NEXT: mov x0, x1 305; CHECK-LSE-O0-NEXT: cas x0, x2, [x8] 306; CHECK-LSE-O0-NEXT: ret 307; 308; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_64: 309; CHECK-LDAPR-O1: ; %bb.0: 310; CHECK-LDAPR-O1-NEXT: LBB3_1: ; %cmpxchg.start 311; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 312; CHECK-LDAPR-O1-NEXT: ldxr x8, [x0] 313; CHECK-LDAPR-O1-NEXT: cmp x8, x1 314; CHECK-LDAPR-O1-NEXT: b.ne LBB3_4 315; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 316; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB3_1 Depth=1 317; CHECK-LDAPR-O1-NEXT: stxr w9, x2, [x0] 318; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB3_1 319; CHECK-LDAPR-O1-NEXT: ; %bb.3: ; %cmpxchg.end 320; CHECK-LDAPR-O1-NEXT: mov x0, x8 321; CHECK-LDAPR-O1-NEXT: ret 322; CHECK-LDAPR-O1-NEXT: LBB3_4: ; %cmpxchg.nostore 323; CHECK-LDAPR-O1-NEXT: clrex 324; CHECK-LDAPR-O1-NEXT: mov x0, x8 325; CHECK-LDAPR-O1-NEXT: ret 326; 327; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_64: 328; CHECK-LDAPR-O0: ; %bb.0: 329; CHECK-LDAPR-O0-NEXT: mov x9, x0 330; CHECK-LDAPR-O0-NEXT: LBB3_1: ; =>This Inner Loop Header: Depth=1 331; CHECK-LDAPR-O0-NEXT: ldaxr x0, [x9] 332; CHECK-LDAPR-O0-NEXT: cmp x0, x1 333; CHECK-LDAPR-O0-NEXT: b.ne LBB3_3 334; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB3_1 Depth=1 335; CHECK-LDAPR-O0-NEXT: stlxr w8, x2, [x9] 336; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB3_1 337; CHECK-LDAPR-O0-NEXT: LBB3_3: 338; CHECK-LDAPR-O0-NEXT: ret 339 %pair = cmpxchg i64* %p, i64 %cmp, i64 %new monotonic monotonic 340 %val = extractvalue { i64, i1 } %pair, 0 341 ret i64 %val 342} 343 344define i64 @val_compare_and_swap_64_monotonic_seqcst(i64* %p, i64 %cmp, i64 %new) #0 { 345; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst: 346; CHECK-NOLSE-O1: ; %bb.0: 347; CHECK-NOLSE-O1-NEXT: LBB4_1: ; %cmpxchg.start 348; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 349; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0] 350; CHECK-NOLSE-O1-NEXT: cmp x8, x1 351; CHECK-NOLSE-O1-NEXT: b.ne LBB4_4 352; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 353; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB4_1 Depth=1 354; CHECK-NOLSE-O1-NEXT: stlxr w9, x2, [x0] 355; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB4_1 356; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end 357; CHECK-NOLSE-O1-NEXT: mov x0, x8 358; CHECK-NOLSE-O1-NEXT: ret 359; CHECK-NOLSE-O1-NEXT: LBB4_4: ; %cmpxchg.nostore 360; CHECK-NOLSE-O1-NEXT: clrex 361; CHECK-NOLSE-O1-NEXT: mov x0, x8 362; CHECK-NOLSE-O1-NEXT: ret 363; 364; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst: 365; CHECK-NOLSE-O0: ; %bb.0: 366; CHECK-NOLSE-O0-NEXT: mov x9, x0 367; CHECK-NOLSE-O0-NEXT: LBB4_1: ; =>This Inner Loop Header: Depth=1 368; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9] 369; CHECK-NOLSE-O0-NEXT: cmp x0, x1 370; CHECK-NOLSE-O0-NEXT: b.ne LBB4_3 371; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB4_1 Depth=1 372; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9] 373; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB4_1 374; CHECK-NOLSE-O0-NEXT: LBB4_3: 375; CHECK-NOLSE-O0-NEXT: ret 376; 377; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst: 378; CHECK-LSE-O1: ; %bb.0: 379; CHECK-LSE-O1-NEXT: casal x1, x2, [x0] 380; CHECK-LSE-O1-NEXT: mov x0, x1 381; CHECK-LSE-O1-NEXT: ret 382; 383; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst: 384; CHECK-LSE-O0: ; %bb.0: 385; CHECK-LSE-O0-NEXT: mov x8, x0 386; CHECK-LSE-O0-NEXT: mov x0, x1 387; CHECK-LSE-O0-NEXT: casal x0, x2, [x8] 388; CHECK-LSE-O0-NEXT: ret 389; 390; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_64_monotonic_seqcst: 391; CHECK-LDAPR-O1: ; %bb.0: 392; CHECK-LDAPR-O1-NEXT: LBB4_1: ; %cmpxchg.start 393; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 394; CHECK-LDAPR-O1-NEXT: ldaxr x8, [x0] 395; CHECK-LDAPR-O1-NEXT: cmp x8, x1 396; CHECK-LDAPR-O1-NEXT: b.ne LBB4_4 397; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 398; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB4_1 Depth=1 399; CHECK-LDAPR-O1-NEXT: stlxr w9, x2, [x0] 400; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB4_1 401; CHECK-LDAPR-O1-NEXT: ; %bb.3: ; %cmpxchg.end 402; CHECK-LDAPR-O1-NEXT: mov x0, x8 403; CHECK-LDAPR-O1-NEXT: ret 404; CHECK-LDAPR-O1-NEXT: LBB4_4: ; %cmpxchg.nostore 405; CHECK-LDAPR-O1-NEXT: clrex 406; CHECK-LDAPR-O1-NEXT: mov x0, x8 407; CHECK-LDAPR-O1-NEXT: ret 408; 409; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_64_monotonic_seqcst: 410; CHECK-LDAPR-O0: ; %bb.0: 411; CHECK-LDAPR-O0-NEXT: mov x9, x0 412; CHECK-LDAPR-O0-NEXT: LBB4_1: ; =>This Inner Loop Header: Depth=1 413; CHECK-LDAPR-O0-NEXT: ldaxr x0, [x9] 414; CHECK-LDAPR-O0-NEXT: cmp x0, x1 415; CHECK-LDAPR-O0-NEXT: b.ne LBB4_3 416; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB4_1 Depth=1 417; CHECK-LDAPR-O0-NEXT: stlxr w8, x2, [x9] 418; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB4_1 419; CHECK-LDAPR-O0-NEXT: LBB4_3: 420; CHECK-LDAPR-O0-NEXT: ret 421 %pair = cmpxchg i64* %p, i64 %cmp, i64 %new monotonic seq_cst 422 %val = extractvalue { i64, i1 } %pair, 0 423 ret i64 %val 424} 425 426define i64 @val_compare_and_swap_64_release_acquire(i64* %p, i64 %cmp, i64 %new) #0 { 427; CHECK-NOLSE-O1-LABEL: val_compare_and_swap_64_release_acquire: 428; CHECK-NOLSE-O1: ; %bb.0: 429; CHECK-NOLSE-O1-NEXT: LBB5_1: ; %cmpxchg.start 430; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 431; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0] 432; CHECK-NOLSE-O1-NEXT: cmp x8, x1 433; CHECK-NOLSE-O1-NEXT: b.ne LBB5_4 434; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 435; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB5_1 Depth=1 436; CHECK-NOLSE-O1-NEXT: stlxr w9, x2, [x0] 437; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB5_1 438; CHECK-NOLSE-O1-NEXT: ; %bb.3: ; %cmpxchg.end 439; CHECK-NOLSE-O1-NEXT: mov x0, x8 440; CHECK-NOLSE-O1-NEXT: ret 441; CHECK-NOLSE-O1-NEXT: LBB5_4: ; %cmpxchg.nostore 442; CHECK-NOLSE-O1-NEXT: clrex 443; CHECK-NOLSE-O1-NEXT: mov x0, x8 444; CHECK-NOLSE-O1-NEXT: ret 445; 446; CHECK-NOLSE-O0-LABEL: val_compare_and_swap_64_release_acquire: 447; CHECK-NOLSE-O0: ; %bb.0: 448; CHECK-NOLSE-O0-NEXT: mov x9, x0 449; CHECK-NOLSE-O0-NEXT: LBB5_1: ; =>This Inner Loop Header: Depth=1 450; CHECK-NOLSE-O0-NEXT: ldaxr x0, [x9] 451; CHECK-NOLSE-O0-NEXT: cmp x0, x1 452; CHECK-NOLSE-O0-NEXT: b.ne LBB5_3 453; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB5_1 Depth=1 454; CHECK-NOLSE-O0-NEXT: stlxr w8, x2, [x9] 455; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB5_1 456; CHECK-NOLSE-O0-NEXT: LBB5_3: 457; CHECK-NOLSE-O0-NEXT: ret 458; 459; CHECK-LSE-O1-LABEL: val_compare_and_swap_64_release_acquire: 460; CHECK-LSE-O1: ; %bb.0: 461; CHECK-LSE-O1-NEXT: casal x1, x2, [x0] 462; CHECK-LSE-O1-NEXT: mov x0, x1 463; CHECK-LSE-O1-NEXT: ret 464; 465; CHECK-LSE-O0-LABEL: val_compare_and_swap_64_release_acquire: 466; CHECK-LSE-O0: ; %bb.0: 467; CHECK-LSE-O0-NEXT: mov x8, x0 468; CHECK-LSE-O0-NEXT: mov x0, x1 469; CHECK-LSE-O0-NEXT: casal x0, x2, [x8] 470; CHECK-LSE-O0-NEXT: ret 471; 472; CHECK-LDAPR-O1-LABEL: val_compare_and_swap_64_release_acquire: 473; CHECK-LDAPR-O1: ; %bb.0: 474; CHECK-LDAPR-O1-NEXT: LBB5_1: ; %cmpxchg.start 475; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 476; CHECK-LDAPR-O1-NEXT: ldaxr x8, [x0] 477; CHECK-LDAPR-O1-NEXT: cmp x8, x1 478; CHECK-LDAPR-O1-NEXT: b.ne LBB5_4 479; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 480; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB5_1 Depth=1 481; CHECK-LDAPR-O1-NEXT: stlxr w9, x2, [x0] 482; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB5_1 483; CHECK-LDAPR-O1-NEXT: ; %bb.3: ; %cmpxchg.end 484; CHECK-LDAPR-O1-NEXT: mov x0, x8 485; CHECK-LDAPR-O1-NEXT: ret 486; CHECK-LDAPR-O1-NEXT: LBB5_4: ; %cmpxchg.nostore 487; CHECK-LDAPR-O1-NEXT: clrex 488; CHECK-LDAPR-O1-NEXT: mov x0, x8 489; CHECK-LDAPR-O1-NEXT: ret 490; 491; CHECK-LDAPR-O0-LABEL: val_compare_and_swap_64_release_acquire: 492; CHECK-LDAPR-O0: ; %bb.0: 493; CHECK-LDAPR-O0-NEXT: mov x9, x0 494; CHECK-LDAPR-O0-NEXT: LBB5_1: ; =>This Inner Loop Header: Depth=1 495; CHECK-LDAPR-O0-NEXT: ldaxr x0, [x9] 496; CHECK-LDAPR-O0-NEXT: cmp x0, x1 497; CHECK-LDAPR-O0-NEXT: b.ne LBB5_3 498; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB5_1 Depth=1 499; CHECK-LDAPR-O0-NEXT: stlxr w8, x2, [x9] 500; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB5_1 501; CHECK-LDAPR-O0-NEXT: LBB5_3: 502; CHECK-LDAPR-O0-NEXT: ret 503 %pair = cmpxchg i64* %p, i64 %cmp, i64 %new release acquire 504 %val = extractvalue { i64, i1 } %pair, 0 505 ret i64 %val 506} 507 508define i32 @fetch_and_nand(i32* %p) #0 { 509; CHECK-NOLSE-O1-LABEL: fetch_and_nand: 510; CHECK-NOLSE-O1: ; %bb.0: 511; CHECK-NOLSE-O1-NEXT: LBB6_1: ; %atomicrmw.start 512; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 513; CHECK-NOLSE-O1-NEXT: ldxr w8, [x0] 514; CHECK-NOLSE-O1-NEXT: and w9, w8, #0x7 515; CHECK-NOLSE-O1-NEXT: mvn w9, w9 516; CHECK-NOLSE-O1-NEXT: stlxr w10, w9, [x0] 517; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB6_1 518; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 519; CHECK-NOLSE-O1-NEXT: mov w0, w8 520; CHECK-NOLSE-O1-NEXT: ret 521; 522; CHECK-NOLSE-O0-LABEL: fetch_and_nand: 523; CHECK-NOLSE-O0: ; %bb.0: 524; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 525; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 526; CHECK-NOLSE-O0-NEXT: ldr w8, [x0] 527; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 528; CHECK-NOLSE-O0-NEXT: b LBB6_1 529; CHECK-NOLSE-O0-NEXT: LBB6_1: ; %atomicrmw.start 530; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 531; CHECK-NOLSE-O0-NEXT: ; Child Loop BB6_2 Depth 2 532; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 533; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 534; CHECK-NOLSE-O0-NEXT: and w9, w8, #0x7 535; CHECK-NOLSE-O0-NEXT: mvn w12, w9 536; CHECK-NOLSE-O0-NEXT: LBB6_2: ; %atomicrmw.start 537; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB6_1 Depth=1 538; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 539; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11] 540; CHECK-NOLSE-O0-NEXT: cmp w9, w8 541; CHECK-NOLSE-O0-NEXT: b.ne LBB6_4 542; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 543; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB6_2 Depth=2 544; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11] 545; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB6_2 546; CHECK-NOLSE-O0-NEXT: LBB6_4: ; %atomicrmw.start 547; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB6_1 Depth=1 548; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 549; CHECK-NOLSE-O0-NEXT: subs w8, w9, w8 550; CHECK-NOLSE-O0-NEXT: cset w8, eq 551; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 552; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB6_1 553; CHECK-NOLSE-O0-NEXT: b LBB6_5 554; CHECK-NOLSE-O0-NEXT: LBB6_5: ; %atomicrmw.end 555; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 556; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 557; CHECK-NOLSE-O0-NEXT: ret 558; 559; CHECK-LSE-O1-LABEL: fetch_and_nand: 560; CHECK-LSE-O1: ; %bb.0: 561; CHECK-LSE-O1-NEXT: LBB6_1: ; %atomicrmw.start 562; CHECK-LSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 563; CHECK-LSE-O1-NEXT: ldxr w8, [x0] 564; CHECK-LSE-O1-NEXT: and w9, w8, #0x7 565; CHECK-LSE-O1-NEXT: mvn w9, w9 566; CHECK-LSE-O1-NEXT: stlxr w10, w9, [x0] 567; CHECK-LSE-O1-NEXT: cbnz w10, LBB6_1 568; CHECK-LSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 569; CHECK-LSE-O1-NEXT: mov x0, x8 570; CHECK-LSE-O1-NEXT: ret 571; 572; CHECK-LSE-O0-LABEL: fetch_and_nand: 573; CHECK-LSE-O0: ; %bb.0: 574; CHECK-LSE-O0-NEXT: sub sp, sp, #32 575; CHECK-LSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 576; CHECK-LSE-O0-NEXT: ldr w8, [x0] 577; CHECK-LSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 578; CHECK-LSE-O0-NEXT: b LBB6_1 579; CHECK-LSE-O0-NEXT: LBB6_1: ; %atomicrmw.start 580; CHECK-LSE-O0-NEXT: ; =>This Inner Loop Header: Depth=1 581; CHECK-LSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 582; CHECK-LSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 583; CHECK-LSE-O0-NEXT: and w9, w8, #0x7 584; CHECK-LSE-O0-NEXT: mvn w10, w9 585; CHECK-LSE-O0-NEXT: mov x9, x8 586; CHECK-LSE-O0-NEXT: casl w9, w10, [x11] 587; CHECK-LSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 588; CHECK-LSE-O0-NEXT: subs w8, w9, w8 589; CHECK-LSE-O0-NEXT: cset w8, eq 590; CHECK-LSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 591; CHECK-LSE-O0-NEXT: tbz w8, #0, LBB6_1 592; CHECK-LSE-O0-NEXT: b LBB6_2 593; CHECK-LSE-O0-NEXT: LBB6_2: ; %atomicrmw.end 594; CHECK-LSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 595; CHECK-LSE-O0-NEXT: add sp, sp, #32 596; CHECK-LSE-O0-NEXT: ret 597; 598; CHECK-LDAPR-O1-LABEL: fetch_and_nand: 599; CHECK-LDAPR-O1: ; %bb.0: 600; CHECK-LDAPR-O1-NEXT: LBB6_1: ; %atomicrmw.start 601; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 602; CHECK-LDAPR-O1-NEXT: ldxr w8, [x0] 603; CHECK-LDAPR-O1-NEXT: and w9, w8, #0x7 604; CHECK-LDAPR-O1-NEXT: mvn w9, w9 605; CHECK-LDAPR-O1-NEXT: stlxr w10, w9, [x0] 606; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB6_1 607; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 608; CHECK-LDAPR-O1-NEXT: mov w0, w8 609; CHECK-LDAPR-O1-NEXT: ret 610; 611; CHECK-LDAPR-O0-LABEL: fetch_and_nand: 612; CHECK-LDAPR-O0: ; %bb.0: 613; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 614; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 615; CHECK-LDAPR-O0-NEXT: ldr w8, [x0] 616; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 617; CHECK-LDAPR-O0-NEXT: b LBB6_1 618; CHECK-LDAPR-O0-NEXT: LBB6_1: ; %atomicrmw.start 619; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 620; CHECK-LDAPR-O0-NEXT: ; Child Loop BB6_2 Depth 2 621; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 622; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 623; CHECK-LDAPR-O0-NEXT: and w9, w8, #0x7 624; CHECK-LDAPR-O0-NEXT: mvn w12, w9 625; CHECK-LDAPR-O0-NEXT: LBB6_2: ; %atomicrmw.start 626; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB6_1 Depth=1 627; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 628; CHECK-LDAPR-O0-NEXT: ldaxr w9, [x11] 629; CHECK-LDAPR-O0-NEXT: cmp w9, w8 630; CHECK-LDAPR-O0-NEXT: b.ne LBB6_4 631; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 632; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB6_2 Depth=2 633; CHECK-LDAPR-O0-NEXT: stlxr w10, w12, [x11] 634; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB6_2 635; CHECK-LDAPR-O0-NEXT: LBB6_4: ; %atomicrmw.start 636; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB6_1 Depth=1 637; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 638; CHECK-LDAPR-O0-NEXT: subs w8, w9, w8 639; CHECK-LDAPR-O0-NEXT: cset w8, eq 640; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 641; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB6_1 642; CHECK-LDAPR-O0-NEXT: b LBB6_5 643; CHECK-LDAPR-O0-NEXT: LBB6_5: ; %atomicrmw.end 644; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 645; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 646; CHECK-LDAPR-O0-NEXT: ret 647 %val = atomicrmw nand i32* %p, i32 7 release 648 ret i32 %val 649} 650 651define i64 @fetch_and_nand_64(i64* %p) #0 { 652; CHECK-NOLSE-O1-LABEL: fetch_and_nand_64: 653; CHECK-NOLSE-O1: ; %bb.0: 654; CHECK-NOLSE-O1-NEXT: LBB7_1: ; %atomicrmw.start 655; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 656; CHECK-NOLSE-O1-NEXT: ldaxr x8, [x0] 657; CHECK-NOLSE-O1-NEXT: and x9, x8, #0x7 658; CHECK-NOLSE-O1-NEXT: mvn x9, x9 659; CHECK-NOLSE-O1-NEXT: stlxr w10, x9, [x0] 660; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB7_1 661; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 662; CHECK-NOLSE-O1-NEXT: mov x0, x8 663; CHECK-NOLSE-O1-NEXT: ret 664; 665; CHECK-NOLSE-O0-LABEL: fetch_and_nand_64: 666; CHECK-NOLSE-O0: ; %bb.0: 667; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 668; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 669; CHECK-NOLSE-O0-NEXT: ldr x8, [x0] 670; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Folded Spill 671; CHECK-NOLSE-O0-NEXT: b LBB7_1 672; CHECK-NOLSE-O0-NEXT: LBB7_1: ; %atomicrmw.start 673; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 674; CHECK-NOLSE-O0-NEXT: ; Child Loop BB7_2 Depth 2 675; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Folded Reload 676; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 677; CHECK-NOLSE-O0-NEXT: and x9, x8, #0x7 678; CHECK-NOLSE-O0-NEXT: mvn x12, x9 679; CHECK-NOLSE-O0-NEXT: LBB7_2: ; %atomicrmw.start 680; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB7_1 Depth=1 681; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 682; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11] 683; CHECK-NOLSE-O0-NEXT: cmp x9, x8 684; CHECK-NOLSE-O0-NEXT: b.ne LBB7_4 685; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 686; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB7_2 Depth=2 687; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11] 688; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB7_2 689; CHECK-NOLSE-O0-NEXT: LBB7_4: ; %atomicrmw.start 690; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB7_1 Depth=1 691; CHECK-NOLSE-O0-NEXT: str x9, [sp, #8] ; 8-byte Folded Spill 692; CHECK-NOLSE-O0-NEXT: subs x8, x9, x8 693; CHECK-NOLSE-O0-NEXT: cset w8, eq 694; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Folded Spill 695; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB7_1 696; CHECK-NOLSE-O0-NEXT: b LBB7_5 697; CHECK-NOLSE-O0-NEXT: LBB7_5: ; %atomicrmw.end 698; CHECK-NOLSE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Folded Reload 699; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 700; CHECK-NOLSE-O0-NEXT: ret 701; 702; CHECK-LSE-O1-LABEL: fetch_and_nand_64: 703; CHECK-LSE-O1: ; %bb.0: 704; CHECK-LSE-O1-NEXT: LBB7_1: ; %atomicrmw.start 705; CHECK-LSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 706; CHECK-LSE-O1-NEXT: ldaxr x8, [x0] 707; CHECK-LSE-O1-NEXT: and x9, x8, #0x7 708; CHECK-LSE-O1-NEXT: mvn x9, x9 709; CHECK-LSE-O1-NEXT: stlxr w10, x9, [x0] 710; CHECK-LSE-O1-NEXT: cbnz w10, LBB7_1 711; CHECK-LSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 712; CHECK-LSE-O1-NEXT: mov x0, x8 713; CHECK-LSE-O1-NEXT: ret 714; 715; CHECK-LSE-O0-LABEL: fetch_and_nand_64: 716; CHECK-LSE-O0: ; %bb.0: 717; CHECK-LSE-O0-NEXT: sub sp, sp, #32 718; CHECK-LSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 719; CHECK-LSE-O0-NEXT: ldr x8, [x0] 720; CHECK-LSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Folded Spill 721; CHECK-LSE-O0-NEXT: b LBB7_1 722; CHECK-LSE-O0-NEXT: LBB7_1: ; %atomicrmw.start 723; CHECK-LSE-O0-NEXT: ; =>This Inner Loop Header: Depth=1 724; CHECK-LSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Folded Reload 725; CHECK-LSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 726; CHECK-LSE-O0-NEXT: and x9, x8, #0x7 727; CHECK-LSE-O0-NEXT: mvn x10, x9 728; CHECK-LSE-O0-NEXT: mov x9, x8 729; CHECK-LSE-O0-NEXT: casal x9, x10, [x11] 730; CHECK-LSE-O0-NEXT: str x9, [sp, #8] ; 8-byte Folded Spill 731; CHECK-LSE-O0-NEXT: subs x8, x9, x8 732; CHECK-LSE-O0-NEXT: cset w8, eq 733; CHECK-LSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Folded Spill 734; CHECK-LSE-O0-NEXT: tbz w8, #0, LBB7_1 735; CHECK-LSE-O0-NEXT: b LBB7_2 736; CHECK-LSE-O0-NEXT: LBB7_2: ; %atomicrmw.end 737; CHECK-LSE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Folded Reload 738; CHECK-LSE-O0-NEXT: add sp, sp, #32 739; CHECK-LSE-O0-NEXT: ret 740; 741; CHECK-LDAPR-O1-LABEL: fetch_and_nand_64: 742; CHECK-LDAPR-O1: ; %bb.0: 743; CHECK-LDAPR-O1-NEXT: LBB7_1: ; %atomicrmw.start 744; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 745; CHECK-LDAPR-O1-NEXT: ldaxr x8, [x0] 746; CHECK-LDAPR-O1-NEXT: and x9, x8, #0x7 747; CHECK-LDAPR-O1-NEXT: mvn x9, x9 748; CHECK-LDAPR-O1-NEXT: stlxr w10, x9, [x0] 749; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB7_1 750; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 751; CHECK-LDAPR-O1-NEXT: mov x0, x8 752; CHECK-LDAPR-O1-NEXT: ret 753; 754; CHECK-LDAPR-O0-LABEL: fetch_and_nand_64: 755; CHECK-LDAPR-O0: ; %bb.0: 756; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 757; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 758; CHECK-LDAPR-O0-NEXT: ldr x8, [x0] 759; CHECK-LDAPR-O0-NEXT: str x8, [sp, #24] ; 8-byte Folded Spill 760; CHECK-LDAPR-O0-NEXT: b LBB7_1 761; CHECK-LDAPR-O0-NEXT: LBB7_1: ; %atomicrmw.start 762; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 763; CHECK-LDAPR-O0-NEXT: ; Child Loop BB7_2 Depth 2 764; CHECK-LDAPR-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Folded Reload 765; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 766; CHECK-LDAPR-O0-NEXT: and x9, x8, #0x7 767; CHECK-LDAPR-O0-NEXT: mvn x12, x9 768; CHECK-LDAPR-O0-NEXT: LBB7_2: ; %atomicrmw.start 769; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB7_1 Depth=1 770; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 771; CHECK-LDAPR-O0-NEXT: ldaxr x9, [x11] 772; CHECK-LDAPR-O0-NEXT: cmp x9, x8 773; CHECK-LDAPR-O0-NEXT: b.ne LBB7_4 774; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 775; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB7_2 Depth=2 776; CHECK-LDAPR-O0-NEXT: stlxr w10, x12, [x11] 777; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB7_2 778; CHECK-LDAPR-O0-NEXT: LBB7_4: ; %atomicrmw.start 779; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB7_1 Depth=1 780; CHECK-LDAPR-O0-NEXT: str x9, [sp, #8] ; 8-byte Folded Spill 781; CHECK-LDAPR-O0-NEXT: subs x8, x9, x8 782; CHECK-LDAPR-O0-NEXT: cset w8, eq 783; CHECK-LDAPR-O0-NEXT: str x9, [sp, #24] ; 8-byte Folded Spill 784; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB7_1 785; CHECK-LDAPR-O0-NEXT: b LBB7_5 786; CHECK-LDAPR-O0-NEXT: LBB7_5: ; %atomicrmw.end 787; CHECK-LDAPR-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Folded Reload 788; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 789; CHECK-LDAPR-O0-NEXT: ret 790 %val = atomicrmw nand i64* %p, i64 7 acq_rel 791 ret i64 %val 792} 793 794define i32 @fetch_and_or(i32* %p) #0 { 795; CHECK-NOLSE-O1-LABEL: fetch_and_or: 796; CHECK-NOLSE-O1: ; %bb.0: 797; CHECK-NOLSE-O1-NEXT: mov w9, #5 798; CHECK-NOLSE-O1-NEXT: LBB8_1: ; %atomicrmw.start 799; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 800; CHECK-NOLSE-O1-NEXT: ldaxr w8, [x0] 801; CHECK-NOLSE-O1-NEXT: orr w10, w8, w9 802; CHECK-NOLSE-O1-NEXT: stlxr w11, w10, [x0] 803; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB8_1 804; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 805; CHECK-NOLSE-O1-NEXT: mov w0, w8 806; CHECK-NOLSE-O1-NEXT: ret 807; 808; CHECK-NOLSE-O0-LABEL: fetch_and_or: 809; CHECK-NOLSE-O0: ; %bb.0: 810; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 811; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 812; CHECK-NOLSE-O0-NEXT: ldr w8, [x0] 813; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 814; CHECK-NOLSE-O0-NEXT: b LBB8_1 815; CHECK-NOLSE-O0-NEXT: LBB8_1: ; %atomicrmw.start 816; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 817; CHECK-NOLSE-O0-NEXT: ; Child Loop BB8_2 Depth 2 818; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 819; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 820; CHECK-NOLSE-O0-NEXT: mov w9, #5 821; CHECK-NOLSE-O0-NEXT: orr w12, w8, w9 822; CHECK-NOLSE-O0-NEXT: LBB8_2: ; %atomicrmw.start 823; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB8_1 Depth=1 824; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 825; CHECK-NOLSE-O0-NEXT: ldaxr w9, [x11] 826; CHECK-NOLSE-O0-NEXT: cmp w9, w8 827; CHECK-NOLSE-O0-NEXT: b.ne LBB8_4 828; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 829; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB8_2 Depth=2 830; CHECK-NOLSE-O0-NEXT: stlxr w10, w12, [x11] 831; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB8_2 832; CHECK-NOLSE-O0-NEXT: LBB8_4: ; %atomicrmw.start 833; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB8_1 Depth=1 834; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 835; CHECK-NOLSE-O0-NEXT: subs w8, w9, w8 836; CHECK-NOLSE-O0-NEXT: cset w8, eq 837; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 838; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB8_1 839; CHECK-NOLSE-O0-NEXT: b LBB8_5 840; CHECK-NOLSE-O0-NEXT: LBB8_5: ; %atomicrmw.end 841; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 842; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 843; CHECK-NOLSE-O0-NEXT: ret 844; 845; CHECK-LSE-O1-LABEL: fetch_and_or: 846; CHECK-LSE-O1: ; %bb.0: 847; CHECK-LSE-O1-NEXT: mov w8, #5 848; CHECK-LSE-O1-NEXT: ldsetal w8, w0, [x0] 849; CHECK-LSE-O1-NEXT: ret 850; 851; CHECK-LSE-O0-LABEL: fetch_and_or: 852; CHECK-LSE-O0: ; %bb.0: 853; CHECK-LSE-O0-NEXT: mov w8, #5 854; CHECK-LSE-O0-NEXT: ldsetal w8, w0, [x0] 855; CHECK-LSE-O0-NEXT: ret 856; 857; CHECK-LDAPR-O1-LABEL: fetch_and_or: 858; CHECK-LDAPR-O1: ; %bb.0: 859; CHECK-LDAPR-O1-NEXT: mov w9, #5 860; CHECK-LDAPR-O1-NEXT: LBB8_1: ; %atomicrmw.start 861; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 862; CHECK-LDAPR-O1-NEXT: ldaxr w8, [x0] 863; CHECK-LDAPR-O1-NEXT: orr w10, w8, w9 864; CHECK-LDAPR-O1-NEXT: stlxr w11, w10, [x0] 865; CHECK-LDAPR-O1-NEXT: cbnz w11, LBB8_1 866; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 867; CHECK-LDAPR-O1-NEXT: mov w0, w8 868; CHECK-LDAPR-O1-NEXT: ret 869; 870; CHECK-LDAPR-O0-LABEL: fetch_and_or: 871; CHECK-LDAPR-O0: ; %bb.0: 872; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 873; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 874; CHECK-LDAPR-O0-NEXT: ldr w8, [x0] 875; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 876; CHECK-LDAPR-O0-NEXT: b LBB8_1 877; CHECK-LDAPR-O0-NEXT: LBB8_1: ; %atomicrmw.start 878; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 879; CHECK-LDAPR-O0-NEXT: ; Child Loop BB8_2 Depth 2 880; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 881; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 882; CHECK-LDAPR-O0-NEXT: mov w9, #5 883; CHECK-LDAPR-O0-NEXT: orr w12, w8, w9 884; CHECK-LDAPR-O0-NEXT: LBB8_2: ; %atomicrmw.start 885; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB8_1 Depth=1 886; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 887; CHECK-LDAPR-O0-NEXT: ldaxr w9, [x11] 888; CHECK-LDAPR-O0-NEXT: cmp w9, w8 889; CHECK-LDAPR-O0-NEXT: b.ne LBB8_4 890; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 891; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB8_2 Depth=2 892; CHECK-LDAPR-O0-NEXT: stlxr w10, w12, [x11] 893; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB8_2 894; CHECK-LDAPR-O0-NEXT: LBB8_4: ; %atomicrmw.start 895; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB8_1 Depth=1 896; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 897; CHECK-LDAPR-O0-NEXT: subs w8, w9, w8 898; CHECK-LDAPR-O0-NEXT: cset w8, eq 899; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 900; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB8_1 901; CHECK-LDAPR-O0-NEXT: b LBB8_5 902; CHECK-LDAPR-O0-NEXT: LBB8_5: ; %atomicrmw.end 903; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 904; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 905; CHECK-LDAPR-O0-NEXT: ret 906 %val = atomicrmw or i32* %p, i32 5 seq_cst 907 ret i32 %val 908} 909 910define i64 @fetch_and_or_64(i64* %p) #0 { 911; CHECK-NOLSE-O1-LABEL: fetch_and_or_64: 912; CHECK-NOLSE-O1: ; %bb.0: 913; CHECK-NOLSE-O1-NEXT: LBB9_1: ; %atomicrmw.start 914; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 915; CHECK-NOLSE-O1-NEXT: ldxr x8, [x0] 916; CHECK-NOLSE-O1-NEXT: orr x9, x8, #0x7 917; CHECK-NOLSE-O1-NEXT: stxr w10, x9, [x0] 918; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB9_1 919; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 920; CHECK-NOLSE-O1-NEXT: mov x0, x8 921; CHECK-NOLSE-O1-NEXT: ret 922; 923; CHECK-NOLSE-O0-LABEL: fetch_and_or_64: 924; CHECK-NOLSE-O0: ; %bb.0: 925; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 926; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 927; CHECK-NOLSE-O0-NEXT: ldr x8, [x0] 928; CHECK-NOLSE-O0-NEXT: str x8, [sp, #24] ; 8-byte Folded Spill 929; CHECK-NOLSE-O0-NEXT: b LBB9_1 930; CHECK-NOLSE-O0-NEXT: LBB9_1: ; %atomicrmw.start 931; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 932; CHECK-NOLSE-O0-NEXT: ; Child Loop BB9_2 Depth 2 933; CHECK-NOLSE-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Folded Reload 934; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 935; CHECK-NOLSE-O0-NEXT: orr x12, x8, #0x7 936; CHECK-NOLSE-O0-NEXT: LBB9_2: ; %atomicrmw.start 937; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB9_1 Depth=1 938; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 939; CHECK-NOLSE-O0-NEXT: ldaxr x9, [x11] 940; CHECK-NOLSE-O0-NEXT: cmp x9, x8 941; CHECK-NOLSE-O0-NEXT: b.ne LBB9_4 942; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 943; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB9_2 Depth=2 944; CHECK-NOLSE-O0-NEXT: stlxr w10, x12, [x11] 945; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB9_2 946; CHECK-NOLSE-O0-NEXT: LBB9_4: ; %atomicrmw.start 947; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB9_1 Depth=1 948; CHECK-NOLSE-O0-NEXT: str x9, [sp, #8] ; 8-byte Folded Spill 949; CHECK-NOLSE-O0-NEXT: subs x8, x9, x8 950; CHECK-NOLSE-O0-NEXT: cset w8, eq 951; CHECK-NOLSE-O0-NEXT: str x9, [sp, #24] ; 8-byte Folded Spill 952; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB9_1 953; CHECK-NOLSE-O0-NEXT: b LBB9_5 954; CHECK-NOLSE-O0-NEXT: LBB9_5: ; %atomicrmw.end 955; CHECK-NOLSE-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Folded Reload 956; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 957; CHECK-NOLSE-O0-NEXT: ret 958; 959; CHECK-LSE-O1-LABEL: fetch_and_or_64: 960; CHECK-LSE-O1: ; %bb.0: 961; CHECK-LSE-O1-NEXT: mov w8, #7 962; CHECK-LSE-O1-NEXT: ldset x8, x0, [x0] 963; CHECK-LSE-O1-NEXT: ret 964; 965; CHECK-LSE-O0-LABEL: fetch_and_or_64: 966; CHECK-LSE-O0: ; %bb.0: 967; CHECK-LSE-O0-NEXT: mov w8, #7 968; CHECK-LSE-O0-NEXT: ; kill: def $x8 killed $w8 969; CHECK-LSE-O0-NEXT: ldset x8, x0, [x0] 970; CHECK-LSE-O0-NEXT: ret 971; 972; CHECK-LDAPR-O1-LABEL: fetch_and_or_64: 973; CHECK-LDAPR-O1: ; %bb.0: 974; CHECK-LDAPR-O1-NEXT: LBB9_1: ; %atomicrmw.start 975; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 976; CHECK-LDAPR-O1-NEXT: ldxr x8, [x0] 977; CHECK-LDAPR-O1-NEXT: orr x9, x8, #0x7 978; CHECK-LDAPR-O1-NEXT: stxr w10, x9, [x0] 979; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB9_1 980; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 981; CHECK-LDAPR-O1-NEXT: mov x0, x8 982; CHECK-LDAPR-O1-NEXT: ret 983; 984; CHECK-LDAPR-O0-LABEL: fetch_and_or_64: 985; CHECK-LDAPR-O0: ; %bb.0: 986; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 987; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 988; CHECK-LDAPR-O0-NEXT: ldr x8, [x0] 989; CHECK-LDAPR-O0-NEXT: str x8, [sp, #24] ; 8-byte Folded Spill 990; CHECK-LDAPR-O0-NEXT: b LBB9_1 991; CHECK-LDAPR-O0-NEXT: LBB9_1: ; %atomicrmw.start 992; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 993; CHECK-LDAPR-O0-NEXT: ; Child Loop BB9_2 Depth 2 994; CHECK-LDAPR-O0-NEXT: ldr x8, [sp, #24] ; 8-byte Folded Reload 995; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 996; CHECK-LDAPR-O0-NEXT: orr x12, x8, #0x7 997; CHECK-LDAPR-O0-NEXT: LBB9_2: ; %atomicrmw.start 998; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB9_1 Depth=1 999; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 1000; CHECK-LDAPR-O0-NEXT: ldaxr x9, [x11] 1001; CHECK-LDAPR-O0-NEXT: cmp x9, x8 1002; CHECK-LDAPR-O0-NEXT: b.ne LBB9_4 1003; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 1004; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB9_2 Depth=2 1005; CHECK-LDAPR-O0-NEXT: stlxr w10, x12, [x11] 1006; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB9_2 1007; CHECK-LDAPR-O0-NEXT: LBB9_4: ; %atomicrmw.start 1008; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB9_1 Depth=1 1009; CHECK-LDAPR-O0-NEXT: str x9, [sp, #8] ; 8-byte Folded Spill 1010; CHECK-LDAPR-O0-NEXT: subs x8, x9, x8 1011; CHECK-LDAPR-O0-NEXT: cset w8, eq 1012; CHECK-LDAPR-O0-NEXT: str x9, [sp, #24] ; 8-byte Folded Spill 1013; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB9_1 1014; CHECK-LDAPR-O0-NEXT: b LBB9_5 1015; CHECK-LDAPR-O0-NEXT: LBB9_5: ; %atomicrmw.end 1016; CHECK-LDAPR-O0-NEXT: ldr x0, [sp, #8] ; 8-byte Folded Reload 1017; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 1018; CHECK-LDAPR-O0-NEXT: ret 1019 %val = atomicrmw or i64* %p, i64 7 monotonic 1020 ret i64 %val 1021} 1022 1023define void @acquire_fence() #0 { 1024; CHECK-NOLSE-LABEL: acquire_fence: 1025; CHECK-NOLSE: ; %bb.0: 1026; CHECK-NOLSE-NEXT: dmb ishld 1027; CHECK-NOLSE-NEXT: ret 1028; 1029; CHECK-LSE-O1-LABEL: acquire_fence: 1030; CHECK-LSE-O1: ; %bb.0: 1031; CHECK-LSE-O1-NEXT: dmb ishld 1032; CHECK-LSE-O1-NEXT: ret 1033; 1034; CHECK-LSE-O0-LABEL: acquire_fence: 1035; CHECK-LSE-O0: ; %bb.0: 1036; CHECK-LSE-O0-NEXT: dmb ishld 1037; CHECK-LSE-O0-NEXT: ret 1038; 1039; CHECK-LDAPR-O1-LABEL: acquire_fence: 1040; CHECK-LDAPR-O1: ; %bb.0: 1041; CHECK-LDAPR-O1-NEXT: dmb ishld 1042; CHECK-LDAPR-O1-NEXT: ret 1043; 1044; CHECK-LDAPR-O0-LABEL: acquire_fence: 1045; CHECK-LDAPR-O0: ; %bb.0: 1046; CHECK-LDAPR-O0-NEXT: dmb ishld 1047; CHECK-LDAPR-O0-NEXT: ret 1048 fence acquire 1049 ret void 1050} 1051 1052define void @release_fence() #0 { 1053; CHECK-NOLSE-LABEL: release_fence: 1054; CHECK-NOLSE: ; %bb.0: 1055; CHECK-NOLSE-NEXT: dmb ish 1056; CHECK-NOLSE-NEXT: ret 1057; 1058; CHECK-LSE-O1-LABEL: release_fence: 1059; CHECK-LSE-O1: ; %bb.0: 1060; CHECK-LSE-O1-NEXT: dmb ish 1061; CHECK-LSE-O1-NEXT: ret 1062; 1063; CHECK-LSE-O0-LABEL: release_fence: 1064; CHECK-LSE-O0: ; %bb.0: 1065; CHECK-LSE-O0-NEXT: dmb ish 1066; CHECK-LSE-O0-NEXT: ret 1067; 1068; CHECK-LDAPR-O1-LABEL: release_fence: 1069; CHECK-LDAPR-O1: ; %bb.0: 1070; CHECK-LDAPR-O1-NEXT: dmb ish 1071; CHECK-LDAPR-O1-NEXT: ret 1072; 1073; CHECK-LDAPR-O0-LABEL: release_fence: 1074; CHECK-LDAPR-O0: ; %bb.0: 1075; CHECK-LDAPR-O0-NEXT: dmb ish 1076; CHECK-LDAPR-O0-NEXT: ret 1077 fence release 1078 ret void 1079} 1080 1081define void @seq_cst_fence() #0 { 1082; CHECK-NOLSE-LABEL: seq_cst_fence: 1083; CHECK-NOLSE: ; %bb.0: 1084; CHECK-NOLSE-NEXT: dmb ish 1085; CHECK-NOLSE-NEXT: ret 1086; 1087; CHECK-LSE-O1-LABEL: seq_cst_fence: 1088; CHECK-LSE-O1: ; %bb.0: 1089; CHECK-LSE-O1-NEXT: dmb ish 1090; CHECK-LSE-O1-NEXT: ret 1091; 1092; CHECK-LSE-O0-LABEL: seq_cst_fence: 1093; CHECK-LSE-O0: ; %bb.0: 1094; CHECK-LSE-O0-NEXT: dmb ish 1095; CHECK-LSE-O0-NEXT: ret 1096; 1097; CHECK-LDAPR-O1-LABEL: seq_cst_fence: 1098; CHECK-LDAPR-O1: ; %bb.0: 1099; CHECK-LDAPR-O1-NEXT: dmb ish 1100; CHECK-LDAPR-O1-NEXT: ret 1101; 1102; CHECK-LDAPR-O0-LABEL: seq_cst_fence: 1103; CHECK-LDAPR-O0: ; %bb.0: 1104; CHECK-LDAPR-O0-NEXT: dmb ish 1105; CHECK-LDAPR-O0-NEXT: ret 1106 fence seq_cst 1107 ret void 1108} 1109 1110define i32 @atomic_load(i32* %p) #0 { 1111; CHECK-NOLSE-LABEL: atomic_load: 1112; CHECK-NOLSE: ; %bb.0: 1113; CHECK-NOLSE-NEXT: ldar w0, [x0] 1114; CHECK-NOLSE-NEXT: ret 1115; 1116; CHECK-LSE-O1-LABEL: atomic_load: 1117; CHECK-LSE-O1: ; %bb.0: 1118; CHECK-LSE-O1-NEXT: ldar w0, [x0] 1119; CHECK-LSE-O1-NEXT: ret 1120; 1121; CHECK-LSE-O0-LABEL: atomic_load: 1122; CHECK-LSE-O0: ; %bb.0: 1123; CHECK-LSE-O0-NEXT: ldar w0, [x0] 1124; CHECK-LSE-O0-NEXT: ret 1125; 1126; CHECK-LDAPR-O1-LABEL: atomic_load: 1127; CHECK-LDAPR-O1: ; %bb.0: 1128; CHECK-LDAPR-O1-NEXT: ldar w0, [x0] 1129; CHECK-LDAPR-O1-NEXT: ret 1130; 1131; CHECK-LDAPR-O0-LABEL: atomic_load: 1132; CHECK-LDAPR-O0: ; %bb.0: 1133; CHECK-LDAPR-O0-NEXT: ldar w0, [x0] 1134; CHECK-LDAPR-O0-NEXT: ret 1135 %r = load atomic i32, i32* %p seq_cst, align 4 1136 ret i32 %r 1137} 1138 1139define i8 @atomic_load_relaxed_8(i8* %p, i32 %off32) #0 { 1140; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_8: 1141; CHECK-NOLSE-O1: ; %bb.0: 1142; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1143; CHECK-NOLSE-O1-NEXT: ldrb w9, [x0, #4095] 1144; CHECK-NOLSE-O1-NEXT: ldrb w10, [x0, w1, sxtw] 1145; CHECK-NOLSE-O1-NEXT: ldurb w11, [x0, #-256] 1146; CHECK-NOLSE-O1-NEXT: ldrb w8, [x8] 1147; CHECK-NOLSE-O1-NEXT: add w9, w9, w10 1148; CHECK-NOLSE-O1-NEXT: add w9, w9, w11 1149; CHECK-NOLSE-O1-NEXT: add w0, w9, w8 1150; CHECK-NOLSE-O1-NEXT: ret 1151; 1152; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_8: 1153; CHECK-NOLSE-O0: ; %bb.0: 1154; CHECK-NOLSE-O0-NEXT: ldrb w9, [x0, #4095] 1155; CHECK-NOLSE-O0-NEXT: add x8, x0, w1, sxtw 1156; CHECK-NOLSE-O0-NEXT: ldrb w8, [x8] 1157; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxtb 1158; CHECK-NOLSE-O0-NEXT: subs x9, x0, #256 1159; CHECK-NOLSE-O0-NEXT: ldrb w9, [x9] 1160; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxtb 1161; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1162; CHECK-NOLSE-O0-NEXT: ldrb w9, [x9] 1163; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, uxtb 1164; CHECK-NOLSE-O0-NEXT: ret 1165; 1166; CHECK-LSE-O1-LABEL: atomic_load_relaxed_8: 1167; CHECK-LSE-O1: ; %bb.0: 1168; CHECK-LSE-O1-NEXT: ldrb w8, [x0, #4095] 1169; CHECK-LSE-O1-NEXT: ldrb w9, [x0, w1, sxtw] 1170; CHECK-LSE-O1-NEXT: add w8, w8, w9 1171; CHECK-LSE-O1-NEXT: ldurb w9, [x0, #-256] 1172; CHECK-LSE-O1-NEXT: add w8, w8, w9 1173; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1174; CHECK-LSE-O1-NEXT: ldrb w9, [x9] 1175; CHECK-LSE-O1-NEXT: add w0, w8, w9 1176; CHECK-LSE-O1-NEXT: ret 1177; 1178; CHECK-LSE-O0-LABEL: atomic_load_relaxed_8: 1179; CHECK-LSE-O0: ; %bb.0: 1180; CHECK-LSE-O0-NEXT: ldrb w9, [x0, #4095] 1181; CHECK-LSE-O0-NEXT: add x8, x0, w1, sxtw 1182; CHECK-LSE-O0-NEXT: ldrb w8, [x8] 1183; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxtb 1184; CHECK-LSE-O0-NEXT: subs x9, x0, #256 1185; CHECK-LSE-O0-NEXT: ldrb w9, [x9] 1186; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxtb 1187; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1188; CHECK-LSE-O0-NEXT: ldrb w9, [x9] 1189; CHECK-LSE-O0-NEXT: add w0, w8, w9, uxtb 1190; CHECK-LSE-O0-NEXT: ret 1191; 1192; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_8: 1193; CHECK-LDAPR-O1: ; %bb.0: 1194; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1195; CHECK-LDAPR-O1-NEXT: ldrb w9, [x0, #4095] 1196; CHECK-LDAPR-O1-NEXT: ldrb w10, [x0, w1, sxtw] 1197; CHECK-LDAPR-O1-NEXT: ldurb w11, [x0, #-256] 1198; CHECK-LDAPR-O1-NEXT: ldrb w8, [x8] 1199; CHECK-LDAPR-O1-NEXT: add w9, w9, w10 1200; CHECK-LDAPR-O1-NEXT: add w9, w9, w11 1201; CHECK-LDAPR-O1-NEXT: add w0, w9, w8 1202; CHECK-LDAPR-O1-NEXT: ret 1203; 1204; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_8: 1205; CHECK-LDAPR-O0: ; %bb.0: 1206; CHECK-LDAPR-O0-NEXT: ldrb w9, [x0, #4095] 1207; CHECK-LDAPR-O0-NEXT: add x8, x0, w1, sxtw 1208; CHECK-LDAPR-O0-NEXT: ldrb w8, [x8] 1209; CHECK-LDAPR-O0-NEXT: add w8, w8, w9, uxtb 1210; CHECK-LDAPR-O0-NEXT: subs x9, x0, #256 1211; CHECK-LDAPR-O0-NEXT: ldrb w9, [x9] 1212; CHECK-LDAPR-O0-NEXT: add w8, w8, w9, uxtb 1213; CHECK-LDAPR-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1214; CHECK-LDAPR-O0-NEXT: ldrb w9, [x9] 1215; CHECK-LDAPR-O0-NEXT: add w0, w8, w9, uxtb 1216; CHECK-LDAPR-O0-NEXT: ret 1217 %ptr_unsigned = getelementptr i8, i8* %p, i32 4095 1218 %val_unsigned = load atomic i8, i8* %ptr_unsigned monotonic, align 1 1219 1220 %ptr_regoff = getelementptr i8, i8* %p, i32 %off32 1221 %val_regoff = load atomic i8, i8* %ptr_regoff unordered, align 1 1222 %tot1 = add i8 %val_unsigned, %val_regoff 1223 1224 %ptr_unscaled = getelementptr i8, i8* %p, i32 -256 1225 %val_unscaled = load atomic i8, i8* %ptr_unscaled monotonic, align 1 1226 %tot2 = add i8 %tot1, %val_unscaled 1227 1228 %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm) 1229 %val_random = load atomic i8, i8* %ptr_random unordered, align 1 1230 %tot3 = add i8 %tot2, %val_random 1231 1232 ret i8 %tot3 1233} 1234 1235define i16 @atomic_load_relaxed_16(i16* %p, i32 %off32) #0 { 1236; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_16: 1237; CHECK-NOLSE-O1: ; %bb.0: 1238; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1239; CHECK-NOLSE-O1-NEXT: ldrh w9, [x0, #8190] 1240; CHECK-NOLSE-O1-NEXT: ldrh w10, [x0, w1, sxtw #1] 1241; CHECK-NOLSE-O1-NEXT: ldurh w11, [x0, #-256] 1242; CHECK-NOLSE-O1-NEXT: ldrh w8, [x8] 1243; CHECK-NOLSE-O1-NEXT: add w9, w9, w10 1244; CHECK-NOLSE-O1-NEXT: add w9, w9, w11 1245; CHECK-NOLSE-O1-NEXT: add w0, w9, w8 1246; CHECK-NOLSE-O1-NEXT: ret 1247; 1248; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_16: 1249; CHECK-NOLSE-O0: ; %bb.0: 1250; CHECK-NOLSE-O0-NEXT: ldrh w9, [x0, #8190] 1251; CHECK-NOLSE-O0-NEXT: add x8, x0, w1, sxtw #1 1252; CHECK-NOLSE-O0-NEXT: ldrh w8, [x8] 1253; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxth 1254; CHECK-NOLSE-O0-NEXT: subs x9, x0, #256 1255; CHECK-NOLSE-O0-NEXT: ldrh w9, [x9] 1256; CHECK-NOLSE-O0-NEXT: add w8, w8, w9, uxth 1257; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1258; CHECK-NOLSE-O0-NEXT: ldrh w9, [x9] 1259; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, uxth 1260; CHECK-NOLSE-O0-NEXT: ret 1261; 1262; CHECK-LSE-O1-LABEL: atomic_load_relaxed_16: 1263; CHECK-LSE-O1: ; %bb.0: 1264; CHECK-LSE-O1-NEXT: ldrh w8, [x0, #8190] 1265; CHECK-LSE-O1-NEXT: ldrh w9, [x0, w1, sxtw #1] 1266; CHECK-LSE-O1-NEXT: add w8, w8, w9 1267; CHECK-LSE-O1-NEXT: ldurh w9, [x0, #-256] 1268; CHECK-LSE-O1-NEXT: add w8, w8, w9 1269; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1270; CHECK-LSE-O1-NEXT: ldrh w9, [x9] 1271; CHECK-LSE-O1-NEXT: add w0, w8, w9 1272; CHECK-LSE-O1-NEXT: ret 1273; 1274; CHECK-LSE-O0-LABEL: atomic_load_relaxed_16: 1275; CHECK-LSE-O0: ; %bb.0: 1276; CHECK-LSE-O0-NEXT: ldrh w9, [x0, #8190] 1277; CHECK-LSE-O0-NEXT: add x8, x0, w1, sxtw #1 1278; CHECK-LSE-O0-NEXT: ldrh w8, [x8] 1279; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxth 1280; CHECK-LSE-O0-NEXT: subs x9, x0, #256 1281; CHECK-LSE-O0-NEXT: ldrh w9, [x9] 1282; CHECK-LSE-O0-NEXT: add w8, w8, w9, uxth 1283; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1284; CHECK-LSE-O0-NEXT: ldrh w9, [x9] 1285; CHECK-LSE-O0-NEXT: add w0, w8, w9, uxth 1286; CHECK-LSE-O0-NEXT: ret 1287; 1288; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_16: 1289; CHECK-LDAPR-O1: ; %bb.0: 1290; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1291; CHECK-LDAPR-O1-NEXT: ldrh w9, [x0, #8190] 1292; CHECK-LDAPR-O1-NEXT: ldrh w10, [x0, w1, sxtw #1] 1293; CHECK-LDAPR-O1-NEXT: ldurh w11, [x0, #-256] 1294; CHECK-LDAPR-O1-NEXT: ldrh w8, [x8] 1295; CHECK-LDAPR-O1-NEXT: add w9, w9, w10 1296; CHECK-LDAPR-O1-NEXT: add w9, w9, w11 1297; CHECK-LDAPR-O1-NEXT: add w0, w9, w8 1298; CHECK-LDAPR-O1-NEXT: ret 1299; 1300; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_16: 1301; CHECK-LDAPR-O0: ; %bb.0: 1302; CHECK-LDAPR-O0-NEXT: ldrh w9, [x0, #8190] 1303; CHECK-LDAPR-O0-NEXT: add x8, x0, w1, sxtw #1 1304; CHECK-LDAPR-O0-NEXT: ldrh w8, [x8] 1305; CHECK-LDAPR-O0-NEXT: add w8, w8, w9, uxth 1306; CHECK-LDAPR-O0-NEXT: subs x9, x0, #256 1307; CHECK-LDAPR-O0-NEXT: ldrh w9, [x9] 1308; CHECK-LDAPR-O0-NEXT: add w8, w8, w9, uxth 1309; CHECK-LDAPR-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1310; CHECK-LDAPR-O0-NEXT: ldrh w9, [x9] 1311; CHECK-LDAPR-O0-NEXT: add w0, w8, w9, uxth 1312; CHECK-LDAPR-O0-NEXT: ret 1313 %ptr_unsigned = getelementptr i16, i16* %p, i32 4095 1314 %val_unsigned = load atomic i16, i16* %ptr_unsigned monotonic, align 2 1315 1316 %ptr_regoff = getelementptr i16, i16* %p, i32 %off32 1317 %val_regoff = load atomic i16, i16* %ptr_regoff unordered, align 2 1318 %tot1 = add i16 %val_unsigned, %val_regoff 1319 1320 %ptr_unscaled = getelementptr i16, i16* %p, i32 -128 1321 %val_unscaled = load atomic i16, i16* %ptr_unscaled monotonic, align 2 1322 %tot2 = add i16 %tot1, %val_unscaled 1323 1324 %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm) 1325 %val_random = load atomic i16, i16* %ptr_random unordered, align 2 1326 %tot3 = add i16 %tot2, %val_random 1327 1328 ret i16 %tot3 1329} 1330 1331define i32 @atomic_load_relaxed_32(i32* %p, i32 %off32) #0 { 1332; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_32: 1333; CHECK-NOLSE-O1: ; %bb.0: 1334; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1335; CHECK-NOLSE-O1-NEXT: ldr w9, [x0, #16380] 1336; CHECK-NOLSE-O1-NEXT: ldr w10, [x0, w1, sxtw #2] 1337; CHECK-NOLSE-O1-NEXT: ldur w11, [x0, #-256] 1338; CHECK-NOLSE-O1-NEXT: ldr w8, [x8] 1339; CHECK-NOLSE-O1-NEXT: add w9, w9, w10 1340; CHECK-NOLSE-O1-NEXT: add w9, w9, w11 1341; CHECK-NOLSE-O1-NEXT: add w0, w9, w8 1342; CHECK-NOLSE-O1-NEXT: ret 1343; 1344; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_32: 1345; CHECK-NOLSE-O0: ; %bb.0: 1346; CHECK-NOLSE-O0-NEXT: ldr w8, [x0, #16380] 1347; CHECK-NOLSE-O0-NEXT: ldr w9, [x0, w1, sxtw #2] 1348; CHECK-NOLSE-O0-NEXT: add w8, w8, w9 1349; CHECK-NOLSE-O0-NEXT: ldur w9, [x0, #-256] 1350; CHECK-NOLSE-O0-NEXT: add w8, w8, w9 1351; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1352; CHECK-NOLSE-O0-NEXT: ldr w9, [x9] 1353; CHECK-NOLSE-O0-NEXT: add w0, w8, w9 1354; CHECK-NOLSE-O0-NEXT: ret 1355; 1356; CHECK-LSE-O1-LABEL: atomic_load_relaxed_32: 1357; CHECK-LSE-O1: ; %bb.0: 1358; CHECK-LSE-O1-NEXT: ldr w8, [x0, #16380] 1359; CHECK-LSE-O1-NEXT: ldr w9, [x0, w1, sxtw #2] 1360; CHECK-LSE-O1-NEXT: add w8, w8, w9 1361; CHECK-LSE-O1-NEXT: ldur w9, [x0, #-256] 1362; CHECK-LSE-O1-NEXT: add w8, w8, w9 1363; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1364; CHECK-LSE-O1-NEXT: ldr w9, [x9] 1365; CHECK-LSE-O1-NEXT: add w0, w8, w9 1366; CHECK-LSE-O1-NEXT: ret 1367; 1368; CHECK-LSE-O0-LABEL: atomic_load_relaxed_32: 1369; CHECK-LSE-O0: ; %bb.0: 1370; CHECK-LSE-O0-NEXT: ldr w8, [x0, #16380] 1371; CHECK-LSE-O0-NEXT: ldr w9, [x0, w1, sxtw #2] 1372; CHECK-LSE-O0-NEXT: add w8, w8, w9 1373; CHECK-LSE-O0-NEXT: ldur w9, [x0, #-256] 1374; CHECK-LSE-O0-NEXT: add w8, w8, w9 1375; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1376; CHECK-LSE-O0-NEXT: ldr w9, [x9] 1377; CHECK-LSE-O0-NEXT: add w0, w8, w9 1378; CHECK-LSE-O0-NEXT: ret 1379; 1380; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_32: 1381; CHECK-LDAPR-O1: ; %bb.0: 1382; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1383; CHECK-LDAPR-O1-NEXT: ldr w9, [x0, #16380] 1384; CHECK-LDAPR-O1-NEXT: ldr w10, [x0, w1, sxtw #2] 1385; CHECK-LDAPR-O1-NEXT: ldur w11, [x0, #-256] 1386; CHECK-LDAPR-O1-NEXT: ldr w8, [x8] 1387; CHECK-LDAPR-O1-NEXT: add w9, w9, w10 1388; CHECK-LDAPR-O1-NEXT: add w9, w9, w11 1389; CHECK-LDAPR-O1-NEXT: add w0, w9, w8 1390; CHECK-LDAPR-O1-NEXT: ret 1391; 1392; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_32: 1393; CHECK-LDAPR-O0: ; %bb.0: 1394; CHECK-LDAPR-O0-NEXT: ldr w8, [x0, #16380] 1395; CHECK-LDAPR-O0-NEXT: ldr w9, [x0, w1, sxtw #2] 1396; CHECK-LDAPR-O0-NEXT: add w8, w8, w9 1397; CHECK-LDAPR-O0-NEXT: ldur w9, [x0, #-256] 1398; CHECK-LDAPR-O0-NEXT: add w8, w8, w9 1399; CHECK-LDAPR-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1400; CHECK-LDAPR-O0-NEXT: ldr w9, [x9] 1401; CHECK-LDAPR-O0-NEXT: add w0, w8, w9 1402; CHECK-LDAPR-O0-NEXT: ret 1403 %ptr_unsigned = getelementptr i32, i32* %p, i32 4095 1404 %val_unsigned = load atomic i32, i32* %ptr_unsigned monotonic, align 4 1405 1406 %ptr_regoff = getelementptr i32, i32* %p, i32 %off32 1407 %val_regoff = load atomic i32, i32* %ptr_regoff unordered, align 4 1408 %tot1 = add i32 %val_unsigned, %val_regoff 1409 1410 %ptr_unscaled = getelementptr i32, i32* %p, i32 -64 1411 %val_unscaled = load atomic i32, i32* %ptr_unscaled monotonic, align 4 1412 %tot2 = add i32 %tot1, %val_unscaled 1413 1414 %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm) 1415 %val_random = load atomic i32, i32* %ptr_random unordered, align 4 1416 %tot3 = add i32 %tot2, %val_random 1417 1418 ret i32 %tot3 1419} 1420 1421define i64 @atomic_load_relaxed_64(i64* %p, i32 %off32) #0 { 1422; CHECK-NOLSE-O1-LABEL: atomic_load_relaxed_64: 1423; CHECK-NOLSE-O1: ; %bb.0: 1424; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1425; CHECK-NOLSE-O1-NEXT: ldr x9, [x0, #32760] 1426; CHECK-NOLSE-O1-NEXT: ldr x10, [x0, w1, sxtw #3] 1427; CHECK-NOLSE-O1-NEXT: ldur x11, [x0, #-256] 1428; CHECK-NOLSE-O1-NEXT: ldr x8, [x8] 1429; CHECK-NOLSE-O1-NEXT: add x9, x9, x10 1430; CHECK-NOLSE-O1-NEXT: add x9, x9, x11 1431; CHECK-NOLSE-O1-NEXT: add x0, x9, x8 1432; CHECK-NOLSE-O1-NEXT: ret 1433; 1434; CHECK-NOLSE-O0-LABEL: atomic_load_relaxed_64: 1435; CHECK-NOLSE-O0: ; %bb.0: 1436; CHECK-NOLSE-O0-NEXT: ldr x8, [x0, #32760] 1437; CHECK-NOLSE-O0-NEXT: ldr x9, [x0, w1, sxtw #3] 1438; CHECK-NOLSE-O0-NEXT: add x8, x8, x9 1439; CHECK-NOLSE-O0-NEXT: ldur x9, [x0, #-256] 1440; CHECK-NOLSE-O0-NEXT: add x8, x8, x9 1441; CHECK-NOLSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1442; CHECK-NOLSE-O0-NEXT: ldr x9, [x9] 1443; CHECK-NOLSE-O0-NEXT: add x0, x8, x9 1444; CHECK-NOLSE-O0-NEXT: ret 1445; 1446; CHECK-LSE-O1-LABEL: atomic_load_relaxed_64: 1447; CHECK-LSE-O1: ; %bb.0: 1448; CHECK-LSE-O1-NEXT: ldr x8, [x0, #32760] 1449; CHECK-LSE-O1-NEXT: ldr x9, [x0, w1, sxtw #3] 1450; CHECK-LSE-O1-NEXT: add x8, x8, x9 1451; CHECK-LSE-O1-NEXT: ldur x9, [x0, #-256] 1452; CHECK-LSE-O1-NEXT: add x8, x8, x9 1453; CHECK-LSE-O1-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1454; CHECK-LSE-O1-NEXT: ldr x9, [x9] 1455; CHECK-LSE-O1-NEXT: add x0, x8, x9 1456; CHECK-LSE-O1-NEXT: ret 1457; 1458; CHECK-LSE-O0-LABEL: atomic_load_relaxed_64: 1459; CHECK-LSE-O0: ; %bb.0: 1460; CHECK-LSE-O0-NEXT: ldr x8, [x0, #32760] 1461; CHECK-LSE-O0-NEXT: ldr x9, [x0, w1, sxtw #3] 1462; CHECK-LSE-O0-NEXT: add x8, x8, x9 1463; CHECK-LSE-O0-NEXT: ldur x9, [x0, #-256] 1464; CHECK-LSE-O0-NEXT: add x8, x8, x9 1465; CHECK-LSE-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1466; CHECK-LSE-O0-NEXT: ldr x9, [x9] 1467; CHECK-LSE-O0-NEXT: add x0, x8, x9 1468; CHECK-LSE-O0-NEXT: ret 1469; 1470; CHECK-LDAPR-O1-LABEL: atomic_load_relaxed_64: 1471; CHECK-LDAPR-O1: ; %bb.0: 1472; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1473; CHECK-LDAPR-O1-NEXT: ldr x9, [x0, #32760] 1474; CHECK-LDAPR-O1-NEXT: ldr x10, [x0, w1, sxtw #3] 1475; CHECK-LDAPR-O1-NEXT: ldur x11, [x0, #-256] 1476; CHECK-LDAPR-O1-NEXT: ldr x8, [x8] 1477; CHECK-LDAPR-O1-NEXT: add x9, x9, x10 1478; CHECK-LDAPR-O1-NEXT: add x9, x9, x11 1479; CHECK-LDAPR-O1-NEXT: add x0, x9, x8 1480; CHECK-LDAPR-O1-NEXT: ret 1481; 1482; CHECK-LDAPR-O0-LABEL: atomic_load_relaxed_64: 1483; CHECK-LDAPR-O0: ; %bb.0: 1484; CHECK-LDAPR-O0-NEXT: ldr x8, [x0, #32760] 1485; CHECK-LDAPR-O0-NEXT: ldr x9, [x0, w1, sxtw #3] 1486; CHECK-LDAPR-O0-NEXT: add x8, x8, x9 1487; CHECK-LDAPR-O0-NEXT: ldur x9, [x0, #-256] 1488; CHECK-LDAPR-O0-NEXT: add x8, x8, x9 1489; CHECK-LDAPR-O0-NEXT: add x9, x0, #291, lsl #12 ; =1191936 1490; CHECK-LDAPR-O0-NEXT: ldr x9, [x9] 1491; CHECK-LDAPR-O0-NEXT: add x0, x8, x9 1492; CHECK-LDAPR-O0-NEXT: ret 1493 %ptr_unsigned = getelementptr i64, i64* %p, i32 4095 1494 %val_unsigned = load atomic i64, i64* %ptr_unsigned monotonic, align 8 1495 1496 %ptr_regoff = getelementptr i64, i64* %p, i32 %off32 1497 %val_regoff = load atomic i64, i64* %ptr_regoff unordered, align 8 1498 %tot1 = add i64 %val_unsigned, %val_regoff 1499 1500 %ptr_unscaled = getelementptr i64, i64* %p, i32 -32 1501 %val_unscaled = load atomic i64, i64* %ptr_unscaled monotonic, align 8 1502 %tot2 = add i64 %tot1, %val_unscaled 1503 1504 %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm) 1505 %val_random = load atomic i64, i64* %ptr_random unordered, align 8 1506 %tot3 = add i64 %tot2, %val_random 1507 1508 ret i64 %tot3 1509} 1510 1511 1512define void @atomc_store(i32* %p) #0 { 1513; CHECK-NOLSE-LABEL: atomc_store: 1514; CHECK-NOLSE: ; %bb.0: 1515; CHECK-NOLSE-NEXT: mov w8, #4 1516; CHECK-NOLSE-NEXT: stlr w8, [x0] 1517; CHECK-NOLSE-NEXT: ret 1518; 1519; CHECK-LSE-O1-LABEL: atomc_store: 1520; CHECK-LSE-O1: ; %bb.0: 1521; CHECK-LSE-O1-NEXT: mov w8, #4 1522; CHECK-LSE-O1-NEXT: stlr w8, [x0] 1523; CHECK-LSE-O1-NEXT: ret 1524; 1525; CHECK-LSE-O0-LABEL: atomc_store: 1526; CHECK-LSE-O0: ; %bb.0: 1527; CHECK-LSE-O0-NEXT: mov w8, #4 1528; CHECK-LSE-O0-NEXT: stlr w8, [x0] 1529; CHECK-LSE-O0-NEXT: ret 1530; 1531; CHECK-LDAPR-O1-LABEL: atomc_store: 1532; CHECK-LDAPR-O1: ; %bb.0: 1533; CHECK-LDAPR-O1-NEXT: mov w8, #4 1534; CHECK-LDAPR-O1-NEXT: stlr w8, [x0] 1535; CHECK-LDAPR-O1-NEXT: ret 1536; 1537; CHECK-LDAPR-O0-LABEL: atomc_store: 1538; CHECK-LDAPR-O0: ; %bb.0: 1539; CHECK-LDAPR-O0-NEXT: mov w8, #4 1540; CHECK-LDAPR-O0-NEXT: stlr w8, [x0] 1541; CHECK-LDAPR-O0-NEXT: ret 1542 store atomic i32 4, i32* %p seq_cst, align 4 1543 ret void 1544} 1545 1546define void @atomic_store_relaxed_8(i8* %p, i32 %off32, i8 %val) #0 { 1547; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_8: 1548; CHECK-NOLSE-O1: ; %bb.0: 1549; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1550; CHECK-NOLSE-O1-NEXT: strb w2, [x0, #4095] 1551; CHECK-NOLSE-O1-NEXT: strb w2, [x0, w1, sxtw] 1552; CHECK-NOLSE-O1-NEXT: sturb w2, [x0, #-256] 1553; CHECK-NOLSE-O1-NEXT: strb w2, [x8] 1554; CHECK-NOLSE-O1-NEXT: ret 1555; 1556; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_8: 1557; CHECK-NOLSE-O0: ; %bb.0: 1558; CHECK-NOLSE-O0-NEXT: strb w2, [x0, #4095] 1559; CHECK-NOLSE-O0-NEXT: strb w2, [x0, w1, sxtw] 1560; CHECK-NOLSE-O0-NEXT: sturb w2, [x0, #-256] 1561; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1562; CHECK-NOLSE-O0-NEXT: strb w2, [x8] 1563; CHECK-NOLSE-O0-NEXT: ret 1564; 1565; CHECK-LSE-O1-LABEL: atomic_store_relaxed_8: 1566; CHECK-LSE-O1: ; %bb.0: 1567; CHECK-LSE-O1-NEXT: strb w2, [x0, #4095] 1568; CHECK-LSE-O1-NEXT: strb w2, [x0, w1, sxtw] 1569; CHECK-LSE-O1-NEXT: sturb w2, [x0, #-256] 1570; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1571; CHECK-LSE-O1-NEXT: strb w2, [x8] 1572; CHECK-LSE-O1-NEXT: ret 1573; 1574; CHECK-LSE-O0-LABEL: atomic_store_relaxed_8: 1575; CHECK-LSE-O0: ; %bb.0: 1576; CHECK-LSE-O0-NEXT: strb w2, [x0, #4095] 1577; CHECK-LSE-O0-NEXT: strb w2, [x0, w1, sxtw] 1578; CHECK-LSE-O0-NEXT: sturb w2, [x0, #-256] 1579; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1580; CHECK-LSE-O0-NEXT: strb w2, [x8] 1581; CHECK-LSE-O0-NEXT: ret 1582; 1583; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_8: 1584; CHECK-LDAPR-O1: ; %bb.0: 1585; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1586; CHECK-LDAPR-O1-NEXT: strb w2, [x0, #4095] 1587; CHECK-LDAPR-O1-NEXT: strb w2, [x0, w1, sxtw] 1588; CHECK-LDAPR-O1-NEXT: sturb w2, [x0, #-256] 1589; CHECK-LDAPR-O1-NEXT: strb w2, [x8] 1590; CHECK-LDAPR-O1-NEXT: ret 1591; 1592; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_8: 1593; CHECK-LDAPR-O0: ; %bb.0: 1594; CHECK-LDAPR-O0-NEXT: strb w2, [x0, #4095] 1595; CHECK-LDAPR-O0-NEXT: strb w2, [x0, w1, sxtw] 1596; CHECK-LDAPR-O0-NEXT: sturb w2, [x0, #-256] 1597; CHECK-LDAPR-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1598; CHECK-LDAPR-O0-NEXT: strb w2, [x8] 1599; CHECK-LDAPR-O0-NEXT: ret 1600 %ptr_unsigned = getelementptr i8, i8* %p, i32 4095 1601 store atomic i8 %val, i8* %ptr_unsigned monotonic, align 1 1602 1603 %ptr_regoff = getelementptr i8, i8* %p, i32 %off32 1604 store atomic i8 %val, i8* %ptr_regoff unordered, align 1 1605 1606 %ptr_unscaled = getelementptr i8, i8* %p, i32 -256 1607 store atomic i8 %val, i8* %ptr_unscaled monotonic, align 1 1608 1609 %ptr_random = getelementptr i8, i8* %p, i32 1191936 ; 0x123000 (i.e. ADD imm) 1610 store atomic i8 %val, i8* %ptr_random unordered, align 1 1611 1612 ret void 1613} 1614 1615define void @atomic_store_relaxed_16(i16* %p, i32 %off32, i16 %val) #0 { 1616; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_16: 1617; CHECK-NOLSE-O1: ; %bb.0: 1618; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1619; CHECK-NOLSE-O1-NEXT: strh w2, [x0, #8190] 1620; CHECK-NOLSE-O1-NEXT: strh w2, [x0, w1, sxtw #1] 1621; CHECK-NOLSE-O1-NEXT: sturh w2, [x0, #-256] 1622; CHECK-NOLSE-O1-NEXT: strh w2, [x8] 1623; CHECK-NOLSE-O1-NEXT: ret 1624; 1625; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_16: 1626; CHECK-NOLSE-O0: ; %bb.0: 1627; CHECK-NOLSE-O0-NEXT: strh w2, [x0, #8190] 1628; CHECK-NOLSE-O0-NEXT: strh w2, [x0, w1, sxtw #1] 1629; CHECK-NOLSE-O0-NEXT: sturh w2, [x0, #-256] 1630; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1631; CHECK-NOLSE-O0-NEXT: strh w2, [x8] 1632; CHECK-NOLSE-O0-NEXT: ret 1633; 1634; CHECK-LSE-O1-LABEL: atomic_store_relaxed_16: 1635; CHECK-LSE-O1: ; %bb.0: 1636; CHECK-LSE-O1-NEXT: strh w2, [x0, #8190] 1637; CHECK-LSE-O1-NEXT: strh w2, [x0, w1, sxtw #1] 1638; CHECK-LSE-O1-NEXT: sturh w2, [x0, #-256] 1639; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1640; CHECK-LSE-O1-NEXT: strh w2, [x8] 1641; CHECK-LSE-O1-NEXT: ret 1642; 1643; CHECK-LSE-O0-LABEL: atomic_store_relaxed_16: 1644; CHECK-LSE-O0: ; %bb.0: 1645; CHECK-LSE-O0-NEXT: strh w2, [x0, #8190] 1646; CHECK-LSE-O0-NEXT: strh w2, [x0, w1, sxtw #1] 1647; CHECK-LSE-O0-NEXT: sturh w2, [x0, #-256] 1648; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1649; CHECK-LSE-O0-NEXT: strh w2, [x8] 1650; CHECK-LSE-O0-NEXT: ret 1651; 1652; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_16: 1653; CHECK-LDAPR-O1: ; %bb.0: 1654; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1655; CHECK-LDAPR-O1-NEXT: strh w2, [x0, #8190] 1656; CHECK-LDAPR-O1-NEXT: strh w2, [x0, w1, sxtw #1] 1657; CHECK-LDAPR-O1-NEXT: sturh w2, [x0, #-256] 1658; CHECK-LDAPR-O1-NEXT: strh w2, [x8] 1659; CHECK-LDAPR-O1-NEXT: ret 1660; 1661; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_16: 1662; CHECK-LDAPR-O0: ; %bb.0: 1663; CHECK-LDAPR-O0-NEXT: strh w2, [x0, #8190] 1664; CHECK-LDAPR-O0-NEXT: strh w2, [x0, w1, sxtw #1] 1665; CHECK-LDAPR-O0-NEXT: sturh w2, [x0, #-256] 1666; CHECK-LDAPR-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1667; CHECK-LDAPR-O0-NEXT: strh w2, [x8] 1668; CHECK-LDAPR-O0-NEXT: ret 1669 %ptr_unsigned = getelementptr i16, i16* %p, i32 4095 1670 store atomic i16 %val, i16* %ptr_unsigned monotonic, align 2 1671 1672 %ptr_regoff = getelementptr i16, i16* %p, i32 %off32 1673 store atomic i16 %val, i16* %ptr_regoff unordered, align 2 1674 1675 %ptr_unscaled = getelementptr i16, i16* %p, i32 -128 1676 store atomic i16 %val, i16* %ptr_unscaled monotonic, align 2 1677 1678 %ptr_random = getelementptr i16, i16* %p, i32 595968 ; 0x123000/2 (i.e. ADD imm) 1679 store atomic i16 %val, i16* %ptr_random unordered, align 2 1680 1681 ret void 1682} 1683 1684define void @atomic_store_relaxed_32(i32* %p, i32 %off32, i32 %val) #0 { 1685; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_32: 1686; CHECK-NOLSE-O1: ; %bb.0: 1687; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1688; CHECK-NOLSE-O1-NEXT: str w2, [x0, #16380] 1689; CHECK-NOLSE-O1-NEXT: str w2, [x0, w1, sxtw #2] 1690; CHECK-NOLSE-O1-NEXT: stur w2, [x0, #-256] 1691; CHECK-NOLSE-O1-NEXT: str w2, [x8] 1692; CHECK-NOLSE-O1-NEXT: ret 1693; 1694; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_32: 1695; CHECK-NOLSE-O0: ; %bb.0: 1696; CHECK-NOLSE-O0-NEXT: str w2, [x0, #16380] 1697; CHECK-NOLSE-O0-NEXT: str w2, [x0, w1, sxtw #2] 1698; CHECK-NOLSE-O0-NEXT: stur w2, [x0, #-256] 1699; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1700; CHECK-NOLSE-O0-NEXT: str w2, [x8] 1701; CHECK-NOLSE-O0-NEXT: ret 1702; 1703; CHECK-LSE-O1-LABEL: atomic_store_relaxed_32: 1704; CHECK-LSE-O1: ; %bb.0: 1705; CHECK-LSE-O1-NEXT: str w2, [x0, #16380] 1706; CHECK-LSE-O1-NEXT: str w2, [x0, w1, sxtw #2] 1707; CHECK-LSE-O1-NEXT: stur w2, [x0, #-256] 1708; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1709; CHECK-LSE-O1-NEXT: str w2, [x8] 1710; CHECK-LSE-O1-NEXT: ret 1711; 1712; CHECK-LSE-O0-LABEL: atomic_store_relaxed_32: 1713; CHECK-LSE-O0: ; %bb.0: 1714; CHECK-LSE-O0-NEXT: str w2, [x0, #16380] 1715; CHECK-LSE-O0-NEXT: str w2, [x0, w1, sxtw #2] 1716; CHECK-LSE-O0-NEXT: stur w2, [x0, #-256] 1717; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1718; CHECK-LSE-O0-NEXT: str w2, [x8] 1719; CHECK-LSE-O0-NEXT: ret 1720; 1721; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_32: 1722; CHECK-LDAPR-O1: ; %bb.0: 1723; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1724; CHECK-LDAPR-O1-NEXT: str w2, [x0, #16380] 1725; CHECK-LDAPR-O1-NEXT: str w2, [x0, w1, sxtw #2] 1726; CHECK-LDAPR-O1-NEXT: stur w2, [x0, #-256] 1727; CHECK-LDAPR-O1-NEXT: str w2, [x8] 1728; CHECK-LDAPR-O1-NEXT: ret 1729; 1730; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_32: 1731; CHECK-LDAPR-O0: ; %bb.0: 1732; CHECK-LDAPR-O0-NEXT: str w2, [x0, #16380] 1733; CHECK-LDAPR-O0-NEXT: str w2, [x0, w1, sxtw #2] 1734; CHECK-LDAPR-O0-NEXT: stur w2, [x0, #-256] 1735; CHECK-LDAPR-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1736; CHECK-LDAPR-O0-NEXT: str w2, [x8] 1737; CHECK-LDAPR-O0-NEXT: ret 1738 %ptr_unsigned = getelementptr i32, i32* %p, i32 4095 1739 store atomic i32 %val, i32* %ptr_unsigned monotonic, align 4 1740 1741 %ptr_regoff = getelementptr i32, i32* %p, i32 %off32 1742 store atomic i32 %val, i32* %ptr_regoff unordered, align 4 1743 1744 %ptr_unscaled = getelementptr i32, i32* %p, i32 -64 1745 store atomic i32 %val, i32* %ptr_unscaled monotonic, align 4 1746 1747 %ptr_random = getelementptr i32, i32* %p, i32 297984 ; 0x123000/4 (i.e. ADD imm) 1748 store atomic i32 %val, i32* %ptr_random unordered, align 4 1749 1750 ret void 1751} 1752 1753define void @atomic_store_relaxed_64(i64* %p, i32 %off32, i64 %val) #0 { 1754; CHECK-NOLSE-O1-LABEL: atomic_store_relaxed_64: 1755; CHECK-NOLSE-O1: ; %bb.0: 1756; CHECK-NOLSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1757; CHECK-NOLSE-O1-NEXT: str x2, [x0, #32760] 1758; CHECK-NOLSE-O1-NEXT: str x2, [x0, w1, sxtw #3] 1759; CHECK-NOLSE-O1-NEXT: stur x2, [x0, #-256] 1760; CHECK-NOLSE-O1-NEXT: str x2, [x8] 1761; CHECK-NOLSE-O1-NEXT: ret 1762; 1763; CHECK-NOLSE-O0-LABEL: atomic_store_relaxed_64: 1764; CHECK-NOLSE-O0: ; %bb.0: 1765; CHECK-NOLSE-O0-NEXT: str x2, [x0, #32760] 1766; CHECK-NOLSE-O0-NEXT: str x2, [x0, w1, sxtw #3] 1767; CHECK-NOLSE-O0-NEXT: stur x2, [x0, #-256] 1768; CHECK-NOLSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1769; CHECK-NOLSE-O0-NEXT: str x2, [x8] 1770; CHECK-NOLSE-O0-NEXT: ret 1771; 1772; CHECK-LSE-O1-LABEL: atomic_store_relaxed_64: 1773; CHECK-LSE-O1: ; %bb.0: 1774; CHECK-LSE-O1-NEXT: str x2, [x0, #32760] 1775; CHECK-LSE-O1-NEXT: str x2, [x0, w1, sxtw #3] 1776; CHECK-LSE-O1-NEXT: stur x2, [x0, #-256] 1777; CHECK-LSE-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1778; CHECK-LSE-O1-NEXT: str x2, [x8] 1779; CHECK-LSE-O1-NEXT: ret 1780; 1781; CHECK-LSE-O0-LABEL: atomic_store_relaxed_64: 1782; CHECK-LSE-O0: ; %bb.0: 1783; CHECK-LSE-O0-NEXT: str x2, [x0, #32760] 1784; CHECK-LSE-O0-NEXT: str x2, [x0, w1, sxtw #3] 1785; CHECK-LSE-O0-NEXT: stur x2, [x0, #-256] 1786; CHECK-LSE-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1787; CHECK-LSE-O0-NEXT: str x2, [x8] 1788; CHECK-LSE-O0-NEXT: ret 1789; 1790; CHECK-LDAPR-O1-LABEL: atomic_store_relaxed_64: 1791; CHECK-LDAPR-O1: ; %bb.0: 1792; CHECK-LDAPR-O1-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1793; CHECK-LDAPR-O1-NEXT: str x2, [x0, #32760] 1794; CHECK-LDAPR-O1-NEXT: str x2, [x0, w1, sxtw #3] 1795; CHECK-LDAPR-O1-NEXT: stur x2, [x0, #-256] 1796; CHECK-LDAPR-O1-NEXT: str x2, [x8] 1797; CHECK-LDAPR-O1-NEXT: ret 1798; 1799; CHECK-LDAPR-O0-LABEL: atomic_store_relaxed_64: 1800; CHECK-LDAPR-O0: ; %bb.0: 1801; CHECK-LDAPR-O0-NEXT: str x2, [x0, #32760] 1802; CHECK-LDAPR-O0-NEXT: str x2, [x0, w1, sxtw #3] 1803; CHECK-LDAPR-O0-NEXT: stur x2, [x0, #-256] 1804; CHECK-LDAPR-O0-NEXT: add x8, x0, #291, lsl #12 ; =1191936 1805; CHECK-LDAPR-O0-NEXT: str x2, [x8] 1806; CHECK-LDAPR-O0-NEXT: ret 1807 %ptr_unsigned = getelementptr i64, i64* %p, i32 4095 1808 store atomic i64 %val, i64* %ptr_unsigned monotonic, align 8 1809 1810 %ptr_regoff = getelementptr i64, i64* %p, i32 %off32 1811 store atomic i64 %val, i64* %ptr_regoff unordered, align 8 1812 1813 %ptr_unscaled = getelementptr i64, i64* %p, i32 -32 1814 store atomic i64 %val, i64* %ptr_unscaled monotonic, align 8 1815 1816 %ptr_random = getelementptr i64, i64* %p, i32 148992 ; 0x123000/8 (i.e. ADD imm) 1817 store atomic i64 %val, i64* %ptr_random unordered, align 8 1818 1819 ret void 1820} 1821 1822define i32 @load_zext(i8* %p8, i16* %p16) { 1823; CHECK-NOLSE-O1-LABEL: load_zext: 1824; CHECK-NOLSE-O1: ; %bb.0: 1825; CHECK-NOLSE-O1-NEXT: ldarb w8, [x0] 1826; CHECK-NOLSE-O1-NEXT: ldrh w9, [x1] 1827; CHECK-NOLSE-O1-NEXT: add w0, w9, w8, uxtb 1828; CHECK-NOLSE-O1-NEXT: ret 1829; 1830; CHECK-NOLSE-O0-LABEL: load_zext: 1831; CHECK-NOLSE-O0: ; %bb.0: 1832; CHECK-NOLSE-O0-NEXT: ldarb w9, [x0] 1833; CHECK-NOLSE-O0-NEXT: ldrh w8, [x1] 1834; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, uxtb 1835; CHECK-NOLSE-O0-NEXT: ret 1836; 1837; CHECK-LSE-O1-LABEL: load_zext: 1838; CHECK-LSE-O1: ; %bb.0: 1839; CHECK-LSE-O1-NEXT: ldarb w8, [x0] 1840; CHECK-LSE-O1-NEXT: ldrh w9, [x1] 1841; CHECK-LSE-O1-NEXT: add w0, w9, w8, uxtb 1842; CHECK-LSE-O1-NEXT: ret 1843; 1844; CHECK-LSE-O0-LABEL: load_zext: 1845; CHECK-LSE-O0: ; %bb.0: 1846; CHECK-LSE-O0-NEXT: ldarb w9, [x0] 1847; CHECK-LSE-O0-NEXT: ldrh w8, [x1] 1848; CHECK-LSE-O0-NEXT: add w0, w8, w9, uxtb 1849; CHECK-LSE-O0-NEXT: ret 1850; 1851; CHECK-LDAPR-O1-LABEL: load_zext: 1852; CHECK-LDAPR-O1: ; %bb.0: 1853; CHECK-LDAPR-O1-NEXT: ldaprb w8, [x0] 1854; CHECK-LDAPR-O1-NEXT: ldrh w9, [x1] 1855; CHECK-LDAPR-O1-NEXT: add w0, w9, w8, uxtb 1856; CHECK-LDAPR-O1-NEXT: ret 1857; 1858; CHECK-LDAPR-O0-LABEL: load_zext: 1859; CHECK-LDAPR-O0: ; %bb.0: 1860; CHECK-LDAPR-O0-NEXT: ldaprb w9, [x0] 1861; CHECK-LDAPR-O0-NEXT: ldrh w8, [x1] 1862; CHECK-LDAPR-O0-NEXT: add w0, w8, w9, uxtb 1863; CHECK-LDAPR-O0-NEXT: ret 1864 %val1.8 = load atomic i8, i8* %p8 acquire, align 1 1865 %val1 = zext i8 %val1.8 to i32 1866 1867 %val2.16 = load atomic i16, i16* %p16 unordered, align 2 1868 %val2 = zext i16 %val2.16 to i32 1869 1870 %res = add i32 %val1, %val2 1871 ret i32 %res 1872} 1873 1874define { i32, i64 } @load_acq(i32* %p32, i64* %p64) { 1875; CHECK-NOLSE-LABEL: load_acq: 1876; CHECK-NOLSE: ; %bb.0: 1877; CHECK-NOLSE-NEXT: ldar w0, [x0] 1878; CHECK-NOLSE-NEXT: ldar x1, [x1] 1879; CHECK-NOLSE-NEXT: ret 1880; 1881; CHECK-LSE-O1-LABEL: load_acq: 1882; CHECK-LSE-O1: ; %bb.0: 1883; CHECK-LSE-O1-NEXT: ldar w0, [x0] 1884; CHECK-LSE-O1-NEXT: ldar x1, [x1] 1885; CHECK-LSE-O1-NEXT: ret 1886; 1887; CHECK-LSE-O0-LABEL: load_acq: 1888; CHECK-LSE-O0: ; %bb.0: 1889; CHECK-LSE-O0-NEXT: ldar w0, [x0] 1890; CHECK-LSE-O0-NEXT: ldar x1, [x1] 1891; CHECK-LSE-O0-NEXT: ret 1892; 1893; CHECK-LDAPR-O1-LABEL: load_acq: 1894; CHECK-LDAPR-O1: ; %bb.0: 1895; CHECK-LDAPR-O1-NEXT: ldar w0, [x0] 1896; CHECK-LDAPR-O1-NEXT: ldapr x1, [x1] 1897; CHECK-LDAPR-O1-NEXT: ret 1898; 1899; CHECK-LDAPR-O0-LABEL: load_acq: 1900; CHECK-LDAPR-O0: ; %bb.0: 1901; CHECK-LDAPR-O0-NEXT: ldar w0, [x0] 1902; CHECK-LDAPR-O0-NEXT: ldapr x1, [x1] 1903; CHECK-LDAPR-O0-NEXT: ret 1904 %val32 = load atomic i32, i32* %p32 seq_cst, align 4 1905 %tmp = insertvalue { i32, i64 } undef, i32 %val32, 0 1906 1907 %val64 = load atomic i64, i64* %p64 acquire, align 8 1908 %res = insertvalue { i32, i64 } %tmp, i64 %val64, 1 1909 1910 ret { i32, i64 } %res 1911} 1912 1913define i32 @load_sext(i8* %p8, i16* %p16) { 1914; CHECK-NOLSE-O1-LABEL: load_sext: 1915; CHECK-NOLSE-O1: ; %bb.0: 1916; CHECK-NOLSE-O1-NEXT: ldarb w8, [x0] 1917; CHECK-NOLSE-O1-NEXT: ldrh w9, [x1] 1918; CHECK-NOLSE-O1-NEXT: sxth w9, w9 1919; CHECK-NOLSE-O1-NEXT: add w0, w9, w8, sxtb 1920; CHECK-NOLSE-O1-NEXT: ret 1921; 1922; CHECK-NOLSE-O0-LABEL: load_sext: 1923; CHECK-NOLSE-O0: ; %bb.0: 1924; CHECK-NOLSE-O0-NEXT: ldarb w9, [x0] 1925; CHECK-NOLSE-O0-NEXT: ldrh w8, [x1] 1926; CHECK-NOLSE-O0-NEXT: sxth w8, w8 1927; CHECK-NOLSE-O0-NEXT: add w0, w8, w9, sxtb 1928; CHECK-NOLSE-O0-NEXT: ret 1929; 1930; CHECK-LSE-O1-LABEL: load_sext: 1931; CHECK-LSE-O1: ; %bb.0: 1932; CHECK-LSE-O1-NEXT: ldarb w8, [x0] 1933; CHECK-LSE-O1-NEXT: ldrh w9, [x1] 1934; CHECK-LSE-O1-NEXT: sxth w9, w9 1935; CHECK-LSE-O1-NEXT: add w0, w9, w8, sxtb 1936; CHECK-LSE-O1-NEXT: ret 1937; 1938; CHECK-LSE-O0-LABEL: load_sext: 1939; CHECK-LSE-O0: ; %bb.0: 1940; CHECK-LSE-O0-NEXT: ldarb w9, [x0] 1941; CHECK-LSE-O0-NEXT: ldrh w8, [x1] 1942; CHECK-LSE-O0-NEXT: sxth w8, w8 1943; CHECK-LSE-O0-NEXT: add w0, w8, w9, sxtb 1944; CHECK-LSE-O0-NEXT: ret 1945; 1946; CHECK-LDAPR-O1-LABEL: load_sext: 1947; CHECK-LDAPR-O1: ; %bb.0: 1948; CHECK-LDAPR-O1-NEXT: ldaprb w8, [x0] 1949; CHECK-LDAPR-O1-NEXT: ldrh w9, [x1] 1950; CHECK-LDAPR-O1-NEXT: sxth w9, w9 1951; CHECK-LDAPR-O1-NEXT: add w0, w9, w8, sxtb 1952; CHECK-LDAPR-O1-NEXT: ret 1953; 1954; CHECK-LDAPR-O0-LABEL: load_sext: 1955; CHECK-LDAPR-O0: ; %bb.0: 1956; CHECK-LDAPR-O0-NEXT: ldaprb w9, [x0] 1957; CHECK-LDAPR-O0-NEXT: ldrh w8, [x1] 1958; CHECK-LDAPR-O0-NEXT: sxth w8, w8 1959; CHECK-LDAPR-O0-NEXT: add w0, w8, w9, sxtb 1960; CHECK-LDAPR-O0-NEXT: ret 1961 %val1.8 = load atomic i8, i8* %p8 acquire, align 1 1962 %val1 = sext i8 %val1.8 to i32 1963 1964 %val2.16 = load atomic i16, i16* %p16 unordered, align 2 1965 %val2 = sext i16 %val2.16 to i32 1966 1967 %res = add i32 %val1, %val2 1968 ret i32 %res 1969} 1970 1971define void @store_trunc(i32 %val, i8* %p8, i16* %p16) { 1972; CHECK-NOLSE-LABEL: store_trunc: 1973; CHECK-NOLSE: ; %bb.0: 1974; CHECK-NOLSE-NEXT: stlrb w0, [x1] 1975; CHECK-NOLSE-NEXT: strh w0, [x2] 1976; CHECK-NOLSE-NEXT: ret 1977; 1978; CHECK-LSE-O1-LABEL: store_trunc: 1979; CHECK-LSE-O1: ; %bb.0: 1980; CHECK-LSE-O1-NEXT: stlrb w0, [x1] 1981; CHECK-LSE-O1-NEXT: strh w0, [x2] 1982; CHECK-LSE-O1-NEXT: ret 1983; 1984; CHECK-LSE-O0-LABEL: store_trunc: 1985; CHECK-LSE-O0: ; %bb.0: 1986; CHECK-LSE-O0-NEXT: stlrb w0, [x1] 1987; CHECK-LSE-O0-NEXT: strh w0, [x2] 1988; CHECK-LSE-O0-NEXT: ret 1989; 1990; CHECK-LDAPR-O1-LABEL: store_trunc: 1991; CHECK-LDAPR-O1: ; %bb.0: 1992; CHECK-LDAPR-O1-NEXT: stlrb w0, [x1] 1993; CHECK-LDAPR-O1-NEXT: strh w0, [x2] 1994; CHECK-LDAPR-O1-NEXT: ret 1995; 1996; CHECK-LDAPR-O0-LABEL: store_trunc: 1997; CHECK-LDAPR-O0: ; %bb.0: 1998; CHECK-LDAPR-O0-NEXT: stlrb w0, [x1] 1999; CHECK-LDAPR-O0-NEXT: strh w0, [x2] 2000; CHECK-LDAPR-O0-NEXT: ret 2001 %val8 = trunc i32 %val to i8 2002 store atomic i8 %val8, i8* %p8 seq_cst, align 1 2003 2004 %val16 = trunc i32 %val to i16 2005 store atomic i16 %val16, i16* %p16 monotonic, align 2 2006 2007 ret void 2008} 2009 2010define i8 @atomicrmw_add_i8(i8* %ptr, i8 %rhs) { 2011; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i8: 2012; CHECK-NOLSE-O1: ; %bb.0: 2013; CHECK-NOLSE-O1-NEXT: LBB27_1: ; %atomicrmw.start 2014; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2015; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0] 2016; CHECK-NOLSE-O1-NEXT: add w9, w8, w1 2017; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0] 2018; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB27_1 2019; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2020; CHECK-NOLSE-O1-NEXT: mov w0, w8 2021; CHECK-NOLSE-O1-NEXT: ret 2022; 2023; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i8: 2024; CHECK-NOLSE-O0: ; %bb.0: 2025; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2026; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2027; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2028; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2029; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2030; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2031; CHECK-NOLSE-O0-NEXT: b LBB27_1 2032; CHECK-NOLSE-O0-NEXT: LBB27_1: ; %atomicrmw.start 2033; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2034; CHECK-NOLSE-O0-NEXT: ; Child Loop BB27_2 Depth 2 2035; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2036; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2037; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2038; CHECK-NOLSE-O0-NEXT: add w12, w8, w10, uxth 2039; CHECK-NOLSE-O0-NEXT: LBB27_2: ; %atomicrmw.start 2040; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB27_1 Depth=1 2041; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2042; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2043; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2044; CHECK-NOLSE-O0-NEXT: b.ne LBB27_4 2045; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2046; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB27_2 Depth=2 2047; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2048; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB27_2 2049; CHECK-NOLSE-O0-NEXT: LBB27_4: ; %atomicrmw.start 2050; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB27_1 Depth=1 2051; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2052; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2053; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2054; CHECK-NOLSE-O0-NEXT: cset w8, eq 2055; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2056; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB27_1 2057; CHECK-NOLSE-O0-NEXT: b LBB27_5 2058; CHECK-NOLSE-O0-NEXT: LBB27_5: ; %atomicrmw.end 2059; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2060; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2061; CHECK-NOLSE-O0-NEXT: ret 2062; 2063; CHECK-LSE-O1-LABEL: atomicrmw_add_i8: 2064; CHECK-LSE-O1: ; %bb.0: 2065; CHECK-LSE-O1-NEXT: ldaddalb w1, w0, [x0] 2066; CHECK-LSE-O1-NEXT: ret 2067; 2068; CHECK-LSE-O0-LABEL: atomicrmw_add_i8: 2069; CHECK-LSE-O0: ; %bb.0: 2070; CHECK-LSE-O0-NEXT: ldaddalb w1, w0, [x0] 2071; CHECK-LSE-O0-NEXT: ret 2072; 2073; CHECK-LDAPR-O1-LABEL: atomicrmw_add_i8: 2074; CHECK-LDAPR-O1: ; %bb.0: 2075; CHECK-LDAPR-O1-NEXT: LBB27_1: ; %atomicrmw.start 2076; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2077; CHECK-LDAPR-O1-NEXT: ldaxrb w8, [x0] 2078; CHECK-LDAPR-O1-NEXT: add w9, w8, w1 2079; CHECK-LDAPR-O1-NEXT: stlxrb w10, w9, [x0] 2080; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB27_1 2081; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2082; CHECK-LDAPR-O1-NEXT: mov w0, w8 2083; CHECK-LDAPR-O1-NEXT: ret 2084; 2085; CHECK-LDAPR-O0-LABEL: atomicrmw_add_i8: 2086; CHECK-LDAPR-O0: ; %bb.0: 2087; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2088; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2089; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2090; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2091; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2092; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2093; CHECK-LDAPR-O0-NEXT: b LBB27_1 2094; CHECK-LDAPR-O0-NEXT: LBB27_1: ; %atomicrmw.start 2095; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2096; CHECK-LDAPR-O0-NEXT: ; Child Loop BB27_2 Depth 2 2097; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2098; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2099; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2100; CHECK-LDAPR-O0-NEXT: add w12, w8, w10, uxth 2101; CHECK-LDAPR-O0-NEXT: LBB27_2: ; %atomicrmw.start 2102; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB27_1 Depth=1 2103; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2104; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2105; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2106; CHECK-LDAPR-O0-NEXT: b.ne LBB27_4 2107; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2108; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB27_2 Depth=2 2109; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2110; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB27_2 2111; CHECK-LDAPR-O0-NEXT: LBB27_4: ; %atomicrmw.start 2112; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB27_1 Depth=1 2113; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2114; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2115; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2116; CHECK-LDAPR-O0-NEXT: cset w8, eq 2117; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2118; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB27_1 2119; CHECK-LDAPR-O0-NEXT: b LBB27_5 2120; CHECK-LDAPR-O0-NEXT: LBB27_5: ; %atomicrmw.end 2121; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2122; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2123; CHECK-LDAPR-O0-NEXT: ret 2124 %res = atomicrmw add i8* %ptr, i8 %rhs seq_cst 2125 ret i8 %res 2126} 2127 2128define i8 @atomicrmw_xchg_i8(i8* %ptr, i8 %rhs) { 2129; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i8: 2130; CHECK-NOLSE-O1: ; %bb.0: 2131; CHECK-NOLSE-O1-NEXT: ; kill: def $w1 killed $w1 def $x1 2132; CHECK-NOLSE-O1-NEXT: LBB28_1: ; %atomicrmw.start 2133; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2134; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0] 2135; CHECK-NOLSE-O1-NEXT: stxrb w9, w1, [x0] 2136; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB28_1 2137; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2138; CHECK-NOLSE-O1-NEXT: mov w0, w8 2139; CHECK-NOLSE-O1-NEXT: ret 2140; 2141; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i8: 2142; CHECK-NOLSE-O0: ; %bb.0: 2143; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2144; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2145; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2146; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2147; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2148; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2149; CHECK-NOLSE-O0-NEXT: b LBB28_1 2150; CHECK-NOLSE-O0-NEXT: LBB28_1: ; %atomicrmw.start 2151; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2152; CHECK-NOLSE-O0-NEXT: ; Child Loop BB28_2 Depth 2 2153; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2154; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2155; CHECK-NOLSE-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Folded Reload 2156; CHECK-NOLSE-O0-NEXT: LBB28_2: ; %atomicrmw.start 2157; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB28_1 Depth=1 2158; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2159; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2160; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2161; CHECK-NOLSE-O0-NEXT: b.ne LBB28_4 2162; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2163; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB28_2 Depth=2 2164; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2165; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB28_2 2166; CHECK-NOLSE-O0-NEXT: LBB28_4: ; %atomicrmw.start 2167; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB28_1 Depth=1 2168; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2169; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2170; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2171; CHECK-NOLSE-O0-NEXT: cset w8, eq 2172; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2173; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB28_1 2174; CHECK-NOLSE-O0-NEXT: b LBB28_5 2175; CHECK-NOLSE-O0-NEXT: LBB28_5: ; %atomicrmw.end 2176; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2177; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2178; CHECK-NOLSE-O0-NEXT: ret 2179; 2180; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i8: 2181; CHECK-LSE-O1: ; %bb.0: 2182; CHECK-LSE-O1-NEXT: swpb w1, w0, [x0] 2183; CHECK-LSE-O1-NEXT: ret 2184; 2185; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i8: 2186; CHECK-LSE-O0: ; %bb.0: 2187; CHECK-LSE-O0-NEXT: swpb w1, w0, [x0] 2188; CHECK-LSE-O0-NEXT: ret 2189; 2190; CHECK-LDAPR-O1-LABEL: atomicrmw_xchg_i8: 2191; CHECK-LDAPR-O1: ; %bb.0: 2192; CHECK-LDAPR-O1-NEXT: ; kill: def $w1 killed $w1 def $x1 2193; CHECK-LDAPR-O1-NEXT: LBB28_1: ; %atomicrmw.start 2194; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2195; CHECK-LDAPR-O1-NEXT: ldxrb w8, [x0] 2196; CHECK-LDAPR-O1-NEXT: stxrb w9, w1, [x0] 2197; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB28_1 2198; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2199; CHECK-LDAPR-O1-NEXT: mov w0, w8 2200; CHECK-LDAPR-O1-NEXT: ret 2201; 2202; CHECK-LDAPR-O0-LABEL: atomicrmw_xchg_i8: 2203; CHECK-LDAPR-O0: ; %bb.0: 2204; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2205; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2206; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2207; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2208; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2209; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2210; CHECK-LDAPR-O0-NEXT: b LBB28_1 2211; CHECK-LDAPR-O0-NEXT: LBB28_1: ; %atomicrmw.start 2212; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2213; CHECK-LDAPR-O0-NEXT: ; Child Loop BB28_2 Depth 2 2214; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2215; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2216; CHECK-LDAPR-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Folded Reload 2217; CHECK-LDAPR-O0-NEXT: LBB28_2: ; %atomicrmw.start 2218; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB28_1 Depth=1 2219; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2220; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2221; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2222; CHECK-LDAPR-O0-NEXT: b.ne LBB28_4 2223; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2224; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB28_2 Depth=2 2225; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2226; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB28_2 2227; CHECK-LDAPR-O0-NEXT: LBB28_4: ; %atomicrmw.start 2228; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB28_1 Depth=1 2229; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2230; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2231; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2232; CHECK-LDAPR-O0-NEXT: cset w8, eq 2233; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2234; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB28_1 2235; CHECK-LDAPR-O0-NEXT: b LBB28_5 2236; CHECK-LDAPR-O0-NEXT: LBB28_5: ; %atomicrmw.end 2237; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2238; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2239; CHECK-LDAPR-O0-NEXT: ret 2240 %res = atomicrmw xchg i8* %ptr, i8 %rhs monotonic 2241 ret i8 %res 2242} 2243 2244define i8 @atomicrmw_sub_i8(i8* %ptr, i8 %rhs) { 2245; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i8: 2246; CHECK-NOLSE-O1: ; %bb.0: 2247; CHECK-NOLSE-O1-NEXT: LBB29_1: ; %atomicrmw.start 2248; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2249; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0] 2250; CHECK-NOLSE-O1-NEXT: sub w9, w8, w1 2251; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0] 2252; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB29_1 2253; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2254; CHECK-NOLSE-O1-NEXT: mov w0, w8 2255; CHECK-NOLSE-O1-NEXT: ret 2256; 2257; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i8: 2258; CHECK-NOLSE-O0: ; %bb.0: 2259; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2260; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2261; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2262; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2263; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2264; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2265; CHECK-NOLSE-O0-NEXT: b LBB29_1 2266; CHECK-NOLSE-O0-NEXT: LBB29_1: ; %atomicrmw.start 2267; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2268; CHECK-NOLSE-O0-NEXT: ; Child Loop BB29_2 Depth 2 2269; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2270; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2271; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2272; CHECK-NOLSE-O0-NEXT: subs w12, w10, w8 2273; CHECK-NOLSE-O0-NEXT: LBB29_2: ; %atomicrmw.start 2274; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB29_1 Depth=1 2275; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2276; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2277; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2278; CHECK-NOLSE-O0-NEXT: b.ne LBB29_4 2279; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2280; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB29_2 Depth=2 2281; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2282; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB29_2 2283; CHECK-NOLSE-O0-NEXT: LBB29_4: ; %atomicrmw.start 2284; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB29_1 Depth=1 2285; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2286; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2287; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2288; CHECK-NOLSE-O0-NEXT: cset w8, eq 2289; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2290; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB29_1 2291; CHECK-NOLSE-O0-NEXT: b LBB29_5 2292; CHECK-NOLSE-O0-NEXT: LBB29_5: ; %atomicrmw.end 2293; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2294; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2295; CHECK-NOLSE-O0-NEXT: ret 2296; 2297; CHECK-LSE-O1-LABEL: atomicrmw_sub_i8: 2298; CHECK-LSE-O1: ; %bb.0: 2299; CHECK-LSE-O1-NEXT: neg w8, w1 2300; CHECK-LSE-O1-NEXT: ldaddab w8, w0, [x0] 2301; CHECK-LSE-O1-NEXT: ret 2302; 2303; CHECK-LSE-O0-LABEL: atomicrmw_sub_i8: 2304; CHECK-LSE-O0: ; %bb.0: 2305; CHECK-LSE-O0-NEXT: neg w8, w1 2306; CHECK-LSE-O0-NEXT: ldaddab w8, w0, [x0] 2307; CHECK-LSE-O0-NEXT: ret 2308; 2309; CHECK-LDAPR-O1-LABEL: atomicrmw_sub_i8: 2310; CHECK-LDAPR-O1: ; %bb.0: 2311; CHECK-LDAPR-O1-NEXT: LBB29_1: ; %atomicrmw.start 2312; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2313; CHECK-LDAPR-O1-NEXT: ldaxrb w8, [x0] 2314; CHECK-LDAPR-O1-NEXT: sub w9, w8, w1 2315; CHECK-LDAPR-O1-NEXT: stxrb w10, w9, [x0] 2316; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB29_1 2317; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2318; CHECK-LDAPR-O1-NEXT: mov w0, w8 2319; CHECK-LDAPR-O1-NEXT: ret 2320; 2321; CHECK-LDAPR-O0-LABEL: atomicrmw_sub_i8: 2322; CHECK-LDAPR-O0: ; %bb.0: 2323; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2324; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2325; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2326; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2327; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2328; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2329; CHECK-LDAPR-O0-NEXT: b LBB29_1 2330; CHECK-LDAPR-O0-NEXT: LBB29_1: ; %atomicrmw.start 2331; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2332; CHECK-LDAPR-O0-NEXT: ; Child Loop BB29_2 Depth 2 2333; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2334; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2335; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2336; CHECK-LDAPR-O0-NEXT: subs w12, w10, w8 2337; CHECK-LDAPR-O0-NEXT: LBB29_2: ; %atomicrmw.start 2338; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB29_1 Depth=1 2339; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2340; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2341; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2342; CHECK-LDAPR-O0-NEXT: b.ne LBB29_4 2343; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2344; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB29_2 Depth=2 2345; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2346; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB29_2 2347; CHECK-LDAPR-O0-NEXT: LBB29_4: ; %atomicrmw.start 2348; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB29_1 Depth=1 2349; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2350; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2351; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2352; CHECK-LDAPR-O0-NEXT: cset w8, eq 2353; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2354; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB29_1 2355; CHECK-LDAPR-O0-NEXT: b LBB29_5 2356; CHECK-LDAPR-O0-NEXT: LBB29_5: ; %atomicrmw.end 2357; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2358; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2359; CHECK-LDAPR-O0-NEXT: ret 2360 %res = atomicrmw sub i8* %ptr, i8 %rhs acquire 2361 ret i8 %res 2362} 2363 2364define i8 @atomicrmw_and_i8(i8* %ptr, i8 %rhs) { 2365; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i8: 2366; CHECK-NOLSE-O1: ; %bb.0: 2367; CHECK-NOLSE-O1-NEXT: LBB30_1: ; %atomicrmw.start 2368; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2369; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0] 2370; CHECK-NOLSE-O1-NEXT: and w9, w8, w1 2371; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0] 2372; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB30_1 2373; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2374; CHECK-NOLSE-O1-NEXT: mov w0, w8 2375; CHECK-NOLSE-O1-NEXT: ret 2376; 2377; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i8: 2378; CHECK-NOLSE-O0: ; %bb.0: 2379; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2380; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2381; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2382; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2383; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2384; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2385; CHECK-NOLSE-O0-NEXT: b LBB30_1 2386; CHECK-NOLSE-O0-NEXT: LBB30_1: ; %atomicrmw.start 2387; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2388; CHECK-NOLSE-O0-NEXT: ; Child Loop BB30_2 Depth 2 2389; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2390; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2391; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2392; CHECK-NOLSE-O0-NEXT: and w12, w10, w8 2393; CHECK-NOLSE-O0-NEXT: LBB30_2: ; %atomicrmw.start 2394; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB30_1 Depth=1 2395; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2396; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2397; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2398; CHECK-NOLSE-O0-NEXT: b.ne LBB30_4 2399; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2400; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB30_2 Depth=2 2401; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2402; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB30_2 2403; CHECK-NOLSE-O0-NEXT: LBB30_4: ; %atomicrmw.start 2404; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB30_1 Depth=1 2405; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2406; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2407; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2408; CHECK-NOLSE-O0-NEXT: cset w8, eq 2409; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2410; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB30_1 2411; CHECK-NOLSE-O0-NEXT: b LBB30_5 2412; CHECK-NOLSE-O0-NEXT: LBB30_5: ; %atomicrmw.end 2413; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2414; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2415; CHECK-NOLSE-O0-NEXT: ret 2416; 2417; CHECK-LSE-O1-LABEL: atomicrmw_and_i8: 2418; CHECK-LSE-O1: ; %bb.0: 2419; CHECK-LSE-O1-NEXT: mvn w8, w1 2420; CHECK-LSE-O1-NEXT: ldclrlb w8, w0, [x0] 2421; CHECK-LSE-O1-NEXT: ret 2422; 2423; CHECK-LSE-O0-LABEL: atomicrmw_and_i8: 2424; CHECK-LSE-O0: ; %bb.0: 2425; CHECK-LSE-O0-NEXT: mvn w8, w1 2426; CHECK-LSE-O0-NEXT: ldclrlb w8, w0, [x0] 2427; CHECK-LSE-O0-NEXT: ret 2428; 2429; CHECK-LDAPR-O1-LABEL: atomicrmw_and_i8: 2430; CHECK-LDAPR-O1: ; %bb.0: 2431; CHECK-LDAPR-O1-NEXT: LBB30_1: ; %atomicrmw.start 2432; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2433; CHECK-LDAPR-O1-NEXT: ldxrb w8, [x0] 2434; CHECK-LDAPR-O1-NEXT: and w9, w8, w1 2435; CHECK-LDAPR-O1-NEXT: stlxrb w10, w9, [x0] 2436; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB30_1 2437; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2438; CHECK-LDAPR-O1-NEXT: mov w0, w8 2439; CHECK-LDAPR-O1-NEXT: ret 2440; 2441; CHECK-LDAPR-O0-LABEL: atomicrmw_and_i8: 2442; CHECK-LDAPR-O0: ; %bb.0: 2443; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2444; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2445; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2446; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2447; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2448; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2449; CHECK-LDAPR-O0-NEXT: b LBB30_1 2450; CHECK-LDAPR-O0-NEXT: LBB30_1: ; %atomicrmw.start 2451; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2452; CHECK-LDAPR-O0-NEXT: ; Child Loop BB30_2 Depth 2 2453; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2454; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2455; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2456; CHECK-LDAPR-O0-NEXT: and w12, w10, w8 2457; CHECK-LDAPR-O0-NEXT: LBB30_2: ; %atomicrmw.start 2458; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB30_1 Depth=1 2459; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2460; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2461; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2462; CHECK-LDAPR-O0-NEXT: b.ne LBB30_4 2463; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2464; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB30_2 Depth=2 2465; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2466; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB30_2 2467; CHECK-LDAPR-O0-NEXT: LBB30_4: ; %atomicrmw.start 2468; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB30_1 Depth=1 2469; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2470; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2471; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2472; CHECK-LDAPR-O0-NEXT: cset w8, eq 2473; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2474; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB30_1 2475; CHECK-LDAPR-O0-NEXT: b LBB30_5 2476; CHECK-LDAPR-O0-NEXT: LBB30_5: ; %atomicrmw.end 2477; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2478; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2479; CHECK-LDAPR-O0-NEXT: ret 2480 %res = atomicrmw and i8* %ptr, i8 %rhs release 2481 ret i8 %res 2482} 2483 2484define i8 @atomicrmw_or_i8(i8* %ptr, i8 %rhs) { 2485; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i8: 2486; CHECK-NOLSE-O1: ; %bb.0: 2487; CHECK-NOLSE-O1-NEXT: LBB31_1: ; %atomicrmw.start 2488; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2489; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0] 2490; CHECK-NOLSE-O1-NEXT: orr w9, w8, w1 2491; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0] 2492; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB31_1 2493; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2494; CHECK-NOLSE-O1-NEXT: mov w0, w8 2495; CHECK-NOLSE-O1-NEXT: ret 2496; 2497; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i8: 2498; CHECK-NOLSE-O0: ; %bb.0: 2499; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2500; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2501; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2502; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2503; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2504; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2505; CHECK-NOLSE-O0-NEXT: b LBB31_1 2506; CHECK-NOLSE-O0-NEXT: LBB31_1: ; %atomicrmw.start 2507; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2508; CHECK-NOLSE-O0-NEXT: ; Child Loop BB31_2 Depth 2 2509; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2510; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2511; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2512; CHECK-NOLSE-O0-NEXT: orr w12, w10, w8 2513; CHECK-NOLSE-O0-NEXT: LBB31_2: ; %atomicrmw.start 2514; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB31_1 Depth=1 2515; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2516; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2517; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2518; CHECK-NOLSE-O0-NEXT: b.ne LBB31_4 2519; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2520; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB31_2 Depth=2 2521; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2522; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB31_2 2523; CHECK-NOLSE-O0-NEXT: LBB31_4: ; %atomicrmw.start 2524; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB31_1 Depth=1 2525; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2526; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2527; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2528; CHECK-NOLSE-O0-NEXT: cset w8, eq 2529; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2530; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB31_1 2531; CHECK-NOLSE-O0-NEXT: b LBB31_5 2532; CHECK-NOLSE-O0-NEXT: LBB31_5: ; %atomicrmw.end 2533; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2534; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2535; CHECK-NOLSE-O0-NEXT: ret 2536; 2537; CHECK-LSE-O1-LABEL: atomicrmw_or_i8: 2538; CHECK-LSE-O1: ; %bb.0: 2539; CHECK-LSE-O1-NEXT: ldsetalb w1, w0, [x0] 2540; CHECK-LSE-O1-NEXT: ret 2541; 2542; CHECK-LSE-O0-LABEL: atomicrmw_or_i8: 2543; CHECK-LSE-O0: ; %bb.0: 2544; CHECK-LSE-O0-NEXT: ldsetalb w1, w0, [x0] 2545; CHECK-LSE-O0-NEXT: ret 2546; 2547; CHECK-LDAPR-O1-LABEL: atomicrmw_or_i8: 2548; CHECK-LDAPR-O1: ; %bb.0: 2549; CHECK-LDAPR-O1-NEXT: LBB31_1: ; %atomicrmw.start 2550; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2551; CHECK-LDAPR-O1-NEXT: ldaxrb w8, [x0] 2552; CHECK-LDAPR-O1-NEXT: orr w9, w8, w1 2553; CHECK-LDAPR-O1-NEXT: stlxrb w10, w9, [x0] 2554; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB31_1 2555; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2556; CHECK-LDAPR-O1-NEXT: mov w0, w8 2557; CHECK-LDAPR-O1-NEXT: ret 2558; 2559; CHECK-LDAPR-O0-LABEL: atomicrmw_or_i8: 2560; CHECK-LDAPR-O0: ; %bb.0: 2561; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2562; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2563; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2564; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2565; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2566; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2567; CHECK-LDAPR-O0-NEXT: b LBB31_1 2568; CHECK-LDAPR-O0-NEXT: LBB31_1: ; %atomicrmw.start 2569; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2570; CHECK-LDAPR-O0-NEXT: ; Child Loop BB31_2 Depth 2 2571; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2572; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2573; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2574; CHECK-LDAPR-O0-NEXT: orr w12, w10, w8 2575; CHECK-LDAPR-O0-NEXT: LBB31_2: ; %atomicrmw.start 2576; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB31_1 Depth=1 2577; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2578; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2579; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2580; CHECK-LDAPR-O0-NEXT: b.ne LBB31_4 2581; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2582; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB31_2 Depth=2 2583; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2584; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB31_2 2585; CHECK-LDAPR-O0-NEXT: LBB31_4: ; %atomicrmw.start 2586; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB31_1 Depth=1 2587; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2588; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2589; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2590; CHECK-LDAPR-O0-NEXT: cset w8, eq 2591; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2592; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB31_1 2593; CHECK-LDAPR-O0-NEXT: b LBB31_5 2594; CHECK-LDAPR-O0-NEXT: LBB31_5: ; %atomicrmw.end 2595; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2596; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2597; CHECK-LDAPR-O0-NEXT: ret 2598 %res = atomicrmw or i8* %ptr, i8 %rhs seq_cst 2599 ret i8 %res 2600} 2601 2602define i8 @atomicrmw_xor_i8(i8* %ptr, i8 %rhs) { 2603; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i8: 2604; CHECK-NOLSE-O1: ; %bb.0: 2605; CHECK-NOLSE-O1-NEXT: LBB32_1: ; %atomicrmw.start 2606; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2607; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0] 2608; CHECK-NOLSE-O1-NEXT: eor w9, w8, w1 2609; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0] 2610; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB32_1 2611; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2612; CHECK-NOLSE-O1-NEXT: mov w0, w8 2613; CHECK-NOLSE-O1-NEXT: ret 2614; 2615; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i8: 2616; CHECK-NOLSE-O0: ; %bb.0: 2617; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2618; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2619; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2620; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2621; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2622; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2623; CHECK-NOLSE-O0-NEXT: b LBB32_1 2624; CHECK-NOLSE-O0-NEXT: LBB32_1: ; %atomicrmw.start 2625; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2626; CHECK-NOLSE-O0-NEXT: ; Child Loop BB32_2 Depth 2 2627; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2628; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2629; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2630; CHECK-NOLSE-O0-NEXT: eor w12, w10, w8 2631; CHECK-NOLSE-O0-NEXT: LBB32_2: ; %atomicrmw.start 2632; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB32_1 Depth=1 2633; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2634; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2635; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2636; CHECK-NOLSE-O0-NEXT: b.ne LBB32_4 2637; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2638; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB32_2 Depth=2 2639; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2640; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB32_2 2641; CHECK-NOLSE-O0-NEXT: LBB32_4: ; %atomicrmw.start 2642; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB32_1 Depth=1 2643; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2644; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2645; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2646; CHECK-NOLSE-O0-NEXT: cset w8, eq 2647; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2648; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB32_1 2649; CHECK-NOLSE-O0-NEXT: b LBB32_5 2650; CHECK-NOLSE-O0-NEXT: LBB32_5: ; %atomicrmw.end 2651; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2652; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2653; CHECK-NOLSE-O0-NEXT: ret 2654; 2655; CHECK-LSE-O1-LABEL: atomicrmw_xor_i8: 2656; CHECK-LSE-O1: ; %bb.0: 2657; CHECK-LSE-O1-NEXT: ldeorb w1, w0, [x0] 2658; CHECK-LSE-O1-NEXT: ret 2659; 2660; CHECK-LSE-O0-LABEL: atomicrmw_xor_i8: 2661; CHECK-LSE-O0: ; %bb.0: 2662; CHECK-LSE-O0-NEXT: ldeorb w1, w0, [x0] 2663; CHECK-LSE-O0-NEXT: ret 2664; 2665; CHECK-LDAPR-O1-LABEL: atomicrmw_xor_i8: 2666; CHECK-LDAPR-O1: ; %bb.0: 2667; CHECK-LDAPR-O1-NEXT: LBB32_1: ; %atomicrmw.start 2668; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2669; CHECK-LDAPR-O1-NEXT: ldxrb w8, [x0] 2670; CHECK-LDAPR-O1-NEXT: eor w9, w8, w1 2671; CHECK-LDAPR-O1-NEXT: stxrb w10, w9, [x0] 2672; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB32_1 2673; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2674; CHECK-LDAPR-O1-NEXT: mov w0, w8 2675; CHECK-LDAPR-O1-NEXT: ret 2676; 2677; CHECK-LDAPR-O0-LABEL: atomicrmw_xor_i8: 2678; CHECK-LDAPR-O0: ; %bb.0: 2679; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2680; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2681; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2682; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2683; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2684; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2685; CHECK-LDAPR-O0-NEXT: b LBB32_1 2686; CHECK-LDAPR-O0-NEXT: LBB32_1: ; %atomicrmw.start 2687; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2688; CHECK-LDAPR-O0-NEXT: ; Child Loop BB32_2 Depth 2 2689; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2690; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2691; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2692; CHECK-LDAPR-O0-NEXT: eor w12, w10, w8 2693; CHECK-LDAPR-O0-NEXT: LBB32_2: ; %atomicrmw.start 2694; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB32_1 Depth=1 2695; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2696; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2697; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2698; CHECK-LDAPR-O0-NEXT: b.ne LBB32_4 2699; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2700; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB32_2 Depth=2 2701; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2702; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB32_2 2703; CHECK-LDAPR-O0-NEXT: LBB32_4: ; %atomicrmw.start 2704; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB32_1 Depth=1 2705; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2706; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2707; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2708; CHECK-LDAPR-O0-NEXT: cset w8, eq 2709; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2710; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB32_1 2711; CHECK-LDAPR-O0-NEXT: b LBB32_5 2712; CHECK-LDAPR-O0-NEXT: LBB32_5: ; %atomicrmw.end 2713; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2714; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2715; CHECK-LDAPR-O0-NEXT: ret 2716 %res = atomicrmw xor i8* %ptr, i8 %rhs monotonic 2717 ret i8 %res 2718} 2719 2720define i8 @atomicrmw_min_i8(i8* %ptr, i8 %rhs) { 2721; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i8: 2722; CHECK-NOLSE-O1: ; %bb.0: 2723; CHECK-NOLSE-O1-NEXT: LBB33_1: ; %atomicrmw.start 2724; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2725; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0] 2726; CHECK-NOLSE-O1-NEXT: sxtb w9, w8 2727; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxtb 2728; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, le 2729; CHECK-NOLSE-O1-NEXT: stxrb w10, w9, [x0] 2730; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB33_1 2731; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2732; CHECK-NOLSE-O1-NEXT: mov w0, w8 2733; CHECK-NOLSE-O1-NEXT: ret 2734; 2735; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i8: 2736; CHECK-NOLSE-O0: ; %bb.0: 2737; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2738; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2739; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2740; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2741; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2742; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2743; CHECK-NOLSE-O0-NEXT: b LBB33_1 2744; CHECK-NOLSE-O0-NEXT: LBB33_1: ; %atomicrmw.start 2745; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2746; CHECK-NOLSE-O0-NEXT: ; Child Loop BB33_2 Depth 2 2747; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2748; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2749; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2750; CHECK-NOLSE-O0-NEXT: sxtb w9, w10 2751; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, sxtb 2752; CHECK-NOLSE-O0-NEXT: cset w9, le 2753; CHECK-NOLSE-O0-NEXT: and w9, w9, #0x1 2754; CHECK-NOLSE-O0-NEXT: ands w9, w9, #0x1 2755; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, ne 2756; CHECK-NOLSE-O0-NEXT: LBB33_2: ; %atomicrmw.start 2757; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB33_1 Depth=1 2758; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2759; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2760; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2761; CHECK-NOLSE-O0-NEXT: b.ne LBB33_4 2762; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2763; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB33_2 Depth=2 2764; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2765; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB33_2 2766; CHECK-NOLSE-O0-NEXT: LBB33_4: ; %atomicrmw.start 2767; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB33_1 Depth=1 2768; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2769; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2770; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2771; CHECK-NOLSE-O0-NEXT: cset w8, eq 2772; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2773; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB33_1 2774; CHECK-NOLSE-O0-NEXT: b LBB33_5 2775; CHECK-NOLSE-O0-NEXT: LBB33_5: ; %atomicrmw.end 2776; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2777; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2778; CHECK-NOLSE-O0-NEXT: ret 2779; 2780; CHECK-LSE-O1-LABEL: atomicrmw_min_i8: 2781; CHECK-LSE-O1: ; %bb.0: 2782; CHECK-LSE-O1-NEXT: ldsminab w1, w0, [x0] 2783; CHECK-LSE-O1-NEXT: ret 2784; 2785; CHECK-LSE-O0-LABEL: atomicrmw_min_i8: 2786; CHECK-LSE-O0: ; %bb.0: 2787; CHECK-LSE-O0-NEXT: ldsminab w1, w0, [x0] 2788; CHECK-LSE-O0-NEXT: ret 2789; 2790; CHECK-LDAPR-O1-LABEL: atomicrmw_min_i8: 2791; CHECK-LDAPR-O1: ; %bb.0: 2792; CHECK-LDAPR-O1-NEXT: LBB33_1: ; %atomicrmw.start 2793; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2794; CHECK-LDAPR-O1-NEXT: ldaxrb w8, [x0] 2795; CHECK-LDAPR-O1-NEXT: sxtb w9, w8 2796; CHECK-LDAPR-O1-NEXT: cmp w9, w1, sxtb 2797; CHECK-LDAPR-O1-NEXT: csel w9, w8, w1, le 2798; CHECK-LDAPR-O1-NEXT: stxrb w10, w9, [x0] 2799; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB33_1 2800; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2801; CHECK-LDAPR-O1-NEXT: mov w0, w8 2802; CHECK-LDAPR-O1-NEXT: ret 2803; 2804; CHECK-LDAPR-O0-LABEL: atomicrmw_min_i8: 2805; CHECK-LDAPR-O0: ; %bb.0: 2806; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2807; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2808; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2809; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2810; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2811; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2812; CHECK-LDAPR-O0-NEXT: b LBB33_1 2813; CHECK-LDAPR-O0-NEXT: LBB33_1: ; %atomicrmw.start 2814; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2815; CHECK-LDAPR-O0-NEXT: ; Child Loop BB33_2 Depth 2 2816; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2817; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2818; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2819; CHECK-LDAPR-O0-NEXT: sxtb w9, w10 2820; CHECK-LDAPR-O0-NEXT: subs w9, w9, w8, sxtb 2821; CHECK-LDAPR-O0-NEXT: cset w9, le 2822; CHECK-LDAPR-O0-NEXT: and w9, w9, #0x1 2823; CHECK-LDAPR-O0-NEXT: ands w9, w9, #0x1 2824; CHECK-LDAPR-O0-NEXT: csel w12, w10, w8, ne 2825; CHECK-LDAPR-O0-NEXT: LBB33_2: ; %atomicrmw.start 2826; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB33_1 Depth=1 2827; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2828; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2829; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2830; CHECK-LDAPR-O0-NEXT: b.ne LBB33_4 2831; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2832; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB33_2 Depth=2 2833; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2834; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB33_2 2835; CHECK-LDAPR-O0-NEXT: LBB33_4: ; %atomicrmw.start 2836; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB33_1 Depth=1 2837; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2838; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2839; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2840; CHECK-LDAPR-O0-NEXT: cset w8, eq 2841; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2842; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB33_1 2843; CHECK-LDAPR-O0-NEXT: b LBB33_5 2844; CHECK-LDAPR-O0-NEXT: LBB33_5: ; %atomicrmw.end 2845; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2846; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2847; CHECK-LDAPR-O0-NEXT: ret 2848 %res = atomicrmw min i8* %ptr, i8 %rhs acquire 2849 ret i8 %res 2850} 2851 2852define i8 @atomicrmw_max_i8(i8* %ptr, i8 %rhs) { 2853; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i8: 2854; CHECK-NOLSE-O1: ; %bb.0: 2855; CHECK-NOLSE-O1-NEXT: LBB34_1: ; %atomicrmw.start 2856; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2857; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0] 2858; CHECK-NOLSE-O1-NEXT: sxtb w9, w8 2859; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxtb 2860; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, gt 2861; CHECK-NOLSE-O1-NEXT: stlxrb w10, w9, [x0] 2862; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB34_1 2863; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2864; CHECK-NOLSE-O1-NEXT: mov w0, w8 2865; CHECK-NOLSE-O1-NEXT: ret 2866; 2867; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i8: 2868; CHECK-NOLSE-O0: ; %bb.0: 2869; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 2870; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 2871; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2872; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2873; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 2874; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2875; CHECK-NOLSE-O0-NEXT: b LBB34_1 2876; CHECK-NOLSE-O0-NEXT: LBB34_1: ; %atomicrmw.start 2877; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 2878; CHECK-NOLSE-O0-NEXT: ; Child Loop BB34_2 Depth 2 2879; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2880; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2881; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2882; CHECK-NOLSE-O0-NEXT: sxtb w9, w10 2883; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, sxtb 2884; CHECK-NOLSE-O0-NEXT: cset w9, gt 2885; CHECK-NOLSE-O0-NEXT: and w9, w9, #0x1 2886; CHECK-NOLSE-O0-NEXT: ands w9, w9, #0x1 2887; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, ne 2888; CHECK-NOLSE-O0-NEXT: LBB34_2: ; %atomicrmw.start 2889; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB34_1 Depth=1 2890; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 2891; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 2892; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 2893; CHECK-NOLSE-O0-NEXT: b.ne LBB34_4 2894; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2895; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB34_2 Depth=2 2896; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 2897; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB34_2 2898; CHECK-NOLSE-O0-NEXT: LBB34_4: ; %atomicrmw.start 2899; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB34_1 Depth=1 2900; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2901; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 2902; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 2903; CHECK-NOLSE-O0-NEXT: cset w8, eq 2904; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2905; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB34_1 2906; CHECK-NOLSE-O0-NEXT: b LBB34_5 2907; CHECK-NOLSE-O0-NEXT: LBB34_5: ; %atomicrmw.end 2908; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2909; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 2910; CHECK-NOLSE-O0-NEXT: ret 2911; 2912; CHECK-LSE-O1-LABEL: atomicrmw_max_i8: 2913; CHECK-LSE-O1: ; %bb.0: 2914; CHECK-LSE-O1-NEXT: ldsmaxlb w1, w0, [x0] 2915; CHECK-LSE-O1-NEXT: ret 2916; 2917; CHECK-LSE-O0-LABEL: atomicrmw_max_i8: 2918; CHECK-LSE-O0: ; %bb.0: 2919; CHECK-LSE-O0-NEXT: ldsmaxlb w1, w0, [x0] 2920; CHECK-LSE-O0-NEXT: ret 2921; 2922; CHECK-LDAPR-O1-LABEL: atomicrmw_max_i8: 2923; CHECK-LDAPR-O1: ; %bb.0: 2924; CHECK-LDAPR-O1-NEXT: LBB34_1: ; %atomicrmw.start 2925; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2926; CHECK-LDAPR-O1-NEXT: ldxrb w8, [x0] 2927; CHECK-LDAPR-O1-NEXT: sxtb w9, w8 2928; CHECK-LDAPR-O1-NEXT: cmp w9, w1, sxtb 2929; CHECK-LDAPR-O1-NEXT: csel w9, w8, w1, gt 2930; CHECK-LDAPR-O1-NEXT: stlxrb w10, w9, [x0] 2931; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB34_1 2932; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2933; CHECK-LDAPR-O1-NEXT: mov w0, w8 2934; CHECK-LDAPR-O1-NEXT: ret 2935; 2936; CHECK-LDAPR-O0-LABEL: atomicrmw_max_i8: 2937; CHECK-LDAPR-O0: ; %bb.0: 2938; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 2939; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 2940; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 2941; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 2942; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 2943; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 2944; CHECK-LDAPR-O0-NEXT: b LBB34_1 2945; CHECK-LDAPR-O0-NEXT: LBB34_1: ; %atomicrmw.start 2946; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 2947; CHECK-LDAPR-O0-NEXT: ; Child Loop BB34_2 Depth 2 2948; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 2949; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 2950; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 2951; CHECK-LDAPR-O0-NEXT: sxtb w9, w10 2952; CHECK-LDAPR-O0-NEXT: subs w9, w9, w8, sxtb 2953; CHECK-LDAPR-O0-NEXT: cset w9, gt 2954; CHECK-LDAPR-O0-NEXT: and w9, w9, #0x1 2955; CHECK-LDAPR-O0-NEXT: ands w9, w9, #0x1 2956; CHECK-LDAPR-O0-NEXT: csel w12, w10, w8, ne 2957; CHECK-LDAPR-O0-NEXT: LBB34_2: ; %atomicrmw.start 2958; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB34_1 Depth=1 2959; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 2960; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 2961; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 2962; CHECK-LDAPR-O0-NEXT: b.ne LBB34_4 2963; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 2964; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB34_2 Depth=2 2965; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 2966; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB34_2 2967; CHECK-LDAPR-O0-NEXT: LBB34_4: ; %atomicrmw.start 2968; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB34_1 Depth=1 2969; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 2970; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 2971; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 2972; CHECK-LDAPR-O0-NEXT: cset w8, eq 2973; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 2974; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB34_1 2975; CHECK-LDAPR-O0-NEXT: b LBB34_5 2976; CHECK-LDAPR-O0-NEXT: LBB34_5: ; %atomicrmw.end 2977; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 2978; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 2979; CHECK-LDAPR-O0-NEXT: ret 2980 %res = atomicrmw max i8* %ptr, i8 %rhs release 2981 ret i8 %res 2982} 2983 2984define i8 @atomicrmw_umin_i8(i8* %ptr, i8 %rhs) { 2985; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i8: 2986; CHECK-NOLSE-O1: ; %bb.0: 2987; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xff 2988; CHECK-NOLSE-O1-NEXT: LBB35_1: ; %atomicrmw.start 2989; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 2990; CHECK-NOLSE-O1-NEXT: ldaxrb w8, [x0] 2991; CHECK-NOLSE-O1-NEXT: and w10, w8, #0xff 2992; CHECK-NOLSE-O1-NEXT: cmp w10, w9 2993; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, ls 2994; CHECK-NOLSE-O1-NEXT: stlxrb w11, w10, [x0] 2995; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB35_1 2996; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 2997; CHECK-NOLSE-O1-NEXT: mov w0, w8 2998; CHECK-NOLSE-O1-NEXT: ret 2999; 3000; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i8: 3001; CHECK-NOLSE-O0: ; %bb.0: 3002; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3003; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3004; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3005; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3006; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 3007; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3008; CHECK-NOLSE-O0-NEXT: b LBB35_1 3009; CHECK-NOLSE-O0-NEXT: LBB35_1: ; %atomicrmw.start 3010; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3011; CHECK-NOLSE-O0-NEXT: ; Child Loop BB35_2 Depth 2 3012; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 3013; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3014; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 3015; CHECK-NOLSE-O0-NEXT: and w9, w10, #0xff 3016; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, uxtb 3017; CHECK-NOLSE-O0-NEXT: cset w9, ls 3018; CHECK-NOLSE-O0-NEXT: and w9, w9, #0x1 3019; CHECK-NOLSE-O0-NEXT: ands w9, w9, #0x1 3020; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, ne 3021; CHECK-NOLSE-O0-NEXT: LBB35_2: ; %atomicrmw.start 3022; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB35_1 Depth=1 3023; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3024; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 3025; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 3026; CHECK-NOLSE-O0-NEXT: b.ne LBB35_4 3027; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3028; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB35_2 Depth=2 3029; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 3030; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB35_2 3031; CHECK-NOLSE-O0-NEXT: LBB35_4: ; %atomicrmw.start 3032; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB35_1 Depth=1 3033; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3034; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 3035; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 3036; CHECK-NOLSE-O0-NEXT: cset w8, eq 3037; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3038; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB35_1 3039; CHECK-NOLSE-O0-NEXT: b LBB35_5 3040; CHECK-NOLSE-O0-NEXT: LBB35_5: ; %atomicrmw.end 3041; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3042; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3043; CHECK-NOLSE-O0-NEXT: ret 3044; 3045; CHECK-LSE-O1-LABEL: atomicrmw_umin_i8: 3046; CHECK-LSE-O1: ; %bb.0: 3047; CHECK-LSE-O1-NEXT: lduminalb w1, w0, [x0] 3048; CHECK-LSE-O1-NEXT: ret 3049; 3050; CHECK-LSE-O0-LABEL: atomicrmw_umin_i8: 3051; CHECK-LSE-O0: ; %bb.0: 3052; CHECK-LSE-O0-NEXT: lduminalb w1, w0, [x0] 3053; CHECK-LSE-O0-NEXT: ret 3054; 3055; CHECK-LDAPR-O1-LABEL: atomicrmw_umin_i8: 3056; CHECK-LDAPR-O1: ; %bb.0: 3057; CHECK-LDAPR-O1-NEXT: and w9, w1, #0xff 3058; CHECK-LDAPR-O1-NEXT: LBB35_1: ; %atomicrmw.start 3059; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3060; CHECK-LDAPR-O1-NEXT: ldaxrb w8, [x0] 3061; CHECK-LDAPR-O1-NEXT: and w10, w8, #0xff 3062; CHECK-LDAPR-O1-NEXT: cmp w10, w9 3063; CHECK-LDAPR-O1-NEXT: csel w10, w10, w9, ls 3064; CHECK-LDAPR-O1-NEXT: stlxrb w11, w10, [x0] 3065; CHECK-LDAPR-O1-NEXT: cbnz w11, LBB35_1 3066; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3067; CHECK-LDAPR-O1-NEXT: mov w0, w8 3068; CHECK-LDAPR-O1-NEXT: ret 3069; 3070; CHECK-LDAPR-O0-LABEL: atomicrmw_umin_i8: 3071; CHECK-LDAPR-O0: ; %bb.0: 3072; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3073; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3074; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3075; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3076; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 3077; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3078; CHECK-LDAPR-O0-NEXT: b LBB35_1 3079; CHECK-LDAPR-O0-NEXT: LBB35_1: ; %atomicrmw.start 3080; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3081; CHECK-LDAPR-O0-NEXT: ; Child Loop BB35_2 Depth 2 3082; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 3083; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3084; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 3085; CHECK-LDAPR-O0-NEXT: and w9, w10, #0xff 3086; CHECK-LDAPR-O0-NEXT: subs w9, w9, w8, uxtb 3087; CHECK-LDAPR-O0-NEXT: cset w9, ls 3088; CHECK-LDAPR-O0-NEXT: and w9, w9, #0x1 3089; CHECK-LDAPR-O0-NEXT: ands w9, w9, #0x1 3090; CHECK-LDAPR-O0-NEXT: csel w12, w10, w8, ne 3091; CHECK-LDAPR-O0-NEXT: LBB35_2: ; %atomicrmw.start 3092; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB35_1 Depth=1 3093; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3094; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 3095; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 3096; CHECK-LDAPR-O0-NEXT: b.ne LBB35_4 3097; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3098; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB35_2 Depth=2 3099; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 3100; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB35_2 3101; CHECK-LDAPR-O0-NEXT: LBB35_4: ; %atomicrmw.start 3102; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB35_1 Depth=1 3103; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3104; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 3105; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 3106; CHECK-LDAPR-O0-NEXT: cset w8, eq 3107; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3108; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB35_1 3109; CHECK-LDAPR-O0-NEXT: b LBB35_5 3110; CHECK-LDAPR-O0-NEXT: LBB35_5: ; %atomicrmw.end 3111; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3112; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3113; CHECK-LDAPR-O0-NEXT: ret 3114 %res = atomicrmw umin i8* %ptr, i8 %rhs seq_cst 3115 ret i8 %res 3116} 3117 3118define i8 @atomicrmw_umax_i8(i8* %ptr, i8 %rhs) { 3119; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i8: 3120; CHECK-NOLSE-O1: ; %bb.0: 3121; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xff 3122; CHECK-NOLSE-O1-NEXT: LBB36_1: ; %atomicrmw.start 3123; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3124; CHECK-NOLSE-O1-NEXT: ldxrb w8, [x0] 3125; CHECK-NOLSE-O1-NEXT: and w10, w8, #0xff 3126; CHECK-NOLSE-O1-NEXT: cmp w10, w9 3127; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, hi 3128; CHECK-NOLSE-O1-NEXT: stxrb w11, w10, [x0] 3129; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB36_1 3130; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3131; CHECK-NOLSE-O1-NEXT: mov w0, w8 3132; CHECK-NOLSE-O1-NEXT: ret 3133; 3134; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i8: 3135; CHECK-NOLSE-O0: ; %bb.0: 3136; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3137; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3138; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3139; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3140; CHECK-NOLSE-O0-NEXT: ldrb w8, [x0] 3141; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3142; CHECK-NOLSE-O0-NEXT: b LBB36_1 3143; CHECK-NOLSE-O0-NEXT: LBB36_1: ; %atomicrmw.start 3144; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3145; CHECK-NOLSE-O0-NEXT: ; Child Loop BB36_2 Depth 2 3146; CHECK-NOLSE-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 3147; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3148; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 3149; CHECK-NOLSE-O0-NEXT: and w9, w10, #0xff 3150; CHECK-NOLSE-O0-NEXT: subs w9, w9, w8, uxtb 3151; CHECK-NOLSE-O0-NEXT: cset w9, hi 3152; CHECK-NOLSE-O0-NEXT: and w9, w9, #0x1 3153; CHECK-NOLSE-O0-NEXT: ands w9, w9, #0x1 3154; CHECK-NOLSE-O0-NEXT: csel w12, w10, w8, ne 3155; CHECK-NOLSE-O0-NEXT: LBB36_2: ; %atomicrmw.start 3156; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB36_1 Depth=1 3157; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3158; CHECK-NOLSE-O0-NEXT: ldaxrb w9, [x11] 3159; CHECK-NOLSE-O0-NEXT: cmp w9, w10, uxtb 3160; CHECK-NOLSE-O0-NEXT: b.ne LBB36_4 3161; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3162; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB36_2 Depth=2 3163; CHECK-NOLSE-O0-NEXT: stlxrb w8, w12, [x11] 3164; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB36_2 3165; CHECK-NOLSE-O0-NEXT: LBB36_4: ; %atomicrmw.start 3166; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB36_1 Depth=1 3167; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3168; CHECK-NOLSE-O0-NEXT: and w8, w9, #0xff 3169; CHECK-NOLSE-O0-NEXT: subs w8, w8, w10, uxtb 3170; CHECK-NOLSE-O0-NEXT: cset w8, eq 3171; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3172; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB36_1 3173; CHECK-NOLSE-O0-NEXT: b LBB36_5 3174; CHECK-NOLSE-O0-NEXT: LBB36_5: ; %atomicrmw.end 3175; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3176; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3177; CHECK-NOLSE-O0-NEXT: ret 3178; 3179; CHECK-LSE-O1-LABEL: atomicrmw_umax_i8: 3180; CHECK-LSE-O1: ; %bb.0: 3181; CHECK-LSE-O1-NEXT: ldumaxb w1, w0, [x0] 3182; CHECK-LSE-O1-NEXT: ret 3183; 3184; CHECK-LSE-O0-LABEL: atomicrmw_umax_i8: 3185; CHECK-LSE-O0: ; %bb.0: 3186; CHECK-LSE-O0-NEXT: ldumaxb w1, w0, [x0] 3187; CHECK-LSE-O0-NEXT: ret 3188; 3189; CHECK-LDAPR-O1-LABEL: atomicrmw_umax_i8: 3190; CHECK-LDAPR-O1: ; %bb.0: 3191; CHECK-LDAPR-O1-NEXT: and w9, w1, #0xff 3192; CHECK-LDAPR-O1-NEXT: LBB36_1: ; %atomicrmw.start 3193; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3194; CHECK-LDAPR-O1-NEXT: ldxrb w8, [x0] 3195; CHECK-LDAPR-O1-NEXT: and w10, w8, #0xff 3196; CHECK-LDAPR-O1-NEXT: cmp w10, w9 3197; CHECK-LDAPR-O1-NEXT: csel w10, w10, w9, hi 3198; CHECK-LDAPR-O1-NEXT: stxrb w11, w10, [x0] 3199; CHECK-LDAPR-O1-NEXT: cbnz w11, LBB36_1 3200; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3201; CHECK-LDAPR-O1-NEXT: mov w0, w8 3202; CHECK-LDAPR-O1-NEXT: ret 3203; 3204; CHECK-LDAPR-O0-LABEL: atomicrmw_umax_i8: 3205; CHECK-LDAPR-O0: ; %bb.0: 3206; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3207; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3208; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3209; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3210; CHECK-LDAPR-O0-NEXT: ldrb w8, [x0] 3211; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3212; CHECK-LDAPR-O0-NEXT: b LBB36_1 3213; CHECK-LDAPR-O0-NEXT: LBB36_1: ; %atomicrmw.start 3214; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3215; CHECK-LDAPR-O0-NEXT: ; Child Loop BB36_2 Depth 2 3216; CHECK-LDAPR-O0-NEXT: ldr w10, [sp, #28] ; 4-byte Folded Reload 3217; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3218; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #24] ; 4-byte Folded Reload 3219; CHECK-LDAPR-O0-NEXT: and w9, w10, #0xff 3220; CHECK-LDAPR-O0-NEXT: subs w9, w9, w8, uxtb 3221; CHECK-LDAPR-O0-NEXT: cset w9, hi 3222; CHECK-LDAPR-O0-NEXT: and w9, w9, #0x1 3223; CHECK-LDAPR-O0-NEXT: ands w9, w9, #0x1 3224; CHECK-LDAPR-O0-NEXT: csel w12, w10, w8, ne 3225; CHECK-LDAPR-O0-NEXT: LBB36_2: ; %atomicrmw.start 3226; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB36_1 Depth=1 3227; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3228; CHECK-LDAPR-O0-NEXT: ldaxrb w9, [x11] 3229; CHECK-LDAPR-O0-NEXT: cmp w9, w10, uxtb 3230; CHECK-LDAPR-O0-NEXT: b.ne LBB36_4 3231; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3232; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB36_2 Depth=2 3233; CHECK-LDAPR-O0-NEXT: stlxrb w8, w12, [x11] 3234; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB36_2 3235; CHECK-LDAPR-O0-NEXT: LBB36_4: ; %atomicrmw.start 3236; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB36_1 Depth=1 3237; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3238; CHECK-LDAPR-O0-NEXT: and w8, w9, #0xff 3239; CHECK-LDAPR-O0-NEXT: subs w8, w8, w10, uxtb 3240; CHECK-LDAPR-O0-NEXT: cset w8, eq 3241; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3242; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB36_1 3243; CHECK-LDAPR-O0-NEXT: b LBB36_5 3244; CHECK-LDAPR-O0-NEXT: LBB36_5: ; %atomicrmw.end 3245; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3246; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3247; CHECK-LDAPR-O0-NEXT: ret 3248 %res = atomicrmw umax i8* %ptr, i8 %rhs monotonic 3249 ret i8 %res 3250} 3251 3252define i16 @atomicrmw_add_i16(i16* %ptr, i16 %rhs) { 3253; CHECK-NOLSE-O1-LABEL: atomicrmw_add_i16: 3254; CHECK-NOLSE-O1: ; %bb.0: 3255; CHECK-NOLSE-O1-NEXT: LBB37_1: ; %atomicrmw.start 3256; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3257; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0] 3258; CHECK-NOLSE-O1-NEXT: add w9, w8, w1 3259; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0] 3260; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB37_1 3261; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3262; CHECK-NOLSE-O1-NEXT: mov w0, w8 3263; CHECK-NOLSE-O1-NEXT: ret 3264; 3265; CHECK-NOLSE-O0-LABEL: atomicrmw_add_i16: 3266; CHECK-NOLSE-O0: ; %bb.0: 3267; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3268; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3269; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3270; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3271; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3272; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3273; CHECK-NOLSE-O0-NEXT: b LBB37_1 3274; CHECK-NOLSE-O0-NEXT: LBB37_1: ; %atomicrmw.start 3275; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3276; CHECK-NOLSE-O0-NEXT: ; Child Loop BB37_2 Depth 2 3277; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3278; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3279; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3280; CHECK-NOLSE-O0-NEXT: add w12, w9, w8, uxth 3281; CHECK-NOLSE-O0-NEXT: LBB37_2: ; %atomicrmw.start 3282; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB37_1 Depth=1 3283; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3284; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 3285; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 3286; CHECK-NOLSE-O0-NEXT: b.ne LBB37_4 3287; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3288; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB37_2 Depth=2 3289; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 3290; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB37_2 3291; CHECK-NOLSE-O0-NEXT: LBB37_4: ; %atomicrmw.start 3292; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB37_1 Depth=1 3293; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3294; CHECK-NOLSE-O0-NEXT: uxth w8, w8 3295; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 3296; CHECK-NOLSE-O0-NEXT: cset w8, eq 3297; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3298; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB37_1 3299; CHECK-NOLSE-O0-NEXT: b LBB37_5 3300; CHECK-NOLSE-O0-NEXT: LBB37_5: ; %atomicrmw.end 3301; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3302; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3303; CHECK-NOLSE-O0-NEXT: ret 3304; 3305; CHECK-LSE-O1-LABEL: atomicrmw_add_i16: 3306; CHECK-LSE-O1: ; %bb.0: 3307; CHECK-LSE-O1-NEXT: ldaddalh w1, w0, [x0] 3308; CHECK-LSE-O1-NEXT: ret 3309; 3310; CHECK-LSE-O0-LABEL: atomicrmw_add_i16: 3311; CHECK-LSE-O0: ; %bb.0: 3312; CHECK-LSE-O0-NEXT: ldaddalh w1, w0, [x0] 3313; CHECK-LSE-O0-NEXT: ret 3314; 3315; CHECK-LDAPR-O1-LABEL: atomicrmw_add_i16: 3316; CHECK-LDAPR-O1: ; %bb.0: 3317; CHECK-LDAPR-O1-NEXT: LBB37_1: ; %atomicrmw.start 3318; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3319; CHECK-LDAPR-O1-NEXT: ldaxrh w8, [x0] 3320; CHECK-LDAPR-O1-NEXT: add w9, w8, w1 3321; CHECK-LDAPR-O1-NEXT: stlxrh w10, w9, [x0] 3322; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB37_1 3323; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3324; CHECK-LDAPR-O1-NEXT: mov w0, w8 3325; CHECK-LDAPR-O1-NEXT: ret 3326; 3327; CHECK-LDAPR-O0-LABEL: atomicrmw_add_i16: 3328; CHECK-LDAPR-O0: ; %bb.0: 3329; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3330; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3331; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3332; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3333; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 3334; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3335; CHECK-LDAPR-O0-NEXT: b LBB37_1 3336; CHECK-LDAPR-O0-NEXT: LBB37_1: ; %atomicrmw.start 3337; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3338; CHECK-LDAPR-O0-NEXT: ; Child Loop BB37_2 Depth 2 3339; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3340; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3341; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3342; CHECK-LDAPR-O0-NEXT: add w12, w9, w8, uxth 3343; CHECK-LDAPR-O0-NEXT: LBB37_2: ; %atomicrmw.start 3344; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB37_1 Depth=1 3345; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3346; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 3347; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 3348; CHECK-LDAPR-O0-NEXT: b.ne LBB37_4 3349; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3350; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB37_2 Depth=2 3351; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 3352; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB37_2 3353; CHECK-LDAPR-O0-NEXT: LBB37_4: ; %atomicrmw.start 3354; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB37_1 Depth=1 3355; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3356; CHECK-LDAPR-O0-NEXT: uxth w8, w8 3357; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 3358; CHECK-LDAPR-O0-NEXT: cset w8, eq 3359; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3360; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB37_1 3361; CHECK-LDAPR-O0-NEXT: b LBB37_5 3362; CHECK-LDAPR-O0-NEXT: LBB37_5: ; %atomicrmw.end 3363; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3364; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3365; CHECK-LDAPR-O0-NEXT: ret 3366 %res = atomicrmw add i16* %ptr, i16 %rhs seq_cst 3367 ret i16 %res 3368} 3369 3370define i16 @atomicrmw_xchg_i16(i16* %ptr, i16 %rhs) { 3371; CHECK-NOLSE-O1-LABEL: atomicrmw_xchg_i16: 3372; CHECK-NOLSE-O1: ; %bb.0: 3373; CHECK-NOLSE-O1-NEXT: ; kill: def $w1 killed $w1 def $x1 3374; CHECK-NOLSE-O1-NEXT: LBB38_1: ; %atomicrmw.start 3375; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3376; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0] 3377; CHECK-NOLSE-O1-NEXT: stxrh w9, w1, [x0] 3378; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB38_1 3379; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3380; CHECK-NOLSE-O1-NEXT: mov w0, w8 3381; CHECK-NOLSE-O1-NEXT: ret 3382; 3383; CHECK-NOLSE-O0-LABEL: atomicrmw_xchg_i16: 3384; CHECK-NOLSE-O0: ; %bb.0: 3385; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3386; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3387; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3388; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3389; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3390; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3391; CHECK-NOLSE-O0-NEXT: b LBB38_1 3392; CHECK-NOLSE-O0-NEXT: LBB38_1: ; %atomicrmw.start 3393; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3394; CHECK-NOLSE-O0-NEXT: ; Child Loop BB38_2 Depth 2 3395; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3396; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3397; CHECK-NOLSE-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Folded Reload 3398; CHECK-NOLSE-O0-NEXT: LBB38_2: ; %atomicrmw.start 3399; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB38_1 Depth=1 3400; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3401; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 3402; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 3403; CHECK-NOLSE-O0-NEXT: b.ne LBB38_4 3404; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3405; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB38_2 Depth=2 3406; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 3407; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB38_2 3408; CHECK-NOLSE-O0-NEXT: LBB38_4: ; %atomicrmw.start 3409; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB38_1 Depth=1 3410; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3411; CHECK-NOLSE-O0-NEXT: uxth w8, w8 3412; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 3413; CHECK-NOLSE-O0-NEXT: cset w8, eq 3414; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3415; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB38_1 3416; CHECK-NOLSE-O0-NEXT: b LBB38_5 3417; CHECK-NOLSE-O0-NEXT: LBB38_5: ; %atomicrmw.end 3418; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3419; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3420; CHECK-NOLSE-O0-NEXT: ret 3421; 3422; CHECK-LSE-O1-LABEL: atomicrmw_xchg_i16: 3423; CHECK-LSE-O1: ; %bb.0: 3424; CHECK-LSE-O1-NEXT: swph w1, w0, [x0] 3425; CHECK-LSE-O1-NEXT: ret 3426; 3427; CHECK-LSE-O0-LABEL: atomicrmw_xchg_i16: 3428; CHECK-LSE-O0: ; %bb.0: 3429; CHECK-LSE-O0-NEXT: swph w1, w0, [x0] 3430; CHECK-LSE-O0-NEXT: ret 3431; 3432; CHECK-LDAPR-O1-LABEL: atomicrmw_xchg_i16: 3433; CHECK-LDAPR-O1: ; %bb.0: 3434; CHECK-LDAPR-O1-NEXT: ; kill: def $w1 killed $w1 def $x1 3435; CHECK-LDAPR-O1-NEXT: LBB38_1: ; %atomicrmw.start 3436; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3437; CHECK-LDAPR-O1-NEXT: ldxrh w8, [x0] 3438; CHECK-LDAPR-O1-NEXT: stxrh w9, w1, [x0] 3439; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB38_1 3440; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3441; CHECK-LDAPR-O1-NEXT: mov w0, w8 3442; CHECK-LDAPR-O1-NEXT: ret 3443; 3444; CHECK-LDAPR-O0-LABEL: atomicrmw_xchg_i16: 3445; CHECK-LDAPR-O0: ; %bb.0: 3446; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3447; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3448; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3449; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3450; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 3451; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3452; CHECK-LDAPR-O0-NEXT: b LBB38_1 3453; CHECK-LDAPR-O0-NEXT: LBB38_1: ; %atomicrmw.start 3454; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3455; CHECK-LDAPR-O0-NEXT: ; Child Loop BB38_2 Depth 2 3456; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3457; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3458; CHECK-LDAPR-O0-NEXT: ldr w12, [sp, #24] ; 4-byte Folded Reload 3459; CHECK-LDAPR-O0-NEXT: LBB38_2: ; %atomicrmw.start 3460; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB38_1 Depth=1 3461; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3462; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 3463; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 3464; CHECK-LDAPR-O0-NEXT: b.ne LBB38_4 3465; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3466; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB38_2 Depth=2 3467; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 3468; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB38_2 3469; CHECK-LDAPR-O0-NEXT: LBB38_4: ; %atomicrmw.start 3470; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB38_1 Depth=1 3471; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3472; CHECK-LDAPR-O0-NEXT: uxth w8, w8 3473; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 3474; CHECK-LDAPR-O0-NEXT: cset w8, eq 3475; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3476; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB38_1 3477; CHECK-LDAPR-O0-NEXT: b LBB38_5 3478; CHECK-LDAPR-O0-NEXT: LBB38_5: ; %atomicrmw.end 3479; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3480; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3481; CHECK-LDAPR-O0-NEXT: ret 3482 %res = atomicrmw xchg i16* %ptr, i16 %rhs monotonic 3483 ret i16 %res 3484} 3485 3486define i16 @atomicrmw_sub_i16(i16* %ptr, i16 %rhs) { 3487; CHECK-NOLSE-O1-LABEL: atomicrmw_sub_i16: 3488; CHECK-NOLSE-O1: ; %bb.0: 3489; CHECK-NOLSE-O1-NEXT: LBB39_1: ; %atomicrmw.start 3490; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3491; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0] 3492; CHECK-NOLSE-O1-NEXT: sub w9, w8, w1 3493; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0] 3494; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB39_1 3495; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3496; CHECK-NOLSE-O1-NEXT: mov w0, w8 3497; CHECK-NOLSE-O1-NEXT: ret 3498; 3499; CHECK-NOLSE-O0-LABEL: atomicrmw_sub_i16: 3500; CHECK-NOLSE-O0: ; %bb.0: 3501; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3502; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3503; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3504; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3505; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3506; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3507; CHECK-NOLSE-O0-NEXT: b LBB39_1 3508; CHECK-NOLSE-O0-NEXT: LBB39_1: ; %atomicrmw.start 3509; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3510; CHECK-NOLSE-O0-NEXT: ; Child Loop BB39_2 Depth 2 3511; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3512; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3513; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3514; CHECK-NOLSE-O0-NEXT: subs w12, w8, w9 3515; CHECK-NOLSE-O0-NEXT: LBB39_2: ; %atomicrmw.start 3516; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB39_1 Depth=1 3517; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3518; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 3519; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 3520; CHECK-NOLSE-O0-NEXT: b.ne LBB39_4 3521; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3522; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB39_2 Depth=2 3523; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 3524; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB39_2 3525; CHECK-NOLSE-O0-NEXT: LBB39_4: ; %atomicrmw.start 3526; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB39_1 Depth=1 3527; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3528; CHECK-NOLSE-O0-NEXT: uxth w8, w8 3529; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 3530; CHECK-NOLSE-O0-NEXT: cset w8, eq 3531; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3532; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB39_1 3533; CHECK-NOLSE-O0-NEXT: b LBB39_5 3534; CHECK-NOLSE-O0-NEXT: LBB39_5: ; %atomicrmw.end 3535; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3536; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3537; CHECK-NOLSE-O0-NEXT: ret 3538; 3539; CHECK-LSE-O1-LABEL: atomicrmw_sub_i16: 3540; CHECK-LSE-O1: ; %bb.0: 3541; CHECK-LSE-O1-NEXT: neg w8, w1 3542; CHECK-LSE-O1-NEXT: ldaddah w8, w0, [x0] 3543; CHECK-LSE-O1-NEXT: ret 3544; 3545; CHECK-LSE-O0-LABEL: atomicrmw_sub_i16: 3546; CHECK-LSE-O0: ; %bb.0: 3547; CHECK-LSE-O0-NEXT: neg w8, w1 3548; CHECK-LSE-O0-NEXT: ldaddah w8, w0, [x0] 3549; CHECK-LSE-O0-NEXT: ret 3550; 3551; CHECK-LDAPR-O1-LABEL: atomicrmw_sub_i16: 3552; CHECK-LDAPR-O1: ; %bb.0: 3553; CHECK-LDAPR-O1-NEXT: LBB39_1: ; %atomicrmw.start 3554; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3555; CHECK-LDAPR-O1-NEXT: ldaxrh w8, [x0] 3556; CHECK-LDAPR-O1-NEXT: sub w9, w8, w1 3557; CHECK-LDAPR-O1-NEXT: stxrh w10, w9, [x0] 3558; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB39_1 3559; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3560; CHECK-LDAPR-O1-NEXT: mov w0, w8 3561; CHECK-LDAPR-O1-NEXT: ret 3562; 3563; CHECK-LDAPR-O0-LABEL: atomicrmw_sub_i16: 3564; CHECK-LDAPR-O0: ; %bb.0: 3565; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3566; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3567; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3568; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3569; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 3570; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3571; CHECK-LDAPR-O0-NEXT: b LBB39_1 3572; CHECK-LDAPR-O0-NEXT: LBB39_1: ; %atomicrmw.start 3573; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3574; CHECK-LDAPR-O0-NEXT: ; Child Loop BB39_2 Depth 2 3575; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3576; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3577; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3578; CHECK-LDAPR-O0-NEXT: subs w12, w8, w9 3579; CHECK-LDAPR-O0-NEXT: LBB39_2: ; %atomicrmw.start 3580; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB39_1 Depth=1 3581; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3582; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 3583; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 3584; CHECK-LDAPR-O0-NEXT: b.ne LBB39_4 3585; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3586; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB39_2 Depth=2 3587; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 3588; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB39_2 3589; CHECK-LDAPR-O0-NEXT: LBB39_4: ; %atomicrmw.start 3590; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB39_1 Depth=1 3591; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3592; CHECK-LDAPR-O0-NEXT: uxth w8, w8 3593; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 3594; CHECK-LDAPR-O0-NEXT: cset w8, eq 3595; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3596; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB39_1 3597; CHECK-LDAPR-O0-NEXT: b LBB39_5 3598; CHECK-LDAPR-O0-NEXT: LBB39_5: ; %atomicrmw.end 3599; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3600; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3601; CHECK-LDAPR-O0-NEXT: ret 3602 %res = atomicrmw sub i16* %ptr, i16 %rhs acquire 3603 ret i16 %res 3604} 3605 3606define i16 @atomicrmw_and_i16(i16* %ptr, i16 %rhs) { 3607; CHECK-NOLSE-O1-LABEL: atomicrmw_and_i16: 3608; CHECK-NOLSE-O1: ; %bb.0: 3609; CHECK-NOLSE-O1-NEXT: LBB40_1: ; %atomicrmw.start 3610; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3611; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0] 3612; CHECK-NOLSE-O1-NEXT: and w9, w8, w1 3613; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0] 3614; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB40_1 3615; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3616; CHECK-NOLSE-O1-NEXT: mov w0, w8 3617; CHECK-NOLSE-O1-NEXT: ret 3618; 3619; CHECK-NOLSE-O0-LABEL: atomicrmw_and_i16: 3620; CHECK-NOLSE-O0: ; %bb.0: 3621; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3622; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3623; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3624; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3625; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3626; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3627; CHECK-NOLSE-O0-NEXT: b LBB40_1 3628; CHECK-NOLSE-O0-NEXT: LBB40_1: ; %atomicrmw.start 3629; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3630; CHECK-NOLSE-O0-NEXT: ; Child Loop BB40_2 Depth 2 3631; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3632; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3633; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3634; CHECK-NOLSE-O0-NEXT: and w12, w8, w9 3635; CHECK-NOLSE-O0-NEXT: LBB40_2: ; %atomicrmw.start 3636; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB40_1 Depth=1 3637; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3638; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 3639; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 3640; CHECK-NOLSE-O0-NEXT: b.ne LBB40_4 3641; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3642; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB40_2 Depth=2 3643; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 3644; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB40_2 3645; CHECK-NOLSE-O0-NEXT: LBB40_4: ; %atomicrmw.start 3646; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB40_1 Depth=1 3647; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3648; CHECK-NOLSE-O0-NEXT: uxth w8, w8 3649; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 3650; CHECK-NOLSE-O0-NEXT: cset w8, eq 3651; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3652; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB40_1 3653; CHECK-NOLSE-O0-NEXT: b LBB40_5 3654; CHECK-NOLSE-O0-NEXT: LBB40_5: ; %atomicrmw.end 3655; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3656; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3657; CHECK-NOLSE-O0-NEXT: ret 3658; 3659; CHECK-LSE-O1-LABEL: atomicrmw_and_i16: 3660; CHECK-LSE-O1: ; %bb.0: 3661; CHECK-LSE-O1-NEXT: mvn w8, w1 3662; CHECK-LSE-O1-NEXT: ldclrlh w8, w0, [x0] 3663; CHECK-LSE-O1-NEXT: ret 3664; 3665; CHECK-LSE-O0-LABEL: atomicrmw_and_i16: 3666; CHECK-LSE-O0: ; %bb.0: 3667; CHECK-LSE-O0-NEXT: mvn w8, w1 3668; CHECK-LSE-O0-NEXT: ldclrlh w8, w0, [x0] 3669; CHECK-LSE-O0-NEXT: ret 3670; 3671; CHECK-LDAPR-O1-LABEL: atomicrmw_and_i16: 3672; CHECK-LDAPR-O1: ; %bb.0: 3673; CHECK-LDAPR-O1-NEXT: LBB40_1: ; %atomicrmw.start 3674; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3675; CHECK-LDAPR-O1-NEXT: ldxrh w8, [x0] 3676; CHECK-LDAPR-O1-NEXT: and w9, w8, w1 3677; CHECK-LDAPR-O1-NEXT: stlxrh w10, w9, [x0] 3678; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB40_1 3679; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3680; CHECK-LDAPR-O1-NEXT: mov w0, w8 3681; CHECK-LDAPR-O1-NEXT: ret 3682; 3683; CHECK-LDAPR-O0-LABEL: atomicrmw_and_i16: 3684; CHECK-LDAPR-O0: ; %bb.0: 3685; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3686; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3687; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3688; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3689; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 3690; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3691; CHECK-LDAPR-O0-NEXT: b LBB40_1 3692; CHECK-LDAPR-O0-NEXT: LBB40_1: ; %atomicrmw.start 3693; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3694; CHECK-LDAPR-O0-NEXT: ; Child Loop BB40_2 Depth 2 3695; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3696; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3697; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3698; CHECK-LDAPR-O0-NEXT: and w12, w8, w9 3699; CHECK-LDAPR-O0-NEXT: LBB40_2: ; %atomicrmw.start 3700; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB40_1 Depth=1 3701; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3702; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 3703; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 3704; CHECK-LDAPR-O0-NEXT: b.ne LBB40_4 3705; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3706; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB40_2 Depth=2 3707; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 3708; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB40_2 3709; CHECK-LDAPR-O0-NEXT: LBB40_4: ; %atomicrmw.start 3710; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB40_1 Depth=1 3711; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3712; CHECK-LDAPR-O0-NEXT: uxth w8, w8 3713; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 3714; CHECK-LDAPR-O0-NEXT: cset w8, eq 3715; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3716; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB40_1 3717; CHECK-LDAPR-O0-NEXT: b LBB40_5 3718; CHECK-LDAPR-O0-NEXT: LBB40_5: ; %atomicrmw.end 3719; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3720; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3721; CHECK-LDAPR-O0-NEXT: ret 3722 %res = atomicrmw and i16* %ptr, i16 %rhs release 3723 ret i16 %res 3724} 3725 3726define i16 @atomicrmw_or_i16(i16* %ptr, i16 %rhs) { 3727; CHECK-NOLSE-O1-LABEL: atomicrmw_or_i16: 3728; CHECK-NOLSE-O1: ; %bb.0: 3729; CHECK-NOLSE-O1-NEXT: LBB41_1: ; %atomicrmw.start 3730; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3731; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0] 3732; CHECK-NOLSE-O1-NEXT: orr w9, w8, w1 3733; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0] 3734; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB41_1 3735; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3736; CHECK-NOLSE-O1-NEXT: mov w0, w8 3737; CHECK-NOLSE-O1-NEXT: ret 3738; 3739; CHECK-NOLSE-O0-LABEL: atomicrmw_or_i16: 3740; CHECK-NOLSE-O0: ; %bb.0: 3741; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3742; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3743; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3744; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3745; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3746; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3747; CHECK-NOLSE-O0-NEXT: b LBB41_1 3748; CHECK-NOLSE-O0-NEXT: LBB41_1: ; %atomicrmw.start 3749; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3750; CHECK-NOLSE-O0-NEXT: ; Child Loop BB41_2 Depth 2 3751; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3752; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3753; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3754; CHECK-NOLSE-O0-NEXT: orr w12, w8, w9 3755; CHECK-NOLSE-O0-NEXT: LBB41_2: ; %atomicrmw.start 3756; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB41_1 Depth=1 3757; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3758; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 3759; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 3760; CHECK-NOLSE-O0-NEXT: b.ne LBB41_4 3761; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3762; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB41_2 Depth=2 3763; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 3764; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB41_2 3765; CHECK-NOLSE-O0-NEXT: LBB41_4: ; %atomicrmw.start 3766; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB41_1 Depth=1 3767; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3768; CHECK-NOLSE-O0-NEXT: uxth w8, w8 3769; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 3770; CHECK-NOLSE-O0-NEXT: cset w8, eq 3771; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3772; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB41_1 3773; CHECK-NOLSE-O0-NEXT: b LBB41_5 3774; CHECK-NOLSE-O0-NEXT: LBB41_5: ; %atomicrmw.end 3775; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3776; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3777; CHECK-NOLSE-O0-NEXT: ret 3778; 3779; CHECK-LSE-O1-LABEL: atomicrmw_or_i16: 3780; CHECK-LSE-O1: ; %bb.0: 3781; CHECK-LSE-O1-NEXT: ldsetalh w1, w0, [x0] 3782; CHECK-LSE-O1-NEXT: ret 3783; 3784; CHECK-LSE-O0-LABEL: atomicrmw_or_i16: 3785; CHECK-LSE-O0: ; %bb.0: 3786; CHECK-LSE-O0-NEXT: ldsetalh w1, w0, [x0] 3787; CHECK-LSE-O0-NEXT: ret 3788; 3789; CHECK-LDAPR-O1-LABEL: atomicrmw_or_i16: 3790; CHECK-LDAPR-O1: ; %bb.0: 3791; CHECK-LDAPR-O1-NEXT: LBB41_1: ; %atomicrmw.start 3792; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3793; CHECK-LDAPR-O1-NEXT: ldaxrh w8, [x0] 3794; CHECK-LDAPR-O1-NEXT: orr w9, w8, w1 3795; CHECK-LDAPR-O1-NEXT: stlxrh w10, w9, [x0] 3796; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB41_1 3797; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3798; CHECK-LDAPR-O1-NEXT: mov w0, w8 3799; CHECK-LDAPR-O1-NEXT: ret 3800; 3801; CHECK-LDAPR-O0-LABEL: atomicrmw_or_i16: 3802; CHECK-LDAPR-O0: ; %bb.0: 3803; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3804; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3805; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3806; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3807; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 3808; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3809; CHECK-LDAPR-O0-NEXT: b LBB41_1 3810; CHECK-LDAPR-O0-NEXT: LBB41_1: ; %atomicrmw.start 3811; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3812; CHECK-LDAPR-O0-NEXT: ; Child Loop BB41_2 Depth 2 3813; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3814; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3815; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3816; CHECK-LDAPR-O0-NEXT: orr w12, w8, w9 3817; CHECK-LDAPR-O0-NEXT: LBB41_2: ; %atomicrmw.start 3818; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB41_1 Depth=1 3819; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3820; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 3821; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 3822; CHECK-LDAPR-O0-NEXT: b.ne LBB41_4 3823; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3824; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB41_2 Depth=2 3825; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 3826; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB41_2 3827; CHECK-LDAPR-O0-NEXT: LBB41_4: ; %atomicrmw.start 3828; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB41_1 Depth=1 3829; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3830; CHECK-LDAPR-O0-NEXT: uxth w8, w8 3831; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 3832; CHECK-LDAPR-O0-NEXT: cset w8, eq 3833; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3834; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB41_1 3835; CHECK-LDAPR-O0-NEXT: b LBB41_5 3836; CHECK-LDAPR-O0-NEXT: LBB41_5: ; %atomicrmw.end 3837; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3838; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3839; CHECK-LDAPR-O0-NEXT: ret 3840 %res = atomicrmw or i16* %ptr, i16 %rhs seq_cst 3841 ret i16 %res 3842} 3843 3844define i16 @atomicrmw_xor_i16(i16* %ptr, i16 %rhs) { 3845; CHECK-NOLSE-O1-LABEL: atomicrmw_xor_i16: 3846; CHECK-NOLSE-O1: ; %bb.0: 3847; CHECK-NOLSE-O1-NEXT: LBB42_1: ; %atomicrmw.start 3848; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3849; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0] 3850; CHECK-NOLSE-O1-NEXT: eor w9, w8, w1 3851; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0] 3852; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB42_1 3853; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3854; CHECK-NOLSE-O1-NEXT: mov w0, w8 3855; CHECK-NOLSE-O1-NEXT: ret 3856; 3857; CHECK-NOLSE-O0-LABEL: atomicrmw_xor_i16: 3858; CHECK-NOLSE-O0: ; %bb.0: 3859; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3860; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3861; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3862; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3863; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3864; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3865; CHECK-NOLSE-O0-NEXT: b LBB42_1 3866; CHECK-NOLSE-O0-NEXT: LBB42_1: ; %atomicrmw.start 3867; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3868; CHECK-NOLSE-O0-NEXT: ; Child Loop BB42_2 Depth 2 3869; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3870; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3871; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3872; CHECK-NOLSE-O0-NEXT: eor w12, w8, w9 3873; CHECK-NOLSE-O0-NEXT: LBB42_2: ; %atomicrmw.start 3874; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB42_1 Depth=1 3875; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 3876; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 3877; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 3878; CHECK-NOLSE-O0-NEXT: b.ne LBB42_4 3879; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3880; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB42_2 Depth=2 3881; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 3882; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB42_2 3883; CHECK-NOLSE-O0-NEXT: LBB42_4: ; %atomicrmw.start 3884; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB42_1 Depth=1 3885; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3886; CHECK-NOLSE-O0-NEXT: uxth w8, w8 3887; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 3888; CHECK-NOLSE-O0-NEXT: cset w8, eq 3889; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3890; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB42_1 3891; CHECK-NOLSE-O0-NEXT: b LBB42_5 3892; CHECK-NOLSE-O0-NEXT: LBB42_5: ; %atomicrmw.end 3893; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3894; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 3895; CHECK-NOLSE-O0-NEXT: ret 3896; 3897; CHECK-LSE-O1-LABEL: atomicrmw_xor_i16: 3898; CHECK-LSE-O1: ; %bb.0: 3899; CHECK-LSE-O1-NEXT: ldeorh w1, w0, [x0] 3900; CHECK-LSE-O1-NEXT: ret 3901; 3902; CHECK-LSE-O0-LABEL: atomicrmw_xor_i16: 3903; CHECK-LSE-O0: ; %bb.0: 3904; CHECK-LSE-O0-NEXT: ldeorh w1, w0, [x0] 3905; CHECK-LSE-O0-NEXT: ret 3906; 3907; CHECK-LDAPR-O1-LABEL: atomicrmw_xor_i16: 3908; CHECK-LDAPR-O1: ; %bb.0: 3909; CHECK-LDAPR-O1-NEXT: LBB42_1: ; %atomicrmw.start 3910; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3911; CHECK-LDAPR-O1-NEXT: ldxrh w8, [x0] 3912; CHECK-LDAPR-O1-NEXT: eor w9, w8, w1 3913; CHECK-LDAPR-O1-NEXT: stxrh w10, w9, [x0] 3914; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB42_1 3915; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3916; CHECK-LDAPR-O1-NEXT: mov w0, w8 3917; CHECK-LDAPR-O1-NEXT: ret 3918; 3919; CHECK-LDAPR-O0-LABEL: atomicrmw_xor_i16: 3920; CHECK-LDAPR-O0: ; %bb.0: 3921; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 3922; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 3923; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3924; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3925; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 3926; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3927; CHECK-LDAPR-O0-NEXT: b LBB42_1 3928; CHECK-LDAPR-O0-NEXT: LBB42_1: ; %atomicrmw.start 3929; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 3930; CHECK-LDAPR-O0-NEXT: ; Child Loop BB42_2 Depth 2 3931; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3932; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3933; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3934; CHECK-LDAPR-O0-NEXT: eor w12, w8, w9 3935; CHECK-LDAPR-O0-NEXT: LBB42_2: ; %atomicrmw.start 3936; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB42_1 Depth=1 3937; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 3938; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 3939; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 3940; CHECK-LDAPR-O0-NEXT: b.ne LBB42_4 3941; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 3942; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB42_2 Depth=2 3943; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 3944; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB42_2 3945; CHECK-LDAPR-O0-NEXT: LBB42_4: ; %atomicrmw.start 3946; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB42_1 Depth=1 3947; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 3948; CHECK-LDAPR-O0-NEXT: uxth w8, w8 3949; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 3950; CHECK-LDAPR-O0-NEXT: cset w8, eq 3951; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 3952; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB42_1 3953; CHECK-LDAPR-O0-NEXT: b LBB42_5 3954; CHECK-LDAPR-O0-NEXT: LBB42_5: ; %atomicrmw.end 3955; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 3956; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 3957; CHECK-LDAPR-O0-NEXT: ret 3958 %res = atomicrmw xor i16* %ptr, i16 %rhs monotonic 3959 ret i16 %res 3960} 3961 3962define i16 @atomicrmw_min_i16(i16* %ptr, i16 %rhs) { 3963; CHECK-NOLSE-O1-LABEL: atomicrmw_min_i16: 3964; CHECK-NOLSE-O1: ; %bb.0: 3965; CHECK-NOLSE-O1-NEXT: LBB43_1: ; %atomicrmw.start 3966; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 3967; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0] 3968; CHECK-NOLSE-O1-NEXT: sxth w9, w8 3969; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxth 3970; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, le 3971; CHECK-NOLSE-O1-NEXT: stxrh w10, w9, [x0] 3972; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB43_1 3973; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 3974; CHECK-NOLSE-O1-NEXT: mov w0, w8 3975; CHECK-NOLSE-O1-NEXT: ret 3976; 3977; CHECK-NOLSE-O0-LABEL: atomicrmw_min_i16: 3978; CHECK-NOLSE-O0: ; %bb.0: 3979; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 3980; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 3981; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 3982; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 3983; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 3984; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 3985; CHECK-NOLSE-O0-NEXT: b LBB43_1 3986; CHECK-NOLSE-O0-NEXT: LBB43_1: ; %atomicrmw.start 3987; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 3988; CHECK-NOLSE-O0-NEXT: ; Child Loop BB43_2 Depth 2 3989; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 3990; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 3991; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 3992; CHECK-NOLSE-O0-NEXT: sxth w10, w8 3993; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, sxth 3994; CHECK-NOLSE-O0-NEXT: cset w10, le 3995; CHECK-NOLSE-O0-NEXT: and w10, w10, #0x1 3996; CHECK-NOLSE-O0-NEXT: ands w10, w10, #0x1 3997; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, ne 3998; CHECK-NOLSE-O0-NEXT: LBB43_2: ; %atomicrmw.start 3999; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB43_1 Depth=1 4000; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 4001; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 4002; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 4003; CHECK-NOLSE-O0-NEXT: b.ne LBB43_4 4004; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4005; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB43_2 Depth=2 4006; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 4007; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB43_2 4008; CHECK-NOLSE-O0-NEXT: LBB43_4: ; %atomicrmw.start 4009; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB43_1 Depth=1 4010; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4011; CHECK-NOLSE-O0-NEXT: uxth w8, w8 4012; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 4013; CHECK-NOLSE-O0-NEXT: cset w8, eq 4014; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4015; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB43_1 4016; CHECK-NOLSE-O0-NEXT: b LBB43_5 4017; CHECK-NOLSE-O0-NEXT: LBB43_5: ; %atomicrmw.end 4018; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4019; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 4020; CHECK-NOLSE-O0-NEXT: ret 4021; 4022; CHECK-LSE-O1-LABEL: atomicrmw_min_i16: 4023; CHECK-LSE-O1: ; %bb.0: 4024; CHECK-LSE-O1-NEXT: ldsminah w1, w0, [x0] 4025; CHECK-LSE-O1-NEXT: ret 4026; 4027; CHECK-LSE-O0-LABEL: atomicrmw_min_i16: 4028; CHECK-LSE-O0: ; %bb.0: 4029; CHECK-LSE-O0-NEXT: ldsminah w1, w0, [x0] 4030; CHECK-LSE-O0-NEXT: ret 4031; 4032; CHECK-LDAPR-O1-LABEL: atomicrmw_min_i16: 4033; CHECK-LDAPR-O1: ; %bb.0: 4034; CHECK-LDAPR-O1-NEXT: LBB43_1: ; %atomicrmw.start 4035; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4036; CHECK-LDAPR-O1-NEXT: ldaxrh w8, [x0] 4037; CHECK-LDAPR-O1-NEXT: sxth w9, w8 4038; CHECK-LDAPR-O1-NEXT: cmp w9, w1, sxth 4039; CHECK-LDAPR-O1-NEXT: csel w9, w8, w1, le 4040; CHECK-LDAPR-O1-NEXT: stxrh w10, w9, [x0] 4041; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB43_1 4042; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4043; CHECK-LDAPR-O1-NEXT: mov w0, w8 4044; CHECK-LDAPR-O1-NEXT: ret 4045; 4046; CHECK-LDAPR-O0-LABEL: atomicrmw_min_i16: 4047; CHECK-LDAPR-O0: ; %bb.0: 4048; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 4049; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 4050; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4051; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4052; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 4053; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4054; CHECK-LDAPR-O0-NEXT: b LBB43_1 4055; CHECK-LDAPR-O0-NEXT: LBB43_1: ; %atomicrmw.start 4056; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 4057; CHECK-LDAPR-O0-NEXT: ; Child Loop BB43_2 Depth 2 4058; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4059; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4060; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4061; CHECK-LDAPR-O0-NEXT: sxth w10, w8 4062; CHECK-LDAPR-O0-NEXT: subs w10, w10, w9, sxth 4063; CHECK-LDAPR-O0-NEXT: cset w10, le 4064; CHECK-LDAPR-O0-NEXT: and w10, w10, #0x1 4065; CHECK-LDAPR-O0-NEXT: ands w10, w10, #0x1 4066; CHECK-LDAPR-O0-NEXT: csel w12, w8, w9, ne 4067; CHECK-LDAPR-O0-NEXT: LBB43_2: ; %atomicrmw.start 4068; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB43_1 Depth=1 4069; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 4070; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 4071; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 4072; CHECK-LDAPR-O0-NEXT: b.ne LBB43_4 4073; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4074; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB43_2 Depth=2 4075; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 4076; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB43_2 4077; CHECK-LDAPR-O0-NEXT: LBB43_4: ; %atomicrmw.start 4078; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB43_1 Depth=1 4079; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4080; CHECK-LDAPR-O0-NEXT: uxth w8, w8 4081; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 4082; CHECK-LDAPR-O0-NEXT: cset w8, eq 4083; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4084; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB43_1 4085; CHECK-LDAPR-O0-NEXT: b LBB43_5 4086; CHECK-LDAPR-O0-NEXT: LBB43_5: ; %atomicrmw.end 4087; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4088; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 4089; CHECK-LDAPR-O0-NEXT: ret 4090 %res = atomicrmw min i16* %ptr, i16 %rhs acquire 4091 ret i16 %res 4092} 4093 4094define i16 @atomicrmw_max_i16(i16* %ptr, i16 %rhs) { 4095; CHECK-NOLSE-O1-LABEL: atomicrmw_max_i16: 4096; CHECK-NOLSE-O1: ; %bb.0: 4097; CHECK-NOLSE-O1-NEXT: LBB44_1: ; %atomicrmw.start 4098; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4099; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0] 4100; CHECK-NOLSE-O1-NEXT: sxth w9, w8 4101; CHECK-NOLSE-O1-NEXT: cmp w9, w1, sxth 4102; CHECK-NOLSE-O1-NEXT: csel w9, w8, w1, gt 4103; CHECK-NOLSE-O1-NEXT: stlxrh w10, w9, [x0] 4104; CHECK-NOLSE-O1-NEXT: cbnz w10, LBB44_1 4105; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4106; CHECK-NOLSE-O1-NEXT: mov w0, w8 4107; CHECK-NOLSE-O1-NEXT: ret 4108; 4109; CHECK-NOLSE-O0-LABEL: atomicrmw_max_i16: 4110; CHECK-NOLSE-O0: ; %bb.0: 4111; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 4112; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 4113; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4114; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4115; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 4116; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4117; CHECK-NOLSE-O0-NEXT: b LBB44_1 4118; CHECK-NOLSE-O0-NEXT: LBB44_1: ; %atomicrmw.start 4119; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 4120; CHECK-NOLSE-O0-NEXT: ; Child Loop BB44_2 Depth 2 4121; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4122; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4123; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4124; CHECK-NOLSE-O0-NEXT: sxth w10, w8 4125; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, sxth 4126; CHECK-NOLSE-O0-NEXT: cset w10, gt 4127; CHECK-NOLSE-O0-NEXT: and w10, w10, #0x1 4128; CHECK-NOLSE-O0-NEXT: ands w10, w10, #0x1 4129; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, ne 4130; CHECK-NOLSE-O0-NEXT: LBB44_2: ; %atomicrmw.start 4131; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB44_1 Depth=1 4132; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 4133; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 4134; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 4135; CHECK-NOLSE-O0-NEXT: b.ne LBB44_4 4136; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4137; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB44_2 Depth=2 4138; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 4139; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB44_2 4140; CHECK-NOLSE-O0-NEXT: LBB44_4: ; %atomicrmw.start 4141; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB44_1 Depth=1 4142; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4143; CHECK-NOLSE-O0-NEXT: uxth w8, w8 4144; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 4145; CHECK-NOLSE-O0-NEXT: cset w8, eq 4146; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4147; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB44_1 4148; CHECK-NOLSE-O0-NEXT: b LBB44_5 4149; CHECK-NOLSE-O0-NEXT: LBB44_5: ; %atomicrmw.end 4150; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4151; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 4152; CHECK-NOLSE-O0-NEXT: ret 4153; 4154; CHECK-LSE-O1-LABEL: atomicrmw_max_i16: 4155; CHECK-LSE-O1: ; %bb.0: 4156; CHECK-LSE-O1-NEXT: ldsmaxlh w1, w0, [x0] 4157; CHECK-LSE-O1-NEXT: ret 4158; 4159; CHECK-LSE-O0-LABEL: atomicrmw_max_i16: 4160; CHECK-LSE-O0: ; %bb.0: 4161; CHECK-LSE-O0-NEXT: ldsmaxlh w1, w0, [x0] 4162; CHECK-LSE-O0-NEXT: ret 4163; 4164; CHECK-LDAPR-O1-LABEL: atomicrmw_max_i16: 4165; CHECK-LDAPR-O1: ; %bb.0: 4166; CHECK-LDAPR-O1-NEXT: LBB44_1: ; %atomicrmw.start 4167; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4168; CHECK-LDAPR-O1-NEXT: ldxrh w8, [x0] 4169; CHECK-LDAPR-O1-NEXT: sxth w9, w8 4170; CHECK-LDAPR-O1-NEXT: cmp w9, w1, sxth 4171; CHECK-LDAPR-O1-NEXT: csel w9, w8, w1, gt 4172; CHECK-LDAPR-O1-NEXT: stlxrh w10, w9, [x0] 4173; CHECK-LDAPR-O1-NEXT: cbnz w10, LBB44_1 4174; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4175; CHECK-LDAPR-O1-NEXT: mov w0, w8 4176; CHECK-LDAPR-O1-NEXT: ret 4177; 4178; CHECK-LDAPR-O0-LABEL: atomicrmw_max_i16: 4179; CHECK-LDAPR-O0: ; %bb.0: 4180; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 4181; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 4182; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4183; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4184; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 4185; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4186; CHECK-LDAPR-O0-NEXT: b LBB44_1 4187; CHECK-LDAPR-O0-NEXT: LBB44_1: ; %atomicrmw.start 4188; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 4189; CHECK-LDAPR-O0-NEXT: ; Child Loop BB44_2 Depth 2 4190; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4191; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4192; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4193; CHECK-LDAPR-O0-NEXT: sxth w10, w8 4194; CHECK-LDAPR-O0-NEXT: subs w10, w10, w9, sxth 4195; CHECK-LDAPR-O0-NEXT: cset w10, gt 4196; CHECK-LDAPR-O0-NEXT: and w10, w10, #0x1 4197; CHECK-LDAPR-O0-NEXT: ands w10, w10, #0x1 4198; CHECK-LDAPR-O0-NEXT: csel w12, w8, w9, ne 4199; CHECK-LDAPR-O0-NEXT: LBB44_2: ; %atomicrmw.start 4200; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB44_1 Depth=1 4201; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 4202; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 4203; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 4204; CHECK-LDAPR-O0-NEXT: b.ne LBB44_4 4205; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4206; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB44_2 Depth=2 4207; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 4208; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB44_2 4209; CHECK-LDAPR-O0-NEXT: LBB44_4: ; %atomicrmw.start 4210; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB44_1 Depth=1 4211; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4212; CHECK-LDAPR-O0-NEXT: uxth w8, w8 4213; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 4214; CHECK-LDAPR-O0-NEXT: cset w8, eq 4215; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4216; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB44_1 4217; CHECK-LDAPR-O0-NEXT: b LBB44_5 4218; CHECK-LDAPR-O0-NEXT: LBB44_5: ; %atomicrmw.end 4219; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4220; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 4221; CHECK-LDAPR-O0-NEXT: ret 4222 %res = atomicrmw max i16* %ptr, i16 %rhs release 4223 ret i16 %res 4224} 4225 4226define i16 @atomicrmw_umin_i16(i16* %ptr, i16 %rhs) { 4227; CHECK-NOLSE-O1-LABEL: atomicrmw_umin_i16: 4228; CHECK-NOLSE-O1: ; %bb.0: 4229; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xffff 4230; CHECK-NOLSE-O1-NEXT: LBB45_1: ; %atomicrmw.start 4231; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4232; CHECK-NOLSE-O1-NEXT: ldaxrh w8, [x0] 4233; CHECK-NOLSE-O1-NEXT: and w10, w8, #0xffff 4234; CHECK-NOLSE-O1-NEXT: cmp w10, w9 4235; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, ls 4236; CHECK-NOLSE-O1-NEXT: stlxrh w11, w10, [x0] 4237; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB45_1 4238; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4239; CHECK-NOLSE-O1-NEXT: mov w0, w8 4240; CHECK-NOLSE-O1-NEXT: ret 4241; 4242; CHECK-NOLSE-O0-LABEL: atomicrmw_umin_i16: 4243; CHECK-NOLSE-O0: ; %bb.0: 4244; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 4245; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 4246; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4247; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4248; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 4249; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4250; CHECK-NOLSE-O0-NEXT: b LBB45_1 4251; CHECK-NOLSE-O0-NEXT: LBB45_1: ; %atomicrmw.start 4252; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 4253; CHECK-NOLSE-O0-NEXT: ; Child Loop BB45_2 Depth 2 4254; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4255; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4256; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4257; CHECK-NOLSE-O0-NEXT: uxth w10, w8 4258; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, uxth 4259; CHECK-NOLSE-O0-NEXT: cset w10, ls 4260; CHECK-NOLSE-O0-NEXT: and w10, w10, #0x1 4261; CHECK-NOLSE-O0-NEXT: ands w10, w10, #0x1 4262; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, ne 4263; CHECK-NOLSE-O0-NEXT: LBB45_2: ; %atomicrmw.start 4264; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB45_1 Depth=1 4265; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 4266; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 4267; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 4268; CHECK-NOLSE-O0-NEXT: b.ne LBB45_4 4269; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4270; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB45_2 Depth=2 4271; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 4272; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB45_2 4273; CHECK-NOLSE-O0-NEXT: LBB45_4: ; %atomicrmw.start 4274; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB45_1 Depth=1 4275; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4276; CHECK-NOLSE-O0-NEXT: uxth w8, w8 4277; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 4278; CHECK-NOLSE-O0-NEXT: cset w8, eq 4279; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4280; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB45_1 4281; CHECK-NOLSE-O0-NEXT: b LBB45_5 4282; CHECK-NOLSE-O0-NEXT: LBB45_5: ; %atomicrmw.end 4283; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4284; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 4285; CHECK-NOLSE-O0-NEXT: ret 4286; 4287; CHECK-LSE-O1-LABEL: atomicrmw_umin_i16: 4288; CHECK-LSE-O1: ; %bb.0: 4289; CHECK-LSE-O1-NEXT: lduminalh w1, w0, [x0] 4290; CHECK-LSE-O1-NEXT: ret 4291; 4292; CHECK-LSE-O0-LABEL: atomicrmw_umin_i16: 4293; CHECK-LSE-O0: ; %bb.0: 4294; CHECK-LSE-O0-NEXT: lduminalh w1, w0, [x0] 4295; CHECK-LSE-O0-NEXT: ret 4296; 4297; CHECK-LDAPR-O1-LABEL: atomicrmw_umin_i16: 4298; CHECK-LDAPR-O1: ; %bb.0: 4299; CHECK-LDAPR-O1-NEXT: and w9, w1, #0xffff 4300; CHECK-LDAPR-O1-NEXT: LBB45_1: ; %atomicrmw.start 4301; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4302; CHECK-LDAPR-O1-NEXT: ldaxrh w8, [x0] 4303; CHECK-LDAPR-O1-NEXT: and w10, w8, #0xffff 4304; CHECK-LDAPR-O1-NEXT: cmp w10, w9 4305; CHECK-LDAPR-O1-NEXT: csel w10, w10, w9, ls 4306; CHECK-LDAPR-O1-NEXT: stlxrh w11, w10, [x0] 4307; CHECK-LDAPR-O1-NEXT: cbnz w11, LBB45_1 4308; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4309; CHECK-LDAPR-O1-NEXT: mov w0, w8 4310; CHECK-LDAPR-O1-NEXT: ret 4311; 4312; CHECK-LDAPR-O0-LABEL: atomicrmw_umin_i16: 4313; CHECK-LDAPR-O0: ; %bb.0: 4314; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 4315; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 4316; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4317; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4318; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 4319; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4320; CHECK-LDAPR-O0-NEXT: b LBB45_1 4321; CHECK-LDAPR-O0-NEXT: LBB45_1: ; %atomicrmw.start 4322; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 4323; CHECK-LDAPR-O0-NEXT: ; Child Loop BB45_2 Depth 2 4324; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4325; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4326; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4327; CHECK-LDAPR-O0-NEXT: uxth w10, w8 4328; CHECK-LDAPR-O0-NEXT: subs w10, w10, w9, uxth 4329; CHECK-LDAPR-O0-NEXT: cset w10, ls 4330; CHECK-LDAPR-O0-NEXT: and w10, w10, #0x1 4331; CHECK-LDAPR-O0-NEXT: ands w10, w10, #0x1 4332; CHECK-LDAPR-O0-NEXT: csel w12, w8, w9, ne 4333; CHECK-LDAPR-O0-NEXT: LBB45_2: ; %atomicrmw.start 4334; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB45_1 Depth=1 4335; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 4336; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 4337; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 4338; CHECK-LDAPR-O0-NEXT: b.ne LBB45_4 4339; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4340; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB45_2 Depth=2 4341; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 4342; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB45_2 4343; CHECK-LDAPR-O0-NEXT: LBB45_4: ; %atomicrmw.start 4344; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB45_1 Depth=1 4345; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4346; CHECK-LDAPR-O0-NEXT: uxth w8, w8 4347; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 4348; CHECK-LDAPR-O0-NEXT: cset w8, eq 4349; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4350; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB45_1 4351; CHECK-LDAPR-O0-NEXT: b LBB45_5 4352; CHECK-LDAPR-O0-NEXT: LBB45_5: ; %atomicrmw.end 4353; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4354; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 4355; CHECK-LDAPR-O0-NEXT: ret 4356 %res = atomicrmw umin i16* %ptr, i16 %rhs seq_cst 4357 ret i16 %res 4358} 4359 4360define i16 @atomicrmw_umax_i16(i16* %ptr, i16 %rhs) { 4361; CHECK-NOLSE-O1-LABEL: atomicrmw_umax_i16: 4362; CHECK-NOLSE-O1: ; %bb.0: 4363; CHECK-NOLSE-O1-NEXT: and w9, w1, #0xffff 4364; CHECK-NOLSE-O1-NEXT: LBB46_1: ; %atomicrmw.start 4365; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4366; CHECK-NOLSE-O1-NEXT: ldxrh w8, [x0] 4367; CHECK-NOLSE-O1-NEXT: and w10, w8, #0xffff 4368; CHECK-NOLSE-O1-NEXT: cmp w10, w9 4369; CHECK-NOLSE-O1-NEXT: csel w10, w10, w9, hi 4370; CHECK-NOLSE-O1-NEXT: stxrh w11, w10, [x0] 4371; CHECK-NOLSE-O1-NEXT: cbnz w11, LBB46_1 4372; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4373; CHECK-NOLSE-O1-NEXT: mov w0, w8 4374; CHECK-NOLSE-O1-NEXT: ret 4375; 4376; CHECK-NOLSE-O0-LABEL: atomicrmw_umax_i16: 4377; CHECK-NOLSE-O0: ; %bb.0: 4378; CHECK-NOLSE-O0-NEXT: sub sp, sp, #32 4379; CHECK-NOLSE-O0-NEXT: .cfi_def_cfa_offset 32 4380; CHECK-NOLSE-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4381; CHECK-NOLSE-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4382; CHECK-NOLSE-O0-NEXT: ldrh w8, [x0] 4383; CHECK-NOLSE-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4384; CHECK-NOLSE-O0-NEXT: b LBB46_1 4385; CHECK-NOLSE-O0-NEXT: LBB46_1: ; %atomicrmw.start 4386; CHECK-NOLSE-O0-NEXT: ; =>This Loop Header: Depth=1 4387; CHECK-NOLSE-O0-NEXT: ; Child Loop BB46_2 Depth 2 4388; CHECK-NOLSE-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4389; CHECK-NOLSE-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4390; CHECK-NOLSE-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4391; CHECK-NOLSE-O0-NEXT: uxth w10, w8 4392; CHECK-NOLSE-O0-NEXT: subs w10, w10, w9, uxth 4393; CHECK-NOLSE-O0-NEXT: cset w10, hi 4394; CHECK-NOLSE-O0-NEXT: and w10, w10, #0x1 4395; CHECK-NOLSE-O0-NEXT: ands w10, w10, #0x1 4396; CHECK-NOLSE-O0-NEXT: csel w12, w8, w9, ne 4397; CHECK-NOLSE-O0-NEXT: LBB46_2: ; %atomicrmw.start 4398; CHECK-NOLSE-O0-NEXT: ; Parent Loop BB46_1 Depth=1 4399; CHECK-NOLSE-O0-NEXT: ; => This Inner Loop Header: Depth=2 4400; CHECK-NOLSE-O0-NEXT: ldaxrh w9, [x11] 4401; CHECK-NOLSE-O0-NEXT: cmp w9, w8, uxth 4402; CHECK-NOLSE-O0-NEXT: b.ne LBB46_4 4403; CHECK-NOLSE-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4404; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB46_2 Depth=2 4405; CHECK-NOLSE-O0-NEXT: stlxrh w10, w12, [x11] 4406; CHECK-NOLSE-O0-NEXT: cbnz w10, LBB46_2 4407; CHECK-NOLSE-O0-NEXT: LBB46_4: ; %atomicrmw.start 4408; CHECK-NOLSE-O0-NEXT: ; in Loop: Header=BB46_1 Depth=1 4409; CHECK-NOLSE-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4410; CHECK-NOLSE-O0-NEXT: uxth w8, w8 4411; CHECK-NOLSE-O0-NEXT: subs w8, w8, w9, uxth 4412; CHECK-NOLSE-O0-NEXT: cset w8, eq 4413; CHECK-NOLSE-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4414; CHECK-NOLSE-O0-NEXT: tbz w8, #0, LBB46_1 4415; CHECK-NOLSE-O0-NEXT: b LBB46_5 4416; CHECK-NOLSE-O0-NEXT: LBB46_5: ; %atomicrmw.end 4417; CHECK-NOLSE-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4418; CHECK-NOLSE-O0-NEXT: add sp, sp, #32 4419; CHECK-NOLSE-O0-NEXT: ret 4420; 4421; CHECK-LSE-O1-LABEL: atomicrmw_umax_i16: 4422; CHECK-LSE-O1: ; %bb.0: 4423; CHECK-LSE-O1-NEXT: ldumaxh w1, w0, [x0] 4424; CHECK-LSE-O1-NEXT: ret 4425; 4426; CHECK-LSE-O0-LABEL: atomicrmw_umax_i16: 4427; CHECK-LSE-O0: ; %bb.0: 4428; CHECK-LSE-O0-NEXT: ldumaxh w1, w0, [x0] 4429; CHECK-LSE-O0-NEXT: ret 4430; 4431; CHECK-LDAPR-O1-LABEL: atomicrmw_umax_i16: 4432; CHECK-LDAPR-O1: ; %bb.0: 4433; CHECK-LDAPR-O1-NEXT: and w9, w1, #0xffff 4434; CHECK-LDAPR-O1-NEXT: LBB46_1: ; %atomicrmw.start 4435; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4436; CHECK-LDAPR-O1-NEXT: ldxrh w8, [x0] 4437; CHECK-LDAPR-O1-NEXT: and w10, w8, #0xffff 4438; CHECK-LDAPR-O1-NEXT: cmp w10, w9 4439; CHECK-LDAPR-O1-NEXT: csel w10, w10, w9, hi 4440; CHECK-LDAPR-O1-NEXT: stxrh w11, w10, [x0] 4441; CHECK-LDAPR-O1-NEXT: cbnz w11, LBB46_1 4442; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %atomicrmw.end 4443; CHECK-LDAPR-O1-NEXT: mov w0, w8 4444; CHECK-LDAPR-O1-NEXT: ret 4445; 4446; CHECK-LDAPR-O0-LABEL: atomicrmw_umax_i16: 4447; CHECK-LDAPR-O0: ; %bb.0: 4448; CHECK-LDAPR-O0-NEXT: sub sp, sp, #32 4449; CHECK-LDAPR-O0-NEXT: .cfi_def_cfa_offset 32 4450; CHECK-LDAPR-O0-NEXT: str x0, [sp, #16] ; 8-byte Folded Spill 4451; CHECK-LDAPR-O0-NEXT: str w1, [sp, #24] ; 4-byte Folded Spill 4452; CHECK-LDAPR-O0-NEXT: ldrh w8, [x0] 4453; CHECK-LDAPR-O0-NEXT: str w8, [sp, #28] ; 4-byte Folded Spill 4454; CHECK-LDAPR-O0-NEXT: b LBB46_1 4455; CHECK-LDAPR-O0-NEXT: LBB46_1: ; %atomicrmw.start 4456; CHECK-LDAPR-O0-NEXT: ; =>This Loop Header: Depth=1 4457; CHECK-LDAPR-O0-NEXT: ; Child Loop BB46_2 Depth 2 4458; CHECK-LDAPR-O0-NEXT: ldr w8, [sp, #28] ; 4-byte Folded Reload 4459; CHECK-LDAPR-O0-NEXT: ldr x11, [sp, #16] ; 8-byte Folded Reload 4460; CHECK-LDAPR-O0-NEXT: ldr w9, [sp, #24] ; 4-byte Folded Reload 4461; CHECK-LDAPR-O0-NEXT: uxth w10, w8 4462; CHECK-LDAPR-O0-NEXT: subs w10, w10, w9, uxth 4463; CHECK-LDAPR-O0-NEXT: cset w10, hi 4464; CHECK-LDAPR-O0-NEXT: and w10, w10, #0x1 4465; CHECK-LDAPR-O0-NEXT: ands w10, w10, #0x1 4466; CHECK-LDAPR-O0-NEXT: csel w12, w8, w9, ne 4467; CHECK-LDAPR-O0-NEXT: LBB46_2: ; %atomicrmw.start 4468; CHECK-LDAPR-O0-NEXT: ; Parent Loop BB46_1 Depth=1 4469; CHECK-LDAPR-O0-NEXT: ; => This Inner Loop Header: Depth=2 4470; CHECK-LDAPR-O0-NEXT: ldaxrh w9, [x11] 4471; CHECK-LDAPR-O0-NEXT: cmp w9, w8, uxth 4472; CHECK-LDAPR-O0-NEXT: b.ne LBB46_4 4473; CHECK-LDAPR-O0-NEXT: ; %bb.3: ; %atomicrmw.start 4474; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB46_2 Depth=2 4475; CHECK-LDAPR-O0-NEXT: stlxrh w10, w12, [x11] 4476; CHECK-LDAPR-O0-NEXT: cbnz w10, LBB46_2 4477; CHECK-LDAPR-O0-NEXT: LBB46_4: ; %atomicrmw.start 4478; CHECK-LDAPR-O0-NEXT: ; in Loop: Header=BB46_1 Depth=1 4479; CHECK-LDAPR-O0-NEXT: str w9, [sp, #12] ; 4-byte Folded Spill 4480; CHECK-LDAPR-O0-NEXT: uxth w8, w8 4481; CHECK-LDAPR-O0-NEXT: subs w8, w8, w9, uxth 4482; CHECK-LDAPR-O0-NEXT: cset w8, eq 4483; CHECK-LDAPR-O0-NEXT: str w9, [sp, #28] ; 4-byte Folded Spill 4484; CHECK-LDAPR-O0-NEXT: tbz w8, #0, LBB46_1 4485; CHECK-LDAPR-O0-NEXT: b LBB46_5 4486; CHECK-LDAPR-O0-NEXT: LBB46_5: ; %atomicrmw.end 4487; CHECK-LDAPR-O0-NEXT: ldr w0, [sp, #12] ; 4-byte Folded Reload 4488; CHECK-LDAPR-O0-NEXT: add sp, sp, #32 4489; CHECK-LDAPR-O0-NEXT: ret 4490 %res = atomicrmw umax i16* %ptr, i16 %rhs monotonic 4491 ret i16 %res 4492} 4493 4494define { i8, i1 } @cmpxchg_i8(i8* %ptr, i8 %desired, i8 %new) { 4495; CHECK-NOLSE-O1-LABEL: cmpxchg_i8: 4496; CHECK-NOLSE-O1: ; %bb.0: 4497; CHECK-NOLSE-O1-NEXT: mov x8, x0 4498; CHECK-NOLSE-O1-NEXT: ; kill: def $w2 killed $w2 def $x2 4499; CHECK-NOLSE-O1-NEXT: LBB47_1: ; %cmpxchg.start 4500; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4501; CHECK-NOLSE-O1-NEXT: ldxrb w0, [x8] 4502; CHECK-NOLSE-O1-NEXT: and w9, w0, #0xff 4503; CHECK-NOLSE-O1-NEXT: cmp w9, w1, uxtb 4504; CHECK-NOLSE-O1-NEXT: b.ne LBB47_4 4505; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 4506; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB47_1 Depth=1 4507; CHECK-NOLSE-O1-NEXT: stxrb w9, w2, [x8] 4508; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB47_1 4509; CHECK-NOLSE-O1-NEXT: ; %bb.3: 4510; CHECK-NOLSE-O1-NEXT: mov w1, #1 4511; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4512; CHECK-NOLSE-O1-NEXT: ret 4513; CHECK-NOLSE-O1-NEXT: LBB47_4: ; %cmpxchg.nostore 4514; CHECK-NOLSE-O1-NEXT: mov w1, wzr 4515; CHECK-NOLSE-O1-NEXT: clrex 4516; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4517; CHECK-NOLSE-O1-NEXT: ret 4518; 4519; CHECK-NOLSE-O0-LABEL: cmpxchg_i8: 4520; CHECK-NOLSE-O0: ; %bb.0: 4521; CHECK-NOLSE-O0-NEXT: mov x9, x0 4522; CHECK-NOLSE-O0-NEXT: LBB47_1: ; =>This Inner Loop Header: Depth=1 4523; CHECK-NOLSE-O0-NEXT: ldaxrb w0, [x9] 4524; CHECK-NOLSE-O0-NEXT: cmp w0, w1, uxtb 4525; CHECK-NOLSE-O0-NEXT: b.ne LBB47_3 4526; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB47_1 Depth=1 4527; CHECK-NOLSE-O0-NEXT: stlxrb w8, w2, [x9] 4528; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB47_1 4529; CHECK-NOLSE-O0-NEXT: LBB47_3: 4530; CHECK-NOLSE-O0-NEXT: and w8, w0, #0xff 4531; CHECK-NOLSE-O0-NEXT: subs w8, w8, w1, uxtb 4532; CHECK-NOLSE-O0-NEXT: cset w8, eq 4533; CHECK-NOLSE-O0-NEXT: and w1, w8, #0x1 4534; CHECK-NOLSE-O0-NEXT: ret 4535; 4536; CHECK-LSE-O1-LABEL: cmpxchg_i8: 4537; CHECK-LSE-O1: ; %bb.0: 4538; CHECK-LSE-O1-NEXT: mov x8, x1 4539; CHECK-LSE-O1-NEXT: casb w8, w2, [x0] 4540; CHECK-LSE-O1-NEXT: and w9, w8, #0xff 4541; CHECK-LSE-O1-NEXT: cmp w9, w1, uxtb 4542; CHECK-LSE-O1-NEXT: cset w1, eq 4543; CHECK-LSE-O1-NEXT: mov x0, x8 4544; CHECK-LSE-O1-NEXT: ret 4545; 4546; CHECK-LSE-O0-LABEL: cmpxchg_i8: 4547; CHECK-LSE-O0: ; %bb.0: 4548; CHECK-LSE-O0-NEXT: mov x8, x0 4549; CHECK-LSE-O0-NEXT: mov x0, x1 4550; CHECK-LSE-O0-NEXT: casb w0, w2, [x8] 4551; CHECK-LSE-O0-NEXT: and w8, w0, #0xff 4552; CHECK-LSE-O0-NEXT: subs w8, w8, w1, uxtb 4553; CHECK-LSE-O0-NEXT: cset w8, eq 4554; CHECK-LSE-O0-NEXT: and w1, w8, #0x1 4555; CHECK-LSE-O0-NEXT: ret 4556; 4557; CHECK-LDAPR-O1-LABEL: cmpxchg_i8: 4558; CHECK-LDAPR-O1: ; %bb.0: 4559; CHECK-LDAPR-O1-NEXT: mov x8, x0 4560; CHECK-LDAPR-O1-NEXT: ; kill: def $w2 killed $w2 def $x2 4561; CHECK-LDAPR-O1-NEXT: LBB47_1: ; %cmpxchg.start 4562; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4563; CHECK-LDAPR-O1-NEXT: ldxrb w0, [x8] 4564; CHECK-LDAPR-O1-NEXT: and w9, w0, #0xff 4565; CHECK-LDAPR-O1-NEXT: cmp w9, w1, uxtb 4566; CHECK-LDAPR-O1-NEXT: b.ne LBB47_4 4567; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 4568; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB47_1 Depth=1 4569; CHECK-LDAPR-O1-NEXT: stxrb w9, w2, [x8] 4570; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB47_1 4571; CHECK-LDAPR-O1-NEXT: ; %bb.3: 4572; CHECK-LDAPR-O1-NEXT: mov w1, #1 4573; CHECK-LDAPR-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4574; CHECK-LDAPR-O1-NEXT: ret 4575; CHECK-LDAPR-O1-NEXT: LBB47_4: ; %cmpxchg.nostore 4576; CHECK-LDAPR-O1-NEXT: mov w1, wzr 4577; CHECK-LDAPR-O1-NEXT: clrex 4578; CHECK-LDAPR-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4579; CHECK-LDAPR-O1-NEXT: ret 4580; 4581; CHECK-LDAPR-O0-LABEL: cmpxchg_i8: 4582; CHECK-LDAPR-O0: ; %bb.0: 4583; CHECK-LDAPR-O0-NEXT: mov x9, x0 4584; CHECK-LDAPR-O0-NEXT: LBB47_1: ; =>This Inner Loop Header: Depth=1 4585; CHECK-LDAPR-O0-NEXT: ldaxrb w0, [x9] 4586; CHECK-LDAPR-O0-NEXT: cmp w0, w1, uxtb 4587; CHECK-LDAPR-O0-NEXT: b.ne LBB47_3 4588; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB47_1 Depth=1 4589; CHECK-LDAPR-O0-NEXT: stlxrb w8, w2, [x9] 4590; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB47_1 4591; CHECK-LDAPR-O0-NEXT: LBB47_3: 4592; CHECK-LDAPR-O0-NEXT: and w8, w0, #0xff 4593; CHECK-LDAPR-O0-NEXT: subs w8, w8, w1, uxtb 4594; CHECK-LDAPR-O0-NEXT: cset w8, eq 4595; CHECK-LDAPR-O0-NEXT: and w1, w8, #0x1 4596; CHECK-LDAPR-O0-NEXT: ret 4597 %res = cmpxchg i8* %ptr, i8 %desired, i8 %new monotonic monotonic 4598 ret { i8, i1 } %res 4599} 4600 4601define { i16, i1 } @cmpxchg_i16(i16* %ptr, i16 %desired, i16 %new) { 4602; CHECK-NOLSE-O1-LABEL: cmpxchg_i16: 4603; CHECK-NOLSE-O1: ; %bb.0: 4604; CHECK-NOLSE-O1-NEXT: mov x8, x0 4605; CHECK-NOLSE-O1-NEXT: ; kill: def $w2 killed $w2 def $x2 4606; CHECK-NOLSE-O1-NEXT: LBB48_1: ; %cmpxchg.start 4607; CHECK-NOLSE-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4608; CHECK-NOLSE-O1-NEXT: ldxrh w0, [x8] 4609; CHECK-NOLSE-O1-NEXT: and w9, w0, #0xffff 4610; CHECK-NOLSE-O1-NEXT: cmp w9, w1, uxth 4611; CHECK-NOLSE-O1-NEXT: b.ne LBB48_4 4612; CHECK-NOLSE-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 4613; CHECK-NOLSE-O1-NEXT: ; in Loop: Header=BB48_1 Depth=1 4614; CHECK-NOLSE-O1-NEXT: stxrh w9, w2, [x8] 4615; CHECK-NOLSE-O1-NEXT: cbnz w9, LBB48_1 4616; CHECK-NOLSE-O1-NEXT: ; %bb.3: 4617; CHECK-NOLSE-O1-NEXT: mov w1, #1 4618; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4619; CHECK-NOLSE-O1-NEXT: ret 4620; CHECK-NOLSE-O1-NEXT: LBB48_4: ; %cmpxchg.nostore 4621; CHECK-NOLSE-O1-NEXT: mov w1, wzr 4622; CHECK-NOLSE-O1-NEXT: clrex 4623; CHECK-NOLSE-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4624; CHECK-NOLSE-O1-NEXT: ret 4625; 4626; CHECK-NOLSE-O0-LABEL: cmpxchg_i16: 4627; CHECK-NOLSE-O0: ; %bb.0: 4628; CHECK-NOLSE-O0-NEXT: mov x9, x0 4629; CHECK-NOLSE-O0-NEXT: LBB48_1: ; =>This Inner Loop Header: Depth=1 4630; CHECK-NOLSE-O0-NEXT: ldaxrh w0, [x9] 4631; CHECK-NOLSE-O0-NEXT: cmp w0, w1, uxth 4632; CHECK-NOLSE-O0-NEXT: b.ne LBB48_3 4633; CHECK-NOLSE-O0-NEXT: ; %bb.2: ; in Loop: Header=BB48_1 Depth=1 4634; CHECK-NOLSE-O0-NEXT: stlxrh w8, w2, [x9] 4635; CHECK-NOLSE-O0-NEXT: cbnz w8, LBB48_1 4636; CHECK-NOLSE-O0-NEXT: LBB48_3: 4637; CHECK-NOLSE-O0-NEXT: and w8, w0, #0xffff 4638; CHECK-NOLSE-O0-NEXT: subs w8, w8, w1, uxth 4639; CHECK-NOLSE-O0-NEXT: cset w8, eq 4640; CHECK-NOLSE-O0-NEXT: and w1, w8, #0x1 4641; CHECK-NOLSE-O0-NEXT: ret 4642; 4643; CHECK-LSE-O1-LABEL: cmpxchg_i16: 4644; CHECK-LSE-O1: ; %bb.0: 4645; CHECK-LSE-O1-NEXT: mov x8, x1 4646; CHECK-LSE-O1-NEXT: cash w8, w2, [x0] 4647; CHECK-LSE-O1-NEXT: and w9, w8, #0xffff 4648; CHECK-LSE-O1-NEXT: cmp w9, w1, uxth 4649; CHECK-LSE-O1-NEXT: cset w1, eq 4650; CHECK-LSE-O1-NEXT: mov x0, x8 4651; CHECK-LSE-O1-NEXT: ret 4652; 4653; CHECK-LSE-O0-LABEL: cmpxchg_i16: 4654; CHECK-LSE-O0: ; %bb.0: 4655; CHECK-LSE-O0-NEXT: mov x8, x0 4656; CHECK-LSE-O0-NEXT: mov x0, x1 4657; CHECK-LSE-O0-NEXT: cash w0, w2, [x8] 4658; CHECK-LSE-O0-NEXT: and w8, w0, #0xffff 4659; CHECK-LSE-O0-NEXT: subs w8, w8, w1, uxth 4660; CHECK-LSE-O0-NEXT: cset w8, eq 4661; CHECK-LSE-O0-NEXT: and w1, w8, #0x1 4662; CHECK-LSE-O0-NEXT: ret 4663; 4664; CHECK-LDAPR-O1-LABEL: cmpxchg_i16: 4665; CHECK-LDAPR-O1: ; %bb.0: 4666; CHECK-LDAPR-O1-NEXT: mov x8, x0 4667; CHECK-LDAPR-O1-NEXT: ; kill: def $w2 killed $w2 def $x2 4668; CHECK-LDAPR-O1-NEXT: LBB48_1: ; %cmpxchg.start 4669; CHECK-LDAPR-O1-NEXT: ; =>This Inner Loop Header: Depth=1 4670; CHECK-LDAPR-O1-NEXT: ldxrh w0, [x8] 4671; CHECK-LDAPR-O1-NEXT: and w9, w0, #0xffff 4672; CHECK-LDAPR-O1-NEXT: cmp w9, w1, uxth 4673; CHECK-LDAPR-O1-NEXT: b.ne LBB48_4 4674; CHECK-LDAPR-O1-NEXT: ; %bb.2: ; %cmpxchg.trystore 4675; CHECK-LDAPR-O1-NEXT: ; in Loop: Header=BB48_1 Depth=1 4676; CHECK-LDAPR-O1-NEXT: stxrh w9, w2, [x8] 4677; CHECK-LDAPR-O1-NEXT: cbnz w9, LBB48_1 4678; CHECK-LDAPR-O1-NEXT: ; %bb.3: 4679; CHECK-LDAPR-O1-NEXT: mov w1, #1 4680; CHECK-LDAPR-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4681; CHECK-LDAPR-O1-NEXT: ret 4682; CHECK-LDAPR-O1-NEXT: LBB48_4: ; %cmpxchg.nostore 4683; CHECK-LDAPR-O1-NEXT: mov w1, wzr 4684; CHECK-LDAPR-O1-NEXT: clrex 4685; CHECK-LDAPR-O1-NEXT: ; kill: def $w0 killed $w0 killed $x0 4686; CHECK-LDAPR-O1-NEXT: ret 4687; 4688; CHECK-LDAPR-O0-LABEL: cmpxchg_i16: 4689; CHECK-LDAPR-O0: ; %bb.0: 4690; CHECK-LDAPR-O0-NEXT: mov x9, x0 4691; CHECK-LDAPR-O0-NEXT: LBB48_1: ; =>This Inner Loop Header: Depth=1 4692; CHECK-LDAPR-O0-NEXT: ldaxrh w0, [x9] 4693; CHECK-LDAPR-O0-NEXT: cmp w0, w1, uxth 4694; CHECK-LDAPR-O0-NEXT: b.ne LBB48_3 4695; CHECK-LDAPR-O0-NEXT: ; %bb.2: ; in Loop: Header=BB48_1 Depth=1 4696; CHECK-LDAPR-O0-NEXT: stlxrh w8, w2, [x9] 4697; CHECK-LDAPR-O0-NEXT: cbnz w8, LBB48_1 4698; CHECK-LDAPR-O0-NEXT: LBB48_3: 4699; CHECK-LDAPR-O0-NEXT: and w8, w0, #0xffff 4700; CHECK-LDAPR-O0-NEXT: subs w8, w8, w1, uxth 4701; CHECK-LDAPR-O0-NEXT: cset w8, eq 4702; CHECK-LDAPR-O0-NEXT: and w1, w8, #0x1 4703; CHECK-LDAPR-O0-NEXT: ret 4704 %res = cmpxchg i16* %ptr, i16 %desired, i16 %new monotonic monotonic 4705 ret { i16, i1 } %res 4706} 4707 4708define internal double @bitcast_to_double(i64* %ptr) { 4709; CHECK-NOLSE-LABEL: bitcast_to_double: 4710; CHECK-NOLSE: ; %bb.0: 4711; CHECK-NOLSE-NEXT: ldar x8, [x0] 4712; CHECK-NOLSE-NEXT: fmov d0, x8 4713; CHECK-NOLSE-NEXT: ret 4714; 4715; CHECK-LSE-O1-LABEL: bitcast_to_double: 4716; CHECK-LSE-O1: ; %bb.0: 4717; CHECK-LSE-O1-NEXT: ldar x8, [x0] 4718; CHECK-LSE-O1-NEXT: fmov d0, x8 4719; CHECK-LSE-O1-NEXT: ret 4720; 4721; CHECK-LSE-O0-LABEL: bitcast_to_double: 4722; CHECK-LSE-O0: ; %bb.0: 4723; CHECK-LSE-O0-NEXT: ldar x8, [x0] 4724; CHECK-LSE-O0-NEXT: fmov d0, x8 4725; CHECK-LSE-O0-NEXT: ret 4726; 4727; CHECK-LDAPR-O1-LABEL: bitcast_to_double: 4728; CHECK-LDAPR-O1: ; %bb.0: 4729; CHECK-LDAPR-O1-NEXT: ldar x8, [x0] 4730; CHECK-LDAPR-O1-NEXT: fmov d0, x8 4731; CHECK-LDAPR-O1-NEXT: ret 4732; 4733; CHECK-LDAPR-O0-LABEL: bitcast_to_double: 4734; CHECK-LDAPR-O0: ; %bb.0: 4735; CHECK-LDAPR-O0-NEXT: ldar x8, [x0] 4736; CHECK-LDAPR-O0-NEXT: fmov d0, x8 4737; CHECK-LDAPR-O0-NEXT: ret 4738 %load = load atomic i64, i64* %ptr seq_cst, align 8 4739 %bitcast = bitcast i64 %load to double 4740 ret double %bitcast 4741} 4742 4743define internal float @bitcast_to_float(i32* %ptr) { 4744; CHECK-NOLSE-LABEL: bitcast_to_float: 4745; CHECK-NOLSE: ; %bb.0: 4746; CHECK-NOLSE-NEXT: ldar w8, [x0] 4747; CHECK-NOLSE-NEXT: fmov s0, w8 4748; CHECK-NOLSE-NEXT: ret 4749; 4750; CHECK-LSE-O1-LABEL: bitcast_to_float: 4751; CHECK-LSE-O1: ; %bb.0: 4752; CHECK-LSE-O1-NEXT: ldar w8, [x0] 4753; CHECK-LSE-O1-NEXT: fmov s0, w8 4754; CHECK-LSE-O1-NEXT: ret 4755; 4756; CHECK-LSE-O0-LABEL: bitcast_to_float: 4757; CHECK-LSE-O0: ; %bb.0: 4758; CHECK-LSE-O0-NEXT: ldar w8, [x0] 4759; CHECK-LSE-O0-NEXT: fmov s0, w8 4760; CHECK-LSE-O0-NEXT: ret 4761; 4762; CHECK-LDAPR-O1-LABEL: bitcast_to_float: 4763; CHECK-LDAPR-O1: ; %bb.0: 4764; CHECK-LDAPR-O1-NEXT: ldar w8, [x0] 4765; CHECK-LDAPR-O1-NEXT: fmov s0, w8 4766; CHECK-LDAPR-O1-NEXT: ret 4767; 4768; CHECK-LDAPR-O0-LABEL: bitcast_to_float: 4769; CHECK-LDAPR-O0: ; %bb.0: 4770; CHECK-LDAPR-O0-NEXT: ldar w8, [x0] 4771; CHECK-LDAPR-O0-NEXT: fmov s0, w8 4772; CHECK-LDAPR-O0-NEXT: ret 4773 %load = load atomic i32, i32* %ptr seq_cst, align 8 4774 %bitcast = bitcast i32 %load to float 4775 ret float %bitcast 4776} 4777 4778define internal half @bitcast_to_half(i16* %ptr) { 4779; CHECK-NOLSE-LABEL: bitcast_to_half: 4780; CHECK-NOLSE: ; %bb.0: 4781; CHECK-NOLSE-NEXT: ldarh w8, [x0] 4782; CHECK-NOLSE-NEXT: fmov s0, w8 4783; CHECK-NOLSE-NEXT: ; kill: def $h0 killed $h0 killed $s0 4784; CHECK-NOLSE-NEXT: ret 4785; 4786; CHECK-LSE-O1-LABEL: bitcast_to_half: 4787; CHECK-LSE-O1: ; %bb.0: 4788; CHECK-LSE-O1-NEXT: ldarh w8, [x0] 4789; CHECK-LSE-O1-NEXT: fmov s0, w8 4790; CHECK-LSE-O1-NEXT: ; kill: def $h0 killed $h0 killed $s0 4791; CHECK-LSE-O1-NEXT: ret 4792; 4793; CHECK-LSE-O0-LABEL: bitcast_to_half: 4794; CHECK-LSE-O0: ; %bb.0: 4795; CHECK-LSE-O0-NEXT: ldarh w8, [x0] 4796; CHECK-LSE-O0-NEXT: fmov s0, w8 4797; CHECK-LSE-O0-NEXT: ; kill: def $h0 killed $h0 killed $s0 4798; CHECK-LSE-O0-NEXT: ret 4799; 4800; CHECK-LDAPR-O1-LABEL: bitcast_to_half: 4801; CHECK-LDAPR-O1: ; %bb.0: 4802; CHECK-LDAPR-O1-NEXT: ldarh w8, [x0] 4803; CHECK-LDAPR-O1-NEXT: fmov s0, w8 4804; CHECK-LDAPR-O1-NEXT: ; kill: def $h0 killed $h0 killed $s0 4805; CHECK-LDAPR-O1-NEXT: ret 4806; 4807; CHECK-LDAPR-O0-LABEL: bitcast_to_half: 4808; CHECK-LDAPR-O0: ; %bb.0: 4809; CHECK-LDAPR-O0-NEXT: ldarh w8, [x0] 4810; CHECK-LDAPR-O0-NEXT: fmov s0, w8 4811; CHECK-LDAPR-O0-NEXT: ; kill: def $h0 killed $h0 killed $s0 4812; CHECK-LDAPR-O0-NEXT: ret 4813 %load = load atomic i16, i16* %ptr seq_cst, align 8 4814 %bitcast = bitcast i16 %load to half 4815 ret half %bitcast 4816} 4817 4818define internal i64* @inttoptr(i64* %ptr) { 4819; CHECK-NOLSE-LABEL: inttoptr: 4820; CHECK-NOLSE: ; %bb.0: 4821; CHECK-NOLSE-NEXT: ldar x0, [x0] 4822; CHECK-NOLSE-NEXT: ret 4823; 4824; CHECK-LSE-O1-LABEL: inttoptr: 4825; CHECK-LSE-O1: ; %bb.0: 4826; CHECK-LSE-O1-NEXT: ldar x0, [x0] 4827; CHECK-LSE-O1-NEXT: ret 4828; 4829; CHECK-LSE-O0-LABEL: inttoptr: 4830; CHECK-LSE-O0: ; %bb.0: 4831; CHECK-LSE-O0-NEXT: ldar x0, [x0] 4832; CHECK-LSE-O0-NEXT: ret 4833; 4834; CHECK-LDAPR-O1-LABEL: inttoptr: 4835; CHECK-LDAPR-O1: ; %bb.0: 4836; CHECK-LDAPR-O1-NEXT: ldar x0, [x0] 4837; CHECK-LDAPR-O1-NEXT: ret 4838; 4839; CHECK-LDAPR-O0-LABEL: inttoptr: 4840; CHECK-LDAPR-O0: ; %bb.0: 4841; CHECK-LDAPR-O0-NEXT: ldar x0, [x0] 4842; CHECK-LDAPR-O0-NEXT: ret 4843 %load = load atomic i64, i64* %ptr seq_cst, align 8 4844 %bitcast = inttoptr i64 %load to i64* 4845 ret i64* %bitcast 4846} 4847 4848define internal i64* @load_ptr(i64** %ptr) { 4849; CHECK-NOLSE-LABEL: load_ptr: 4850; CHECK-NOLSE: ; %bb.0: 4851; CHECK-NOLSE-NEXT: ldar x0, [x0] 4852; CHECK-NOLSE-NEXT: ret 4853; 4854; CHECK-LSE-O1-LABEL: load_ptr: 4855; CHECK-LSE-O1: ; %bb.0: 4856; CHECK-LSE-O1-NEXT: ldar x0, [x0] 4857; CHECK-LSE-O1-NEXT: ret 4858; 4859; CHECK-LSE-O0-LABEL: load_ptr: 4860; CHECK-LSE-O0: ; %bb.0: 4861; CHECK-LSE-O0-NEXT: ldar x0, [x0] 4862; CHECK-LSE-O0-NEXT: ret 4863; 4864; CHECK-LDAPR-O1-LABEL: load_ptr: 4865; CHECK-LDAPR-O1: ; %bb.0: 4866; CHECK-LDAPR-O1-NEXT: ldar x0, [x0] 4867; CHECK-LDAPR-O1-NEXT: ret 4868; 4869; CHECK-LDAPR-O0-LABEL: load_ptr: 4870; CHECK-LDAPR-O0: ; %bb.0: 4871; CHECK-LDAPR-O0-NEXT: ldar x0, [x0] 4872; CHECK-LDAPR-O0-NEXT: ret 4873 %load = load atomic i64*, i64** %ptr seq_cst, align 8 4874 ret i64* %load 4875} 4876 4877attributes #0 = { nounwind } 4878