1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)" 2; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py 3; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+v8.1a -O0 | FileCheck %s --check-prefixes=CHECK,-O0 4; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+v8.1a -O1 | FileCheck %s --check-prefixes=CHECK,-O1 5 6define dso_local i8 @atomicrmw_xchg_i8_aligned_monotonic(ptr %ptr, i8 %value) { 7; CHECK-LABEL: atomicrmw_xchg_i8_aligned_monotonic: 8; CHECK: swpb w1, w0, [x0] 9 %r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1 10 ret i8 %r 11} 12 13define dso_local i8 @atomicrmw_xchg_i8_aligned_acquire(ptr %ptr, i8 %value) { 14; CHECK-LABEL: atomicrmw_xchg_i8_aligned_acquire: 15; CHECK: swpab w1, w0, [x0] 16 %r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1 17 ret i8 %r 18} 19 20define dso_local i8 @atomicrmw_xchg_i8_aligned_release(ptr %ptr, i8 %value) { 21; CHECK-LABEL: atomicrmw_xchg_i8_aligned_release: 22; CHECK: swplb w1, w0, [x0] 23 %r = atomicrmw xchg ptr %ptr, i8 %value release, align 1 24 ret i8 %r 25} 26 27define dso_local i8 @atomicrmw_xchg_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 28; CHECK-LABEL: atomicrmw_xchg_i8_aligned_acq_rel: 29; CHECK: swpalb w1, w0, [x0] 30 %r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1 31 ret i8 %r 32} 33 34define dso_local i8 @atomicrmw_xchg_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 35; CHECK-LABEL: atomicrmw_xchg_i8_aligned_seq_cst: 36; CHECK: swpalb w1, w0, [x0] 37 %r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1 38 ret i8 %r 39} 40 41define dso_local i16 @atomicrmw_xchg_i16_aligned_monotonic(ptr %ptr, i16 %value) { 42; CHECK-LABEL: atomicrmw_xchg_i16_aligned_monotonic: 43; CHECK: swph w1, w0, [x0] 44 %r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 2 45 ret i16 %r 46} 47 48define dso_local i16 @atomicrmw_xchg_i16_aligned_acquire(ptr %ptr, i16 %value) { 49; CHECK-LABEL: atomicrmw_xchg_i16_aligned_acquire: 50; CHECK: swpah w1, w0, [x0] 51 %r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 2 52 ret i16 %r 53} 54 55define dso_local i16 @atomicrmw_xchg_i16_aligned_release(ptr %ptr, i16 %value) { 56; CHECK-LABEL: atomicrmw_xchg_i16_aligned_release: 57; CHECK: swplh w1, w0, [x0] 58 %r = atomicrmw xchg ptr %ptr, i16 %value release, align 2 59 ret i16 %r 60} 61 62define dso_local i16 @atomicrmw_xchg_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 63; CHECK-LABEL: atomicrmw_xchg_i16_aligned_acq_rel: 64; CHECK: swpalh w1, w0, [x0] 65 %r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 2 66 ret i16 %r 67} 68 69define dso_local i16 @atomicrmw_xchg_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 70; CHECK-LABEL: atomicrmw_xchg_i16_aligned_seq_cst: 71; CHECK: swpalh w1, w0, [x0] 72 %r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 2 73 ret i16 %r 74} 75 76define dso_local i32 @atomicrmw_xchg_i32_aligned_monotonic(ptr %ptr, i32 %value) { 77; CHECK-LABEL: atomicrmw_xchg_i32_aligned_monotonic: 78; CHECK: swp w1, w0, [x0] 79 %r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 4 80 ret i32 %r 81} 82 83define dso_local i32 @atomicrmw_xchg_i32_aligned_acquire(ptr %ptr, i32 %value) { 84; CHECK-LABEL: atomicrmw_xchg_i32_aligned_acquire: 85; CHECK: swpa w1, w0, [x0] 86 %r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 4 87 ret i32 %r 88} 89 90define dso_local i32 @atomicrmw_xchg_i32_aligned_release(ptr %ptr, i32 %value) { 91; CHECK-LABEL: atomicrmw_xchg_i32_aligned_release: 92; CHECK: swpl w1, w0, [x0] 93 %r = atomicrmw xchg ptr %ptr, i32 %value release, align 4 94 ret i32 %r 95} 96 97define dso_local i32 @atomicrmw_xchg_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 98; CHECK-LABEL: atomicrmw_xchg_i32_aligned_acq_rel: 99; CHECK: swpal w1, w0, [x0] 100 %r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 4 101 ret i32 %r 102} 103 104define dso_local i32 @atomicrmw_xchg_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 105; CHECK-LABEL: atomicrmw_xchg_i32_aligned_seq_cst: 106; CHECK: swpal w1, w0, [x0] 107 %r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 4 108 ret i32 %r 109} 110 111define dso_local i64 @atomicrmw_xchg_i64_aligned_monotonic(ptr %ptr, i64 %value) { 112; CHECK-LABEL: atomicrmw_xchg_i64_aligned_monotonic: 113; CHECK: swp x1, x0, [x0] 114 %r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 8 115 ret i64 %r 116} 117 118define dso_local i64 @atomicrmw_xchg_i64_aligned_acquire(ptr %ptr, i64 %value) { 119; CHECK-LABEL: atomicrmw_xchg_i64_aligned_acquire: 120; CHECK: swpa x1, x0, [x0] 121 %r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 8 122 ret i64 %r 123} 124 125define dso_local i64 @atomicrmw_xchg_i64_aligned_release(ptr %ptr, i64 %value) { 126; CHECK-LABEL: atomicrmw_xchg_i64_aligned_release: 127; CHECK: swpl x1, x0, [x0] 128 %r = atomicrmw xchg ptr %ptr, i64 %value release, align 8 129 ret i64 %r 130} 131 132define dso_local i64 @atomicrmw_xchg_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 133; CHECK-LABEL: atomicrmw_xchg_i64_aligned_acq_rel: 134; CHECK: swpal x1, x0, [x0] 135 %r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 8 136 ret i64 %r 137} 138 139define dso_local i64 @atomicrmw_xchg_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 140; CHECK-LABEL: atomicrmw_xchg_i64_aligned_seq_cst: 141; CHECK: swpal x1, x0, [x0] 142 %r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 8 143 ret i64 %r 144} 145 146define dso_local i128 @atomicrmw_xchg_i128_aligned_monotonic(ptr %ptr, i128 %value) { 147; -O0-LABEL: atomicrmw_xchg_i128_aligned_monotonic: 148; -O0: casp x0, x1, x2, x3, [x8] 149; -O0: eor x8, x10, x8 150; -O0: eor x11, x9, x11 151; -O0: orr x8, x8, x11 152; -O0: subs x8, x8, #0 153; 154; -O1-LABEL: atomicrmw_xchg_i128_aligned_monotonic: 155; -O1: ldp x4, x5, [x0] 156; -O1: casp x4, x5, x2, x3, [x0] 157; -O1: cmp x5, x7 158; -O1: ccmp x4, x6, #0, eq 159 %r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 16 160 ret i128 %r 161} 162 163define dso_local i128 @atomicrmw_xchg_i128_aligned_acquire(ptr %ptr, i128 %value) { 164; -O0-LABEL: atomicrmw_xchg_i128_aligned_acquire: 165; -O0: caspa x0, x1, x2, x3, [x8] 166; -O0: eor x8, x10, x8 167; -O0: eor x11, x9, x11 168; -O0: orr x8, x8, x11 169; -O0: subs x8, x8, #0 170; 171; -O1-LABEL: atomicrmw_xchg_i128_aligned_acquire: 172; -O1: ldp x4, x5, [x0] 173; -O1: caspa x4, x5, x2, x3, [x0] 174; -O1: cmp x5, x7 175; -O1: ccmp x4, x6, #0, eq 176 %r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 16 177 ret i128 %r 178} 179 180define dso_local i128 @atomicrmw_xchg_i128_aligned_release(ptr %ptr, i128 %value) { 181; -O0-LABEL: atomicrmw_xchg_i128_aligned_release: 182; -O0: caspl x0, x1, x2, x3, [x8] 183; -O0: eor x8, x10, x8 184; -O0: eor x11, x9, x11 185; -O0: orr x8, x8, x11 186; -O0: subs x8, x8, #0 187; 188; -O1-LABEL: atomicrmw_xchg_i128_aligned_release: 189; -O1: ldp x4, x5, [x0] 190; -O1: caspl x4, x5, x2, x3, [x0] 191; -O1: cmp x5, x7 192; -O1: ccmp x4, x6, #0, eq 193 %r = atomicrmw xchg ptr %ptr, i128 %value release, align 16 194 ret i128 %r 195} 196 197define dso_local i128 @atomicrmw_xchg_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 198; -O0-LABEL: atomicrmw_xchg_i128_aligned_acq_rel: 199; -O0: caspal x0, x1, x2, x3, [x8] 200; -O0: eor x8, x10, x8 201; -O0: eor x11, x9, x11 202; -O0: orr x8, x8, x11 203; -O0: subs x8, x8, #0 204; 205; -O1-LABEL: atomicrmw_xchg_i128_aligned_acq_rel: 206; -O1: ldp x4, x5, [x0] 207; -O1: caspal x4, x5, x2, x3, [x0] 208; -O1: cmp x5, x7 209; -O1: ccmp x4, x6, #0, eq 210 %r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 16 211 ret i128 %r 212} 213 214define dso_local i128 @atomicrmw_xchg_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 215; -O0-LABEL: atomicrmw_xchg_i128_aligned_seq_cst: 216; -O0: caspal x0, x1, x2, x3, [x8] 217; -O0: eor x8, x10, x8 218; -O0: eor x11, x9, x11 219; -O0: orr x8, x8, x11 220; -O0: subs x8, x8, #0 221; 222; -O1-LABEL: atomicrmw_xchg_i128_aligned_seq_cst: 223; -O1: ldp x4, x5, [x0] 224; -O1: caspal x4, x5, x2, x3, [x0] 225; -O1: cmp x5, x7 226; -O1: ccmp x4, x6, #0, eq 227 %r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 16 228 ret i128 %r 229} 230 231define dso_local i8 @atomicrmw_xchg_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 232; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_monotonic: 233; CHECK: swpb w1, w0, [x0] 234 %r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1 235 ret i8 %r 236} 237 238define dso_local i8 @atomicrmw_xchg_i8_unaligned_acquire(ptr %ptr, i8 %value) { 239; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_acquire: 240; CHECK: swpab w1, w0, [x0] 241 %r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1 242 ret i8 %r 243} 244 245define dso_local i8 @atomicrmw_xchg_i8_unaligned_release(ptr %ptr, i8 %value) { 246; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_release: 247; CHECK: swplb w1, w0, [x0] 248 %r = atomicrmw xchg ptr %ptr, i8 %value release, align 1 249 ret i8 %r 250} 251 252define dso_local i8 @atomicrmw_xchg_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 253; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel: 254; CHECK: swpalb w1, w0, [x0] 255 %r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1 256 ret i8 %r 257} 258 259define dso_local i8 @atomicrmw_xchg_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 260; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst: 261; CHECK: swpalb w1, w0, [x0] 262 %r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1 263 ret i8 %r 264} 265 266define dso_local i16 @atomicrmw_xchg_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 267; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_monotonic: 268; CHECK: bl __atomic_exchange 269 %r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 1 270 ret i16 %r 271} 272 273define dso_local i16 @atomicrmw_xchg_i16_unaligned_acquire(ptr %ptr, i16 %value) { 274; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acquire: 275; CHECK: bl __atomic_exchange 276 %r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 1 277 ret i16 %r 278} 279 280define dso_local i16 @atomicrmw_xchg_i16_unaligned_release(ptr %ptr, i16 %value) { 281; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_release: 282; CHECK: bl __atomic_exchange 283 %r = atomicrmw xchg ptr %ptr, i16 %value release, align 1 284 ret i16 %r 285} 286 287define dso_local i16 @atomicrmw_xchg_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 288; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acq_rel: 289; CHECK: bl __atomic_exchange 290 %r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 1 291 ret i16 %r 292} 293 294define dso_local i16 @atomicrmw_xchg_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 295; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_seq_cst: 296; CHECK: bl __atomic_exchange 297 %r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 1 298 ret i16 %r 299} 300 301define dso_local i32 @atomicrmw_xchg_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 302; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_monotonic: 303; CHECK: bl __atomic_exchange 304 %r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 1 305 ret i32 %r 306} 307 308define dso_local i32 @atomicrmw_xchg_i32_unaligned_acquire(ptr %ptr, i32 %value) { 309; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acquire: 310; CHECK: bl __atomic_exchange 311 %r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 1 312 ret i32 %r 313} 314 315define dso_local i32 @atomicrmw_xchg_i32_unaligned_release(ptr %ptr, i32 %value) { 316; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_release: 317; CHECK: bl __atomic_exchange 318 %r = atomicrmw xchg ptr %ptr, i32 %value release, align 1 319 ret i32 %r 320} 321 322define dso_local i32 @atomicrmw_xchg_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 323; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acq_rel: 324; CHECK: bl __atomic_exchange 325 %r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 1 326 ret i32 %r 327} 328 329define dso_local i32 @atomicrmw_xchg_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 330; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_seq_cst: 331; CHECK: bl __atomic_exchange 332 %r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 1 333 ret i32 %r 334} 335 336define dso_local i64 @atomicrmw_xchg_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 337; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_monotonic: 338; CHECK: bl __atomic_exchange 339 %r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 1 340 ret i64 %r 341} 342 343define dso_local i64 @atomicrmw_xchg_i64_unaligned_acquire(ptr %ptr, i64 %value) { 344; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acquire: 345; CHECK: bl __atomic_exchange 346 %r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 1 347 ret i64 %r 348} 349 350define dso_local i64 @atomicrmw_xchg_i64_unaligned_release(ptr %ptr, i64 %value) { 351; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_release: 352; CHECK: bl __atomic_exchange 353 %r = atomicrmw xchg ptr %ptr, i64 %value release, align 1 354 ret i64 %r 355} 356 357define dso_local i64 @atomicrmw_xchg_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 358; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acq_rel: 359; CHECK: bl __atomic_exchange 360 %r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 1 361 ret i64 %r 362} 363 364define dso_local i64 @atomicrmw_xchg_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 365; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_seq_cst: 366; CHECK: bl __atomic_exchange 367 %r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 1 368 ret i64 %r 369} 370 371define dso_local i128 @atomicrmw_xchg_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 372; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_monotonic: 373; CHECK: bl __atomic_exchange 374 %r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 1 375 ret i128 %r 376} 377 378define dso_local i128 @atomicrmw_xchg_i128_unaligned_acquire(ptr %ptr, i128 %value) { 379; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acquire: 380; CHECK: bl __atomic_exchange 381 %r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 1 382 ret i128 %r 383} 384 385define dso_local i128 @atomicrmw_xchg_i128_unaligned_release(ptr %ptr, i128 %value) { 386; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_release: 387; CHECK: bl __atomic_exchange 388 %r = atomicrmw xchg ptr %ptr, i128 %value release, align 1 389 ret i128 %r 390} 391 392define dso_local i128 @atomicrmw_xchg_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 393; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acq_rel: 394; CHECK: bl __atomic_exchange 395 %r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 1 396 ret i128 %r 397} 398 399define dso_local i128 @atomicrmw_xchg_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 400; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_seq_cst: 401; CHECK: bl __atomic_exchange 402 %r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 1 403 ret i128 %r 404} 405 406define dso_local i8 @atomicrmw_add_i8_aligned_monotonic(ptr %ptr, i8 %value) { 407; CHECK-LABEL: atomicrmw_add_i8_aligned_monotonic: 408; CHECK: ldaddb w1, w0, [x0] 409 %r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1 410 ret i8 %r 411} 412 413define dso_local i8 @atomicrmw_add_i8_aligned_acquire(ptr %ptr, i8 %value) { 414; CHECK-LABEL: atomicrmw_add_i8_aligned_acquire: 415; CHECK: ldaddab w1, w0, [x0] 416 %r = atomicrmw add ptr %ptr, i8 %value acquire, align 1 417 ret i8 %r 418} 419 420define dso_local i8 @atomicrmw_add_i8_aligned_release(ptr %ptr, i8 %value) { 421; CHECK-LABEL: atomicrmw_add_i8_aligned_release: 422; CHECK: ldaddlb w1, w0, [x0] 423 %r = atomicrmw add ptr %ptr, i8 %value release, align 1 424 ret i8 %r 425} 426 427define dso_local i8 @atomicrmw_add_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 428; CHECK-LABEL: atomicrmw_add_i8_aligned_acq_rel: 429; CHECK: ldaddalb w1, w0, [x0] 430 %r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1 431 ret i8 %r 432} 433 434define dso_local i8 @atomicrmw_add_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 435; CHECK-LABEL: atomicrmw_add_i8_aligned_seq_cst: 436; CHECK: ldaddalb w1, w0, [x0] 437 %r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1 438 ret i8 %r 439} 440 441define dso_local i16 @atomicrmw_add_i16_aligned_monotonic(ptr %ptr, i16 %value) { 442; CHECK-LABEL: atomicrmw_add_i16_aligned_monotonic: 443; CHECK: ldaddh w1, w0, [x0] 444 %r = atomicrmw add ptr %ptr, i16 %value monotonic, align 2 445 ret i16 %r 446} 447 448define dso_local i16 @atomicrmw_add_i16_aligned_acquire(ptr %ptr, i16 %value) { 449; CHECK-LABEL: atomicrmw_add_i16_aligned_acquire: 450; CHECK: ldaddah w1, w0, [x0] 451 %r = atomicrmw add ptr %ptr, i16 %value acquire, align 2 452 ret i16 %r 453} 454 455define dso_local i16 @atomicrmw_add_i16_aligned_release(ptr %ptr, i16 %value) { 456; CHECK-LABEL: atomicrmw_add_i16_aligned_release: 457; CHECK: ldaddlh w1, w0, [x0] 458 %r = atomicrmw add ptr %ptr, i16 %value release, align 2 459 ret i16 %r 460} 461 462define dso_local i16 @atomicrmw_add_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 463; CHECK-LABEL: atomicrmw_add_i16_aligned_acq_rel: 464; CHECK: ldaddalh w1, w0, [x0] 465 %r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 2 466 ret i16 %r 467} 468 469define dso_local i16 @atomicrmw_add_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 470; CHECK-LABEL: atomicrmw_add_i16_aligned_seq_cst: 471; CHECK: ldaddalh w1, w0, [x0] 472 %r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 2 473 ret i16 %r 474} 475 476define dso_local i32 @atomicrmw_add_i32_aligned_monotonic(ptr %ptr, i32 %value) { 477; CHECK-LABEL: atomicrmw_add_i32_aligned_monotonic: 478; CHECK: ldadd w1, w0, [x0] 479 %r = atomicrmw add ptr %ptr, i32 %value monotonic, align 4 480 ret i32 %r 481} 482 483define dso_local i32 @atomicrmw_add_i32_aligned_acquire(ptr %ptr, i32 %value) { 484; CHECK-LABEL: atomicrmw_add_i32_aligned_acquire: 485; CHECK: ldadda w1, w0, [x0] 486 %r = atomicrmw add ptr %ptr, i32 %value acquire, align 4 487 ret i32 %r 488} 489 490define dso_local i32 @atomicrmw_add_i32_aligned_release(ptr %ptr, i32 %value) { 491; CHECK-LABEL: atomicrmw_add_i32_aligned_release: 492; CHECK: ldaddl w1, w0, [x0] 493 %r = atomicrmw add ptr %ptr, i32 %value release, align 4 494 ret i32 %r 495} 496 497define dso_local i32 @atomicrmw_add_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 498; CHECK-LABEL: atomicrmw_add_i32_aligned_acq_rel: 499; CHECK: ldaddal w1, w0, [x0] 500 %r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 4 501 ret i32 %r 502} 503 504define dso_local i32 @atomicrmw_add_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 505; CHECK-LABEL: atomicrmw_add_i32_aligned_seq_cst: 506; CHECK: ldaddal w1, w0, [x0] 507 %r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 4 508 ret i32 %r 509} 510 511define dso_local i64 @atomicrmw_add_i64_aligned_monotonic(ptr %ptr, i64 %value) { 512; CHECK-LABEL: atomicrmw_add_i64_aligned_monotonic: 513; CHECK: ldadd x1, x0, [x0] 514 %r = atomicrmw add ptr %ptr, i64 %value monotonic, align 8 515 ret i64 %r 516} 517 518define dso_local i64 @atomicrmw_add_i64_aligned_acquire(ptr %ptr, i64 %value) { 519; CHECK-LABEL: atomicrmw_add_i64_aligned_acquire: 520; CHECK: ldadda x1, x0, [x0] 521 %r = atomicrmw add ptr %ptr, i64 %value acquire, align 8 522 ret i64 %r 523} 524 525define dso_local i64 @atomicrmw_add_i64_aligned_release(ptr %ptr, i64 %value) { 526; CHECK-LABEL: atomicrmw_add_i64_aligned_release: 527; CHECK: ldaddl x1, x0, [x0] 528 %r = atomicrmw add ptr %ptr, i64 %value release, align 8 529 ret i64 %r 530} 531 532define dso_local i64 @atomicrmw_add_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 533; CHECK-LABEL: atomicrmw_add_i64_aligned_acq_rel: 534; CHECK: ldaddal x1, x0, [x0] 535 %r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 8 536 ret i64 %r 537} 538 539define dso_local i64 @atomicrmw_add_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 540; CHECK-LABEL: atomicrmw_add_i64_aligned_seq_cst: 541; CHECK: ldaddal x1, x0, [x0] 542 %r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 8 543 ret i64 %r 544} 545 546define dso_local i128 @atomicrmw_add_i128_aligned_monotonic(ptr %ptr, i128 %value) { 547; -O0-LABEL: atomicrmw_add_i128_aligned_monotonic: 548; -O0: adds x2, x9, x11 549; -O0: subs w11, w11, #1 550; -O0: casp x0, x1, x2, x3, [x8] 551; -O0: eor x8, x10, x8 552; -O0: eor x11, x9, x11 553; -O0: orr x8, x8, x11 554; -O0: subs x8, x8, #0 555; 556; -O1-LABEL: atomicrmw_add_i128_aligned_monotonic: 557; -O1: ldp x4, x5, [x0] 558; -O1: adds x8, x4, x2 559; -O1: casp x4, x5, x8, x9, [x0] 560; -O1: cmp x5, x7 561; -O1: ccmp x4, x6, #0, eq 562 %r = atomicrmw add ptr %ptr, i128 %value monotonic, align 16 563 ret i128 %r 564} 565 566define dso_local i128 @atomicrmw_add_i128_aligned_acquire(ptr %ptr, i128 %value) { 567; -O0-LABEL: atomicrmw_add_i128_aligned_acquire: 568; -O0: adds x2, x9, x11 569; -O0: subs w11, w11, #1 570; -O0: caspa x0, x1, x2, x3, [x8] 571; -O0: eor x8, x10, x8 572; -O0: eor x11, x9, x11 573; -O0: orr x8, x8, x11 574; -O0: subs x8, x8, #0 575; 576; -O1-LABEL: atomicrmw_add_i128_aligned_acquire: 577; -O1: ldp x4, x5, [x0] 578; -O1: adds x8, x4, x2 579; -O1: caspa x4, x5, x8, x9, [x0] 580; -O1: cmp x5, x7 581; -O1: ccmp x4, x6, #0, eq 582 %r = atomicrmw add ptr %ptr, i128 %value acquire, align 16 583 ret i128 %r 584} 585 586define dso_local i128 @atomicrmw_add_i128_aligned_release(ptr %ptr, i128 %value) { 587; -O0-LABEL: atomicrmw_add_i128_aligned_release: 588; -O0: adds x2, x9, x11 589; -O0: subs w11, w11, #1 590; -O0: caspl x0, x1, x2, x3, [x8] 591; -O0: eor x8, x10, x8 592; -O0: eor x11, x9, x11 593; -O0: orr x8, x8, x11 594; -O0: subs x8, x8, #0 595; 596; -O1-LABEL: atomicrmw_add_i128_aligned_release: 597; -O1: ldp x4, x5, [x0] 598; -O1: adds x8, x4, x2 599; -O1: caspl x4, x5, x8, x9, [x0] 600; -O1: cmp x5, x7 601; -O1: ccmp x4, x6, #0, eq 602 %r = atomicrmw add ptr %ptr, i128 %value release, align 16 603 ret i128 %r 604} 605 606define dso_local i128 @atomicrmw_add_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 607; -O0-LABEL: atomicrmw_add_i128_aligned_acq_rel: 608; -O0: adds x2, x9, x11 609; -O0: subs w11, w11, #1 610; -O0: caspal x0, x1, x2, x3, [x8] 611; -O0: eor x8, x10, x8 612; -O0: eor x11, x9, x11 613; -O0: orr x8, x8, x11 614; -O0: subs x8, x8, #0 615; 616; -O1-LABEL: atomicrmw_add_i128_aligned_acq_rel: 617; -O1: ldp x4, x5, [x0] 618; -O1: adds x8, x4, x2 619; -O1: caspal x4, x5, x8, x9, [x0] 620; -O1: cmp x5, x7 621; -O1: ccmp x4, x6, #0, eq 622 %r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 16 623 ret i128 %r 624} 625 626define dso_local i128 @atomicrmw_add_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 627; -O0-LABEL: atomicrmw_add_i128_aligned_seq_cst: 628; -O0: adds x2, x9, x11 629; -O0: subs w11, w11, #1 630; -O0: caspal x0, x1, x2, x3, [x8] 631; -O0: eor x8, x10, x8 632; -O0: eor x11, x9, x11 633; -O0: orr x8, x8, x11 634; -O0: subs x8, x8, #0 635; 636; -O1-LABEL: atomicrmw_add_i128_aligned_seq_cst: 637; -O1: ldp x4, x5, [x0] 638; -O1: adds x8, x4, x2 639; -O1: caspal x4, x5, x8, x9, [x0] 640; -O1: cmp x5, x7 641; -O1: ccmp x4, x6, #0, eq 642 %r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 16 643 ret i128 %r 644} 645 646define dso_local i8 @atomicrmw_add_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 647; CHECK-LABEL: atomicrmw_add_i8_unaligned_monotonic: 648; CHECK: ldaddb w1, w0, [x0] 649 %r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1 650 ret i8 %r 651} 652 653define dso_local i8 @atomicrmw_add_i8_unaligned_acquire(ptr %ptr, i8 %value) { 654; CHECK-LABEL: atomicrmw_add_i8_unaligned_acquire: 655; CHECK: ldaddab w1, w0, [x0] 656 %r = atomicrmw add ptr %ptr, i8 %value acquire, align 1 657 ret i8 %r 658} 659 660define dso_local i8 @atomicrmw_add_i8_unaligned_release(ptr %ptr, i8 %value) { 661; CHECK-LABEL: atomicrmw_add_i8_unaligned_release: 662; CHECK: ldaddlb w1, w0, [x0] 663 %r = atomicrmw add ptr %ptr, i8 %value release, align 1 664 ret i8 %r 665} 666 667define dso_local i8 @atomicrmw_add_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 668; CHECK-LABEL: atomicrmw_add_i8_unaligned_acq_rel: 669; CHECK: ldaddalb w1, w0, [x0] 670 %r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1 671 ret i8 %r 672} 673 674define dso_local i8 @atomicrmw_add_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 675; CHECK-LABEL: atomicrmw_add_i8_unaligned_seq_cst: 676; CHECK: ldaddalb w1, w0, [x0] 677 %r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1 678 ret i8 %r 679} 680 681define dso_local i16 @atomicrmw_add_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 682; -O0-LABEL: atomicrmw_add_i16_unaligned_monotonic: 683; -O0: add w8, w8, w9, uxth 684; -O0: bl __atomic_compare_exchange 685; 686; -O1-LABEL: atomicrmw_add_i16_unaligned_monotonic: 687; -O1: add w8, w0, w20 688; -O1: bl __atomic_compare_exchange 689 %r = atomicrmw add ptr %ptr, i16 %value monotonic, align 1 690 ret i16 %r 691} 692 693define dso_local i16 @atomicrmw_add_i16_unaligned_acquire(ptr %ptr, i16 %value) { 694; -O0-LABEL: atomicrmw_add_i16_unaligned_acquire: 695; -O0: add w8, w8, w9, uxth 696; -O0: bl __atomic_compare_exchange 697; 698; -O1-LABEL: atomicrmw_add_i16_unaligned_acquire: 699; -O1: add w8, w0, w20 700; -O1: bl __atomic_compare_exchange 701 %r = atomicrmw add ptr %ptr, i16 %value acquire, align 1 702 ret i16 %r 703} 704 705define dso_local i16 @atomicrmw_add_i16_unaligned_release(ptr %ptr, i16 %value) { 706; -O0-LABEL: atomicrmw_add_i16_unaligned_release: 707; -O0: add w8, w8, w9, uxth 708; -O0: bl __atomic_compare_exchange 709; 710; -O1-LABEL: atomicrmw_add_i16_unaligned_release: 711; -O1: add w8, w0, w20 712; -O1: bl __atomic_compare_exchange 713 %r = atomicrmw add ptr %ptr, i16 %value release, align 1 714 ret i16 %r 715} 716 717define dso_local i16 @atomicrmw_add_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 718; -O0-LABEL: atomicrmw_add_i16_unaligned_acq_rel: 719; -O0: add w8, w8, w9, uxth 720; -O0: bl __atomic_compare_exchange 721; 722; -O1-LABEL: atomicrmw_add_i16_unaligned_acq_rel: 723; -O1: add w8, w0, w20 724; -O1: bl __atomic_compare_exchange 725 %r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 1 726 ret i16 %r 727} 728 729define dso_local i16 @atomicrmw_add_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 730; -O0-LABEL: atomicrmw_add_i16_unaligned_seq_cst: 731; -O0: add w8, w8, w9, uxth 732; -O0: bl __atomic_compare_exchange 733; 734; -O1-LABEL: atomicrmw_add_i16_unaligned_seq_cst: 735; -O1: add w8, w0, w20 736; -O1: bl __atomic_compare_exchange 737 %r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 1 738 ret i16 %r 739} 740 741define dso_local i32 @atomicrmw_add_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 742; -O0-LABEL: atomicrmw_add_i32_unaligned_monotonic: 743; -O0: add w8, w9, w8 744; -O0: bl __atomic_compare_exchange 745; 746; -O1-LABEL: atomicrmw_add_i32_unaligned_monotonic: 747; -O1: add w8, w0, w20 748; -O1: bl __atomic_compare_exchange 749 %r = atomicrmw add ptr %ptr, i32 %value monotonic, align 1 750 ret i32 %r 751} 752 753define dso_local i32 @atomicrmw_add_i32_unaligned_acquire(ptr %ptr, i32 %value) { 754; -O0-LABEL: atomicrmw_add_i32_unaligned_acquire: 755; -O0: add w8, w9, w8 756; -O0: bl __atomic_compare_exchange 757; 758; -O1-LABEL: atomicrmw_add_i32_unaligned_acquire: 759; -O1: add w8, w0, w20 760; -O1: bl __atomic_compare_exchange 761 %r = atomicrmw add ptr %ptr, i32 %value acquire, align 1 762 ret i32 %r 763} 764 765define dso_local i32 @atomicrmw_add_i32_unaligned_release(ptr %ptr, i32 %value) { 766; -O0-LABEL: atomicrmw_add_i32_unaligned_release: 767; -O0: add w8, w9, w8 768; -O0: bl __atomic_compare_exchange 769; 770; -O1-LABEL: atomicrmw_add_i32_unaligned_release: 771; -O1: add w8, w0, w20 772; -O1: bl __atomic_compare_exchange 773 %r = atomicrmw add ptr %ptr, i32 %value release, align 1 774 ret i32 %r 775} 776 777define dso_local i32 @atomicrmw_add_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 778; -O0-LABEL: atomicrmw_add_i32_unaligned_acq_rel: 779; -O0: add w8, w9, w8 780; -O0: bl __atomic_compare_exchange 781; 782; -O1-LABEL: atomicrmw_add_i32_unaligned_acq_rel: 783; -O1: add w8, w0, w20 784; -O1: bl __atomic_compare_exchange 785 %r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 1 786 ret i32 %r 787} 788 789define dso_local i32 @atomicrmw_add_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 790; -O0-LABEL: atomicrmw_add_i32_unaligned_seq_cst: 791; -O0: add w8, w9, w8 792; -O0: bl __atomic_compare_exchange 793; 794; -O1-LABEL: atomicrmw_add_i32_unaligned_seq_cst: 795; -O1: add w8, w0, w20 796; -O1: bl __atomic_compare_exchange 797 %r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 1 798 ret i32 %r 799} 800 801define dso_local i64 @atomicrmw_add_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 802; -O0-LABEL: atomicrmw_add_i64_unaligned_monotonic: 803; -O0: add x8, x9, x8 804; -O0: bl __atomic_compare_exchange 805; 806; -O1-LABEL: atomicrmw_add_i64_unaligned_monotonic: 807; -O1: add x8, x0, x20 808; -O1: bl __atomic_compare_exchange 809 %r = atomicrmw add ptr %ptr, i64 %value monotonic, align 1 810 ret i64 %r 811} 812 813define dso_local i64 @atomicrmw_add_i64_unaligned_acquire(ptr %ptr, i64 %value) { 814; -O0-LABEL: atomicrmw_add_i64_unaligned_acquire: 815; -O0: add x8, x9, x8 816; -O0: bl __atomic_compare_exchange 817; 818; -O1-LABEL: atomicrmw_add_i64_unaligned_acquire: 819; -O1: add x8, x0, x20 820; -O1: bl __atomic_compare_exchange 821 %r = atomicrmw add ptr %ptr, i64 %value acquire, align 1 822 ret i64 %r 823} 824 825define dso_local i64 @atomicrmw_add_i64_unaligned_release(ptr %ptr, i64 %value) { 826; -O0-LABEL: atomicrmw_add_i64_unaligned_release: 827; -O0: add x8, x9, x8 828; -O0: bl __atomic_compare_exchange 829; 830; -O1-LABEL: atomicrmw_add_i64_unaligned_release: 831; -O1: add x8, x0, x20 832; -O1: bl __atomic_compare_exchange 833 %r = atomicrmw add ptr %ptr, i64 %value release, align 1 834 ret i64 %r 835} 836 837define dso_local i64 @atomicrmw_add_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 838; -O0-LABEL: atomicrmw_add_i64_unaligned_acq_rel: 839; -O0: add x8, x9, x8 840; -O0: bl __atomic_compare_exchange 841; 842; -O1-LABEL: atomicrmw_add_i64_unaligned_acq_rel: 843; -O1: add x8, x0, x20 844; -O1: bl __atomic_compare_exchange 845 %r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 1 846 ret i64 %r 847} 848 849define dso_local i64 @atomicrmw_add_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 850; -O0-LABEL: atomicrmw_add_i64_unaligned_seq_cst: 851; -O0: add x8, x9, x8 852; -O0: bl __atomic_compare_exchange 853; 854; -O1-LABEL: atomicrmw_add_i64_unaligned_seq_cst: 855; -O1: add x8, x0, x20 856; -O1: bl __atomic_compare_exchange 857 %r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 1 858 ret i64 %r 859} 860 861define dso_local i128 @atomicrmw_add_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 862; -O0-LABEL: atomicrmw_add_i128_unaligned_monotonic: 863; -O0: adds x9, x8, x9 864; -O0: subs w11, w11, #1 865; -O0: bl __atomic_compare_exchange 866; 867; -O1-LABEL: atomicrmw_add_i128_unaligned_monotonic: 868; -O1: ldp x0, x1, [x0] 869; -O1: adds x8, x0, x21 870; -O1: bl __atomic_compare_exchange 871 %r = atomicrmw add ptr %ptr, i128 %value monotonic, align 1 872 ret i128 %r 873} 874 875define dso_local i128 @atomicrmw_add_i128_unaligned_acquire(ptr %ptr, i128 %value) { 876; -O0-LABEL: atomicrmw_add_i128_unaligned_acquire: 877; -O0: adds x9, x8, x9 878; -O0: subs w11, w11, #1 879; -O0: bl __atomic_compare_exchange 880; 881; -O1-LABEL: atomicrmw_add_i128_unaligned_acquire: 882; -O1: ldp x0, x1, [x0] 883; -O1: adds x8, x0, x21 884; -O1: bl __atomic_compare_exchange 885 %r = atomicrmw add ptr %ptr, i128 %value acquire, align 1 886 ret i128 %r 887} 888 889define dso_local i128 @atomicrmw_add_i128_unaligned_release(ptr %ptr, i128 %value) { 890; -O0-LABEL: atomicrmw_add_i128_unaligned_release: 891; -O0: adds x9, x8, x9 892; -O0: subs w11, w11, #1 893; -O0: bl __atomic_compare_exchange 894; 895; -O1-LABEL: atomicrmw_add_i128_unaligned_release: 896; -O1: ldp x0, x1, [x0] 897; -O1: adds x8, x0, x21 898; -O1: bl __atomic_compare_exchange 899 %r = atomicrmw add ptr %ptr, i128 %value release, align 1 900 ret i128 %r 901} 902 903define dso_local i128 @atomicrmw_add_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 904; -O0-LABEL: atomicrmw_add_i128_unaligned_acq_rel: 905; -O0: adds x9, x8, x9 906; -O0: subs w11, w11, #1 907; -O0: bl __atomic_compare_exchange 908; 909; -O1-LABEL: atomicrmw_add_i128_unaligned_acq_rel: 910; -O1: ldp x0, x1, [x0] 911; -O1: adds x8, x0, x21 912; -O1: bl __atomic_compare_exchange 913 %r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 1 914 ret i128 %r 915} 916 917define dso_local i128 @atomicrmw_add_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 918; -O0-LABEL: atomicrmw_add_i128_unaligned_seq_cst: 919; -O0: adds x9, x8, x9 920; -O0: subs w11, w11, #1 921; -O0: bl __atomic_compare_exchange 922; 923; -O1-LABEL: atomicrmw_add_i128_unaligned_seq_cst: 924; -O1: ldp x0, x1, [x0] 925; -O1: adds x8, x0, x21 926; -O1: bl __atomic_compare_exchange 927 %r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 1 928 ret i128 %r 929} 930 931define dso_local i8 @atomicrmw_sub_i8_aligned_monotonic(ptr %ptr, i8 %value) { 932; CHECK-LABEL: atomicrmw_sub_i8_aligned_monotonic: 933; CHECK: ldaddb w8, w0, [x0] 934 %r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1 935 ret i8 %r 936} 937 938define dso_local i8 @atomicrmw_sub_i8_aligned_acquire(ptr %ptr, i8 %value) { 939; CHECK-LABEL: atomicrmw_sub_i8_aligned_acquire: 940; CHECK: ldaddab w8, w0, [x0] 941 %r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1 942 ret i8 %r 943} 944 945define dso_local i8 @atomicrmw_sub_i8_aligned_release(ptr %ptr, i8 %value) { 946; CHECK-LABEL: atomicrmw_sub_i8_aligned_release: 947; CHECK: ldaddlb w8, w0, [x0] 948 %r = atomicrmw sub ptr %ptr, i8 %value release, align 1 949 ret i8 %r 950} 951 952define dso_local i8 @atomicrmw_sub_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 953; CHECK-LABEL: atomicrmw_sub_i8_aligned_acq_rel: 954; CHECK: ldaddalb w8, w0, [x0] 955 %r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1 956 ret i8 %r 957} 958 959define dso_local i8 @atomicrmw_sub_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 960; CHECK-LABEL: atomicrmw_sub_i8_aligned_seq_cst: 961; CHECK: ldaddalb w8, w0, [x0] 962 %r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1 963 ret i8 %r 964} 965 966define dso_local i16 @atomicrmw_sub_i16_aligned_monotonic(ptr %ptr, i16 %value) { 967; CHECK-LABEL: atomicrmw_sub_i16_aligned_monotonic: 968; CHECK: ldaddh w8, w0, [x0] 969 %r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 2 970 ret i16 %r 971} 972 973define dso_local i16 @atomicrmw_sub_i16_aligned_acquire(ptr %ptr, i16 %value) { 974; CHECK-LABEL: atomicrmw_sub_i16_aligned_acquire: 975; CHECK: ldaddah w8, w0, [x0] 976 %r = atomicrmw sub ptr %ptr, i16 %value acquire, align 2 977 ret i16 %r 978} 979 980define dso_local i16 @atomicrmw_sub_i16_aligned_release(ptr %ptr, i16 %value) { 981; CHECK-LABEL: atomicrmw_sub_i16_aligned_release: 982; CHECK: ldaddlh w8, w0, [x0] 983 %r = atomicrmw sub ptr %ptr, i16 %value release, align 2 984 ret i16 %r 985} 986 987define dso_local i16 @atomicrmw_sub_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 988; CHECK-LABEL: atomicrmw_sub_i16_aligned_acq_rel: 989; CHECK: ldaddalh w8, w0, [x0] 990 %r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 2 991 ret i16 %r 992} 993 994define dso_local i16 @atomicrmw_sub_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 995; CHECK-LABEL: atomicrmw_sub_i16_aligned_seq_cst: 996; CHECK: ldaddalh w8, w0, [x0] 997 %r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 2 998 ret i16 %r 999} 1000 1001define dso_local i32 @atomicrmw_sub_i32_aligned_monotonic(ptr %ptr, i32 %value) { 1002; CHECK-LABEL: atomicrmw_sub_i32_aligned_monotonic: 1003; CHECK: ldadd w8, w0, [x0] 1004 %r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 4 1005 ret i32 %r 1006} 1007 1008define dso_local i32 @atomicrmw_sub_i32_aligned_acquire(ptr %ptr, i32 %value) { 1009; CHECK-LABEL: atomicrmw_sub_i32_aligned_acquire: 1010; CHECK: ldadda w8, w0, [x0] 1011 %r = atomicrmw sub ptr %ptr, i32 %value acquire, align 4 1012 ret i32 %r 1013} 1014 1015define dso_local i32 @atomicrmw_sub_i32_aligned_release(ptr %ptr, i32 %value) { 1016; CHECK-LABEL: atomicrmw_sub_i32_aligned_release: 1017; CHECK: ldaddl w8, w0, [x0] 1018 %r = atomicrmw sub ptr %ptr, i32 %value release, align 4 1019 ret i32 %r 1020} 1021 1022define dso_local i32 @atomicrmw_sub_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 1023; CHECK-LABEL: atomicrmw_sub_i32_aligned_acq_rel: 1024; CHECK: ldaddal w8, w0, [x0] 1025 %r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 4 1026 ret i32 %r 1027} 1028 1029define dso_local i32 @atomicrmw_sub_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 1030; CHECK-LABEL: atomicrmw_sub_i32_aligned_seq_cst: 1031; CHECK: ldaddal w8, w0, [x0] 1032 %r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 4 1033 ret i32 %r 1034} 1035 1036define dso_local i64 @atomicrmw_sub_i64_aligned_monotonic(ptr %ptr, i64 %value) { 1037; CHECK-LABEL: atomicrmw_sub_i64_aligned_monotonic: 1038; CHECK: ldadd x8, x0, [x0] 1039 %r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 8 1040 ret i64 %r 1041} 1042 1043define dso_local i64 @atomicrmw_sub_i64_aligned_acquire(ptr %ptr, i64 %value) { 1044; CHECK-LABEL: atomicrmw_sub_i64_aligned_acquire: 1045; CHECK: ldadda x8, x0, [x0] 1046 %r = atomicrmw sub ptr %ptr, i64 %value acquire, align 8 1047 ret i64 %r 1048} 1049 1050define dso_local i64 @atomicrmw_sub_i64_aligned_release(ptr %ptr, i64 %value) { 1051; CHECK-LABEL: atomicrmw_sub_i64_aligned_release: 1052; CHECK: ldaddl x8, x0, [x0] 1053 %r = atomicrmw sub ptr %ptr, i64 %value release, align 8 1054 ret i64 %r 1055} 1056 1057define dso_local i64 @atomicrmw_sub_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 1058; CHECK-LABEL: atomicrmw_sub_i64_aligned_acq_rel: 1059; CHECK: ldaddal x8, x0, [x0] 1060 %r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 8 1061 ret i64 %r 1062} 1063 1064define dso_local i64 @atomicrmw_sub_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 1065; CHECK-LABEL: atomicrmw_sub_i64_aligned_seq_cst: 1066; CHECK: ldaddal x8, x0, [x0] 1067 %r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 8 1068 ret i64 %r 1069} 1070 1071define dso_local i128 @atomicrmw_sub_i128_aligned_monotonic(ptr %ptr, i128 %value) { 1072; -O0-LABEL: atomicrmw_sub_i128_aligned_monotonic: 1073; -O0: subs x2, x9, x11 1074; -O0: casp x0, x1, x2, x3, [x8] 1075; -O0: eor x8, x10, x8 1076; -O0: eor x11, x9, x11 1077; -O0: orr x8, x8, x11 1078; -O0: subs x8, x8, #0 1079; 1080; -O1-LABEL: atomicrmw_sub_i128_aligned_monotonic: 1081; -O1: ldp x4, x5, [x0] 1082; -O1: subs x8, x4, x2 1083; -O1: casp x4, x5, x8, x9, [x0] 1084; -O1: cmp x5, x7 1085; -O1: ccmp x4, x6, #0, eq 1086 %r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 16 1087 ret i128 %r 1088} 1089 1090define dso_local i128 @atomicrmw_sub_i128_aligned_acquire(ptr %ptr, i128 %value) { 1091; -O0-LABEL: atomicrmw_sub_i128_aligned_acquire: 1092; -O0: subs x2, x9, x11 1093; -O0: caspa x0, x1, x2, x3, [x8] 1094; -O0: eor x8, x10, x8 1095; -O0: eor x11, x9, x11 1096; -O0: orr x8, x8, x11 1097; -O0: subs x8, x8, #0 1098; 1099; -O1-LABEL: atomicrmw_sub_i128_aligned_acquire: 1100; -O1: ldp x4, x5, [x0] 1101; -O1: subs x8, x4, x2 1102; -O1: caspa x4, x5, x8, x9, [x0] 1103; -O1: cmp x5, x7 1104; -O1: ccmp x4, x6, #0, eq 1105 %r = atomicrmw sub ptr %ptr, i128 %value acquire, align 16 1106 ret i128 %r 1107} 1108 1109define dso_local i128 @atomicrmw_sub_i128_aligned_release(ptr %ptr, i128 %value) { 1110; -O0-LABEL: atomicrmw_sub_i128_aligned_release: 1111; -O0: subs x2, x9, x11 1112; -O0: caspl x0, x1, x2, x3, [x8] 1113; -O0: eor x8, x10, x8 1114; -O0: eor x11, x9, x11 1115; -O0: orr x8, x8, x11 1116; -O0: subs x8, x8, #0 1117; 1118; -O1-LABEL: atomicrmw_sub_i128_aligned_release: 1119; -O1: ldp x4, x5, [x0] 1120; -O1: subs x8, x4, x2 1121; -O1: caspl x4, x5, x8, x9, [x0] 1122; -O1: cmp x5, x7 1123; -O1: ccmp x4, x6, #0, eq 1124 %r = atomicrmw sub ptr %ptr, i128 %value release, align 16 1125 ret i128 %r 1126} 1127 1128define dso_local i128 @atomicrmw_sub_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 1129; -O0-LABEL: atomicrmw_sub_i128_aligned_acq_rel: 1130; -O0: subs x2, x9, x11 1131; -O0: caspal x0, x1, x2, x3, [x8] 1132; -O0: eor x8, x10, x8 1133; -O0: eor x11, x9, x11 1134; -O0: orr x8, x8, x11 1135; -O0: subs x8, x8, #0 1136; 1137; -O1-LABEL: atomicrmw_sub_i128_aligned_acq_rel: 1138; -O1: ldp x4, x5, [x0] 1139; -O1: subs x8, x4, x2 1140; -O1: caspal x4, x5, x8, x9, [x0] 1141; -O1: cmp x5, x7 1142; -O1: ccmp x4, x6, #0, eq 1143 %r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 16 1144 ret i128 %r 1145} 1146 1147define dso_local i128 @atomicrmw_sub_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 1148; -O0-LABEL: atomicrmw_sub_i128_aligned_seq_cst: 1149; -O0: subs x2, x9, x11 1150; -O0: caspal x0, x1, x2, x3, [x8] 1151; -O0: eor x8, x10, x8 1152; -O0: eor x11, x9, x11 1153; -O0: orr x8, x8, x11 1154; -O0: subs x8, x8, #0 1155; 1156; -O1-LABEL: atomicrmw_sub_i128_aligned_seq_cst: 1157; -O1: ldp x4, x5, [x0] 1158; -O1: subs x8, x4, x2 1159; -O1: caspal x4, x5, x8, x9, [x0] 1160; -O1: cmp x5, x7 1161; -O1: ccmp x4, x6, #0, eq 1162 %r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 16 1163 ret i128 %r 1164} 1165 1166define dso_local i8 @atomicrmw_sub_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 1167; CHECK-LABEL: atomicrmw_sub_i8_unaligned_monotonic: 1168; CHECK: ldaddb w8, w0, [x0] 1169 %r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1 1170 ret i8 %r 1171} 1172 1173define dso_local i8 @atomicrmw_sub_i8_unaligned_acquire(ptr %ptr, i8 %value) { 1174; CHECK-LABEL: atomicrmw_sub_i8_unaligned_acquire: 1175; CHECK: ldaddab w8, w0, [x0] 1176 %r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1 1177 ret i8 %r 1178} 1179 1180define dso_local i8 @atomicrmw_sub_i8_unaligned_release(ptr %ptr, i8 %value) { 1181; CHECK-LABEL: atomicrmw_sub_i8_unaligned_release: 1182; CHECK: ldaddlb w8, w0, [x0] 1183 %r = atomicrmw sub ptr %ptr, i8 %value release, align 1 1184 ret i8 %r 1185} 1186 1187define dso_local i8 @atomicrmw_sub_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 1188; CHECK-LABEL: atomicrmw_sub_i8_unaligned_acq_rel: 1189; CHECK: ldaddalb w8, w0, [x0] 1190 %r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1 1191 ret i8 %r 1192} 1193 1194define dso_local i8 @atomicrmw_sub_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 1195; CHECK-LABEL: atomicrmw_sub_i8_unaligned_seq_cst: 1196; CHECK: ldaddalb w8, w0, [x0] 1197 %r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1 1198 ret i8 %r 1199} 1200 1201define dso_local i16 @atomicrmw_sub_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 1202; -O0-LABEL: atomicrmw_sub_i16_unaligned_monotonic: 1203; -O0: subs w8, w9, w8 1204; -O0: bl __atomic_compare_exchange 1205; 1206; -O1-LABEL: atomicrmw_sub_i16_unaligned_monotonic: 1207; -O1: sub w8, w0, w20 1208; -O1: bl __atomic_compare_exchange 1209 %r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 1 1210 ret i16 %r 1211} 1212 1213define dso_local i16 @atomicrmw_sub_i16_unaligned_acquire(ptr %ptr, i16 %value) { 1214; -O0-LABEL: atomicrmw_sub_i16_unaligned_acquire: 1215; -O0: subs w8, w9, w8 1216; -O0: bl __atomic_compare_exchange 1217; 1218; -O1-LABEL: atomicrmw_sub_i16_unaligned_acquire: 1219; -O1: sub w8, w0, w20 1220; -O1: bl __atomic_compare_exchange 1221 %r = atomicrmw sub ptr %ptr, i16 %value acquire, align 1 1222 ret i16 %r 1223} 1224 1225define dso_local i16 @atomicrmw_sub_i16_unaligned_release(ptr %ptr, i16 %value) { 1226; -O0-LABEL: atomicrmw_sub_i16_unaligned_release: 1227; -O0: subs w8, w9, w8 1228; -O0: bl __atomic_compare_exchange 1229; 1230; -O1-LABEL: atomicrmw_sub_i16_unaligned_release: 1231; -O1: sub w8, w0, w20 1232; -O1: bl __atomic_compare_exchange 1233 %r = atomicrmw sub ptr %ptr, i16 %value release, align 1 1234 ret i16 %r 1235} 1236 1237define dso_local i16 @atomicrmw_sub_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 1238; -O0-LABEL: atomicrmw_sub_i16_unaligned_acq_rel: 1239; -O0: subs w8, w9, w8 1240; -O0: bl __atomic_compare_exchange 1241; 1242; -O1-LABEL: atomicrmw_sub_i16_unaligned_acq_rel: 1243; -O1: sub w8, w0, w20 1244; -O1: bl __atomic_compare_exchange 1245 %r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 1 1246 ret i16 %r 1247} 1248 1249define dso_local i16 @atomicrmw_sub_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 1250; -O0-LABEL: atomicrmw_sub_i16_unaligned_seq_cst: 1251; -O0: subs w8, w9, w8 1252; -O0: bl __atomic_compare_exchange 1253; 1254; -O1-LABEL: atomicrmw_sub_i16_unaligned_seq_cst: 1255; -O1: sub w8, w0, w20 1256; -O1: bl __atomic_compare_exchange 1257 %r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 1 1258 ret i16 %r 1259} 1260 1261define dso_local i32 @atomicrmw_sub_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 1262; -O0-LABEL: atomicrmw_sub_i32_unaligned_monotonic: 1263; -O0: subs w8, w9, w8 1264; -O0: bl __atomic_compare_exchange 1265; 1266; -O1-LABEL: atomicrmw_sub_i32_unaligned_monotonic: 1267; -O1: sub w8, w0, w20 1268; -O1: bl __atomic_compare_exchange 1269 %r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 1 1270 ret i32 %r 1271} 1272 1273define dso_local i32 @atomicrmw_sub_i32_unaligned_acquire(ptr %ptr, i32 %value) { 1274; -O0-LABEL: atomicrmw_sub_i32_unaligned_acquire: 1275; -O0: subs w8, w9, w8 1276; -O0: bl __atomic_compare_exchange 1277; 1278; -O1-LABEL: atomicrmw_sub_i32_unaligned_acquire: 1279; -O1: sub w8, w0, w20 1280; -O1: bl __atomic_compare_exchange 1281 %r = atomicrmw sub ptr %ptr, i32 %value acquire, align 1 1282 ret i32 %r 1283} 1284 1285define dso_local i32 @atomicrmw_sub_i32_unaligned_release(ptr %ptr, i32 %value) { 1286; -O0-LABEL: atomicrmw_sub_i32_unaligned_release: 1287; -O0: subs w8, w9, w8 1288; -O0: bl __atomic_compare_exchange 1289; 1290; -O1-LABEL: atomicrmw_sub_i32_unaligned_release: 1291; -O1: sub w8, w0, w20 1292; -O1: bl __atomic_compare_exchange 1293 %r = atomicrmw sub ptr %ptr, i32 %value release, align 1 1294 ret i32 %r 1295} 1296 1297define dso_local i32 @atomicrmw_sub_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 1298; -O0-LABEL: atomicrmw_sub_i32_unaligned_acq_rel: 1299; -O0: subs w8, w9, w8 1300; -O0: bl __atomic_compare_exchange 1301; 1302; -O1-LABEL: atomicrmw_sub_i32_unaligned_acq_rel: 1303; -O1: sub w8, w0, w20 1304; -O1: bl __atomic_compare_exchange 1305 %r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 1 1306 ret i32 %r 1307} 1308 1309define dso_local i32 @atomicrmw_sub_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 1310; -O0-LABEL: atomicrmw_sub_i32_unaligned_seq_cst: 1311; -O0: subs w8, w9, w8 1312; -O0: bl __atomic_compare_exchange 1313; 1314; -O1-LABEL: atomicrmw_sub_i32_unaligned_seq_cst: 1315; -O1: sub w8, w0, w20 1316; -O1: bl __atomic_compare_exchange 1317 %r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 1 1318 ret i32 %r 1319} 1320 1321define dso_local i64 @atomicrmw_sub_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 1322; -O0-LABEL: atomicrmw_sub_i64_unaligned_monotonic: 1323; -O0: subs x8, x9, x8 1324; -O0: bl __atomic_compare_exchange 1325; 1326; -O1-LABEL: atomicrmw_sub_i64_unaligned_monotonic: 1327; -O1: sub x8, x0, x20 1328; -O1: bl __atomic_compare_exchange 1329 %r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 1 1330 ret i64 %r 1331} 1332 1333define dso_local i64 @atomicrmw_sub_i64_unaligned_acquire(ptr %ptr, i64 %value) { 1334; -O0-LABEL: atomicrmw_sub_i64_unaligned_acquire: 1335; -O0: subs x8, x9, x8 1336; -O0: bl __atomic_compare_exchange 1337; 1338; -O1-LABEL: atomicrmw_sub_i64_unaligned_acquire: 1339; -O1: sub x8, x0, x20 1340; -O1: bl __atomic_compare_exchange 1341 %r = atomicrmw sub ptr %ptr, i64 %value acquire, align 1 1342 ret i64 %r 1343} 1344 1345define dso_local i64 @atomicrmw_sub_i64_unaligned_release(ptr %ptr, i64 %value) { 1346; -O0-LABEL: atomicrmw_sub_i64_unaligned_release: 1347; -O0: subs x8, x9, x8 1348; -O0: bl __atomic_compare_exchange 1349; 1350; -O1-LABEL: atomicrmw_sub_i64_unaligned_release: 1351; -O1: sub x8, x0, x20 1352; -O1: bl __atomic_compare_exchange 1353 %r = atomicrmw sub ptr %ptr, i64 %value release, align 1 1354 ret i64 %r 1355} 1356 1357define dso_local i64 @atomicrmw_sub_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 1358; -O0-LABEL: atomicrmw_sub_i64_unaligned_acq_rel: 1359; -O0: subs x8, x9, x8 1360; -O0: bl __atomic_compare_exchange 1361; 1362; -O1-LABEL: atomicrmw_sub_i64_unaligned_acq_rel: 1363; -O1: sub x8, x0, x20 1364; -O1: bl __atomic_compare_exchange 1365 %r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 1 1366 ret i64 %r 1367} 1368 1369define dso_local i64 @atomicrmw_sub_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 1370; -O0-LABEL: atomicrmw_sub_i64_unaligned_seq_cst: 1371; -O0: subs x8, x9, x8 1372; -O0: bl __atomic_compare_exchange 1373; 1374; -O1-LABEL: atomicrmw_sub_i64_unaligned_seq_cst: 1375; -O1: sub x8, x0, x20 1376; -O1: bl __atomic_compare_exchange 1377 %r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 1 1378 ret i64 %r 1379} 1380 1381define dso_local i128 @atomicrmw_sub_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 1382; -O0-LABEL: atomicrmw_sub_i128_unaligned_monotonic: 1383; -O0: subs x9, x8, x9 1384; -O0: bl __atomic_compare_exchange 1385; 1386; -O1-LABEL: atomicrmw_sub_i128_unaligned_monotonic: 1387; -O1: ldp x0, x1, [x0] 1388; -O1: subs x8, x0, x21 1389; -O1: bl __atomic_compare_exchange 1390 %r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 1 1391 ret i128 %r 1392} 1393 1394define dso_local i128 @atomicrmw_sub_i128_unaligned_acquire(ptr %ptr, i128 %value) { 1395; -O0-LABEL: atomicrmw_sub_i128_unaligned_acquire: 1396; -O0: subs x9, x8, x9 1397; -O0: bl __atomic_compare_exchange 1398; 1399; -O1-LABEL: atomicrmw_sub_i128_unaligned_acquire: 1400; -O1: ldp x0, x1, [x0] 1401; -O1: subs x8, x0, x21 1402; -O1: bl __atomic_compare_exchange 1403 %r = atomicrmw sub ptr %ptr, i128 %value acquire, align 1 1404 ret i128 %r 1405} 1406 1407define dso_local i128 @atomicrmw_sub_i128_unaligned_release(ptr %ptr, i128 %value) { 1408; -O0-LABEL: atomicrmw_sub_i128_unaligned_release: 1409; -O0: subs x9, x8, x9 1410; -O0: bl __atomic_compare_exchange 1411; 1412; -O1-LABEL: atomicrmw_sub_i128_unaligned_release: 1413; -O1: ldp x0, x1, [x0] 1414; -O1: subs x8, x0, x21 1415; -O1: bl __atomic_compare_exchange 1416 %r = atomicrmw sub ptr %ptr, i128 %value release, align 1 1417 ret i128 %r 1418} 1419 1420define dso_local i128 @atomicrmw_sub_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 1421; -O0-LABEL: atomicrmw_sub_i128_unaligned_acq_rel: 1422; -O0: subs x9, x8, x9 1423; -O0: bl __atomic_compare_exchange 1424; 1425; -O1-LABEL: atomicrmw_sub_i128_unaligned_acq_rel: 1426; -O1: ldp x0, x1, [x0] 1427; -O1: subs x8, x0, x21 1428; -O1: bl __atomic_compare_exchange 1429 %r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 1 1430 ret i128 %r 1431} 1432 1433define dso_local i128 @atomicrmw_sub_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 1434; -O0-LABEL: atomicrmw_sub_i128_unaligned_seq_cst: 1435; -O0: subs x9, x8, x9 1436; -O0: bl __atomic_compare_exchange 1437; 1438; -O1-LABEL: atomicrmw_sub_i128_unaligned_seq_cst: 1439; -O1: ldp x0, x1, [x0] 1440; -O1: subs x8, x0, x21 1441; -O1: bl __atomic_compare_exchange 1442 %r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 1 1443 ret i128 %r 1444} 1445 1446define dso_local i8 @atomicrmw_and_i8_aligned_monotonic(ptr %ptr, i8 %value) { 1447; CHECK-LABEL: atomicrmw_and_i8_aligned_monotonic: 1448; CHECK: mvn w8, w1 1449; CHECK: ldclrb w8, w0, [x0] 1450 %r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1 1451 ret i8 %r 1452} 1453 1454define dso_local i8 @atomicrmw_and_i8_aligned_acquire(ptr %ptr, i8 %value) { 1455; CHECK-LABEL: atomicrmw_and_i8_aligned_acquire: 1456; CHECK: mvn w8, w1 1457; CHECK: ldclrab w8, w0, [x0] 1458 %r = atomicrmw and ptr %ptr, i8 %value acquire, align 1 1459 ret i8 %r 1460} 1461 1462define dso_local i8 @atomicrmw_and_i8_aligned_release(ptr %ptr, i8 %value) { 1463; CHECK-LABEL: atomicrmw_and_i8_aligned_release: 1464; CHECK: mvn w8, w1 1465; CHECK: ldclrlb w8, w0, [x0] 1466 %r = atomicrmw and ptr %ptr, i8 %value release, align 1 1467 ret i8 %r 1468} 1469 1470define dso_local i8 @atomicrmw_and_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 1471; CHECK-LABEL: atomicrmw_and_i8_aligned_acq_rel: 1472; CHECK: mvn w8, w1 1473; CHECK: ldclralb w8, w0, [x0] 1474 %r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1 1475 ret i8 %r 1476} 1477 1478define dso_local i8 @atomicrmw_and_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 1479; CHECK-LABEL: atomicrmw_and_i8_aligned_seq_cst: 1480; CHECK: mvn w8, w1 1481; CHECK: ldclralb w8, w0, [x0] 1482 %r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1 1483 ret i8 %r 1484} 1485 1486define dso_local i16 @atomicrmw_and_i16_aligned_monotonic(ptr %ptr, i16 %value) { 1487; CHECK-LABEL: atomicrmw_and_i16_aligned_monotonic: 1488; CHECK: mvn w8, w1 1489; CHECK: ldclrh w8, w0, [x0] 1490 %r = atomicrmw and ptr %ptr, i16 %value monotonic, align 2 1491 ret i16 %r 1492} 1493 1494define dso_local i16 @atomicrmw_and_i16_aligned_acquire(ptr %ptr, i16 %value) { 1495; CHECK-LABEL: atomicrmw_and_i16_aligned_acquire: 1496; CHECK: mvn w8, w1 1497; CHECK: ldclrah w8, w0, [x0] 1498 %r = atomicrmw and ptr %ptr, i16 %value acquire, align 2 1499 ret i16 %r 1500} 1501 1502define dso_local i16 @atomicrmw_and_i16_aligned_release(ptr %ptr, i16 %value) { 1503; CHECK-LABEL: atomicrmw_and_i16_aligned_release: 1504; CHECK: mvn w8, w1 1505; CHECK: ldclrlh w8, w0, [x0] 1506 %r = atomicrmw and ptr %ptr, i16 %value release, align 2 1507 ret i16 %r 1508} 1509 1510define dso_local i16 @atomicrmw_and_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 1511; CHECK-LABEL: atomicrmw_and_i16_aligned_acq_rel: 1512; CHECK: mvn w8, w1 1513; CHECK: ldclralh w8, w0, [x0] 1514 %r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 2 1515 ret i16 %r 1516} 1517 1518define dso_local i16 @atomicrmw_and_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 1519; CHECK-LABEL: atomicrmw_and_i16_aligned_seq_cst: 1520; CHECK: mvn w8, w1 1521; CHECK: ldclralh w8, w0, [x0] 1522 %r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 2 1523 ret i16 %r 1524} 1525 1526define dso_local i32 @atomicrmw_and_i32_aligned_monotonic(ptr %ptr, i32 %value) { 1527; CHECK-LABEL: atomicrmw_and_i32_aligned_monotonic: 1528; CHECK: mvn w8, w1 1529; CHECK: ldclr w8, w0, [x0] 1530 %r = atomicrmw and ptr %ptr, i32 %value monotonic, align 4 1531 ret i32 %r 1532} 1533 1534define dso_local i32 @atomicrmw_and_i32_aligned_acquire(ptr %ptr, i32 %value) { 1535; CHECK-LABEL: atomicrmw_and_i32_aligned_acquire: 1536; CHECK: mvn w8, w1 1537; CHECK: ldclra w8, w0, [x0] 1538 %r = atomicrmw and ptr %ptr, i32 %value acquire, align 4 1539 ret i32 %r 1540} 1541 1542define dso_local i32 @atomicrmw_and_i32_aligned_release(ptr %ptr, i32 %value) { 1543; CHECK-LABEL: atomicrmw_and_i32_aligned_release: 1544; CHECK: mvn w8, w1 1545; CHECK: ldclrl w8, w0, [x0] 1546 %r = atomicrmw and ptr %ptr, i32 %value release, align 4 1547 ret i32 %r 1548} 1549 1550define dso_local i32 @atomicrmw_and_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 1551; CHECK-LABEL: atomicrmw_and_i32_aligned_acq_rel: 1552; CHECK: mvn w8, w1 1553; CHECK: ldclral w8, w0, [x0] 1554 %r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 4 1555 ret i32 %r 1556} 1557 1558define dso_local i32 @atomicrmw_and_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 1559; CHECK-LABEL: atomicrmw_and_i32_aligned_seq_cst: 1560; CHECK: mvn w8, w1 1561; CHECK: ldclral w8, w0, [x0] 1562 %r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 4 1563 ret i32 %r 1564} 1565 1566define dso_local i64 @atomicrmw_and_i64_aligned_monotonic(ptr %ptr, i64 %value) { 1567; CHECK-LABEL: atomicrmw_and_i64_aligned_monotonic: 1568; CHECK: mvn x8, x1 1569; CHECK: ldclr x8, x0, [x0] 1570 %r = atomicrmw and ptr %ptr, i64 %value monotonic, align 8 1571 ret i64 %r 1572} 1573 1574define dso_local i64 @atomicrmw_and_i64_aligned_acquire(ptr %ptr, i64 %value) { 1575; CHECK-LABEL: atomicrmw_and_i64_aligned_acquire: 1576; CHECK: mvn x8, x1 1577; CHECK: ldclra x8, x0, [x0] 1578 %r = atomicrmw and ptr %ptr, i64 %value acquire, align 8 1579 ret i64 %r 1580} 1581 1582define dso_local i64 @atomicrmw_and_i64_aligned_release(ptr %ptr, i64 %value) { 1583; CHECK-LABEL: atomicrmw_and_i64_aligned_release: 1584; CHECK: mvn x8, x1 1585; CHECK: ldclrl x8, x0, [x0] 1586 %r = atomicrmw and ptr %ptr, i64 %value release, align 8 1587 ret i64 %r 1588} 1589 1590define dso_local i64 @atomicrmw_and_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 1591; CHECK-LABEL: atomicrmw_and_i64_aligned_acq_rel: 1592; CHECK: mvn x8, x1 1593; CHECK: ldclral x8, x0, [x0] 1594 %r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 8 1595 ret i64 %r 1596} 1597 1598define dso_local i64 @atomicrmw_and_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 1599; CHECK-LABEL: atomicrmw_and_i64_aligned_seq_cst: 1600; CHECK: mvn x8, x1 1601; CHECK: ldclral x8, x0, [x0] 1602 %r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 8 1603 ret i64 %r 1604} 1605 1606define dso_local i128 @atomicrmw_and_i128_aligned_monotonic(ptr %ptr, i128 %value) { 1607; -O0-LABEL: atomicrmw_and_i128_aligned_monotonic: 1608; -O0: and x2, x9, x11 1609; -O0: and x9, x9, x10 1610; -O0: casp x0, x1, x2, x3, [x8] 1611; -O0: eor x8, x10, x8 1612; -O0: eor x11, x9, x11 1613; -O0: orr x8, x8, x11 1614; -O0: subs x8, x8, #0 1615; 1616; -O1-LABEL: atomicrmw_and_i128_aligned_monotonic: 1617; -O1: ldp x4, x5, [x0] 1618; -O1: and x8, x4, x2 1619; -O1: and x9, x7, x3 1620; -O1: casp x4, x5, x8, x9, [x0] 1621; -O1: cmp x5, x7 1622; -O1: ccmp x4, x6, #0, eq 1623 %r = atomicrmw and ptr %ptr, i128 %value monotonic, align 16 1624 ret i128 %r 1625} 1626 1627define dso_local i128 @atomicrmw_and_i128_aligned_acquire(ptr %ptr, i128 %value) { 1628; -O0-LABEL: atomicrmw_and_i128_aligned_acquire: 1629; -O0: and x2, x9, x11 1630; -O0: and x9, x9, x10 1631; -O0: caspa x0, x1, x2, x3, [x8] 1632; -O0: eor x8, x10, x8 1633; -O0: eor x11, x9, x11 1634; -O0: orr x8, x8, x11 1635; -O0: subs x8, x8, #0 1636; 1637; -O1-LABEL: atomicrmw_and_i128_aligned_acquire: 1638; -O1: ldp x4, x5, [x0] 1639; -O1: and x8, x4, x2 1640; -O1: and x9, x7, x3 1641; -O1: caspa x4, x5, x8, x9, [x0] 1642; -O1: cmp x5, x7 1643; -O1: ccmp x4, x6, #0, eq 1644 %r = atomicrmw and ptr %ptr, i128 %value acquire, align 16 1645 ret i128 %r 1646} 1647 1648define dso_local i128 @atomicrmw_and_i128_aligned_release(ptr %ptr, i128 %value) { 1649; -O0-LABEL: atomicrmw_and_i128_aligned_release: 1650; -O0: and x2, x9, x11 1651; -O0: and x9, x9, x10 1652; -O0: caspl x0, x1, x2, x3, [x8] 1653; -O0: eor x8, x10, x8 1654; -O0: eor x11, x9, x11 1655; -O0: orr x8, x8, x11 1656; -O0: subs x8, x8, #0 1657; 1658; -O1-LABEL: atomicrmw_and_i128_aligned_release: 1659; -O1: ldp x4, x5, [x0] 1660; -O1: and x8, x4, x2 1661; -O1: and x9, x7, x3 1662; -O1: caspl x4, x5, x8, x9, [x0] 1663; -O1: cmp x5, x7 1664; -O1: ccmp x4, x6, #0, eq 1665 %r = atomicrmw and ptr %ptr, i128 %value release, align 16 1666 ret i128 %r 1667} 1668 1669define dso_local i128 @atomicrmw_and_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 1670; -O0-LABEL: atomicrmw_and_i128_aligned_acq_rel: 1671; -O0: and x2, x9, x11 1672; -O0: and x9, x9, x10 1673; -O0: caspal x0, x1, x2, x3, [x8] 1674; -O0: eor x8, x10, x8 1675; -O0: eor x11, x9, x11 1676; -O0: orr x8, x8, x11 1677; -O0: subs x8, x8, #0 1678; 1679; -O1-LABEL: atomicrmw_and_i128_aligned_acq_rel: 1680; -O1: ldp x4, x5, [x0] 1681; -O1: and x8, x4, x2 1682; -O1: and x9, x7, x3 1683; -O1: caspal x4, x5, x8, x9, [x0] 1684; -O1: cmp x5, x7 1685; -O1: ccmp x4, x6, #0, eq 1686 %r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 16 1687 ret i128 %r 1688} 1689 1690define dso_local i128 @atomicrmw_and_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 1691; -O0-LABEL: atomicrmw_and_i128_aligned_seq_cst: 1692; -O0: and x2, x9, x11 1693; -O0: and x9, x9, x10 1694; -O0: caspal x0, x1, x2, x3, [x8] 1695; -O0: eor x8, x10, x8 1696; -O0: eor x11, x9, x11 1697; -O0: orr x8, x8, x11 1698; -O0: subs x8, x8, #0 1699; 1700; -O1-LABEL: atomicrmw_and_i128_aligned_seq_cst: 1701; -O1: ldp x4, x5, [x0] 1702; -O1: and x8, x4, x2 1703; -O1: and x9, x7, x3 1704; -O1: caspal x4, x5, x8, x9, [x0] 1705; -O1: cmp x5, x7 1706; -O1: ccmp x4, x6, #0, eq 1707 %r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 16 1708 ret i128 %r 1709} 1710 1711define dso_local i8 @atomicrmw_and_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 1712; CHECK-LABEL: atomicrmw_and_i8_unaligned_monotonic: 1713; CHECK: mvn w8, w1 1714; CHECK: ldclrb w8, w0, [x0] 1715 %r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1 1716 ret i8 %r 1717} 1718 1719define dso_local i8 @atomicrmw_and_i8_unaligned_acquire(ptr %ptr, i8 %value) { 1720; CHECK-LABEL: atomicrmw_and_i8_unaligned_acquire: 1721; CHECK: mvn w8, w1 1722; CHECK: ldclrab w8, w0, [x0] 1723 %r = atomicrmw and ptr %ptr, i8 %value acquire, align 1 1724 ret i8 %r 1725} 1726 1727define dso_local i8 @atomicrmw_and_i8_unaligned_release(ptr %ptr, i8 %value) { 1728; CHECK-LABEL: atomicrmw_and_i8_unaligned_release: 1729; CHECK: mvn w8, w1 1730; CHECK: ldclrlb w8, w0, [x0] 1731 %r = atomicrmw and ptr %ptr, i8 %value release, align 1 1732 ret i8 %r 1733} 1734 1735define dso_local i8 @atomicrmw_and_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 1736; CHECK-LABEL: atomicrmw_and_i8_unaligned_acq_rel: 1737; CHECK: mvn w8, w1 1738; CHECK: ldclralb w8, w0, [x0] 1739 %r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1 1740 ret i8 %r 1741} 1742 1743define dso_local i8 @atomicrmw_and_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 1744; CHECK-LABEL: atomicrmw_and_i8_unaligned_seq_cst: 1745; CHECK: mvn w8, w1 1746; CHECK: ldclralb w8, w0, [x0] 1747 %r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1 1748 ret i8 %r 1749} 1750 1751define dso_local i16 @atomicrmw_and_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 1752; -O0-LABEL: atomicrmw_and_i16_unaligned_monotonic: 1753; -O0: and w8, w9, w8 1754; -O0: bl __atomic_compare_exchange 1755; 1756; -O1-LABEL: atomicrmw_and_i16_unaligned_monotonic: 1757; -O1: and w8, w0, w20 1758; -O1: bl __atomic_compare_exchange 1759 %r = atomicrmw and ptr %ptr, i16 %value monotonic, align 1 1760 ret i16 %r 1761} 1762 1763define dso_local i16 @atomicrmw_and_i16_unaligned_acquire(ptr %ptr, i16 %value) { 1764; -O0-LABEL: atomicrmw_and_i16_unaligned_acquire: 1765; -O0: and w8, w9, w8 1766; -O0: bl __atomic_compare_exchange 1767; 1768; -O1-LABEL: atomicrmw_and_i16_unaligned_acquire: 1769; -O1: and w8, w0, w20 1770; -O1: bl __atomic_compare_exchange 1771 %r = atomicrmw and ptr %ptr, i16 %value acquire, align 1 1772 ret i16 %r 1773} 1774 1775define dso_local i16 @atomicrmw_and_i16_unaligned_release(ptr %ptr, i16 %value) { 1776; -O0-LABEL: atomicrmw_and_i16_unaligned_release: 1777; -O0: and w8, w9, w8 1778; -O0: bl __atomic_compare_exchange 1779; 1780; -O1-LABEL: atomicrmw_and_i16_unaligned_release: 1781; -O1: and w8, w0, w20 1782; -O1: bl __atomic_compare_exchange 1783 %r = atomicrmw and ptr %ptr, i16 %value release, align 1 1784 ret i16 %r 1785} 1786 1787define dso_local i16 @atomicrmw_and_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 1788; -O0-LABEL: atomicrmw_and_i16_unaligned_acq_rel: 1789; -O0: and w8, w9, w8 1790; -O0: bl __atomic_compare_exchange 1791; 1792; -O1-LABEL: atomicrmw_and_i16_unaligned_acq_rel: 1793; -O1: and w8, w0, w20 1794; -O1: bl __atomic_compare_exchange 1795 %r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 1 1796 ret i16 %r 1797} 1798 1799define dso_local i16 @atomicrmw_and_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 1800; -O0-LABEL: atomicrmw_and_i16_unaligned_seq_cst: 1801; -O0: and w8, w9, w8 1802; -O0: bl __atomic_compare_exchange 1803; 1804; -O1-LABEL: atomicrmw_and_i16_unaligned_seq_cst: 1805; -O1: and w8, w0, w20 1806; -O1: bl __atomic_compare_exchange 1807 %r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 1 1808 ret i16 %r 1809} 1810 1811define dso_local i32 @atomicrmw_and_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 1812; -O0-LABEL: atomicrmw_and_i32_unaligned_monotonic: 1813; -O0: and w8, w9, w8 1814; -O0: bl __atomic_compare_exchange 1815; 1816; -O1-LABEL: atomicrmw_and_i32_unaligned_monotonic: 1817; -O1: and w8, w0, w20 1818; -O1: bl __atomic_compare_exchange 1819 %r = atomicrmw and ptr %ptr, i32 %value monotonic, align 1 1820 ret i32 %r 1821} 1822 1823define dso_local i32 @atomicrmw_and_i32_unaligned_acquire(ptr %ptr, i32 %value) { 1824; -O0-LABEL: atomicrmw_and_i32_unaligned_acquire: 1825; -O0: and w8, w9, w8 1826; -O0: bl __atomic_compare_exchange 1827; 1828; -O1-LABEL: atomicrmw_and_i32_unaligned_acquire: 1829; -O1: and w8, w0, w20 1830; -O1: bl __atomic_compare_exchange 1831 %r = atomicrmw and ptr %ptr, i32 %value acquire, align 1 1832 ret i32 %r 1833} 1834 1835define dso_local i32 @atomicrmw_and_i32_unaligned_release(ptr %ptr, i32 %value) { 1836; -O0-LABEL: atomicrmw_and_i32_unaligned_release: 1837; -O0: and w8, w9, w8 1838; -O0: bl __atomic_compare_exchange 1839; 1840; -O1-LABEL: atomicrmw_and_i32_unaligned_release: 1841; -O1: and w8, w0, w20 1842; -O1: bl __atomic_compare_exchange 1843 %r = atomicrmw and ptr %ptr, i32 %value release, align 1 1844 ret i32 %r 1845} 1846 1847define dso_local i32 @atomicrmw_and_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 1848; -O0-LABEL: atomicrmw_and_i32_unaligned_acq_rel: 1849; -O0: and w8, w9, w8 1850; -O0: bl __atomic_compare_exchange 1851; 1852; -O1-LABEL: atomicrmw_and_i32_unaligned_acq_rel: 1853; -O1: and w8, w0, w20 1854; -O1: bl __atomic_compare_exchange 1855 %r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 1 1856 ret i32 %r 1857} 1858 1859define dso_local i32 @atomicrmw_and_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 1860; -O0-LABEL: atomicrmw_and_i32_unaligned_seq_cst: 1861; -O0: and w8, w9, w8 1862; -O0: bl __atomic_compare_exchange 1863; 1864; -O1-LABEL: atomicrmw_and_i32_unaligned_seq_cst: 1865; -O1: and w8, w0, w20 1866; -O1: bl __atomic_compare_exchange 1867 %r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 1 1868 ret i32 %r 1869} 1870 1871define dso_local i64 @atomicrmw_and_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 1872; -O0-LABEL: atomicrmw_and_i64_unaligned_monotonic: 1873; -O0: and x8, x9, x8 1874; -O0: bl __atomic_compare_exchange 1875; 1876; -O1-LABEL: atomicrmw_and_i64_unaligned_monotonic: 1877; -O1: and x8, x0, x20 1878; -O1: bl __atomic_compare_exchange 1879 %r = atomicrmw and ptr %ptr, i64 %value monotonic, align 1 1880 ret i64 %r 1881} 1882 1883define dso_local i64 @atomicrmw_and_i64_unaligned_acquire(ptr %ptr, i64 %value) { 1884; -O0-LABEL: atomicrmw_and_i64_unaligned_acquire: 1885; -O0: and x8, x9, x8 1886; -O0: bl __atomic_compare_exchange 1887; 1888; -O1-LABEL: atomicrmw_and_i64_unaligned_acquire: 1889; -O1: and x8, x0, x20 1890; -O1: bl __atomic_compare_exchange 1891 %r = atomicrmw and ptr %ptr, i64 %value acquire, align 1 1892 ret i64 %r 1893} 1894 1895define dso_local i64 @atomicrmw_and_i64_unaligned_release(ptr %ptr, i64 %value) { 1896; -O0-LABEL: atomicrmw_and_i64_unaligned_release: 1897; -O0: and x8, x9, x8 1898; -O0: bl __atomic_compare_exchange 1899; 1900; -O1-LABEL: atomicrmw_and_i64_unaligned_release: 1901; -O1: and x8, x0, x20 1902; -O1: bl __atomic_compare_exchange 1903 %r = atomicrmw and ptr %ptr, i64 %value release, align 1 1904 ret i64 %r 1905} 1906 1907define dso_local i64 @atomicrmw_and_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 1908; -O0-LABEL: atomicrmw_and_i64_unaligned_acq_rel: 1909; -O0: and x8, x9, x8 1910; -O0: bl __atomic_compare_exchange 1911; 1912; -O1-LABEL: atomicrmw_and_i64_unaligned_acq_rel: 1913; -O1: and x8, x0, x20 1914; -O1: bl __atomic_compare_exchange 1915 %r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 1 1916 ret i64 %r 1917} 1918 1919define dso_local i64 @atomicrmw_and_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 1920; -O0-LABEL: atomicrmw_and_i64_unaligned_seq_cst: 1921; -O0: and x8, x9, x8 1922; -O0: bl __atomic_compare_exchange 1923; 1924; -O1-LABEL: atomicrmw_and_i64_unaligned_seq_cst: 1925; -O1: and x8, x0, x20 1926; -O1: bl __atomic_compare_exchange 1927 %r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 1 1928 ret i64 %r 1929} 1930 1931define dso_local i128 @atomicrmw_and_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 1932; -O0-LABEL: atomicrmw_and_i128_unaligned_monotonic: 1933; -O0: and x9, x8, x9 1934; -O0: and x8, x8, x10 1935; -O0: bl __atomic_compare_exchange 1936; 1937; -O1-LABEL: atomicrmw_and_i128_unaligned_monotonic: 1938; -O1: ldp x0, x1, [x0] 1939; -O1: and x8, x1, x19 1940; -O1: and x9, x0, x21 1941; -O1: bl __atomic_compare_exchange 1942 %r = atomicrmw and ptr %ptr, i128 %value monotonic, align 1 1943 ret i128 %r 1944} 1945 1946define dso_local i128 @atomicrmw_and_i128_unaligned_acquire(ptr %ptr, i128 %value) { 1947; -O0-LABEL: atomicrmw_and_i128_unaligned_acquire: 1948; -O0: and x9, x8, x9 1949; -O0: and x8, x8, x10 1950; -O0: bl __atomic_compare_exchange 1951; 1952; -O1-LABEL: atomicrmw_and_i128_unaligned_acquire: 1953; -O1: ldp x0, x1, [x0] 1954; -O1: and x8, x1, x19 1955; -O1: and x9, x0, x21 1956; -O1: bl __atomic_compare_exchange 1957 %r = atomicrmw and ptr %ptr, i128 %value acquire, align 1 1958 ret i128 %r 1959} 1960 1961define dso_local i128 @atomicrmw_and_i128_unaligned_release(ptr %ptr, i128 %value) { 1962; -O0-LABEL: atomicrmw_and_i128_unaligned_release: 1963; -O0: and x9, x8, x9 1964; -O0: and x8, x8, x10 1965; -O0: bl __atomic_compare_exchange 1966; 1967; -O1-LABEL: atomicrmw_and_i128_unaligned_release: 1968; -O1: ldp x0, x1, [x0] 1969; -O1: and x8, x1, x19 1970; -O1: and x9, x0, x21 1971; -O1: bl __atomic_compare_exchange 1972 %r = atomicrmw and ptr %ptr, i128 %value release, align 1 1973 ret i128 %r 1974} 1975 1976define dso_local i128 @atomicrmw_and_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 1977; -O0-LABEL: atomicrmw_and_i128_unaligned_acq_rel: 1978; -O0: and x9, x8, x9 1979; -O0: and x8, x8, x10 1980; -O0: bl __atomic_compare_exchange 1981; 1982; -O1-LABEL: atomicrmw_and_i128_unaligned_acq_rel: 1983; -O1: ldp x0, x1, [x0] 1984; -O1: and x8, x1, x19 1985; -O1: and x9, x0, x21 1986; -O1: bl __atomic_compare_exchange 1987 %r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 1 1988 ret i128 %r 1989} 1990 1991define dso_local i128 @atomicrmw_and_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 1992; -O0-LABEL: atomicrmw_and_i128_unaligned_seq_cst: 1993; -O0: and x9, x8, x9 1994; -O0: and x8, x8, x10 1995; -O0: bl __atomic_compare_exchange 1996; 1997; -O1-LABEL: atomicrmw_and_i128_unaligned_seq_cst: 1998; -O1: ldp x0, x1, [x0] 1999; -O1: and x8, x1, x19 2000; -O1: and x9, x0, x21 2001; -O1: bl __atomic_compare_exchange 2002 %r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 1 2003 ret i128 %r 2004} 2005 2006define dso_local i8 @atomicrmw_nand_i8_aligned_monotonic(ptr %ptr, i8 %value) { 2007; -O0-LABEL: atomicrmw_nand_i8_aligned_monotonic: 2008; -O0: and w8, w10, w8 2009; -O0: mvn w8, w8 2010; -O0: casb w9, w8, [x11] 2011; -O0: and w8, w9, #0xff 2012; -O0: subs w8, w8, w10, uxtb 2013; 2014; -O1-LABEL: atomicrmw_nand_i8_aligned_monotonic: 2015; -O1: and w10, w8, w1 2016; -O1: mvn w10, w10 2017; -O1: casb w9, w10, [x0] 2018; -O1: cmp w9, w8, uxtb 2019 %r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1 2020 ret i8 %r 2021} 2022 2023define dso_local i8 @atomicrmw_nand_i8_aligned_acquire(ptr %ptr, i8 %value) { 2024; -O0-LABEL: atomicrmw_nand_i8_aligned_acquire: 2025; -O0: and w8, w10, w8 2026; -O0: mvn w8, w8 2027; -O0: casab w9, w8, [x11] 2028; -O0: and w8, w9, #0xff 2029; -O0: subs w8, w8, w10, uxtb 2030; 2031; -O1-LABEL: atomicrmw_nand_i8_aligned_acquire: 2032; -O1: and w10, w8, w1 2033; -O1: mvn w10, w10 2034; -O1: casab w9, w10, [x0] 2035; -O1: cmp w9, w8, uxtb 2036 %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1 2037 ret i8 %r 2038} 2039 2040define dso_local i8 @atomicrmw_nand_i8_aligned_release(ptr %ptr, i8 %value) { 2041; -O0-LABEL: atomicrmw_nand_i8_aligned_release: 2042; -O0: and w8, w10, w8 2043; -O0: mvn w8, w8 2044; -O0: caslb w9, w8, [x11] 2045; -O0: and w8, w9, #0xff 2046; -O0: subs w8, w8, w10, uxtb 2047; 2048; -O1-LABEL: atomicrmw_nand_i8_aligned_release: 2049; -O1: and w10, w8, w1 2050; -O1: mvn w10, w10 2051; -O1: caslb w9, w10, [x0] 2052; -O1: cmp w9, w8, uxtb 2053 %r = atomicrmw nand ptr %ptr, i8 %value release, align 1 2054 ret i8 %r 2055} 2056 2057define dso_local i8 @atomicrmw_nand_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 2058; -O0-LABEL: atomicrmw_nand_i8_aligned_acq_rel: 2059; -O0: and w8, w10, w8 2060; -O0: mvn w8, w8 2061; -O0: casalb w9, w8, [x11] 2062; -O0: and w8, w9, #0xff 2063; -O0: subs w8, w8, w10, uxtb 2064; 2065; -O1-LABEL: atomicrmw_nand_i8_aligned_acq_rel: 2066; -O1: and w10, w8, w1 2067; -O1: mvn w10, w10 2068; -O1: casalb w9, w10, [x0] 2069; -O1: cmp w9, w8, uxtb 2070 %r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1 2071 ret i8 %r 2072} 2073 2074define dso_local i8 @atomicrmw_nand_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 2075; -O0-LABEL: atomicrmw_nand_i8_aligned_seq_cst: 2076; -O0: and w8, w10, w8 2077; -O0: mvn w8, w8 2078; -O0: casalb w9, w8, [x11] 2079; -O0: and w8, w9, #0xff 2080; -O0: subs w8, w8, w10, uxtb 2081; 2082; -O1-LABEL: atomicrmw_nand_i8_aligned_seq_cst: 2083; -O1: and w10, w8, w1 2084; -O1: mvn w10, w10 2085; -O1: casalb w9, w10, [x0] 2086; -O1: cmp w9, w8, uxtb 2087 %r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1 2088 ret i8 %r 2089} 2090 2091define dso_local i16 @atomicrmw_nand_i16_aligned_monotonic(ptr %ptr, i16 %value) { 2092; -O0-LABEL: atomicrmw_nand_i16_aligned_monotonic: 2093; -O0: and w9, w8, w9 2094; -O0: mvn w10, w9 2095; -O0: cash w9, w10, [x11] 2096; -O0: subs w8, w8, w9, uxth 2097; 2098; -O1-LABEL: atomicrmw_nand_i16_aligned_monotonic: 2099; -O1: and w10, w8, w1 2100; -O1: mvn w10, w10 2101; -O1: cash w9, w10, [x0] 2102; -O1: cmp w9, w8, uxth 2103 %r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 2 2104 ret i16 %r 2105} 2106 2107define dso_local i16 @atomicrmw_nand_i16_aligned_acquire(ptr %ptr, i16 %value) { 2108; -O0-LABEL: atomicrmw_nand_i16_aligned_acquire: 2109; -O0: and w9, w8, w9 2110; -O0: mvn w10, w9 2111; -O0: casah w9, w10, [x11] 2112; -O0: subs w8, w8, w9, uxth 2113; 2114; -O1-LABEL: atomicrmw_nand_i16_aligned_acquire: 2115; -O1: and w10, w8, w1 2116; -O1: mvn w10, w10 2117; -O1: casah w9, w10, [x0] 2118; -O1: cmp w9, w8, uxth 2119 %r = atomicrmw nand ptr %ptr, i16 %value acquire, align 2 2120 ret i16 %r 2121} 2122 2123define dso_local i16 @atomicrmw_nand_i16_aligned_release(ptr %ptr, i16 %value) { 2124; -O0-LABEL: atomicrmw_nand_i16_aligned_release: 2125; -O0: and w9, w8, w9 2126; -O0: mvn w10, w9 2127; -O0: caslh w9, w10, [x11] 2128; -O0: subs w8, w8, w9, uxth 2129; 2130; -O1-LABEL: atomicrmw_nand_i16_aligned_release: 2131; -O1: and w10, w8, w1 2132; -O1: mvn w10, w10 2133; -O1: caslh w9, w10, [x0] 2134; -O1: cmp w9, w8, uxth 2135 %r = atomicrmw nand ptr %ptr, i16 %value release, align 2 2136 ret i16 %r 2137} 2138 2139define dso_local i16 @atomicrmw_nand_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 2140; -O0-LABEL: atomicrmw_nand_i16_aligned_acq_rel: 2141; -O0: and w9, w8, w9 2142; -O0: mvn w10, w9 2143; -O0: casalh w9, w10, [x11] 2144; -O0: subs w8, w8, w9, uxth 2145; 2146; -O1-LABEL: atomicrmw_nand_i16_aligned_acq_rel: 2147; -O1: and w10, w8, w1 2148; -O1: mvn w10, w10 2149; -O1: casalh w9, w10, [x0] 2150; -O1: cmp w9, w8, uxth 2151 %r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 2 2152 ret i16 %r 2153} 2154 2155define dso_local i16 @atomicrmw_nand_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 2156; -O0-LABEL: atomicrmw_nand_i16_aligned_seq_cst: 2157; -O0: and w9, w8, w9 2158; -O0: mvn w10, w9 2159; -O0: casalh w9, w10, [x11] 2160; -O0: subs w8, w8, w9, uxth 2161; 2162; -O1-LABEL: atomicrmw_nand_i16_aligned_seq_cst: 2163; -O1: and w10, w8, w1 2164; -O1: mvn w10, w10 2165; -O1: casalh w9, w10, [x0] 2166; -O1: cmp w9, w8, uxth 2167 %r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 2 2168 ret i16 %r 2169} 2170 2171define dso_local i32 @atomicrmw_nand_i32_aligned_monotonic(ptr %ptr, i32 %value) { 2172; -O0-LABEL: atomicrmw_nand_i32_aligned_monotonic: 2173; -O0: and w9, w8, w9 2174; -O0: mvn w10, w9 2175; -O0: cas w9, w10, [x11] 2176; -O0: subs w8, w9, w8 2177; 2178; -O1-LABEL: atomicrmw_nand_i32_aligned_monotonic: 2179; -O1: and w10, w8, w1 2180; -O1: mvn w10, w10 2181; -O1: cas w9, w10, [x0] 2182; -O1: cmp w9, w8 2183 %r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 4 2184 ret i32 %r 2185} 2186 2187define dso_local i32 @atomicrmw_nand_i32_aligned_acquire(ptr %ptr, i32 %value) { 2188; -O0-LABEL: atomicrmw_nand_i32_aligned_acquire: 2189; -O0: and w9, w8, w9 2190; -O0: mvn w10, w9 2191; -O0: casa w9, w10, [x11] 2192; -O0: subs w8, w9, w8 2193; 2194; -O1-LABEL: atomicrmw_nand_i32_aligned_acquire: 2195; -O1: and w10, w8, w1 2196; -O1: mvn w10, w10 2197; -O1: casa w9, w10, [x0] 2198; -O1: cmp w9, w8 2199 %r = atomicrmw nand ptr %ptr, i32 %value acquire, align 4 2200 ret i32 %r 2201} 2202 2203define dso_local i32 @atomicrmw_nand_i32_aligned_release(ptr %ptr, i32 %value) { 2204; -O0-LABEL: atomicrmw_nand_i32_aligned_release: 2205; -O0: and w9, w8, w9 2206; -O0: mvn w10, w9 2207; -O0: casl w9, w10, [x11] 2208; -O0: subs w8, w9, w8 2209; 2210; -O1-LABEL: atomicrmw_nand_i32_aligned_release: 2211; -O1: and w10, w8, w1 2212; -O1: mvn w10, w10 2213; -O1: casl w9, w10, [x0] 2214; -O1: cmp w9, w8 2215 %r = atomicrmw nand ptr %ptr, i32 %value release, align 4 2216 ret i32 %r 2217} 2218 2219define dso_local i32 @atomicrmw_nand_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 2220; -O0-LABEL: atomicrmw_nand_i32_aligned_acq_rel: 2221; -O0: and w9, w8, w9 2222; -O0: mvn w10, w9 2223; -O0: casal w9, w10, [x11] 2224; -O0: subs w8, w9, w8 2225; 2226; -O1-LABEL: atomicrmw_nand_i32_aligned_acq_rel: 2227; -O1: and w10, w8, w1 2228; -O1: mvn w10, w10 2229; -O1: casal w9, w10, [x0] 2230; -O1: cmp w9, w8 2231 %r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 4 2232 ret i32 %r 2233} 2234 2235define dso_local i32 @atomicrmw_nand_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 2236; -O0-LABEL: atomicrmw_nand_i32_aligned_seq_cst: 2237; -O0: and w9, w8, w9 2238; -O0: mvn w10, w9 2239; -O0: casal w9, w10, [x11] 2240; -O0: subs w8, w9, w8 2241; 2242; -O1-LABEL: atomicrmw_nand_i32_aligned_seq_cst: 2243; -O1: and w10, w8, w1 2244; -O1: mvn w10, w10 2245; -O1: casal w9, w10, [x0] 2246; -O1: cmp w9, w8 2247 %r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 4 2248 ret i32 %r 2249} 2250 2251define dso_local i64 @atomicrmw_nand_i64_aligned_monotonic(ptr %ptr, i64 %value) { 2252; -O0-LABEL: atomicrmw_nand_i64_aligned_monotonic: 2253; -O0: and x9, x8, x9 2254; -O0: mvn x10, x9 2255; -O0: cas x9, x10, [x11] 2256; -O0: subs x8, x9, x8 2257; 2258; -O1-LABEL: atomicrmw_nand_i64_aligned_monotonic: 2259; -O1: and x10, x8, x1 2260; -O1: mvn x10, x10 2261; -O1: cas x9, x10, [x0] 2262; -O1: cmp x9, x8 2263 %r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 8 2264 ret i64 %r 2265} 2266 2267define dso_local i64 @atomicrmw_nand_i64_aligned_acquire(ptr %ptr, i64 %value) { 2268; -O0-LABEL: atomicrmw_nand_i64_aligned_acquire: 2269; -O0: and x9, x8, x9 2270; -O0: mvn x10, x9 2271; -O0: casa x9, x10, [x11] 2272; -O0: subs x8, x9, x8 2273; 2274; -O1-LABEL: atomicrmw_nand_i64_aligned_acquire: 2275; -O1: and x10, x8, x1 2276; -O1: mvn x10, x10 2277; -O1: casa x9, x10, [x0] 2278; -O1: cmp x9, x8 2279 %r = atomicrmw nand ptr %ptr, i64 %value acquire, align 8 2280 ret i64 %r 2281} 2282 2283define dso_local i64 @atomicrmw_nand_i64_aligned_release(ptr %ptr, i64 %value) { 2284; -O0-LABEL: atomicrmw_nand_i64_aligned_release: 2285; -O0: and x9, x8, x9 2286; -O0: mvn x10, x9 2287; -O0: casl x9, x10, [x11] 2288; -O0: subs x8, x9, x8 2289; 2290; -O1-LABEL: atomicrmw_nand_i64_aligned_release: 2291; -O1: and x10, x8, x1 2292; -O1: mvn x10, x10 2293; -O1: casl x9, x10, [x0] 2294; -O1: cmp x9, x8 2295 %r = atomicrmw nand ptr %ptr, i64 %value release, align 8 2296 ret i64 %r 2297} 2298 2299define dso_local i64 @atomicrmw_nand_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 2300; -O0-LABEL: atomicrmw_nand_i64_aligned_acq_rel: 2301; -O0: and x9, x8, x9 2302; -O0: mvn x10, x9 2303; -O0: casal x9, x10, [x11] 2304; -O0: subs x8, x9, x8 2305; 2306; -O1-LABEL: atomicrmw_nand_i64_aligned_acq_rel: 2307; -O1: and x10, x8, x1 2308; -O1: mvn x10, x10 2309; -O1: casal x9, x10, [x0] 2310; -O1: cmp x9, x8 2311 %r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 8 2312 ret i64 %r 2313} 2314 2315define dso_local i64 @atomicrmw_nand_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 2316; -O0-LABEL: atomicrmw_nand_i64_aligned_seq_cst: 2317; -O0: and x9, x8, x9 2318; -O0: mvn x10, x9 2319; -O0: casal x9, x10, [x11] 2320; -O0: subs x8, x9, x8 2321; 2322; -O1-LABEL: atomicrmw_nand_i64_aligned_seq_cst: 2323; -O1: and x10, x8, x1 2324; -O1: mvn x10, x10 2325; -O1: casal x9, x10, [x0] 2326; -O1: cmp x9, x8 2327 %r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 8 2328 ret i64 %r 2329} 2330 2331define dso_local i128 @atomicrmw_nand_i128_aligned_monotonic(ptr %ptr, i128 %value) { 2332; -O0-LABEL: atomicrmw_nand_i128_aligned_monotonic: 2333; -O0: and x10, x9, x10 2334; -O0: and x9, x9, x11 2335; -O0: mvn x2, x10 2336; -O0: mvn x9, x9 2337; -O0: casp x0, x1, x2, x3, [x8] 2338; -O0: eor x8, x10, x8 2339; -O0: eor x11, x9, x11 2340; -O0: orr x8, x8, x11 2341; -O0: subs x8, x8, #0 2342; 2343; -O1-LABEL: atomicrmw_nand_i128_aligned_monotonic: 2344; -O1: ldp x4, x5, [x0] 2345; -O1: and x8, x4, x2 2346; -O1: and x9, x7, x3 2347; -O1: mvn x10, x8 2348; -O1: mvn x11, x9 2349; -O1: casp x4, x5, x10, x11, [x0] 2350; -O1: cmp x5, x7 2351; -O1: ccmp x4, x6, #0, eq 2352 %r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 16 2353 ret i128 %r 2354} 2355 2356define dso_local i128 @atomicrmw_nand_i128_aligned_acquire(ptr %ptr, i128 %value) { 2357; -O0-LABEL: atomicrmw_nand_i128_aligned_acquire: 2358; -O0: and x10, x9, x10 2359; -O0: and x9, x9, x11 2360; -O0: mvn x2, x10 2361; -O0: mvn x9, x9 2362; -O0: caspa x0, x1, x2, x3, [x8] 2363; -O0: eor x8, x10, x8 2364; -O0: eor x11, x9, x11 2365; -O0: orr x8, x8, x11 2366; -O0: subs x8, x8, #0 2367; 2368; -O1-LABEL: atomicrmw_nand_i128_aligned_acquire: 2369; -O1: ldp x4, x5, [x0] 2370; -O1: and x8, x4, x2 2371; -O1: and x9, x7, x3 2372; -O1: mvn x10, x8 2373; -O1: mvn x11, x9 2374; -O1: caspa x4, x5, x10, x11, [x0] 2375; -O1: cmp x5, x7 2376; -O1: ccmp x4, x6, #0, eq 2377 %r = atomicrmw nand ptr %ptr, i128 %value acquire, align 16 2378 ret i128 %r 2379} 2380 2381define dso_local i128 @atomicrmw_nand_i128_aligned_release(ptr %ptr, i128 %value) { 2382; -O0-LABEL: atomicrmw_nand_i128_aligned_release: 2383; -O0: and x10, x9, x10 2384; -O0: and x9, x9, x11 2385; -O0: mvn x2, x10 2386; -O0: mvn x9, x9 2387; -O0: caspl x0, x1, x2, x3, [x8] 2388; -O0: eor x8, x10, x8 2389; -O0: eor x11, x9, x11 2390; -O0: orr x8, x8, x11 2391; -O0: subs x8, x8, #0 2392; 2393; -O1-LABEL: atomicrmw_nand_i128_aligned_release: 2394; -O1: ldp x4, x5, [x0] 2395; -O1: and x8, x4, x2 2396; -O1: and x9, x7, x3 2397; -O1: mvn x10, x8 2398; -O1: mvn x11, x9 2399; -O1: caspl x4, x5, x10, x11, [x0] 2400; -O1: cmp x5, x7 2401; -O1: ccmp x4, x6, #0, eq 2402 %r = atomicrmw nand ptr %ptr, i128 %value release, align 16 2403 ret i128 %r 2404} 2405 2406define dso_local i128 @atomicrmw_nand_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 2407; -O0-LABEL: atomicrmw_nand_i128_aligned_acq_rel: 2408; -O0: and x10, x9, x10 2409; -O0: and x9, x9, x11 2410; -O0: mvn x2, x10 2411; -O0: mvn x9, x9 2412; -O0: caspal x0, x1, x2, x3, [x8] 2413; -O0: eor x8, x10, x8 2414; -O0: eor x11, x9, x11 2415; -O0: orr x8, x8, x11 2416; -O0: subs x8, x8, #0 2417; 2418; -O1-LABEL: atomicrmw_nand_i128_aligned_acq_rel: 2419; -O1: ldp x4, x5, [x0] 2420; -O1: and x8, x4, x2 2421; -O1: and x9, x7, x3 2422; -O1: mvn x10, x8 2423; -O1: mvn x11, x9 2424; -O1: caspal x4, x5, x10, x11, [x0] 2425; -O1: cmp x5, x7 2426; -O1: ccmp x4, x6, #0, eq 2427 %r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 16 2428 ret i128 %r 2429} 2430 2431define dso_local i128 @atomicrmw_nand_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 2432; -O0-LABEL: atomicrmw_nand_i128_aligned_seq_cst: 2433; -O0: and x10, x9, x10 2434; -O0: and x9, x9, x11 2435; -O0: mvn x2, x10 2436; -O0: mvn x9, x9 2437; -O0: caspal x0, x1, x2, x3, [x8] 2438; -O0: eor x8, x10, x8 2439; -O0: eor x11, x9, x11 2440; -O0: orr x8, x8, x11 2441; -O0: subs x8, x8, #0 2442; 2443; -O1-LABEL: atomicrmw_nand_i128_aligned_seq_cst: 2444; -O1: ldp x4, x5, [x0] 2445; -O1: and x8, x4, x2 2446; -O1: and x9, x7, x3 2447; -O1: mvn x10, x8 2448; -O1: mvn x11, x9 2449; -O1: caspal x4, x5, x10, x11, [x0] 2450; -O1: cmp x5, x7 2451; -O1: ccmp x4, x6, #0, eq 2452 %r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 16 2453 ret i128 %r 2454} 2455 2456define dso_local i8 @atomicrmw_nand_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 2457; -O0-LABEL: atomicrmw_nand_i8_unaligned_monotonic: 2458; -O0: and w8, w10, w8 2459; -O0: mvn w8, w8 2460; -O0: casb w9, w8, [x11] 2461; -O0: and w8, w9, #0xff 2462; -O0: subs w8, w8, w10, uxtb 2463; 2464; -O1-LABEL: atomicrmw_nand_i8_unaligned_monotonic: 2465; -O1: and w10, w8, w1 2466; -O1: mvn w10, w10 2467; -O1: casb w9, w10, [x0] 2468; -O1: cmp w9, w8, uxtb 2469 %r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1 2470 ret i8 %r 2471} 2472 2473define dso_local i8 @atomicrmw_nand_i8_unaligned_acquire(ptr %ptr, i8 %value) { 2474; -O0-LABEL: atomicrmw_nand_i8_unaligned_acquire: 2475; -O0: and w8, w10, w8 2476; -O0: mvn w8, w8 2477; -O0: casab w9, w8, [x11] 2478; -O0: and w8, w9, #0xff 2479; -O0: subs w8, w8, w10, uxtb 2480; 2481; -O1-LABEL: atomicrmw_nand_i8_unaligned_acquire: 2482; -O1: and w10, w8, w1 2483; -O1: mvn w10, w10 2484; -O1: casab w9, w10, [x0] 2485; -O1: cmp w9, w8, uxtb 2486 %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1 2487 ret i8 %r 2488} 2489 2490define dso_local i8 @atomicrmw_nand_i8_unaligned_release(ptr %ptr, i8 %value) { 2491; -O0-LABEL: atomicrmw_nand_i8_unaligned_release: 2492; -O0: and w8, w10, w8 2493; -O0: mvn w8, w8 2494; -O0: caslb w9, w8, [x11] 2495; -O0: and w8, w9, #0xff 2496; -O0: subs w8, w8, w10, uxtb 2497; 2498; -O1-LABEL: atomicrmw_nand_i8_unaligned_release: 2499; -O1: and w10, w8, w1 2500; -O1: mvn w10, w10 2501; -O1: caslb w9, w10, [x0] 2502; -O1: cmp w9, w8, uxtb 2503 %r = atomicrmw nand ptr %ptr, i8 %value release, align 1 2504 ret i8 %r 2505} 2506 2507define dso_local i8 @atomicrmw_nand_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 2508; -O0-LABEL: atomicrmw_nand_i8_unaligned_acq_rel: 2509; -O0: and w8, w10, w8 2510; -O0: mvn w8, w8 2511; -O0: casalb w9, w8, [x11] 2512; -O0: and w8, w9, #0xff 2513; -O0: subs w8, w8, w10, uxtb 2514; 2515; -O1-LABEL: atomicrmw_nand_i8_unaligned_acq_rel: 2516; -O1: and w10, w8, w1 2517; -O1: mvn w10, w10 2518; -O1: casalb w9, w10, [x0] 2519; -O1: cmp w9, w8, uxtb 2520 %r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1 2521 ret i8 %r 2522} 2523 2524define dso_local i8 @atomicrmw_nand_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 2525; -O0-LABEL: atomicrmw_nand_i8_unaligned_seq_cst: 2526; -O0: and w8, w10, w8 2527; -O0: mvn w8, w8 2528; -O0: casalb w9, w8, [x11] 2529; -O0: and w8, w9, #0xff 2530; -O0: subs w8, w8, w10, uxtb 2531; 2532; -O1-LABEL: atomicrmw_nand_i8_unaligned_seq_cst: 2533; -O1: and w10, w8, w1 2534; -O1: mvn w10, w10 2535; -O1: casalb w9, w10, [x0] 2536; -O1: cmp w9, w8, uxtb 2537 %r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1 2538 ret i8 %r 2539} 2540 2541define dso_local i16 @atomicrmw_nand_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 2542; -O0-LABEL: atomicrmw_nand_i16_unaligned_monotonic: 2543; -O0: and w8, w9, w8 2544; -O0: mvn w8, w8 2545; -O0: bl __atomic_compare_exchange 2546; 2547; -O1-LABEL: atomicrmw_nand_i16_unaligned_monotonic: 2548; -O1: and w8, w0, w20 2549; -O1: mvn w8, w8 2550; -O1: bl __atomic_compare_exchange 2551 %r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 1 2552 ret i16 %r 2553} 2554 2555define dso_local i16 @atomicrmw_nand_i16_unaligned_acquire(ptr %ptr, i16 %value) { 2556; -O0-LABEL: atomicrmw_nand_i16_unaligned_acquire: 2557; -O0: and w8, w9, w8 2558; -O0: mvn w8, w8 2559; -O0: bl __atomic_compare_exchange 2560; 2561; -O1-LABEL: atomicrmw_nand_i16_unaligned_acquire: 2562; -O1: and w8, w0, w20 2563; -O1: mvn w8, w8 2564; -O1: bl __atomic_compare_exchange 2565 %r = atomicrmw nand ptr %ptr, i16 %value acquire, align 1 2566 ret i16 %r 2567} 2568 2569define dso_local i16 @atomicrmw_nand_i16_unaligned_release(ptr %ptr, i16 %value) { 2570; -O0-LABEL: atomicrmw_nand_i16_unaligned_release: 2571; -O0: and w8, w9, w8 2572; -O0: mvn w8, w8 2573; -O0: bl __atomic_compare_exchange 2574; 2575; -O1-LABEL: atomicrmw_nand_i16_unaligned_release: 2576; -O1: and w8, w0, w20 2577; -O1: mvn w8, w8 2578; -O1: bl __atomic_compare_exchange 2579 %r = atomicrmw nand ptr %ptr, i16 %value release, align 1 2580 ret i16 %r 2581} 2582 2583define dso_local i16 @atomicrmw_nand_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 2584; -O0-LABEL: atomicrmw_nand_i16_unaligned_acq_rel: 2585; -O0: and w8, w9, w8 2586; -O0: mvn w8, w8 2587; -O0: bl __atomic_compare_exchange 2588; 2589; -O1-LABEL: atomicrmw_nand_i16_unaligned_acq_rel: 2590; -O1: and w8, w0, w20 2591; -O1: mvn w8, w8 2592; -O1: bl __atomic_compare_exchange 2593 %r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 1 2594 ret i16 %r 2595} 2596 2597define dso_local i16 @atomicrmw_nand_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 2598; -O0-LABEL: atomicrmw_nand_i16_unaligned_seq_cst: 2599; -O0: and w8, w9, w8 2600; -O0: mvn w8, w8 2601; -O0: bl __atomic_compare_exchange 2602; 2603; -O1-LABEL: atomicrmw_nand_i16_unaligned_seq_cst: 2604; -O1: and w8, w0, w20 2605; -O1: mvn w8, w8 2606; -O1: bl __atomic_compare_exchange 2607 %r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 1 2608 ret i16 %r 2609} 2610 2611define dso_local i32 @atomicrmw_nand_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 2612; -O0-LABEL: atomicrmw_nand_i32_unaligned_monotonic: 2613; -O0: and w8, w9, w8 2614; -O0: mvn w8, w8 2615; -O0: bl __atomic_compare_exchange 2616; 2617; -O1-LABEL: atomicrmw_nand_i32_unaligned_monotonic: 2618; -O1: and w8, w0, w20 2619; -O1: mvn w8, w8 2620; -O1: bl __atomic_compare_exchange 2621 %r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 1 2622 ret i32 %r 2623} 2624 2625define dso_local i32 @atomicrmw_nand_i32_unaligned_acquire(ptr %ptr, i32 %value) { 2626; -O0-LABEL: atomicrmw_nand_i32_unaligned_acquire: 2627; -O0: and w8, w9, w8 2628; -O0: mvn w8, w8 2629; -O0: bl __atomic_compare_exchange 2630; 2631; -O1-LABEL: atomicrmw_nand_i32_unaligned_acquire: 2632; -O1: and w8, w0, w20 2633; -O1: mvn w8, w8 2634; -O1: bl __atomic_compare_exchange 2635 %r = atomicrmw nand ptr %ptr, i32 %value acquire, align 1 2636 ret i32 %r 2637} 2638 2639define dso_local i32 @atomicrmw_nand_i32_unaligned_release(ptr %ptr, i32 %value) { 2640; -O0-LABEL: atomicrmw_nand_i32_unaligned_release: 2641; -O0: and w8, w9, w8 2642; -O0: mvn w8, w8 2643; -O0: bl __atomic_compare_exchange 2644; 2645; -O1-LABEL: atomicrmw_nand_i32_unaligned_release: 2646; -O1: and w8, w0, w20 2647; -O1: mvn w8, w8 2648; -O1: bl __atomic_compare_exchange 2649 %r = atomicrmw nand ptr %ptr, i32 %value release, align 1 2650 ret i32 %r 2651} 2652 2653define dso_local i32 @atomicrmw_nand_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 2654; -O0-LABEL: atomicrmw_nand_i32_unaligned_acq_rel: 2655; -O0: and w8, w9, w8 2656; -O0: mvn w8, w8 2657; -O0: bl __atomic_compare_exchange 2658; 2659; -O1-LABEL: atomicrmw_nand_i32_unaligned_acq_rel: 2660; -O1: and w8, w0, w20 2661; -O1: mvn w8, w8 2662; -O1: bl __atomic_compare_exchange 2663 %r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 1 2664 ret i32 %r 2665} 2666 2667define dso_local i32 @atomicrmw_nand_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 2668; -O0-LABEL: atomicrmw_nand_i32_unaligned_seq_cst: 2669; -O0: and w8, w9, w8 2670; -O0: mvn w8, w8 2671; -O0: bl __atomic_compare_exchange 2672; 2673; -O1-LABEL: atomicrmw_nand_i32_unaligned_seq_cst: 2674; -O1: and w8, w0, w20 2675; -O1: mvn w8, w8 2676; -O1: bl __atomic_compare_exchange 2677 %r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 1 2678 ret i32 %r 2679} 2680 2681define dso_local i64 @atomicrmw_nand_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 2682; -O0-LABEL: atomicrmw_nand_i64_unaligned_monotonic: 2683; -O0: and x8, x9, x8 2684; -O0: mvn x8, x8 2685; -O0: bl __atomic_compare_exchange 2686; 2687; -O1-LABEL: atomicrmw_nand_i64_unaligned_monotonic: 2688; -O1: and x8, x0, x20 2689; -O1: mvn x8, x8 2690; -O1: bl __atomic_compare_exchange 2691 %r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 1 2692 ret i64 %r 2693} 2694 2695define dso_local i64 @atomicrmw_nand_i64_unaligned_acquire(ptr %ptr, i64 %value) { 2696; -O0-LABEL: atomicrmw_nand_i64_unaligned_acquire: 2697; -O0: and x8, x9, x8 2698; -O0: mvn x8, x8 2699; -O0: bl __atomic_compare_exchange 2700; 2701; -O1-LABEL: atomicrmw_nand_i64_unaligned_acquire: 2702; -O1: and x8, x0, x20 2703; -O1: mvn x8, x8 2704; -O1: bl __atomic_compare_exchange 2705 %r = atomicrmw nand ptr %ptr, i64 %value acquire, align 1 2706 ret i64 %r 2707} 2708 2709define dso_local i64 @atomicrmw_nand_i64_unaligned_release(ptr %ptr, i64 %value) { 2710; -O0-LABEL: atomicrmw_nand_i64_unaligned_release: 2711; -O0: and x8, x9, x8 2712; -O0: mvn x8, x8 2713; -O0: bl __atomic_compare_exchange 2714; 2715; -O1-LABEL: atomicrmw_nand_i64_unaligned_release: 2716; -O1: and x8, x0, x20 2717; -O1: mvn x8, x8 2718; -O1: bl __atomic_compare_exchange 2719 %r = atomicrmw nand ptr %ptr, i64 %value release, align 1 2720 ret i64 %r 2721} 2722 2723define dso_local i64 @atomicrmw_nand_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 2724; -O0-LABEL: atomicrmw_nand_i64_unaligned_acq_rel: 2725; -O0: and x8, x9, x8 2726; -O0: mvn x8, x8 2727; -O0: bl __atomic_compare_exchange 2728; 2729; -O1-LABEL: atomicrmw_nand_i64_unaligned_acq_rel: 2730; -O1: and x8, x0, x20 2731; -O1: mvn x8, x8 2732; -O1: bl __atomic_compare_exchange 2733 %r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 1 2734 ret i64 %r 2735} 2736 2737define dso_local i64 @atomicrmw_nand_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 2738; -O0-LABEL: atomicrmw_nand_i64_unaligned_seq_cst: 2739; -O0: and x8, x9, x8 2740; -O0: mvn x8, x8 2741; -O0: bl __atomic_compare_exchange 2742; 2743; -O1-LABEL: atomicrmw_nand_i64_unaligned_seq_cst: 2744; -O1: and x8, x0, x20 2745; -O1: mvn x8, x8 2746; -O1: bl __atomic_compare_exchange 2747 %r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 1 2748 ret i64 %r 2749} 2750 2751define dso_local i128 @atomicrmw_nand_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 2752; -O0-LABEL: atomicrmw_nand_i128_unaligned_monotonic: 2753; -O0: and x9, x8, x9 2754; -O0: and x8, x8, x10 2755; -O0: mvn x9, x9 2756; -O0: mvn x8, x8 2757; -O0: bl __atomic_compare_exchange 2758; 2759; -O1-LABEL: atomicrmw_nand_i128_unaligned_monotonic: 2760; -O1: ldp x0, x1, [x0] 2761; -O1: and x8, x1, x19 2762; -O1: and x9, x0, x21 2763; -O1: mvn x8, x8 2764; -O1: mvn x9, x9 2765; -O1: bl __atomic_compare_exchange 2766 %r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 1 2767 ret i128 %r 2768} 2769 2770define dso_local i128 @atomicrmw_nand_i128_unaligned_acquire(ptr %ptr, i128 %value) { 2771; -O0-LABEL: atomicrmw_nand_i128_unaligned_acquire: 2772; -O0: and x9, x8, x9 2773; -O0: and x8, x8, x10 2774; -O0: mvn x9, x9 2775; -O0: mvn x8, x8 2776; -O0: bl __atomic_compare_exchange 2777; 2778; -O1-LABEL: atomicrmw_nand_i128_unaligned_acquire: 2779; -O1: ldp x0, x1, [x0] 2780; -O1: and x8, x1, x19 2781; -O1: and x9, x0, x21 2782; -O1: mvn x8, x8 2783; -O1: mvn x9, x9 2784; -O1: bl __atomic_compare_exchange 2785 %r = atomicrmw nand ptr %ptr, i128 %value acquire, align 1 2786 ret i128 %r 2787} 2788 2789define dso_local i128 @atomicrmw_nand_i128_unaligned_release(ptr %ptr, i128 %value) { 2790; -O0-LABEL: atomicrmw_nand_i128_unaligned_release: 2791; -O0: and x9, x8, x9 2792; -O0: and x8, x8, x10 2793; -O0: mvn x9, x9 2794; -O0: mvn x8, x8 2795; -O0: bl __atomic_compare_exchange 2796; 2797; -O1-LABEL: atomicrmw_nand_i128_unaligned_release: 2798; -O1: ldp x0, x1, [x0] 2799; -O1: and x8, x1, x19 2800; -O1: and x9, x0, x21 2801; -O1: mvn x8, x8 2802; -O1: mvn x9, x9 2803; -O1: bl __atomic_compare_exchange 2804 %r = atomicrmw nand ptr %ptr, i128 %value release, align 1 2805 ret i128 %r 2806} 2807 2808define dso_local i128 @atomicrmw_nand_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 2809; -O0-LABEL: atomicrmw_nand_i128_unaligned_acq_rel: 2810; -O0: and x9, x8, x9 2811; -O0: and x8, x8, x10 2812; -O0: mvn x9, x9 2813; -O0: mvn x8, x8 2814; -O0: bl __atomic_compare_exchange 2815; 2816; -O1-LABEL: atomicrmw_nand_i128_unaligned_acq_rel: 2817; -O1: ldp x0, x1, [x0] 2818; -O1: and x8, x1, x19 2819; -O1: and x9, x0, x21 2820; -O1: mvn x8, x8 2821; -O1: mvn x9, x9 2822; -O1: bl __atomic_compare_exchange 2823 %r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 1 2824 ret i128 %r 2825} 2826 2827define dso_local i128 @atomicrmw_nand_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 2828; -O0-LABEL: atomicrmw_nand_i128_unaligned_seq_cst: 2829; -O0: and x9, x8, x9 2830; -O0: and x8, x8, x10 2831; -O0: mvn x9, x9 2832; -O0: mvn x8, x8 2833; -O0: bl __atomic_compare_exchange 2834; 2835; -O1-LABEL: atomicrmw_nand_i128_unaligned_seq_cst: 2836; -O1: ldp x0, x1, [x0] 2837; -O1: and x8, x1, x19 2838; -O1: and x9, x0, x21 2839; -O1: mvn x8, x8 2840; -O1: mvn x9, x9 2841; -O1: bl __atomic_compare_exchange 2842 %r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 1 2843 ret i128 %r 2844} 2845 2846define dso_local i8 @atomicrmw_or_i8_aligned_monotonic(ptr %ptr, i8 %value) { 2847; CHECK-LABEL: atomicrmw_or_i8_aligned_monotonic: 2848; CHECK: ldsetb w1, w0, [x0] 2849 %r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1 2850 ret i8 %r 2851} 2852 2853define dso_local i8 @atomicrmw_or_i8_aligned_acquire(ptr %ptr, i8 %value) { 2854; CHECK-LABEL: atomicrmw_or_i8_aligned_acquire: 2855; CHECK: ldsetab w1, w0, [x0] 2856 %r = atomicrmw or ptr %ptr, i8 %value acquire, align 1 2857 ret i8 %r 2858} 2859 2860define dso_local i8 @atomicrmw_or_i8_aligned_release(ptr %ptr, i8 %value) { 2861; CHECK-LABEL: atomicrmw_or_i8_aligned_release: 2862; CHECK: ldsetlb w1, w0, [x0] 2863 %r = atomicrmw or ptr %ptr, i8 %value release, align 1 2864 ret i8 %r 2865} 2866 2867define dso_local i8 @atomicrmw_or_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 2868; CHECK-LABEL: atomicrmw_or_i8_aligned_acq_rel: 2869; CHECK: ldsetalb w1, w0, [x0] 2870 %r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1 2871 ret i8 %r 2872} 2873 2874define dso_local i8 @atomicrmw_or_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 2875; CHECK-LABEL: atomicrmw_or_i8_aligned_seq_cst: 2876; CHECK: ldsetalb w1, w0, [x0] 2877 %r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1 2878 ret i8 %r 2879} 2880 2881define dso_local i16 @atomicrmw_or_i16_aligned_monotonic(ptr %ptr, i16 %value) { 2882; CHECK-LABEL: atomicrmw_or_i16_aligned_monotonic: 2883; CHECK: ldseth w1, w0, [x0] 2884 %r = atomicrmw or ptr %ptr, i16 %value monotonic, align 2 2885 ret i16 %r 2886} 2887 2888define dso_local i16 @atomicrmw_or_i16_aligned_acquire(ptr %ptr, i16 %value) { 2889; CHECK-LABEL: atomicrmw_or_i16_aligned_acquire: 2890; CHECK: ldsetah w1, w0, [x0] 2891 %r = atomicrmw or ptr %ptr, i16 %value acquire, align 2 2892 ret i16 %r 2893} 2894 2895define dso_local i16 @atomicrmw_or_i16_aligned_release(ptr %ptr, i16 %value) { 2896; CHECK-LABEL: atomicrmw_or_i16_aligned_release: 2897; CHECK: ldsetlh w1, w0, [x0] 2898 %r = atomicrmw or ptr %ptr, i16 %value release, align 2 2899 ret i16 %r 2900} 2901 2902define dso_local i16 @atomicrmw_or_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 2903; CHECK-LABEL: atomicrmw_or_i16_aligned_acq_rel: 2904; CHECK: ldsetalh w1, w0, [x0] 2905 %r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 2 2906 ret i16 %r 2907} 2908 2909define dso_local i16 @atomicrmw_or_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 2910; CHECK-LABEL: atomicrmw_or_i16_aligned_seq_cst: 2911; CHECK: ldsetalh w1, w0, [x0] 2912 %r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 2 2913 ret i16 %r 2914} 2915 2916define dso_local i32 @atomicrmw_or_i32_aligned_monotonic(ptr %ptr, i32 %value) { 2917; CHECK-LABEL: atomicrmw_or_i32_aligned_monotonic: 2918; CHECK: ldset w1, w0, [x0] 2919 %r = atomicrmw or ptr %ptr, i32 %value monotonic, align 4 2920 ret i32 %r 2921} 2922 2923define dso_local i32 @atomicrmw_or_i32_aligned_acquire(ptr %ptr, i32 %value) { 2924; CHECK-LABEL: atomicrmw_or_i32_aligned_acquire: 2925; CHECK: ldseta w1, w0, [x0] 2926 %r = atomicrmw or ptr %ptr, i32 %value acquire, align 4 2927 ret i32 %r 2928} 2929 2930define dso_local i32 @atomicrmw_or_i32_aligned_release(ptr %ptr, i32 %value) { 2931; CHECK-LABEL: atomicrmw_or_i32_aligned_release: 2932; CHECK: ldsetl w1, w0, [x0] 2933 %r = atomicrmw or ptr %ptr, i32 %value release, align 4 2934 ret i32 %r 2935} 2936 2937define dso_local i32 @atomicrmw_or_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 2938; CHECK-LABEL: atomicrmw_or_i32_aligned_acq_rel: 2939; CHECK: ldsetal w1, w0, [x0] 2940 %r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 4 2941 ret i32 %r 2942} 2943 2944define dso_local i32 @atomicrmw_or_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 2945; CHECK-LABEL: atomicrmw_or_i32_aligned_seq_cst: 2946; CHECK: ldsetal w1, w0, [x0] 2947 %r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 4 2948 ret i32 %r 2949} 2950 2951define dso_local i64 @atomicrmw_or_i64_aligned_monotonic(ptr %ptr, i64 %value) { 2952; CHECK-LABEL: atomicrmw_or_i64_aligned_monotonic: 2953; CHECK: ldset x1, x0, [x0] 2954 %r = atomicrmw or ptr %ptr, i64 %value monotonic, align 8 2955 ret i64 %r 2956} 2957 2958define dso_local i64 @atomicrmw_or_i64_aligned_acquire(ptr %ptr, i64 %value) { 2959; CHECK-LABEL: atomicrmw_or_i64_aligned_acquire: 2960; CHECK: ldseta x1, x0, [x0] 2961 %r = atomicrmw or ptr %ptr, i64 %value acquire, align 8 2962 ret i64 %r 2963} 2964 2965define dso_local i64 @atomicrmw_or_i64_aligned_release(ptr %ptr, i64 %value) { 2966; CHECK-LABEL: atomicrmw_or_i64_aligned_release: 2967; CHECK: ldsetl x1, x0, [x0] 2968 %r = atomicrmw or ptr %ptr, i64 %value release, align 8 2969 ret i64 %r 2970} 2971 2972define dso_local i64 @atomicrmw_or_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 2973; CHECK-LABEL: atomicrmw_or_i64_aligned_acq_rel: 2974; CHECK: ldsetal x1, x0, [x0] 2975 %r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 8 2976 ret i64 %r 2977} 2978 2979define dso_local i64 @atomicrmw_or_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 2980; CHECK-LABEL: atomicrmw_or_i64_aligned_seq_cst: 2981; CHECK: ldsetal x1, x0, [x0] 2982 %r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 8 2983 ret i64 %r 2984} 2985 2986define dso_local i128 @atomicrmw_or_i128_aligned_monotonic(ptr %ptr, i128 %value) { 2987; -O0-LABEL: atomicrmw_or_i128_aligned_monotonic: 2988; -O0: orr x2, x9, x11 2989; -O0: orr x9, x9, x10 2990; -O0: casp x0, x1, x2, x3, [x8] 2991; -O0: eor x8, x10, x8 2992; -O0: eor x11, x9, x11 2993; -O0: orr x8, x8, x11 2994; -O0: subs x8, x8, #0 2995; 2996; -O1-LABEL: atomicrmw_or_i128_aligned_monotonic: 2997; -O1: ldp x4, x5, [x0] 2998; -O1: orr x8, x4, x2 2999; -O1: orr x9, x7, x3 3000; -O1: casp x4, x5, x8, x9, [x0] 3001; -O1: cmp x5, x7 3002; -O1: ccmp x4, x6, #0, eq 3003 %r = atomicrmw or ptr %ptr, i128 %value monotonic, align 16 3004 ret i128 %r 3005} 3006 3007define dso_local i128 @atomicrmw_or_i128_aligned_acquire(ptr %ptr, i128 %value) { 3008; -O0-LABEL: atomicrmw_or_i128_aligned_acquire: 3009; -O0: orr x2, x9, x11 3010; -O0: orr x9, x9, x10 3011; -O0: caspa x0, x1, x2, x3, [x8] 3012; -O0: eor x8, x10, x8 3013; -O0: eor x11, x9, x11 3014; -O0: orr x8, x8, x11 3015; -O0: subs x8, x8, #0 3016; 3017; -O1-LABEL: atomicrmw_or_i128_aligned_acquire: 3018; -O1: ldp x4, x5, [x0] 3019; -O1: orr x8, x4, x2 3020; -O1: orr x9, x7, x3 3021; -O1: caspa x4, x5, x8, x9, [x0] 3022; -O1: cmp x5, x7 3023; -O1: ccmp x4, x6, #0, eq 3024 %r = atomicrmw or ptr %ptr, i128 %value acquire, align 16 3025 ret i128 %r 3026} 3027 3028define dso_local i128 @atomicrmw_or_i128_aligned_release(ptr %ptr, i128 %value) { 3029; -O0-LABEL: atomicrmw_or_i128_aligned_release: 3030; -O0: orr x2, x9, x11 3031; -O0: orr x9, x9, x10 3032; -O0: caspl x0, x1, x2, x3, [x8] 3033; -O0: eor x8, x10, x8 3034; -O0: eor x11, x9, x11 3035; -O0: orr x8, x8, x11 3036; -O0: subs x8, x8, #0 3037; 3038; -O1-LABEL: atomicrmw_or_i128_aligned_release: 3039; -O1: ldp x4, x5, [x0] 3040; -O1: orr x8, x4, x2 3041; -O1: orr x9, x7, x3 3042; -O1: caspl x4, x5, x8, x9, [x0] 3043; -O1: cmp x5, x7 3044; -O1: ccmp x4, x6, #0, eq 3045 %r = atomicrmw or ptr %ptr, i128 %value release, align 16 3046 ret i128 %r 3047} 3048 3049define dso_local i128 @atomicrmw_or_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 3050; -O0-LABEL: atomicrmw_or_i128_aligned_acq_rel: 3051; -O0: orr x2, x9, x11 3052; -O0: orr x9, x9, x10 3053; -O0: caspal x0, x1, x2, x3, [x8] 3054; -O0: eor x8, x10, x8 3055; -O0: eor x11, x9, x11 3056; -O0: orr x8, x8, x11 3057; -O0: subs x8, x8, #0 3058; 3059; -O1-LABEL: atomicrmw_or_i128_aligned_acq_rel: 3060; -O1: ldp x4, x5, [x0] 3061; -O1: orr x8, x4, x2 3062; -O1: orr x9, x7, x3 3063; -O1: caspal x4, x5, x8, x9, [x0] 3064; -O1: cmp x5, x7 3065; -O1: ccmp x4, x6, #0, eq 3066 %r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 16 3067 ret i128 %r 3068} 3069 3070define dso_local i128 @atomicrmw_or_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 3071; -O0-LABEL: atomicrmw_or_i128_aligned_seq_cst: 3072; -O0: orr x2, x9, x11 3073; -O0: orr x9, x9, x10 3074; -O0: caspal x0, x1, x2, x3, [x8] 3075; -O0: eor x8, x10, x8 3076; -O0: eor x11, x9, x11 3077; -O0: orr x8, x8, x11 3078; -O0: subs x8, x8, #0 3079; 3080; -O1-LABEL: atomicrmw_or_i128_aligned_seq_cst: 3081; -O1: ldp x4, x5, [x0] 3082; -O1: orr x8, x4, x2 3083; -O1: orr x9, x7, x3 3084; -O1: caspal x4, x5, x8, x9, [x0] 3085; -O1: cmp x5, x7 3086; -O1: ccmp x4, x6, #0, eq 3087 %r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 16 3088 ret i128 %r 3089} 3090 3091define dso_local i8 @atomicrmw_or_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 3092; CHECK-LABEL: atomicrmw_or_i8_unaligned_monotonic: 3093; CHECK: ldsetb w1, w0, [x0] 3094 %r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1 3095 ret i8 %r 3096} 3097 3098define dso_local i8 @atomicrmw_or_i8_unaligned_acquire(ptr %ptr, i8 %value) { 3099; CHECK-LABEL: atomicrmw_or_i8_unaligned_acquire: 3100; CHECK: ldsetab w1, w0, [x0] 3101 %r = atomicrmw or ptr %ptr, i8 %value acquire, align 1 3102 ret i8 %r 3103} 3104 3105define dso_local i8 @atomicrmw_or_i8_unaligned_release(ptr %ptr, i8 %value) { 3106; CHECK-LABEL: atomicrmw_or_i8_unaligned_release: 3107; CHECK: ldsetlb w1, w0, [x0] 3108 %r = atomicrmw or ptr %ptr, i8 %value release, align 1 3109 ret i8 %r 3110} 3111 3112define dso_local i8 @atomicrmw_or_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 3113; CHECK-LABEL: atomicrmw_or_i8_unaligned_acq_rel: 3114; CHECK: ldsetalb w1, w0, [x0] 3115 %r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1 3116 ret i8 %r 3117} 3118 3119define dso_local i8 @atomicrmw_or_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 3120; CHECK-LABEL: atomicrmw_or_i8_unaligned_seq_cst: 3121; CHECK: ldsetalb w1, w0, [x0] 3122 %r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1 3123 ret i8 %r 3124} 3125 3126define dso_local i16 @atomicrmw_or_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 3127; -O0-LABEL: atomicrmw_or_i16_unaligned_monotonic: 3128; -O0: orr w8, w9, w8 3129; -O0: bl __atomic_compare_exchange 3130; 3131; -O1-LABEL: atomicrmw_or_i16_unaligned_monotonic: 3132; -O1: orr w8, w0, w20 3133; -O1: bl __atomic_compare_exchange 3134 %r = atomicrmw or ptr %ptr, i16 %value monotonic, align 1 3135 ret i16 %r 3136} 3137 3138define dso_local i16 @atomicrmw_or_i16_unaligned_acquire(ptr %ptr, i16 %value) { 3139; -O0-LABEL: atomicrmw_or_i16_unaligned_acquire: 3140; -O0: orr w8, w9, w8 3141; -O0: bl __atomic_compare_exchange 3142; 3143; -O1-LABEL: atomicrmw_or_i16_unaligned_acquire: 3144; -O1: orr w8, w0, w20 3145; -O1: bl __atomic_compare_exchange 3146 %r = atomicrmw or ptr %ptr, i16 %value acquire, align 1 3147 ret i16 %r 3148} 3149 3150define dso_local i16 @atomicrmw_or_i16_unaligned_release(ptr %ptr, i16 %value) { 3151; -O0-LABEL: atomicrmw_or_i16_unaligned_release: 3152; -O0: orr w8, w9, w8 3153; -O0: bl __atomic_compare_exchange 3154; 3155; -O1-LABEL: atomicrmw_or_i16_unaligned_release: 3156; -O1: orr w8, w0, w20 3157; -O1: bl __atomic_compare_exchange 3158 %r = atomicrmw or ptr %ptr, i16 %value release, align 1 3159 ret i16 %r 3160} 3161 3162define dso_local i16 @atomicrmw_or_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 3163; -O0-LABEL: atomicrmw_or_i16_unaligned_acq_rel: 3164; -O0: orr w8, w9, w8 3165; -O0: bl __atomic_compare_exchange 3166; 3167; -O1-LABEL: atomicrmw_or_i16_unaligned_acq_rel: 3168; -O1: orr w8, w0, w20 3169; -O1: bl __atomic_compare_exchange 3170 %r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 1 3171 ret i16 %r 3172} 3173 3174define dso_local i16 @atomicrmw_or_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 3175; -O0-LABEL: atomicrmw_or_i16_unaligned_seq_cst: 3176; -O0: orr w8, w9, w8 3177; -O0: bl __atomic_compare_exchange 3178; 3179; -O1-LABEL: atomicrmw_or_i16_unaligned_seq_cst: 3180; -O1: orr w8, w0, w20 3181; -O1: bl __atomic_compare_exchange 3182 %r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 1 3183 ret i16 %r 3184} 3185 3186define dso_local i32 @atomicrmw_or_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 3187; -O0-LABEL: atomicrmw_or_i32_unaligned_monotonic: 3188; -O0: orr w8, w9, w8 3189; -O0: bl __atomic_compare_exchange 3190; 3191; -O1-LABEL: atomicrmw_or_i32_unaligned_monotonic: 3192; -O1: orr w8, w0, w20 3193; -O1: bl __atomic_compare_exchange 3194 %r = atomicrmw or ptr %ptr, i32 %value monotonic, align 1 3195 ret i32 %r 3196} 3197 3198define dso_local i32 @atomicrmw_or_i32_unaligned_acquire(ptr %ptr, i32 %value) { 3199; -O0-LABEL: atomicrmw_or_i32_unaligned_acquire: 3200; -O0: orr w8, w9, w8 3201; -O0: bl __atomic_compare_exchange 3202; 3203; -O1-LABEL: atomicrmw_or_i32_unaligned_acquire: 3204; -O1: orr w8, w0, w20 3205; -O1: bl __atomic_compare_exchange 3206 %r = atomicrmw or ptr %ptr, i32 %value acquire, align 1 3207 ret i32 %r 3208} 3209 3210define dso_local i32 @atomicrmw_or_i32_unaligned_release(ptr %ptr, i32 %value) { 3211; -O0-LABEL: atomicrmw_or_i32_unaligned_release: 3212; -O0: orr w8, w9, w8 3213; -O0: bl __atomic_compare_exchange 3214; 3215; -O1-LABEL: atomicrmw_or_i32_unaligned_release: 3216; -O1: orr w8, w0, w20 3217; -O1: bl __atomic_compare_exchange 3218 %r = atomicrmw or ptr %ptr, i32 %value release, align 1 3219 ret i32 %r 3220} 3221 3222define dso_local i32 @atomicrmw_or_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 3223; -O0-LABEL: atomicrmw_or_i32_unaligned_acq_rel: 3224; -O0: orr w8, w9, w8 3225; -O0: bl __atomic_compare_exchange 3226; 3227; -O1-LABEL: atomicrmw_or_i32_unaligned_acq_rel: 3228; -O1: orr w8, w0, w20 3229; -O1: bl __atomic_compare_exchange 3230 %r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 1 3231 ret i32 %r 3232} 3233 3234define dso_local i32 @atomicrmw_or_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 3235; -O0-LABEL: atomicrmw_or_i32_unaligned_seq_cst: 3236; -O0: orr w8, w9, w8 3237; -O0: bl __atomic_compare_exchange 3238; 3239; -O1-LABEL: atomicrmw_or_i32_unaligned_seq_cst: 3240; -O1: orr w8, w0, w20 3241; -O1: bl __atomic_compare_exchange 3242 %r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 1 3243 ret i32 %r 3244} 3245 3246define dso_local i64 @atomicrmw_or_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 3247; -O0-LABEL: atomicrmw_or_i64_unaligned_monotonic: 3248; -O0: orr x8, x9, x8 3249; -O0: bl __atomic_compare_exchange 3250; 3251; -O1-LABEL: atomicrmw_or_i64_unaligned_monotonic: 3252; -O1: orr x8, x0, x20 3253; -O1: bl __atomic_compare_exchange 3254 %r = atomicrmw or ptr %ptr, i64 %value monotonic, align 1 3255 ret i64 %r 3256} 3257 3258define dso_local i64 @atomicrmw_or_i64_unaligned_acquire(ptr %ptr, i64 %value) { 3259; -O0-LABEL: atomicrmw_or_i64_unaligned_acquire: 3260; -O0: orr x8, x9, x8 3261; -O0: bl __atomic_compare_exchange 3262; 3263; -O1-LABEL: atomicrmw_or_i64_unaligned_acquire: 3264; -O1: orr x8, x0, x20 3265; -O1: bl __atomic_compare_exchange 3266 %r = atomicrmw or ptr %ptr, i64 %value acquire, align 1 3267 ret i64 %r 3268} 3269 3270define dso_local i64 @atomicrmw_or_i64_unaligned_release(ptr %ptr, i64 %value) { 3271; -O0-LABEL: atomicrmw_or_i64_unaligned_release: 3272; -O0: orr x8, x9, x8 3273; -O0: bl __atomic_compare_exchange 3274; 3275; -O1-LABEL: atomicrmw_or_i64_unaligned_release: 3276; -O1: orr x8, x0, x20 3277; -O1: bl __atomic_compare_exchange 3278 %r = atomicrmw or ptr %ptr, i64 %value release, align 1 3279 ret i64 %r 3280} 3281 3282define dso_local i64 @atomicrmw_or_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 3283; -O0-LABEL: atomicrmw_or_i64_unaligned_acq_rel: 3284; -O0: orr x8, x9, x8 3285; -O0: bl __atomic_compare_exchange 3286; 3287; -O1-LABEL: atomicrmw_or_i64_unaligned_acq_rel: 3288; -O1: orr x8, x0, x20 3289; -O1: bl __atomic_compare_exchange 3290 %r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 1 3291 ret i64 %r 3292} 3293 3294define dso_local i64 @atomicrmw_or_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 3295; -O0-LABEL: atomicrmw_or_i64_unaligned_seq_cst: 3296; -O0: orr x8, x9, x8 3297; -O0: bl __atomic_compare_exchange 3298; 3299; -O1-LABEL: atomicrmw_or_i64_unaligned_seq_cst: 3300; -O1: orr x8, x0, x20 3301; -O1: bl __atomic_compare_exchange 3302 %r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 1 3303 ret i64 %r 3304} 3305 3306define dso_local i128 @atomicrmw_or_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 3307; -O0-LABEL: atomicrmw_or_i128_unaligned_monotonic: 3308; -O0: orr x9, x8, x9 3309; -O0: orr x8, x8, x10 3310; -O0: bl __atomic_compare_exchange 3311; 3312; -O1-LABEL: atomicrmw_or_i128_unaligned_monotonic: 3313; -O1: ldp x0, x1, [x0] 3314; -O1: orr x8, x1, x19 3315; -O1: orr x9, x0, x21 3316; -O1: bl __atomic_compare_exchange 3317 %r = atomicrmw or ptr %ptr, i128 %value monotonic, align 1 3318 ret i128 %r 3319} 3320 3321define dso_local i128 @atomicrmw_or_i128_unaligned_acquire(ptr %ptr, i128 %value) { 3322; -O0-LABEL: atomicrmw_or_i128_unaligned_acquire: 3323; -O0: orr x9, x8, x9 3324; -O0: orr x8, x8, x10 3325; -O0: bl __atomic_compare_exchange 3326; 3327; -O1-LABEL: atomicrmw_or_i128_unaligned_acquire: 3328; -O1: ldp x0, x1, [x0] 3329; -O1: orr x8, x1, x19 3330; -O1: orr x9, x0, x21 3331; -O1: bl __atomic_compare_exchange 3332 %r = atomicrmw or ptr %ptr, i128 %value acquire, align 1 3333 ret i128 %r 3334} 3335 3336define dso_local i128 @atomicrmw_or_i128_unaligned_release(ptr %ptr, i128 %value) { 3337; -O0-LABEL: atomicrmw_or_i128_unaligned_release: 3338; -O0: orr x9, x8, x9 3339; -O0: orr x8, x8, x10 3340; -O0: bl __atomic_compare_exchange 3341; 3342; -O1-LABEL: atomicrmw_or_i128_unaligned_release: 3343; -O1: ldp x0, x1, [x0] 3344; -O1: orr x8, x1, x19 3345; -O1: orr x9, x0, x21 3346; -O1: bl __atomic_compare_exchange 3347 %r = atomicrmw or ptr %ptr, i128 %value release, align 1 3348 ret i128 %r 3349} 3350 3351define dso_local i128 @atomicrmw_or_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 3352; -O0-LABEL: atomicrmw_or_i128_unaligned_acq_rel: 3353; -O0: orr x9, x8, x9 3354; -O0: orr x8, x8, x10 3355; -O0: bl __atomic_compare_exchange 3356; 3357; -O1-LABEL: atomicrmw_or_i128_unaligned_acq_rel: 3358; -O1: ldp x0, x1, [x0] 3359; -O1: orr x8, x1, x19 3360; -O1: orr x9, x0, x21 3361; -O1: bl __atomic_compare_exchange 3362 %r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 1 3363 ret i128 %r 3364} 3365 3366define dso_local i128 @atomicrmw_or_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 3367; -O0-LABEL: atomicrmw_or_i128_unaligned_seq_cst: 3368; -O0: orr x9, x8, x9 3369; -O0: orr x8, x8, x10 3370; -O0: bl __atomic_compare_exchange 3371; 3372; -O1-LABEL: atomicrmw_or_i128_unaligned_seq_cst: 3373; -O1: ldp x0, x1, [x0] 3374; -O1: orr x8, x1, x19 3375; -O1: orr x9, x0, x21 3376; -O1: bl __atomic_compare_exchange 3377 %r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 1 3378 ret i128 %r 3379} 3380 3381define dso_local i8 @atomicrmw_xor_i8_aligned_monotonic(ptr %ptr, i8 %value) { 3382; CHECK-LABEL: atomicrmw_xor_i8_aligned_monotonic: 3383; CHECK: ldeorb w1, w0, [x0] 3384 %r = atomicrmw xor ptr %ptr, i8 %value monotonic, align 1 3385 ret i8 %r 3386} 3387 3388define dso_local i8 @atomicrmw_xor_i8_aligned_acquire(ptr %ptr, i8 %value) { 3389; CHECK-LABEL: atomicrmw_xor_i8_aligned_acquire: 3390; CHECK: ldeorab w1, w0, [x0] 3391 %r = atomicrmw xor ptr %ptr, i8 %value acquire, align 1 3392 ret i8 %r 3393} 3394 3395define dso_local i8 @atomicrmw_xor_i8_aligned_release(ptr %ptr, i8 %value) { 3396; CHECK-LABEL: atomicrmw_xor_i8_aligned_release: 3397; CHECK: ldeorlb w1, w0, [x0] 3398 %r = atomicrmw xor ptr %ptr, i8 %value release, align 1 3399 ret i8 %r 3400} 3401 3402define dso_local i8 @atomicrmw_xor_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 3403; CHECK-LABEL: atomicrmw_xor_i8_aligned_acq_rel: 3404; CHECK: ldeoralb w1, w0, [x0] 3405 %r = atomicrmw xor ptr %ptr, i8 %value acq_rel, align 1 3406 ret i8 %r 3407} 3408 3409define dso_local i8 @atomicrmw_xor_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 3410; CHECK-LABEL: atomicrmw_xor_i8_aligned_seq_cst: 3411; CHECK: ldeoralb w1, w0, [x0] 3412 %r = atomicrmw xor ptr %ptr, i8 %value seq_cst, align 1 3413 ret i8 %r 3414} 3415 3416define dso_local i16 @atomicrmw_xor_i16_aligned_monotonic(ptr %ptr, i16 %value) { 3417; CHECK-LABEL: atomicrmw_xor_i16_aligned_monotonic: 3418; CHECK: ldeorh w1, w0, [x0] 3419 %r = atomicrmw xor ptr %ptr, i16 %value monotonic, align 2 3420 ret i16 %r 3421} 3422 3423define dso_local i16 @atomicrmw_xor_i16_aligned_acquire(ptr %ptr, i16 %value) { 3424; CHECK-LABEL: atomicrmw_xor_i16_aligned_acquire: 3425; CHECK: ldeorah w1, w0, [x0] 3426 %r = atomicrmw xor ptr %ptr, i16 %value acquire, align 2 3427 ret i16 %r 3428} 3429 3430define dso_local i16 @atomicrmw_xor_i16_aligned_release(ptr %ptr, i16 %value) { 3431; CHECK-LABEL: atomicrmw_xor_i16_aligned_release: 3432; CHECK: ldeorlh w1, w0, [x0] 3433 %r = atomicrmw xor ptr %ptr, i16 %value release, align 2 3434 ret i16 %r 3435} 3436 3437define dso_local i16 @atomicrmw_xor_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 3438; CHECK-LABEL: atomicrmw_xor_i16_aligned_acq_rel: 3439; CHECK: ldeoralh w1, w0, [x0] 3440 %r = atomicrmw xor ptr %ptr, i16 %value acq_rel, align 2 3441 ret i16 %r 3442} 3443 3444define dso_local i16 @atomicrmw_xor_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 3445; CHECK-LABEL: atomicrmw_xor_i16_aligned_seq_cst: 3446; CHECK: ldeoralh w1, w0, [x0] 3447 %r = atomicrmw xor ptr %ptr, i16 %value seq_cst, align 2 3448 ret i16 %r 3449} 3450 3451define dso_local i32 @atomicrmw_xor_i32_aligned_monotonic(ptr %ptr, i32 %value) { 3452; CHECK-LABEL: atomicrmw_xor_i32_aligned_monotonic: 3453; CHECK: ldeor w1, w0, [x0] 3454 %r = atomicrmw xor ptr %ptr, i32 %value monotonic, align 4 3455 ret i32 %r 3456} 3457 3458define dso_local i32 @atomicrmw_xor_i32_aligned_acquire(ptr %ptr, i32 %value) { 3459; CHECK-LABEL: atomicrmw_xor_i32_aligned_acquire: 3460; CHECK: ldeora w1, w0, [x0] 3461 %r = atomicrmw xor ptr %ptr, i32 %value acquire, align 4 3462 ret i32 %r 3463} 3464 3465define dso_local i32 @atomicrmw_xor_i32_aligned_release(ptr %ptr, i32 %value) { 3466; CHECK-LABEL: atomicrmw_xor_i32_aligned_release: 3467; CHECK: ldeorl w1, w0, [x0] 3468 %r = atomicrmw xor ptr %ptr, i32 %value release, align 4 3469 ret i32 %r 3470} 3471 3472define dso_local i32 @atomicrmw_xor_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 3473; CHECK-LABEL: atomicrmw_xor_i32_aligned_acq_rel: 3474; CHECK: ldeoral w1, w0, [x0] 3475 %r = atomicrmw xor ptr %ptr, i32 %value acq_rel, align 4 3476 ret i32 %r 3477} 3478 3479define dso_local i32 @atomicrmw_xor_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 3480; CHECK-LABEL: atomicrmw_xor_i32_aligned_seq_cst: 3481; CHECK: ldeoral w1, w0, [x0] 3482 %r = atomicrmw xor ptr %ptr, i32 %value seq_cst, align 4 3483 ret i32 %r 3484} 3485 3486define dso_local i64 @atomicrmw_xor_i64_aligned_monotonic(ptr %ptr, i64 %value) { 3487; CHECK-LABEL: atomicrmw_xor_i64_aligned_monotonic: 3488; CHECK: ldeor x1, x0, [x0] 3489 %r = atomicrmw xor ptr %ptr, i64 %value monotonic, align 8 3490 ret i64 %r 3491} 3492 3493define dso_local i64 @atomicrmw_xor_i64_aligned_acquire(ptr %ptr, i64 %value) { 3494; CHECK-LABEL: atomicrmw_xor_i64_aligned_acquire: 3495; CHECK: ldeora x1, x0, [x0] 3496 %r = atomicrmw xor ptr %ptr, i64 %value acquire, align 8 3497 ret i64 %r 3498} 3499 3500define dso_local i64 @atomicrmw_xor_i64_aligned_release(ptr %ptr, i64 %value) { 3501; CHECK-LABEL: atomicrmw_xor_i64_aligned_release: 3502; CHECK: ldeorl x1, x0, [x0] 3503 %r = atomicrmw xor ptr %ptr, i64 %value release, align 8 3504 ret i64 %r 3505} 3506 3507define dso_local i64 @atomicrmw_xor_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 3508; CHECK-LABEL: atomicrmw_xor_i64_aligned_acq_rel: 3509; CHECK: ldeoral x1, x0, [x0] 3510 %r = atomicrmw xor ptr %ptr, i64 %value acq_rel, align 8 3511 ret i64 %r 3512} 3513 3514define dso_local i64 @atomicrmw_xor_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 3515; CHECK-LABEL: atomicrmw_xor_i64_aligned_seq_cst: 3516; CHECK: ldeoral x1, x0, [x0] 3517 %r = atomicrmw xor ptr %ptr, i64 %value seq_cst, align 8 3518 ret i64 %r 3519} 3520 3521define dso_local i128 @atomicrmw_xor_i128_aligned_monotonic(ptr %ptr, i128 %value) { 3522; -O0-LABEL: atomicrmw_xor_i128_aligned_monotonic: 3523; -O0: eor x2, x9, x11 3524; -O0: eor x9, x9, x10 3525; -O0: casp x0, x1, x2, x3, [x8] 3526; -O0: eor x8, x10, x8 3527; -O0: eor x11, x9, x11 3528; -O0: orr x8, x8, x11 3529; -O0: subs x8, x8, #0 3530; 3531; -O1-LABEL: atomicrmw_xor_i128_aligned_monotonic: 3532; -O1: ldp x4, x5, [x0] 3533; -O1: eor x8, x4, x2 3534; -O1: eor x9, x7, x3 3535; -O1: casp x4, x5, x8, x9, [x0] 3536; -O1: cmp x5, x7 3537; -O1: ccmp x4, x6, #0, eq 3538 %r = atomicrmw xor ptr %ptr, i128 %value monotonic, align 16 3539 ret i128 %r 3540} 3541 3542define dso_local i128 @atomicrmw_xor_i128_aligned_acquire(ptr %ptr, i128 %value) { 3543; -O0-LABEL: atomicrmw_xor_i128_aligned_acquire: 3544; -O0: eor x2, x9, x11 3545; -O0: eor x9, x9, x10 3546; -O0: caspa x0, x1, x2, x3, [x8] 3547; -O0: eor x8, x10, x8 3548; -O0: eor x11, x9, x11 3549; -O0: orr x8, x8, x11 3550; -O0: subs x8, x8, #0 3551; 3552; -O1-LABEL: atomicrmw_xor_i128_aligned_acquire: 3553; -O1: ldp x4, x5, [x0] 3554; -O1: eor x8, x4, x2 3555; -O1: eor x9, x7, x3 3556; -O1: caspa x4, x5, x8, x9, [x0] 3557; -O1: cmp x5, x7 3558; -O1: ccmp x4, x6, #0, eq 3559 %r = atomicrmw xor ptr %ptr, i128 %value acquire, align 16 3560 ret i128 %r 3561} 3562 3563define dso_local i128 @atomicrmw_xor_i128_aligned_release(ptr %ptr, i128 %value) { 3564; -O0-LABEL: atomicrmw_xor_i128_aligned_release: 3565; -O0: eor x2, x9, x11 3566; -O0: eor x9, x9, x10 3567; -O0: caspl x0, x1, x2, x3, [x8] 3568; -O0: eor x8, x10, x8 3569; -O0: eor x11, x9, x11 3570; -O0: orr x8, x8, x11 3571; -O0: subs x8, x8, #0 3572; 3573; -O1-LABEL: atomicrmw_xor_i128_aligned_release: 3574; -O1: ldp x4, x5, [x0] 3575; -O1: eor x8, x4, x2 3576; -O1: eor x9, x7, x3 3577; -O1: caspl x4, x5, x8, x9, [x0] 3578; -O1: cmp x5, x7 3579; -O1: ccmp x4, x6, #0, eq 3580 %r = atomicrmw xor ptr %ptr, i128 %value release, align 16 3581 ret i128 %r 3582} 3583 3584define dso_local i128 @atomicrmw_xor_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 3585; -O0-LABEL: atomicrmw_xor_i128_aligned_acq_rel: 3586; -O0: eor x2, x9, x11 3587; -O0: eor x9, x9, x10 3588; -O0: caspal x0, x1, x2, x3, [x8] 3589; -O0: eor x8, x10, x8 3590; -O0: eor x11, x9, x11 3591; -O0: orr x8, x8, x11 3592; -O0: subs x8, x8, #0 3593; 3594; -O1-LABEL: atomicrmw_xor_i128_aligned_acq_rel: 3595; -O1: ldp x4, x5, [x0] 3596; -O1: eor x8, x4, x2 3597; -O1: eor x9, x7, x3 3598; -O1: caspal x4, x5, x8, x9, [x0] 3599; -O1: cmp x5, x7 3600; -O1: ccmp x4, x6, #0, eq 3601 %r = atomicrmw xor ptr %ptr, i128 %value acq_rel, align 16 3602 ret i128 %r 3603} 3604 3605define dso_local i128 @atomicrmw_xor_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 3606; -O0-LABEL: atomicrmw_xor_i128_aligned_seq_cst: 3607; -O0: eor x2, x9, x11 3608; -O0: eor x9, x9, x10 3609; -O0: caspal x0, x1, x2, x3, [x8] 3610; -O0: eor x8, x10, x8 3611; -O0: eor x11, x9, x11 3612; -O0: orr x8, x8, x11 3613; -O0: subs x8, x8, #0 3614; 3615; -O1-LABEL: atomicrmw_xor_i128_aligned_seq_cst: 3616; -O1: ldp x4, x5, [x0] 3617; -O1: eor x8, x4, x2 3618; -O1: eor x9, x7, x3 3619; -O1: caspal x4, x5, x8, x9, [x0] 3620; -O1: cmp x5, x7 3621; -O1: ccmp x4, x6, #0, eq 3622 %r = atomicrmw xor ptr %ptr, i128 %value seq_cst, align 16 3623 ret i128 %r 3624} 3625 3626define dso_local i8 @atomicrmw_xor_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 3627; CHECK-LABEL: atomicrmw_xor_i8_unaligned_monotonic: 3628; CHECK: ldeorb w1, w0, [x0] 3629 %r = atomicrmw xor ptr %ptr, i8 %value monotonic, align 1 3630 ret i8 %r 3631} 3632 3633define dso_local i8 @atomicrmw_xor_i8_unaligned_acquire(ptr %ptr, i8 %value) { 3634; CHECK-LABEL: atomicrmw_xor_i8_unaligned_acquire: 3635; CHECK: ldeorab w1, w0, [x0] 3636 %r = atomicrmw xor ptr %ptr, i8 %value acquire, align 1 3637 ret i8 %r 3638} 3639 3640define dso_local i8 @atomicrmw_xor_i8_unaligned_release(ptr %ptr, i8 %value) { 3641; CHECK-LABEL: atomicrmw_xor_i8_unaligned_release: 3642; CHECK: ldeorlb w1, w0, [x0] 3643 %r = atomicrmw xor ptr %ptr, i8 %value release, align 1 3644 ret i8 %r 3645} 3646 3647define dso_local i8 @atomicrmw_xor_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 3648; CHECK-LABEL: atomicrmw_xor_i8_unaligned_acq_rel: 3649; CHECK: ldeoralb w1, w0, [x0] 3650 %r = atomicrmw xor ptr %ptr, i8 %value acq_rel, align 1 3651 ret i8 %r 3652} 3653 3654define dso_local i8 @atomicrmw_xor_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 3655; CHECK-LABEL: atomicrmw_xor_i8_unaligned_seq_cst: 3656; CHECK: ldeoralb w1, w0, [x0] 3657 %r = atomicrmw xor ptr %ptr, i8 %value seq_cst, align 1 3658 ret i8 %r 3659} 3660 3661define dso_local i16 @atomicrmw_xor_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 3662; -O0-LABEL: atomicrmw_xor_i16_unaligned_monotonic: 3663; -O0: eor w8, w9, w8 3664; -O0: bl __atomic_compare_exchange 3665; 3666; -O1-LABEL: atomicrmw_xor_i16_unaligned_monotonic: 3667; -O1: eor w8, w0, w20 3668; -O1: bl __atomic_compare_exchange 3669 %r = atomicrmw xor ptr %ptr, i16 %value monotonic, align 1 3670 ret i16 %r 3671} 3672 3673define dso_local i16 @atomicrmw_xor_i16_unaligned_acquire(ptr %ptr, i16 %value) { 3674; -O0-LABEL: atomicrmw_xor_i16_unaligned_acquire: 3675; -O0: eor w8, w9, w8 3676; -O0: bl __atomic_compare_exchange 3677; 3678; -O1-LABEL: atomicrmw_xor_i16_unaligned_acquire: 3679; -O1: eor w8, w0, w20 3680; -O1: bl __atomic_compare_exchange 3681 %r = atomicrmw xor ptr %ptr, i16 %value acquire, align 1 3682 ret i16 %r 3683} 3684 3685define dso_local i16 @atomicrmw_xor_i16_unaligned_release(ptr %ptr, i16 %value) { 3686; -O0-LABEL: atomicrmw_xor_i16_unaligned_release: 3687; -O0: eor w8, w9, w8 3688; -O0: bl __atomic_compare_exchange 3689; 3690; -O1-LABEL: atomicrmw_xor_i16_unaligned_release: 3691; -O1: eor w8, w0, w20 3692; -O1: bl __atomic_compare_exchange 3693 %r = atomicrmw xor ptr %ptr, i16 %value release, align 1 3694 ret i16 %r 3695} 3696 3697define dso_local i16 @atomicrmw_xor_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 3698; -O0-LABEL: atomicrmw_xor_i16_unaligned_acq_rel: 3699; -O0: eor w8, w9, w8 3700; -O0: bl __atomic_compare_exchange 3701; 3702; -O1-LABEL: atomicrmw_xor_i16_unaligned_acq_rel: 3703; -O1: eor w8, w0, w20 3704; -O1: bl __atomic_compare_exchange 3705 %r = atomicrmw xor ptr %ptr, i16 %value acq_rel, align 1 3706 ret i16 %r 3707} 3708 3709define dso_local i16 @atomicrmw_xor_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 3710; -O0-LABEL: atomicrmw_xor_i16_unaligned_seq_cst: 3711; -O0: eor w8, w9, w8 3712; -O0: bl __atomic_compare_exchange 3713; 3714; -O1-LABEL: atomicrmw_xor_i16_unaligned_seq_cst: 3715; -O1: eor w8, w0, w20 3716; -O1: bl __atomic_compare_exchange 3717 %r = atomicrmw xor ptr %ptr, i16 %value seq_cst, align 1 3718 ret i16 %r 3719} 3720 3721define dso_local i32 @atomicrmw_xor_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 3722; -O0-LABEL: atomicrmw_xor_i32_unaligned_monotonic: 3723; -O0: eor w8, w9, w8 3724; -O0: bl __atomic_compare_exchange 3725; 3726; -O1-LABEL: atomicrmw_xor_i32_unaligned_monotonic: 3727; -O1: eor w8, w0, w20 3728; -O1: bl __atomic_compare_exchange 3729 %r = atomicrmw xor ptr %ptr, i32 %value monotonic, align 1 3730 ret i32 %r 3731} 3732 3733define dso_local i32 @atomicrmw_xor_i32_unaligned_acquire(ptr %ptr, i32 %value) { 3734; -O0-LABEL: atomicrmw_xor_i32_unaligned_acquire: 3735; -O0: eor w8, w9, w8 3736; -O0: bl __atomic_compare_exchange 3737; 3738; -O1-LABEL: atomicrmw_xor_i32_unaligned_acquire: 3739; -O1: eor w8, w0, w20 3740; -O1: bl __atomic_compare_exchange 3741 %r = atomicrmw xor ptr %ptr, i32 %value acquire, align 1 3742 ret i32 %r 3743} 3744 3745define dso_local i32 @atomicrmw_xor_i32_unaligned_release(ptr %ptr, i32 %value) { 3746; -O0-LABEL: atomicrmw_xor_i32_unaligned_release: 3747; -O0: eor w8, w9, w8 3748; -O0: bl __atomic_compare_exchange 3749; 3750; -O1-LABEL: atomicrmw_xor_i32_unaligned_release: 3751; -O1: eor w8, w0, w20 3752; -O1: bl __atomic_compare_exchange 3753 %r = atomicrmw xor ptr %ptr, i32 %value release, align 1 3754 ret i32 %r 3755} 3756 3757define dso_local i32 @atomicrmw_xor_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 3758; -O0-LABEL: atomicrmw_xor_i32_unaligned_acq_rel: 3759; -O0: eor w8, w9, w8 3760; -O0: bl __atomic_compare_exchange 3761; 3762; -O1-LABEL: atomicrmw_xor_i32_unaligned_acq_rel: 3763; -O1: eor w8, w0, w20 3764; -O1: bl __atomic_compare_exchange 3765 %r = atomicrmw xor ptr %ptr, i32 %value acq_rel, align 1 3766 ret i32 %r 3767} 3768 3769define dso_local i32 @atomicrmw_xor_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 3770; -O0-LABEL: atomicrmw_xor_i32_unaligned_seq_cst: 3771; -O0: eor w8, w9, w8 3772; -O0: bl __atomic_compare_exchange 3773; 3774; -O1-LABEL: atomicrmw_xor_i32_unaligned_seq_cst: 3775; -O1: eor w8, w0, w20 3776; -O1: bl __atomic_compare_exchange 3777 %r = atomicrmw xor ptr %ptr, i32 %value seq_cst, align 1 3778 ret i32 %r 3779} 3780 3781define dso_local i64 @atomicrmw_xor_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 3782; -O0-LABEL: atomicrmw_xor_i64_unaligned_monotonic: 3783; -O0: eor x8, x9, x8 3784; -O0: bl __atomic_compare_exchange 3785; 3786; -O1-LABEL: atomicrmw_xor_i64_unaligned_monotonic: 3787; -O1: eor x8, x0, x20 3788; -O1: bl __atomic_compare_exchange 3789 %r = atomicrmw xor ptr %ptr, i64 %value monotonic, align 1 3790 ret i64 %r 3791} 3792 3793define dso_local i64 @atomicrmw_xor_i64_unaligned_acquire(ptr %ptr, i64 %value) { 3794; -O0-LABEL: atomicrmw_xor_i64_unaligned_acquire: 3795; -O0: eor x8, x9, x8 3796; -O0: bl __atomic_compare_exchange 3797; 3798; -O1-LABEL: atomicrmw_xor_i64_unaligned_acquire: 3799; -O1: eor x8, x0, x20 3800; -O1: bl __atomic_compare_exchange 3801 %r = atomicrmw xor ptr %ptr, i64 %value acquire, align 1 3802 ret i64 %r 3803} 3804 3805define dso_local i64 @atomicrmw_xor_i64_unaligned_release(ptr %ptr, i64 %value) { 3806; -O0-LABEL: atomicrmw_xor_i64_unaligned_release: 3807; -O0: eor x8, x9, x8 3808; -O0: bl __atomic_compare_exchange 3809; 3810; -O1-LABEL: atomicrmw_xor_i64_unaligned_release: 3811; -O1: eor x8, x0, x20 3812; -O1: bl __atomic_compare_exchange 3813 %r = atomicrmw xor ptr %ptr, i64 %value release, align 1 3814 ret i64 %r 3815} 3816 3817define dso_local i64 @atomicrmw_xor_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 3818; -O0-LABEL: atomicrmw_xor_i64_unaligned_acq_rel: 3819; -O0: eor x8, x9, x8 3820; -O0: bl __atomic_compare_exchange 3821; 3822; -O1-LABEL: atomicrmw_xor_i64_unaligned_acq_rel: 3823; -O1: eor x8, x0, x20 3824; -O1: bl __atomic_compare_exchange 3825 %r = atomicrmw xor ptr %ptr, i64 %value acq_rel, align 1 3826 ret i64 %r 3827} 3828 3829define dso_local i64 @atomicrmw_xor_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 3830; -O0-LABEL: atomicrmw_xor_i64_unaligned_seq_cst: 3831; -O0: eor x8, x9, x8 3832; -O0: bl __atomic_compare_exchange 3833; 3834; -O1-LABEL: atomicrmw_xor_i64_unaligned_seq_cst: 3835; -O1: eor x8, x0, x20 3836; -O1: bl __atomic_compare_exchange 3837 %r = atomicrmw xor ptr %ptr, i64 %value seq_cst, align 1 3838 ret i64 %r 3839} 3840 3841define dso_local i128 @atomicrmw_xor_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 3842; -O0-LABEL: atomicrmw_xor_i128_unaligned_monotonic: 3843; -O0: eor x9, x8, x9 3844; -O0: eor x8, x8, x10 3845; -O0: bl __atomic_compare_exchange 3846; 3847; -O1-LABEL: atomicrmw_xor_i128_unaligned_monotonic: 3848; -O1: ldp x0, x1, [x0] 3849; -O1: eor x8, x1, x19 3850; -O1: eor x9, x0, x21 3851; -O1: bl __atomic_compare_exchange 3852 %r = atomicrmw xor ptr %ptr, i128 %value monotonic, align 1 3853 ret i128 %r 3854} 3855 3856define dso_local i128 @atomicrmw_xor_i128_unaligned_acquire(ptr %ptr, i128 %value) { 3857; -O0-LABEL: atomicrmw_xor_i128_unaligned_acquire: 3858; -O0: eor x9, x8, x9 3859; -O0: eor x8, x8, x10 3860; -O0: bl __atomic_compare_exchange 3861; 3862; -O1-LABEL: atomicrmw_xor_i128_unaligned_acquire: 3863; -O1: ldp x0, x1, [x0] 3864; -O1: eor x8, x1, x19 3865; -O1: eor x9, x0, x21 3866; -O1: bl __atomic_compare_exchange 3867 %r = atomicrmw xor ptr %ptr, i128 %value acquire, align 1 3868 ret i128 %r 3869} 3870 3871define dso_local i128 @atomicrmw_xor_i128_unaligned_release(ptr %ptr, i128 %value) { 3872; -O0-LABEL: atomicrmw_xor_i128_unaligned_release: 3873; -O0: eor x9, x8, x9 3874; -O0: eor x8, x8, x10 3875; -O0: bl __atomic_compare_exchange 3876; 3877; -O1-LABEL: atomicrmw_xor_i128_unaligned_release: 3878; -O1: ldp x0, x1, [x0] 3879; -O1: eor x8, x1, x19 3880; -O1: eor x9, x0, x21 3881; -O1: bl __atomic_compare_exchange 3882 %r = atomicrmw xor ptr %ptr, i128 %value release, align 1 3883 ret i128 %r 3884} 3885 3886define dso_local i128 @atomicrmw_xor_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 3887; -O0-LABEL: atomicrmw_xor_i128_unaligned_acq_rel: 3888; -O0: eor x9, x8, x9 3889; -O0: eor x8, x8, x10 3890; -O0: bl __atomic_compare_exchange 3891; 3892; -O1-LABEL: atomicrmw_xor_i128_unaligned_acq_rel: 3893; -O1: ldp x0, x1, [x0] 3894; -O1: eor x8, x1, x19 3895; -O1: eor x9, x0, x21 3896; -O1: bl __atomic_compare_exchange 3897 %r = atomicrmw xor ptr %ptr, i128 %value acq_rel, align 1 3898 ret i128 %r 3899} 3900 3901define dso_local i128 @atomicrmw_xor_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 3902; -O0-LABEL: atomicrmw_xor_i128_unaligned_seq_cst: 3903; -O0: eor x9, x8, x9 3904; -O0: eor x8, x8, x10 3905; -O0: bl __atomic_compare_exchange 3906; 3907; -O1-LABEL: atomicrmw_xor_i128_unaligned_seq_cst: 3908; -O1: ldp x0, x1, [x0] 3909; -O1: eor x8, x1, x19 3910; -O1: eor x9, x0, x21 3911; -O1: bl __atomic_compare_exchange 3912 %r = atomicrmw xor ptr %ptr, i128 %value seq_cst, align 1 3913 ret i128 %r 3914} 3915 3916define dso_local i8 @atomicrmw_max_i8_aligned_monotonic(ptr %ptr, i8 %value) { 3917; CHECK-LABEL: atomicrmw_max_i8_aligned_monotonic: 3918; CHECK: ldsmaxb w1, w0, [x0] 3919 %r = atomicrmw max ptr %ptr, i8 %value monotonic, align 1 3920 ret i8 %r 3921} 3922 3923define dso_local i8 @atomicrmw_max_i8_aligned_acquire(ptr %ptr, i8 %value) { 3924; CHECK-LABEL: atomicrmw_max_i8_aligned_acquire: 3925; CHECK: ldsmaxab w1, w0, [x0] 3926 %r = atomicrmw max ptr %ptr, i8 %value acquire, align 1 3927 ret i8 %r 3928} 3929 3930define dso_local i8 @atomicrmw_max_i8_aligned_release(ptr %ptr, i8 %value) { 3931; CHECK-LABEL: atomicrmw_max_i8_aligned_release: 3932; CHECK: ldsmaxlb w1, w0, [x0] 3933 %r = atomicrmw max ptr %ptr, i8 %value release, align 1 3934 ret i8 %r 3935} 3936 3937define dso_local i8 @atomicrmw_max_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 3938; CHECK-LABEL: atomicrmw_max_i8_aligned_acq_rel: 3939; CHECK: ldsmaxalb w1, w0, [x0] 3940 %r = atomicrmw max ptr %ptr, i8 %value acq_rel, align 1 3941 ret i8 %r 3942} 3943 3944define dso_local i8 @atomicrmw_max_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 3945; CHECK-LABEL: atomicrmw_max_i8_aligned_seq_cst: 3946; CHECK: ldsmaxalb w1, w0, [x0] 3947 %r = atomicrmw max ptr %ptr, i8 %value seq_cst, align 1 3948 ret i8 %r 3949} 3950 3951define dso_local i16 @atomicrmw_max_i16_aligned_monotonic(ptr %ptr, i16 %value) { 3952; CHECK-LABEL: atomicrmw_max_i16_aligned_monotonic: 3953; CHECK: ldsmaxh w1, w0, [x0] 3954 %r = atomicrmw max ptr %ptr, i16 %value monotonic, align 2 3955 ret i16 %r 3956} 3957 3958define dso_local i16 @atomicrmw_max_i16_aligned_acquire(ptr %ptr, i16 %value) { 3959; CHECK-LABEL: atomicrmw_max_i16_aligned_acquire: 3960; CHECK: ldsmaxah w1, w0, [x0] 3961 %r = atomicrmw max ptr %ptr, i16 %value acquire, align 2 3962 ret i16 %r 3963} 3964 3965define dso_local i16 @atomicrmw_max_i16_aligned_release(ptr %ptr, i16 %value) { 3966; CHECK-LABEL: atomicrmw_max_i16_aligned_release: 3967; CHECK: ldsmaxlh w1, w0, [x0] 3968 %r = atomicrmw max ptr %ptr, i16 %value release, align 2 3969 ret i16 %r 3970} 3971 3972define dso_local i16 @atomicrmw_max_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 3973; CHECK-LABEL: atomicrmw_max_i16_aligned_acq_rel: 3974; CHECK: ldsmaxalh w1, w0, [x0] 3975 %r = atomicrmw max ptr %ptr, i16 %value acq_rel, align 2 3976 ret i16 %r 3977} 3978 3979define dso_local i16 @atomicrmw_max_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 3980; CHECK-LABEL: atomicrmw_max_i16_aligned_seq_cst: 3981; CHECK: ldsmaxalh w1, w0, [x0] 3982 %r = atomicrmw max ptr %ptr, i16 %value seq_cst, align 2 3983 ret i16 %r 3984} 3985 3986define dso_local i32 @atomicrmw_max_i32_aligned_monotonic(ptr %ptr, i32 %value) { 3987; CHECK-LABEL: atomicrmw_max_i32_aligned_monotonic: 3988; CHECK: ldsmax w1, w0, [x0] 3989 %r = atomicrmw max ptr %ptr, i32 %value monotonic, align 4 3990 ret i32 %r 3991} 3992 3993define dso_local i32 @atomicrmw_max_i32_aligned_acquire(ptr %ptr, i32 %value) { 3994; CHECK-LABEL: atomicrmw_max_i32_aligned_acquire: 3995; CHECK: ldsmaxa w1, w0, [x0] 3996 %r = atomicrmw max ptr %ptr, i32 %value acquire, align 4 3997 ret i32 %r 3998} 3999 4000define dso_local i32 @atomicrmw_max_i32_aligned_release(ptr %ptr, i32 %value) { 4001; CHECK-LABEL: atomicrmw_max_i32_aligned_release: 4002; CHECK: ldsmaxl w1, w0, [x0] 4003 %r = atomicrmw max ptr %ptr, i32 %value release, align 4 4004 ret i32 %r 4005} 4006 4007define dso_local i32 @atomicrmw_max_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 4008; CHECK-LABEL: atomicrmw_max_i32_aligned_acq_rel: 4009; CHECK: ldsmaxal w1, w0, [x0] 4010 %r = atomicrmw max ptr %ptr, i32 %value acq_rel, align 4 4011 ret i32 %r 4012} 4013 4014define dso_local i32 @atomicrmw_max_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 4015; CHECK-LABEL: atomicrmw_max_i32_aligned_seq_cst: 4016; CHECK: ldsmaxal w1, w0, [x0] 4017 %r = atomicrmw max ptr %ptr, i32 %value seq_cst, align 4 4018 ret i32 %r 4019} 4020 4021define dso_local i64 @atomicrmw_max_i64_aligned_monotonic(ptr %ptr, i64 %value) { 4022; CHECK-LABEL: atomicrmw_max_i64_aligned_monotonic: 4023; CHECK: ldsmax x1, x0, [x0] 4024 %r = atomicrmw max ptr %ptr, i64 %value monotonic, align 8 4025 ret i64 %r 4026} 4027 4028define dso_local i64 @atomicrmw_max_i64_aligned_acquire(ptr %ptr, i64 %value) { 4029; CHECK-LABEL: atomicrmw_max_i64_aligned_acquire: 4030; CHECK: ldsmaxa x1, x0, [x0] 4031 %r = atomicrmw max ptr %ptr, i64 %value acquire, align 8 4032 ret i64 %r 4033} 4034 4035define dso_local i64 @atomicrmw_max_i64_aligned_release(ptr %ptr, i64 %value) { 4036; CHECK-LABEL: atomicrmw_max_i64_aligned_release: 4037; CHECK: ldsmaxl x1, x0, [x0] 4038 %r = atomicrmw max ptr %ptr, i64 %value release, align 8 4039 ret i64 %r 4040} 4041 4042define dso_local i64 @atomicrmw_max_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 4043; CHECK-LABEL: atomicrmw_max_i64_aligned_acq_rel: 4044; CHECK: ldsmaxal x1, x0, [x0] 4045 %r = atomicrmw max ptr %ptr, i64 %value acq_rel, align 8 4046 ret i64 %r 4047} 4048 4049define dso_local i64 @atomicrmw_max_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 4050; CHECK-LABEL: atomicrmw_max_i64_aligned_seq_cst: 4051; CHECK: ldsmaxal x1, x0, [x0] 4052 %r = atomicrmw max ptr %ptr, i64 %value seq_cst, align 8 4053 ret i64 %r 4054} 4055 4056define dso_local i128 @atomicrmw_max_i128_aligned_monotonic(ptr %ptr, i128 %value) { 4057; -O0-LABEL: atomicrmw_max_i128_aligned_monotonic: 4058; -O0: subs x9, x9, x12 4059; -O0: subs x11, x11, x10 4060; -O0: subs x13, x13, x10 4061; -O0: csel w11, w9, w11, eq 4062; -O0: ands w13, w11, #0x1 4063; -O0: csel x2, x9, x12, ne 4064; -O0: ands w11, w11, #0x1 4065; -O0: csel x9, x9, x10, ne 4066; -O0: casp x0, x1, x2, x3, [x8] 4067; -O0: eor x8, x10, x8 4068; -O0: eor x11, x9, x11 4069; -O0: orr x8, x8, x11 4070; -O0: subs x8, x8, #0 4071; 4072; -O1-LABEL: atomicrmw_max_i128_aligned_monotonic: 4073; -O1: ldp x4, x5, [x0] 4074; -O1: cmp x2, x4 4075; -O1: csel x9, x7, x3, lt 4076; -O1: csel x8, x4, x2, lt 4077; -O1: casp x4, x5, x8, x9, [x0] 4078; -O1: cmp x5, x7 4079; -O1: ccmp x4, x6, #0, eq 4080 %r = atomicrmw max ptr %ptr, i128 %value monotonic, align 16 4081 ret i128 %r 4082} 4083 4084define dso_local i128 @atomicrmw_max_i128_aligned_acquire(ptr %ptr, i128 %value) { 4085; -O0-LABEL: atomicrmw_max_i128_aligned_acquire: 4086; -O0: subs x9, x9, x12 4087; -O0: subs x11, x11, x10 4088; -O0: subs x13, x13, x10 4089; -O0: csel w11, w9, w11, eq 4090; -O0: ands w13, w11, #0x1 4091; -O0: csel x2, x9, x12, ne 4092; -O0: ands w11, w11, #0x1 4093; -O0: csel x9, x9, x10, ne 4094; -O0: caspa x0, x1, x2, x3, [x8] 4095; -O0: eor x8, x10, x8 4096; -O0: eor x11, x9, x11 4097; -O0: orr x8, x8, x11 4098; -O0: subs x8, x8, #0 4099; 4100; -O1-LABEL: atomicrmw_max_i128_aligned_acquire: 4101; -O1: ldp x4, x5, [x0] 4102; -O1: cmp x2, x4 4103; -O1: csel x9, x7, x3, lt 4104; -O1: csel x8, x4, x2, lt 4105; -O1: caspa x4, x5, x8, x9, [x0] 4106; -O1: cmp x5, x7 4107; -O1: ccmp x4, x6, #0, eq 4108 %r = atomicrmw max ptr %ptr, i128 %value acquire, align 16 4109 ret i128 %r 4110} 4111 4112define dso_local i128 @atomicrmw_max_i128_aligned_release(ptr %ptr, i128 %value) { 4113; -O0-LABEL: atomicrmw_max_i128_aligned_release: 4114; -O0: subs x9, x9, x12 4115; -O0: subs x11, x11, x10 4116; -O0: subs x13, x13, x10 4117; -O0: csel w11, w9, w11, eq 4118; -O0: ands w13, w11, #0x1 4119; -O0: csel x2, x9, x12, ne 4120; -O0: ands w11, w11, #0x1 4121; -O0: csel x9, x9, x10, ne 4122; -O0: caspl x0, x1, x2, x3, [x8] 4123; -O0: eor x8, x10, x8 4124; -O0: eor x11, x9, x11 4125; -O0: orr x8, x8, x11 4126; -O0: subs x8, x8, #0 4127; 4128; -O1-LABEL: atomicrmw_max_i128_aligned_release: 4129; -O1: ldp x4, x5, [x0] 4130; -O1: cmp x2, x4 4131; -O1: csel x9, x7, x3, lt 4132; -O1: csel x8, x4, x2, lt 4133; -O1: caspl x4, x5, x8, x9, [x0] 4134; -O1: cmp x5, x7 4135; -O1: ccmp x4, x6, #0, eq 4136 %r = atomicrmw max ptr %ptr, i128 %value release, align 16 4137 ret i128 %r 4138} 4139 4140define dso_local i128 @atomicrmw_max_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 4141; -O0-LABEL: atomicrmw_max_i128_aligned_acq_rel: 4142; -O0: subs x9, x9, x12 4143; -O0: subs x11, x11, x10 4144; -O0: subs x13, x13, x10 4145; -O0: csel w11, w9, w11, eq 4146; -O0: ands w13, w11, #0x1 4147; -O0: csel x2, x9, x12, ne 4148; -O0: ands w11, w11, #0x1 4149; -O0: csel x9, x9, x10, ne 4150; -O0: caspal x0, x1, x2, x3, [x8] 4151; -O0: eor x8, x10, x8 4152; -O0: eor x11, x9, x11 4153; -O0: orr x8, x8, x11 4154; -O0: subs x8, x8, #0 4155; 4156; -O1-LABEL: atomicrmw_max_i128_aligned_acq_rel: 4157; -O1: ldp x4, x5, [x0] 4158; -O1: cmp x2, x4 4159; -O1: csel x9, x7, x3, lt 4160; -O1: csel x8, x4, x2, lt 4161; -O1: caspal x4, x5, x8, x9, [x0] 4162; -O1: cmp x5, x7 4163; -O1: ccmp x4, x6, #0, eq 4164 %r = atomicrmw max ptr %ptr, i128 %value acq_rel, align 16 4165 ret i128 %r 4166} 4167 4168define dso_local i128 @atomicrmw_max_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 4169; -O0-LABEL: atomicrmw_max_i128_aligned_seq_cst: 4170; -O0: subs x9, x9, x12 4171; -O0: subs x11, x11, x10 4172; -O0: subs x13, x13, x10 4173; -O0: csel w11, w9, w11, eq 4174; -O0: ands w13, w11, #0x1 4175; -O0: csel x2, x9, x12, ne 4176; -O0: ands w11, w11, #0x1 4177; -O0: csel x9, x9, x10, ne 4178; -O0: caspal x0, x1, x2, x3, [x8] 4179; -O0: eor x8, x10, x8 4180; -O0: eor x11, x9, x11 4181; -O0: orr x8, x8, x11 4182; -O0: subs x8, x8, #0 4183; 4184; -O1-LABEL: atomicrmw_max_i128_aligned_seq_cst: 4185; -O1: ldp x4, x5, [x0] 4186; -O1: cmp x2, x4 4187; -O1: csel x9, x7, x3, lt 4188; -O1: csel x8, x4, x2, lt 4189; -O1: caspal x4, x5, x8, x9, [x0] 4190; -O1: cmp x5, x7 4191; -O1: ccmp x4, x6, #0, eq 4192 %r = atomicrmw max ptr %ptr, i128 %value seq_cst, align 16 4193 ret i128 %r 4194} 4195 4196define dso_local i8 @atomicrmw_max_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 4197; CHECK-LABEL: atomicrmw_max_i8_unaligned_monotonic: 4198; CHECK: ldsmaxb w1, w0, [x0] 4199 %r = atomicrmw max ptr %ptr, i8 %value monotonic, align 1 4200 ret i8 %r 4201} 4202 4203define dso_local i8 @atomicrmw_max_i8_unaligned_acquire(ptr %ptr, i8 %value) { 4204; CHECK-LABEL: atomicrmw_max_i8_unaligned_acquire: 4205; CHECK: ldsmaxab w1, w0, [x0] 4206 %r = atomicrmw max ptr %ptr, i8 %value acquire, align 1 4207 ret i8 %r 4208} 4209 4210define dso_local i8 @atomicrmw_max_i8_unaligned_release(ptr %ptr, i8 %value) { 4211; CHECK-LABEL: atomicrmw_max_i8_unaligned_release: 4212; CHECK: ldsmaxlb w1, w0, [x0] 4213 %r = atomicrmw max ptr %ptr, i8 %value release, align 1 4214 ret i8 %r 4215} 4216 4217define dso_local i8 @atomicrmw_max_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 4218; CHECK-LABEL: atomicrmw_max_i8_unaligned_acq_rel: 4219; CHECK: ldsmaxalb w1, w0, [x0] 4220 %r = atomicrmw max ptr %ptr, i8 %value acq_rel, align 1 4221 ret i8 %r 4222} 4223 4224define dso_local i8 @atomicrmw_max_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 4225; CHECK-LABEL: atomicrmw_max_i8_unaligned_seq_cst: 4226; CHECK: ldsmaxalb w1, w0, [x0] 4227 %r = atomicrmw max ptr %ptr, i8 %value seq_cst, align 1 4228 ret i8 %r 4229} 4230 4231define dso_local i16 @atomicrmw_max_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 4232; -O0-LABEL: atomicrmw_max_i16_unaligned_monotonic: 4233; -O0: sxth w10, w9 4234; -O0: subs w10, w10, w8, sxth 4235; -O0: csel w8, w9, w8, gt 4236; -O0: bl __atomic_compare_exchange 4237; 4238; -O1-LABEL: atomicrmw_max_i16_unaligned_monotonic: 4239; -O1: sxth w8, w0 4240; -O1: cmp w8, w20, sxth 4241; -O1: csel w8, w0, w20, gt 4242; -O1: bl __atomic_compare_exchange 4243 %r = atomicrmw max ptr %ptr, i16 %value monotonic, align 1 4244 ret i16 %r 4245} 4246 4247define dso_local i16 @atomicrmw_max_i16_unaligned_acquire(ptr %ptr, i16 %value) { 4248; -O0-LABEL: atomicrmw_max_i16_unaligned_acquire: 4249; -O0: sxth w10, w9 4250; -O0: subs w10, w10, w8, sxth 4251; -O0: csel w8, w9, w8, gt 4252; -O0: bl __atomic_compare_exchange 4253; 4254; -O1-LABEL: atomicrmw_max_i16_unaligned_acquire: 4255; -O1: sxth w8, w0 4256; -O1: cmp w8, w20, sxth 4257; -O1: csel w8, w0, w20, gt 4258; -O1: bl __atomic_compare_exchange 4259 %r = atomicrmw max ptr %ptr, i16 %value acquire, align 1 4260 ret i16 %r 4261} 4262 4263define dso_local i16 @atomicrmw_max_i16_unaligned_release(ptr %ptr, i16 %value) { 4264; -O0-LABEL: atomicrmw_max_i16_unaligned_release: 4265; -O0: sxth w10, w9 4266; -O0: subs w10, w10, w8, sxth 4267; -O0: csel w8, w9, w8, gt 4268; -O0: bl __atomic_compare_exchange 4269; 4270; -O1-LABEL: atomicrmw_max_i16_unaligned_release: 4271; -O1: sxth w8, w0 4272; -O1: cmp w8, w20, sxth 4273; -O1: csel w8, w0, w20, gt 4274; -O1: bl __atomic_compare_exchange 4275 %r = atomicrmw max ptr %ptr, i16 %value release, align 1 4276 ret i16 %r 4277} 4278 4279define dso_local i16 @atomicrmw_max_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 4280; -O0-LABEL: atomicrmw_max_i16_unaligned_acq_rel: 4281; -O0: sxth w10, w9 4282; -O0: subs w10, w10, w8, sxth 4283; -O0: csel w8, w9, w8, gt 4284; -O0: bl __atomic_compare_exchange 4285; 4286; -O1-LABEL: atomicrmw_max_i16_unaligned_acq_rel: 4287; -O1: sxth w8, w0 4288; -O1: cmp w8, w20, sxth 4289; -O1: csel w8, w0, w20, gt 4290; -O1: bl __atomic_compare_exchange 4291 %r = atomicrmw max ptr %ptr, i16 %value acq_rel, align 1 4292 ret i16 %r 4293} 4294 4295define dso_local i16 @atomicrmw_max_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 4296; -O0-LABEL: atomicrmw_max_i16_unaligned_seq_cst: 4297; -O0: sxth w10, w9 4298; -O0: subs w10, w10, w8, sxth 4299; -O0: csel w8, w9, w8, gt 4300; -O0: bl __atomic_compare_exchange 4301; 4302; -O1-LABEL: atomicrmw_max_i16_unaligned_seq_cst: 4303; -O1: sxth w8, w0 4304; -O1: cmp w8, w20, sxth 4305; -O1: csel w8, w0, w20, gt 4306; -O1: bl __atomic_compare_exchange 4307 %r = atomicrmw max ptr %ptr, i16 %value seq_cst, align 1 4308 ret i16 %r 4309} 4310 4311define dso_local i32 @atomicrmw_max_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 4312; -O0-LABEL: atomicrmw_max_i32_unaligned_monotonic: 4313; -O0: subs w10, w9, w8 4314; -O0: csel w8, w9, w8, gt 4315; -O0: bl __atomic_compare_exchange 4316; 4317; -O1-LABEL: atomicrmw_max_i32_unaligned_monotonic: 4318; -O1: cmp w0, w20 4319; -O1: csel w8, w0, w20, gt 4320; -O1: bl __atomic_compare_exchange 4321 %r = atomicrmw max ptr %ptr, i32 %value monotonic, align 1 4322 ret i32 %r 4323} 4324 4325define dso_local i32 @atomicrmw_max_i32_unaligned_acquire(ptr %ptr, i32 %value) { 4326; -O0-LABEL: atomicrmw_max_i32_unaligned_acquire: 4327; -O0: subs w10, w9, w8 4328; -O0: csel w8, w9, w8, gt 4329; -O0: bl __atomic_compare_exchange 4330; 4331; -O1-LABEL: atomicrmw_max_i32_unaligned_acquire: 4332; -O1: cmp w0, w20 4333; -O1: csel w8, w0, w20, gt 4334; -O1: bl __atomic_compare_exchange 4335 %r = atomicrmw max ptr %ptr, i32 %value acquire, align 1 4336 ret i32 %r 4337} 4338 4339define dso_local i32 @atomicrmw_max_i32_unaligned_release(ptr %ptr, i32 %value) { 4340; -O0-LABEL: atomicrmw_max_i32_unaligned_release: 4341; -O0: subs w10, w9, w8 4342; -O0: csel w8, w9, w8, gt 4343; -O0: bl __atomic_compare_exchange 4344; 4345; -O1-LABEL: atomicrmw_max_i32_unaligned_release: 4346; -O1: cmp w0, w20 4347; -O1: csel w8, w0, w20, gt 4348; -O1: bl __atomic_compare_exchange 4349 %r = atomicrmw max ptr %ptr, i32 %value release, align 1 4350 ret i32 %r 4351} 4352 4353define dso_local i32 @atomicrmw_max_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 4354; -O0-LABEL: atomicrmw_max_i32_unaligned_acq_rel: 4355; -O0: subs w10, w9, w8 4356; -O0: csel w8, w9, w8, gt 4357; -O0: bl __atomic_compare_exchange 4358; 4359; -O1-LABEL: atomicrmw_max_i32_unaligned_acq_rel: 4360; -O1: cmp w0, w20 4361; -O1: csel w8, w0, w20, gt 4362; -O1: bl __atomic_compare_exchange 4363 %r = atomicrmw max ptr %ptr, i32 %value acq_rel, align 1 4364 ret i32 %r 4365} 4366 4367define dso_local i32 @atomicrmw_max_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 4368; -O0-LABEL: atomicrmw_max_i32_unaligned_seq_cst: 4369; -O0: subs w10, w9, w8 4370; -O0: csel w8, w9, w8, gt 4371; -O0: bl __atomic_compare_exchange 4372; 4373; -O1-LABEL: atomicrmw_max_i32_unaligned_seq_cst: 4374; -O1: cmp w0, w20 4375; -O1: csel w8, w0, w20, gt 4376; -O1: bl __atomic_compare_exchange 4377 %r = atomicrmw max ptr %ptr, i32 %value seq_cst, align 1 4378 ret i32 %r 4379} 4380 4381define dso_local i64 @atomicrmw_max_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 4382; -O0-LABEL: atomicrmw_max_i64_unaligned_monotonic: 4383; -O0: subs x10, x9, x8 4384; -O0: csel x8, x9, x8, gt 4385; -O0: bl __atomic_compare_exchange 4386; 4387; -O1-LABEL: atomicrmw_max_i64_unaligned_monotonic: 4388; -O1: cmp x0, x20 4389; -O1: csel x8, x0, x20, gt 4390; -O1: bl __atomic_compare_exchange 4391 %r = atomicrmw max ptr %ptr, i64 %value monotonic, align 1 4392 ret i64 %r 4393} 4394 4395define dso_local i64 @atomicrmw_max_i64_unaligned_acquire(ptr %ptr, i64 %value) { 4396; -O0-LABEL: atomicrmw_max_i64_unaligned_acquire: 4397; -O0: subs x10, x9, x8 4398; -O0: csel x8, x9, x8, gt 4399; -O0: bl __atomic_compare_exchange 4400; 4401; -O1-LABEL: atomicrmw_max_i64_unaligned_acquire: 4402; -O1: cmp x0, x20 4403; -O1: csel x8, x0, x20, gt 4404; -O1: bl __atomic_compare_exchange 4405 %r = atomicrmw max ptr %ptr, i64 %value acquire, align 1 4406 ret i64 %r 4407} 4408 4409define dso_local i64 @atomicrmw_max_i64_unaligned_release(ptr %ptr, i64 %value) { 4410; -O0-LABEL: atomicrmw_max_i64_unaligned_release: 4411; -O0: subs x10, x9, x8 4412; -O0: csel x8, x9, x8, gt 4413; -O0: bl __atomic_compare_exchange 4414; 4415; -O1-LABEL: atomicrmw_max_i64_unaligned_release: 4416; -O1: cmp x0, x20 4417; -O1: csel x8, x0, x20, gt 4418; -O1: bl __atomic_compare_exchange 4419 %r = atomicrmw max ptr %ptr, i64 %value release, align 1 4420 ret i64 %r 4421} 4422 4423define dso_local i64 @atomicrmw_max_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 4424; -O0-LABEL: atomicrmw_max_i64_unaligned_acq_rel: 4425; -O0: subs x10, x9, x8 4426; -O0: csel x8, x9, x8, gt 4427; -O0: bl __atomic_compare_exchange 4428; 4429; -O1-LABEL: atomicrmw_max_i64_unaligned_acq_rel: 4430; -O1: cmp x0, x20 4431; -O1: csel x8, x0, x20, gt 4432; -O1: bl __atomic_compare_exchange 4433 %r = atomicrmw max ptr %ptr, i64 %value acq_rel, align 1 4434 ret i64 %r 4435} 4436 4437define dso_local i64 @atomicrmw_max_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 4438; -O0-LABEL: atomicrmw_max_i64_unaligned_seq_cst: 4439; -O0: subs x10, x9, x8 4440; -O0: csel x8, x9, x8, gt 4441; -O0: bl __atomic_compare_exchange 4442; 4443; -O1-LABEL: atomicrmw_max_i64_unaligned_seq_cst: 4444; -O1: cmp x0, x20 4445; -O1: csel x8, x0, x20, gt 4446; -O1: bl __atomic_compare_exchange 4447 %r = atomicrmw max ptr %ptr, i64 %value seq_cst, align 1 4448 ret i64 %r 4449} 4450 4451define dso_local i128 @atomicrmw_max_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 4452; -O0-LABEL: atomicrmw_max_i128_unaligned_monotonic: 4453; -O0: subs x8, x8, x9 4454; -O0: subs x11, x11, x10 4455; -O0: subs x12, x12, x10 4456; -O0: csel w11, w8, w11, eq 4457; -O0: ands w12, w11, #0x1 4458; -O0: csel x9, x8, x9, ne 4459; -O0: ands w11, w11, #0x1 4460; -O0: csel x8, x8, x10, ne 4461; -O0: bl __atomic_compare_exchange 4462; 4463; -O1-LABEL: atomicrmw_max_i128_unaligned_monotonic: 4464; -O1: ldp x0, x1, [x0] 4465; -O1: cmp x21, x0 4466; -O1: csel x8, x1, x19, lt 4467; -O1: csel x9, x0, x21, lt 4468; -O1: bl __atomic_compare_exchange 4469 %r = atomicrmw max ptr %ptr, i128 %value monotonic, align 1 4470 ret i128 %r 4471} 4472 4473define dso_local i128 @atomicrmw_max_i128_unaligned_acquire(ptr %ptr, i128 %value) { 4474; -O0-LABEL: atomicrmw_max_i128_unaligned_acquire: 4475; -O0: subs x8, x8, x9 4476; -O0: subs x11, x11, x10 4477; -O0: subs x12, x12, x10 4478; -O0: csel w11, w8, w11, eq 4479; -O0: ands w12, w11, #0x1 4480; -O0: csel x9, x8, x9, ne 4481; -O0: ands w11, w11, #0x1 4482; -O0: csel x8, x8, x10, ne 4483; -O0: bl __atomic_compare_exchange 4484; 4485; -O1-LABEL: atomicrmw_max_i128_unaligned_acquire: 4486; -O1: ldp x0, x1, [x0] 4487; -O1: cmp x21, x0 4488; -O1: csel x8, x1, x19, lt 4489; -O1: csel x9, x0, x21, lt 4490; -O1: bl __atomic_compare_exchange 4491 %r = atomicrmw max ptr %ptr, i128 %value acquire, align 1 4492 ret i128 %r 4493} 4494 4495define dso_local i128 @atomicrmw_max_i128_unaligned_release(ptr %ptr, i128 %value) { 4496; -O0-LABEL: atomicrmw_max_i128_unaligned_release: 4497; -O0: subs x8, x8, x9 4498; -O0: subs x11, x11, x10 4499; -O0: subs x12, x12, x10 4500; -O0: csel w11, w8, w11, eq 4501; -O0: ands w12, w11, #0x1 4502; -O0: csel x9, x8, x9, ne 4503; -O0: ands w11, w11, #0x1 4504; -O0: csel x8, x8, x10, ne 4505; -O0: bl __atomic_compare_exchange 4506; 4507; -O1-LABEL: atomicrmw_max_i128_unaligned_release: 4508; -O1: ldp x0, x1, [x0] 4509; -O1: cmp x21, x0 4510; -O1: csel x8, x1, x19, lt 4511; -O1: csel x9, x0, x21, lt 4512; -O1: bl __atomic_compare_exchange 4513 %r = atomicrmw max ptr %ptr, i128 %value release, align 1 4514 ret i128 %r 4515} 4516 4517define dso_local i128 @atomicrmw_max_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 4518; -O0-LABEL: atomicrmw_max_i128_unaligned_acq_rel: 4519; -O0: subs x8, x8, x9 4520; -O0: subs x11, x11, x10 4521; -O0: subs x12, x12, x10 4522; -O0: csel w11, w8, w11, eq 4523; -O0: ands w12, w11, #0x1 4524; -O0: csel x9, x8, x9, ne 4525; -O0: ands w11, w11, #0x1 4526; -O0: csel x8, x8, x10, ne 4527; -O0: bl __atomic_compare_exchange 4528; 4529; -O1-LABEL: atomicrmw_max_i128_unaligned_acq_rel: 4530; -O1: ldp x0, x1, [x0] 4531; -O1: cmp x21, x0 4532; -O1: csel x8, x1, x19, lt 4533; -O1: csel x9, x0, x21, lt 4534; -O1: bl __atomic_compare_exchange 4535 %r = atomicrmw max ptr %ptr, i128 %value acq_rel, align 1 4536 ret i128 %r 4537} 4538 4539define dso_local i128 @atomicrmw_max_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 4540; -O0-LABEL: atomicrmw_max_i128_unaligned_seq_cst: 4541; -O0: subs x8, x8, x9 4542; -O0: subs x11, x11, x10 4543; -O0: subs x12, x12, x10 4544; -O0: csel w11, w8, w11, eq 4545; -O0: ands w12, w11, #0x1 4546; -O0: csel x9, x8, x9, ne 4547; -O0: ands w11, w11, #0x1 4548; -O0: csel x8, x8, x10, ne 4549; -O0: bl __atomic_compare_exchange 4550; 4551; -O1-LABEL: atomicrmw_max_i128_unaligned_seq_cst: 4552; -O1: ldp x0, x1, [x0] 4553; -O1: cmp x21, x0 4554; -O1: csel x8, x1, x19, lt 4555; -O1: csel x9, x0, x21, lt 4556; -O1: bl __atomic_compare_exchange 4557 %r = atomicrmw max ptr %ptr, i128 %value seq_cst, align 1 4558 ret i128 %r 4559} 4560 4561define dso_local i8 @atomicrmw_min_i8_aligned_monotonic(ptr %ptr, i8 %value) { 4562; CHECK-LABEL: atomicrmw_min_i8_aligned_monotonic: 4563; CHECK: ldsminb w1, w0, [x0] 4564 %r = atomicrmw min ptr %ptr, i8 %value monotonic, align 1 4565 ret i8 %r 4566} 4567 4568define dso_local i8 @atomicrmw_min_i8_aligned_acquire(ptr %ptr, i8 %value) { 4569; CHECK-LABEL: atomicrmw_min_i8_aligned_acquire: 4570; CHECK: ldsminab w1, w0, [x0] 4571 %r = atomicrmw min ptr %ptr, i8 %value acquire, align 1 4572 ret i8 %r 4573} 4574 4575define dso_local i8 @atomicrmw_min_i8_aligned_release(ptr %ptr, i8 %value) { 4576; CHECK-LABEL: atomicrmw_min_i8_aligned_release: 4577; CHECK: ldsminlb w1, w0, [x0] 4578 %r = atomicrmw min ptr %ptr, i8 %value release, align 1 4579 ret i8 %r 4580} 4581 4582define dso_local i8 @atomicrmw_min_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 4583; CHECK-LABEL: atomicrmw_min_i8_aligned_acq_rel: 4584; CHECK: ldsminalb w1, w0, [x0] 4585 %r = atomicrmw min ptr %ptr, i8 %value acq_rel, align 1 4586 ret i8 %r 4587} 4588 4589define dso_local i8 @atomicrmw_min_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 4590; CHECK-LABEL: atomicrmw_min_i8_aligned_seq_cst: 4591; CHECK: ldsminalb w1, w0, [x0] 4592 %r = atomicrmw min ptr %ptr, i8 %value seq_cst, align 1 4593 ret i8 %r 4594} 4595 4596define dso_local i16 @atomicrmw_min_i16_aligned_monotonic(ptr %ptr, i16 %value) { 4597; CHECK-LABEL: atomicrmw_min_i16_aligned_monotonic: 4598; CHECK: ldsminh w1, w0, [x0] 4599 %r = atomicrmw min ptr %ptr, i16 %value monotonic, align 2 4600 ret i16 %r 4601} 4602 4603define dso_local i16 @atomicrmw_min_i16_aligned_acquire(ptr %ptr, i16 %value) { 4604; CHECK-LABEL: atomicrmw_min_i16_aligned_acquire: 4605; CHECK: ldsminah w1, w0, [x0] 4606 %r = atomicrmw min ptr %ptr, i16 %value acquire, align 2 4607 ret i16 %r 4608} 4609 4610define dso_local i16 @atomicrmw_min_i16_aligned_release(ptr %ptr, i16 %value) { 4611; CHECK-LABEL: atomicrmw_min_i16_aligned_release: 4612; CHECK: ldsminlh w1, w0, [x0] 4613 %r = atomicrmw min ptr %ptr, i16 %value release, align 2 4614 ret i16 %r 4615} 4616 4617define dso_local i16 @atomicrmw_min_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 4618; CHECK-LABEL: atomicrmw_min_i16_aligned_acq_rel: 4619; CHECK: ldsminalh w1, w0, [x0] 4620 %r = atomicrmw min ptr %ptr, i16 %value acq_rel, align 2 4621 ret i16 %r 4622} 4623 4624define dso_local i16 @atomicrmw_min_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 4625; CHECK-LABEL: atomicrmw_min_i16_aligned_seq_cst: 4626; CHECK: ldsminalh w1, w0, [x0] 4627 %r = atomicrmw min ptr %ptr, i16 %value seq_cst, align 2 4628 ret i16 %r 4629} 4630 4631define dso_local i32 @atomicrmw_min_i32_aligned_monotonic(ptr %ptr, i32 %value) { 4632; CHECK-LABEL: atomicrmw_min_i32_aligned_monotonic: 4633; CHECK: ldsmin w1, w0, [x0] 4634 %r = atomicrmw min ptr %ptr, i32 %value monotonic, align 4 4635 ret i32 %r 4636} 4637 4638define dso_local i32 @atomicrmw_min_i32_aligned_acquire(ptr %ptr, i32 %value) { 4639; CHECK-LABEL: atomicrmw_min_i32_aligned_acquire: 4640; CHECK: ldsmina w1, w0, [x0] 4641 %r = atomicrmw min ptr %ptr, i32 %value acquire, align 4 4642 ret i32 %r 4643} 4644 4645define dso_local i32 @atomicrmw_min_i32_aligned_release(ptr %ptr, i32 %value) { 4646; CHECK-LABEL: atomicrmw_min_i32_aligned_release: 4647; CHECK: ldsminl w1, w0, [x0] 4648 %r = atomicrmw min ptr %ptr, i32 %value release, align 4 4649 ret i32 %r 4650} 4651 4652define dso_local i32 @atomicrmw_min_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 4653; CHECK-LABEL: atomicrmw_min_i32_aligned_acq_rel: 4654; CHECK: ldsminal w1, w0, [x0] 4655 %r = atomicrmw min ptr %ptr, i32 %value acq_rel, align 4 4656 ret i32 %r 4657} 4658 4659define dso_local i32 @atomicrmw_min_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 4660; CHECK-LABEL: atomicrmw_min_i32_aligned_seq_cst: 4661; CHECK: ldsminal w1, w0, [x0] 4662 %r = atomicrmw min ptr %ptr, i32 %value seq_cst, align 4 4663 ret i32 %r 4664} 4665 4666define dso_local i64 @atomicrmw_min_i64_aligned_monotonic(ptr %ptr, i64 %value) { 4667; CHECK-LABEL: atomicrmw_min_i64_aligned_monotonic: 4668; CHECK: ldsmin x1, x0, [x0] 4669 %r = atomicrmw min ptr %ptr, i64 %value monotonic, align 8 4670 ret i64 %r 4671} 4672 4673define dso_local i64 @atomicrmw_min_i64_aligned_acquire(ptr %ptr, i64 %value) { 4674; CHECK-LABEL: atomicrmw_min_i64_aligned_acquire: 4675; CHECK: ldsmina x1, x0, [x0] 4676 %r = atomicrmw min ptr %ptr, i64 %value acquire, align 8 4677 ret i64 %r 4678} 4679 4680define dso_local i64 @atomicrmw_min_i64_aligned_release(ptr %ptr, i64 %value) { 4681; CHECK-LABEL: atomicrmw_min_i64_aligned_release: 4682; CHECK: ldsminl x1, x0, [x0] 4683 %r = atomicrmw min ptr %ptr, i64 %value release, align 8 4684 ret i64 %r 4685} 4686 4687define dso_local i64 @atomicrmw_min_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 4688; CHECK-LABEL: atomicrmw_min_i64_aligned_acq_rel: 4689; CHECK: ldsminal x1, x0, [x0] 4690 %r = atomicrmw min ptr %ptr, i64 %value acq_rel, align 8 4691 ret i64 %r 4692} 4693 4694define dso_local i64 @atomicrmw_min_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 4695; CHECK-LABEL: atomicrmw_min_i64_aligned_seq_cst: 4696; CHECK: ldsminal x1, x0, [x0] 4697 %r = atomicrmw min ptr %ptr, i64 %value seq_cst, align 8 4698 ret i64 %r 4699} 4700 4701define dso_local i128 @atomicrmw_min_i128_aligned_monotonic(ptr %ptr, i128 %value) { 4702; -O0-LABEL: atomicrmw_min_i128_aligned_monotonic: 4703; -O0: subs x9, x9, x12 4704; -O0: subs x11, x11, x10 4705; -O0: subs x13, x13, x10 4706; -O0: csel w11, w9, w11, eq 4707; -O0: ands w13, w11, #0x1 4708; -O0: csel x2, x9, x12, ne 4709; -O0: ands w11, w11, #0x1 4710; -O0: csel x9, x9, x10, ne 4711; -O0: casp x0, x1, x2, x3, [x8] 4712; -O0: eor x8, x10, x8 4713; -O0: eor x11, x9, x11 4714; -O0: orr x8, x8, x11 4715; -O0: subs x8, x8, #0 4716; 4717; -O1-LABEL: atomicrmw_min_i128_aligned_monotonic: 4718; -O1: ldp x4, x5, [x0] 4719; -O1: cmp x2, x4 4720; -O1: csel x9, x7, x3, ge 4721; -O1: csel x8, x4, x2, ge 4722; -O1: casp x4, x5, x8, x9, [x0] 4723; -O1: cmp x5, x7 4724; -O1: ccmp x4, x6, #0, eq 4725 %r = atomicrmw min ptr %ptr, i128 %value monotonic, align 16 4726 ret i128 %r 4727} 4728 4729define dso_local i128 @atomicrmw_min_i128_aligned_acquire(ptr %ptr, i128 %value) { 4730; -O0-LABEL: atomicrmw_min_i128_aligned_acquire: 4731; -O0: subs x9, x9, x12 4732; -O0: subs x11, x11, x10 4733; -O0: subs x13, x13, x10 4734; -O0: csel w11, w9, w11, eq 4735; -O0: ands w13, w11, #0x1 4736; -O0: csel x2, x9, x12, ne 4737; -O0: ands w11, w11, #0x1 4738; -O0: csel x9, x9, x10, ne 4739; -O0: caspa x0, x1, x2, x3, [x8] 4740; -O0: eor x8, x10, x8 4741; -O0: eor x11, x9, x11 4742; -O0: orr x8, x8, x11 4743; -O0: subs x8, x8, #0 4744; 4745; -O1-LABEL: atomicrmw_min_i128_aligned_acquire: 4746; -O1: ldp x4, x5, [x0] 4747; -O1: cmp x2, x4 4748; -O1: csel x9, x7, x3, ge 4749; -O1: csel x8, x4, x2, ge 4750; -O1: caspa x4, x5, x8, x9, [x0] 4751; -O1: cmp x5, x7 4752; -O1: ccmp x4, x6, #0, eq 4753 %r = atomicrmw min ptr %ptr, i128 %value acquire, align 16 4754 ret i128 %r 4755} 4756 4757define dso_local i128 @atomicrmw_min_i128_aligned_release(ptr %ptr, i128 %value) { 4758; -O0-LABEL: atomicrmw_min_i128_aligned_release: 4759; -O0: subs x9, x9, x12 4760; -O0: subs x11, x11, x10 4761; -O0: subs x13, x13, x10 4762; -O0: csel w11, w9, w11, eq 4763; -O0: ands w13, w11, #0x1 4764; -O0: csel x2, x9, x12, ne 4765; -O0: ands w11, w11, #0x1 4766; -O0: csel x9, x9, x10, ne 4767; -O0: caspl x0, x1, x2, x3, [x8] 4768; -O0: eor x8, x10, x8 4769; -O0: eor x11, x9, x11 4770; -O0: orr x8, x8, x11 4771; -O0: subs x8, x8, #0 4772; 4773; -O1-LABEL: atomicrmw_min_i128_aligned_release: 4774; -O1: ldp x4, x5, [x0] 4775; -O1: cmp x2, x4 4776; -O1: csel x9, x7, x3, ge 4777; -O1: csel x8, x4, x2, ge 4778; -O1: caspl x4, x5, x8, x9, [x0] 4779; -O1: cmp x5, x7 4780; -O1: ccmp x4, x6, #0, eq 4781 %r = atomicrmw min ptr %ptr, i128 %value release, align 16 4782 ret i128 %r 4783} 4784 4785define dso_local i128 @atomicrmw_min_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 4786; -O0-LABEL: atomicrmw_min_i128_aligned_acq_rel: 4787; -O0: subs x9, x9, x12 4788; -O0: subs x11, x11, x10 4789; -O0: subs x13, x13, x10 4790; -O0: csel w11, w9, w11, eq 4791; -O0: ands w13, w11, #0x1 4792; -O0: csel x2, x9, x12, ne 4793; -O0: ands w11, w11, #0x1 4794; -O0: csel x9, x9, x10, ne 4795; -O0: caspal x0, x1, x2, x3, [x8] 4796; -O0: eor x8, x10, x8 4797; -O0: eor x11, x9, x11 4798; -O0: orr x8, x8, x11 4799; -O0: subs x8, x8, #0 4800; 4801; -O1-LABEL: atomicrmw_min_i128_aligned_acq_rel: 4802; -O1: ldp x4, x5, [x0] 4803; -O1: cmp x2, x4 4804; -O1: csel x9, x7, x3, ge 4805; -O1: csel x8, x4, x2, ge 4806; -O1: caspal x4, x5, x8, x9, [x0] 4807; -O1: cmp x5, x7 4808; -O1: ccmp x4, x6, #0, eq 4809 %r = atomicrmw min ptr %ptr, i128 %value acq_rel, align 16 4810 ret i128 %r 4811} 4812 4813define dso_local i128 @atomicrmw_min_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 4814; -O0-LABEL: atomicrmw_min_i128_aligned_seq_cst: 4815; -O0: subs x9, x9, x12 4816; -O0: subs x11, x11, x10 4817; -O0: subs x13, x13, x10 4818; -O0: csel w11, w9, w11, eq 4819; -O0: ands w13, w11, #0x1 4820; -O0: csel x2, x9, x12, ne 4821; -O0: ands w11, w11, #0x1 4822; -O0: csel x9, x9, x10, ne 4823; -O0: caspal x0, x1, x2, x3, [x8] 4824; -O0: eor x8, x10, x8 4825; -O0: eor x11, x9, x11 4826; -O0: orr x8, x8, x11 4827; -O0: subs x8, x8, #0 4828; 4829; -O1-LABEL: atomicrmw_min_i128_aligned_seq_cst: 4830; -O1: ldp x4, x5, [x0] 4831; -O1: cmp x2, x4 4832; -O1: csel x9, x7, x3, ge 4833; -O1: csel x8, x4, x2, ge 4834; -O1: caspal x4, x5, x8, x9, [x0] 4835; -O1: cmp x5, x7 4836; -O1: ccmp x4, x6, #0, eq 4837 %r = atomicrmw min ptr %ptr, i128 %value seq_cst, align 16 4838 ret i128 %r 4839} 4840 4841define dso_local i8 @atomicrmw_min_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 4842; CHECK-LABEL: atomicrmw_min_i8_unaligned_monotonic: 4843; CHECK: ldsminb w1, w0, [x0] 4844 %r = atomicrmw min ptr %ptr, i8 %value monotonic, align 1 4845 ret i8 %r 4846} 4847 4848define dso_local i8 @atomicrmw_min_i8_unaligned_acquire(ptr %ptr, i8 %value) { 4849; CHECK-LABEL: atomicrmw_min_i8_unaligned_acquire: 4850; CHECK: ldsminab w1, w0, [x0] 4851 %r = atomicrmw min ptr %ptr, i8 %value acquire, align 1 4852 ret i8 %r 4853} 4854 4855define dso_local i8 @atomicrmw_min_i8_unaligned_release(ptr %ptr, i8 %value) { 4856; CHECK-LABEL: atomicrmw_min_i8_unaligned_release: 4857; CHECK: ldsminlb w1, w0, [x0] 4858 %r = atomicrmw min ptr %ptr, i8 %value release, align 1 4859 ret i8 %r 4860} 4861 4862define dso_local i8 @atomicrmw_min_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 4863; CHECK-LABEL: atomicrmw_min_i8_unaligned_acq_rel: 4864; CHECK: ldsminalb w1, w0, [x0] 4865 %r = atomicrmw min ptr %ptr, i8 %value acq_rel, align 1 4866 ret i8 %r 4867} 4868 4869define dso_local i8 @atomicrmw_min_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 4870; CHECK-LABEL: atomicrmw_min_i8_unaligned_seq_cst: 4871; CHECK: ldsminalb w1, w0, [x0] 4872 %r = atomicrmw min ptr %ptr, i8 %value seq_cst, align 1 4873 ret i8 %r 4874} 4875 4876define dso_local i16 @atomicrmw_min_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 4877; -O0-LABEL: atomicrmw_min_i16_unaligned_monotonic: 4878; -O0: sxth w10, w9 4879; -O0: subs w10, w10, w8, sxth 4880; -O0: csel w8, w9, w8, le 4881; -O0: bl __atomic_compare_exchange 4882; 4883; -O1-LABEL: atomicrmw_min_i16_unaligned_monotonic: 4884; -O1: sxth w8, w0 4885; -O1: cmp w8, w20, sxth 4886; -O1: csel w8, w0, w20, le 4887; -O1: bl __atomic_compare_exchange 4888 %r = atomicrmw min ptr %ptr, i16 %value monotonic, align 1 4889 ret i16 %r 4890} 4891 4892define dso_local i16 @atomicrmw_min_i16_unaligned_acquire(ptr %ptr, i16 %value) { 4893; -O0-LABEL: atomicrmw_min_i16_unaligned_acquire: 4894; -O0: sxth w10, w9 4895; -O0: subs w10, w10, w8, sxth 4896; -O0: csel w8, w9, w8, le 4897; -O0: bl __atomic_compare_exchange 4898; 4899; -O1-LABEL: atomicrmw_min_i16_unaligned_acquire: 4900; -O1: sxth w8, w0 4901; -O1: cmp w8, w20, sxth 4902; -O1: csel w8, w0, w20, le 4903; -O1: bl __atomic_compare_exchange 4904 %r = atomicrmw min ptr %ptr, i16 %value acquire, align 1 4905 ret i16 %r 4906} 4907 4908define dso_local i16 @atomicrmw_min_i16_unaligned_release(ptr %ptr, i16 %value) { 4909; -O0-LABEL: atomicrmw_min_i16_unaligned_release: 4910; -O0: sxth w10, w9 4911; -O0: subs w10, w10, w8, sxth 4912; -O0: csel w8, w9, w8, le 4913; -O0: bl __atomic_compare_exchange 4914; 4915; -O1-LABEL: atomicrmw_min_i16_unaligned_release: 4916; -O1: sxth w8, w0 4917; -O1: cmp w8, w20, sxth 4918; -O1: csel w8, w0, w20, le 4919; -O1: bl __atomic_compare_exchange 4920 %r = atomicrmw min ptr %ptr, i16 %value release, align 1 4921 ret i16 %r 4922} 4923 4924define dso_local i16 @atomicrmw_min_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 4925; -O0-LABEL: atomicrmw_min_i16_unaligned_acq_rel: 4926; -O0: sxth w10, w9 4927; -O0: subs w10, w10, w8, sxth 4928; -O0: csel w8, w9, w8, le 4929; -O0: bl __atomic_compare_exchange 4930; 4931; -O1-LABEL: atomicrmw_min_i16_unaligned_acq_rel: 4932; -O1: sxth w8, w0 4933; -O1: cmp w8, w20, sxth 4934; -O1: csel w8, w0, w20, le 4935; -O1: bl __atomic_compare_exchange 4936 %r = atomicrmw min ptr %ptr, i16 %value acq_rel, align 1 4937 ret i16 %r 4938} 4939 4940define dso_local i16 @atomicrmw_min_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 4941; -O0-LABEL: atomicrmw_min_i16_unaligned_seq_cst: 4942; -O0: sxth w10, w9 4943; -O0: subs w10, w10, w8, sxth 4944; -O0: csel w8, w9, w8, le 4945; -O0: bl __atomic_compare_exchange 4946; 4947; -O1-LABEL: atomicrmw_min_i16_unaligned_seq_cst: 4948; -O1: sxth w8, w0 4949; -O1: cmp w8, w20, sxth 4950; -O1: csel w8, w0, w20, le 4951; -O1: bl __atomic_compare_exchange 4952 %r = atomicrmw min ptr %ptr, i16 %value seq_cst, align 1 4953 ret i16 %r 4954} 4955 4956define dso_local i32 @atomicrmw_min_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 4957; -O0-LABEL: atomicrmw_min_i32_unaligned_monotonic: 4958; -O0: subs w10, w9, w8 4959; -O0: csel w8, w9, w8, le 4960; -O0: bl __atomic_compare_exchange 4961; 4962; -O1-LABEL: atomicrmw_min_i32_unaligned_monotonic: 4963; -O1: cmp w0, w20 4964; -O1: csel w8, w0, w20, le 4965; -O1: bl __atomic_compare_exchange 4966 %r = atomicrmw min ptr %ptr, i32 %value monotonic, align 1 4967 ret i32 %r 4968} 4969 4970define dso_local i32 @atomicrmw_min_i32_unaligned_acquire(ptr %ptr, i32 %value) { 4971; -O0-LABEL: atomicrmw_min_i32_unaligned_acquire: 4972; -O0: subs w10, w9, w8 4973; -O0: csel w8, w9, w8, le 4974; -O0: bl __atomic_compare_exchange 4975; 4976; -O1-LABEL: atomicrmw_min_i32_unaligned_acquire: 4977; -O1: cmp w0, w20 4978; -O1: csel w8, w0, w20, le 4979; -O1: bl __atomic_compare_exchange 4980 %r = atomicrmw min ptr %ptr, i32 %value acquire, align 1 4981 ret i32 %r 4982} 4983 4984define dso_local i32 @atomicrmw_min_i32_unaligned_release(ptr %ptr, i32 %value) { 4985; -O0-LABEL: atomicrmw_min_i32_unaligned_release: 4986; -O0: subs w10, w9, w8 4987; -O0: csel w8, w9, w8, le 4988; -O0: bl __atomic_compare_exchange 4989; 4990; -O1-LABEL: atomicrmw_min_i32_unaligned_release: 4991; -O1: cmp w0, w20 4992; -O1: csel w8, w0, w20, le 4993; -O1: bl __atomic_compare_exchange 4994 %r = atomicrmw min ptr %ptr, i32 %value release, align 1 4995 ret i32 %r 4996} 4997 4998define dso_local i32 @atomicrmw_min_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 4999; -O0-LABEL: atomicrmw_min_i32_unaligned_acq_rel: 5000; -O0: subs w10, w9, w8 5001; -O0: csel w8, w9, w8, le 5002; -O0: bl __atomic_compare_exchange 5003; 5004; -O1-LABEL: atomicrmw_min_i32_unaligned_acq_rel: 5005; -O1: cmp w0, w20 5006; -O1: csel w8, w0, w20, le 5007; -O1: bl __atomic_compare_exchange 5008 %r = atomicrmw min ptr %ptr, i32 %value acq_rel, align 1 5009 ret i32 %r 5010} 5011 5012define dso_local i32 @atomicrmw_min_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 5013; -O0-LABEL: atomicrmw_min_i32_unaligned_seq_cst: 5014; -O0: subs w10, w9, w8 5015; -O0: csel w8, w9, w8, le 5016; -O0: bl __atomic_compare_exchange 5017; 5018; -O1-LABEL: atomicrmw_min_i32_unaligned_seq_cst: 5019; -O1: cmp w0, w20 5020; -O1: csel w8, w0, w20, le 5021; -O1: bl __atomic_compare_exchange 5022 %r = atomicrmw min ptr %ptr, i32 %value seq_cst, align 1 5023 ret i32 %r 5024} 5025 5026define dso_local i64 @atomicrmw_min_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 5027; -O0-LABEL: atomicrmw_min_i64_unaligned_monotonic: 5028; -O0: subs x10, x9, x8 5029; -O0: csel x8, x9, x8, le 5030; -O0: bl __atomic_compare_exchange 5031; 5032; -O1-LABEL: atomicrmw_min_i64_unaligned_monotonic: 5033; -O1: cmp x0, x20 5034; -O1: csel x8, x0, x20, le 5035; -O1: bl __atomic_compare_exchange 5036 %r = atomicrmw min ptr %ptr, i64 %value monotonic, align 1 5037 ret i64 %r 5038} 5039 5040define dso_local i64 @atomicrmw_min_i64_unaligned_acquire(ptr %ptr, i64 %value) { 5041; -O0-LABEL: atomicrmw_min_i64_unaligned_acquire: 5042; -O0: subs x10, x9, x8 5043; -O0: csel x8, x9, x8, le 5044; -O0: bl __atomic_compare_exchange 5045; 5046; -O1-LABEL: atomicrmw_min_i64_unaligned_acquire: 5047; -O1: cmp x0, x20 5048; -O1: csel x8, x0, x20, le 5049; -O1: bl __atomic_compare_exchange 5050 %r = atomicrmw min ptr %ptr, i64 %value acquire, align 1 5051 ret i64 %r 5052} 5053 5054define dso_local i64 @atomicrmw_min_i64_unaligned_release(ptr %ptr, i64 %value) { 5055; -O0-LABEL: atomicrmw_min_i64_unaligned_release: 5056; -O0: subs x10, x9, x8 5057; -O0: csel x8, x9, x8, le 5058; -O0: bl __atomic_compare_exchange 5059; 5060; -O1-LABEL: atomicrmw_min_i64_unaligned_release: 5061; -O1: cmp x0, x20 5062; -O1: csel x8, x0, x20, le 5063; -O1: bl __atomic_compare_exchange 5064 %r = atomicrmw min ptr %ptr, i64 %value release, align 1 5065 ret i64 %r 5066} 5067 5068define dso_local i64 @atomicrmw_min_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 5069; -O0-LABEL: atomicrmw_min_i64_unaligned_acq_rel: 5070; -O0: subs x10, x9, x8 5071; -O0: csel x8, x9, x8, le 5072; -O0: bl __atomic_compare_exchange 5073; 5074; -O1-LABEL: atomicrmw_min_i64_unaligned_acq_rel: 5075; -O1: cmp x0, x20 5076; -O1: csel x8, x0, x20, le 5077; -O1: bl __atomic_compare_exchange 5078 %r = atomicrmw min ptr %ptr, i64 %value acq_rel, align 1 5079 ret i64 %r 5080} 5081 5082define dso_local i64 @atomicrmw_min_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 5083; -O0-LABEL: atomicrmw_min_i64_unaligned_seq_cst: 5084; -O0: subs x10, x9, x8 5085; -O0: csel x8, x9, x8, le 5086; -O0: bl __atomic_compare_exchange 5087; 5088; -O1-LABEL: atomicrmw_min_i64_unaligned_seq_cst: 5089; -O1: cmp x0, x20 5090; -O1: csel x8, x0, x20, le 5091; -O1: bl __atomic_compare_exchange 5092 %r = atomicrmw min ptr %ptr, i64 %value seq_cst, align 1 5093 ret i64 %r 5094} 5095 5096define dso_local i128 @atomicrmw_min_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 5097; -O0-LABEL: atomicrmw_min_i128_unaligned_monotonic: 5098; -O0: subs x8, x8, x9 5099; -O0: subs x11, x11, x10 5100; -O0: subs x12, x12, x10 5101; -O0: csel w11, w8, w11, eq 5102; -O0: ands w12, w11, #0x1 5103; -O0: csel x9, x8, x9, ne 5104; -O0: ands w11, w11, #0x1 5105; -O0: csel x8, x8, x10, ne 5106; -O0: bl __atomic_compare_exchange 5107; 5108; -O1-LABEL: atomicrmw_min_i128_unaligned_monotonic: 5109; -O1: ldp x0, x1, [x0] 5110; -O1: cmp x21, x0 5111; -O1: csel x8, x1, x19, ge 5112; -O1: csel x9, x0, x21, ge 5113; -O1: bl __atomic_compare_exchange 5114 %r = atomicrmw min ptr %ptr, i128 %value monotonic, align 1 5115 ret i128 %r 5116} 5117 5118define dso_local i128 @atomicrmw_min_i128_unaligned_acquire(ptr %ptr, i128 %value) { 5119; -O0-LABEL: atomicrmw_min_i128_unaligned_acquire: 5120; -O0: subs x8, x8, x9 5121; -O0: subs x11, x11, x10 5122; -O0: subs x12, x12, x10 5123; -O0: csel w11, w8, w11, eq 5124; -O0: ands w12, w11, #0x1 5125; -O0: csel x9, x8, x9, ne 5126; -O0: ands w11, w11, #0x1 5127; -O0: csel x8, x8, x10, ne 5128; -O0: bl __atomic_compare_exchange 5129; 5130; -O1-LABEL: atomicrmw_min_i128_unaligned_acquire: 5131; -O1: ldp x0, x1, [x0] 5132; -O1: cmp x21, x0 5133; -O1: csel x8, x1, x19, ge 5134; -O1: csel x9, x0, x21, ge 5135; -O1: bl __atomic_compare_exchange 5136 %r = atomicrmw min ptr %ptr, i128 %value acquire, align 1 5137 ret i128 %r 5138} 5139 5140define dso_local i128 @atomicrmw_min_i128_unaligned_release(ptr %ptr, i128 %value) { 5141; -O0-LABEL: atomicrmw_min_i128_unaligned_release: 5142; -O0: subs x8, x8, x9 5143; -O0: subs x11, x11, x10 5144; -O0: subs x12, x12, x10 5145; -O0: csel w11, w8, w11, eq 5146; -O0: ands w12, w11, #0x1 5147; -O0: csel x9, x8, x9, ne 5148; -O0: ands w11, w11, #0x1 5149; -O0: csel x8, x8, x10, ne 5150; -O0: bl __atomic_compare_exchange 5151; 5152; -O1-LABEL: atomicrmw_min_i128_unaligned_release: 5153; -O1: ldp x0, x1, [x0] 5154; -O1: cmp x21, x0 5155; -O1: csel x8, x1, x19, ge 5156; -O1: csel x9, x0, x21, ge 5157; -O1: bl __atomic_compare_exchange 5158 %r = atomicrmw min ptr %ptr, i128 %value release, align 1 5159 ret i128 %r 5160} 5161 5162define dso_local i128 @atomicrmw_min_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 5163; -O0-LABEL: atomicrmw_min_i128_unaligned_acq_rel: 5164; -O0: subs x8, x8, x9 5165; -O0: subs x11, x11, x10 5166; -O0: subs x12, x12, x10 5167; -O0: csel w11, w8, w11, eq 5168; -O0: ands w12, w11, #0x1 5169; -O0: csel x9, x8, x9, ne 5170; -O0: ands w11, w11, #0x1 5171; -O0: csel x8, x8, x10, ne 5172; -O0: bl __atomic_compare_exchange 5173; 5174; -O1-LABEL: atomicrmw_min_i128_unaligned_acq_rel: 5175; -O1: ldp x0, x1, [x0] 5176; -O1: cmp x21, x0 5177; -O1: csel x8, x1, x19, ge 5178; -O1: csel x9, x0, x21, ge 5179; -O1: bl __atomic_compare_exchange 5180 %r = atomicrmw min ptr %ptr, i128 %value acq_rel, align 1 5181 ret i128 %r 5182} 5183 5184define dso_local i128 @atomicrmw_min_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 5185; -O0-LABEL: atomicrmw_min_i128_unaligned_seq_cst: 5186; -O0: subs x8, x8, x9 5187; -O0: subs x11, x11, x10 5188; -O0: subs x12, x12, x10 5189; -O0: csel w11, w8, w11, eq 5190; -O0: ands w12, w11, #0x1 5191; -O0: csel x9, x8, x9, ne 5192; -O0: ands w11, w11, #0x1 5193; -O0: csel x8, x8, x10, ne 5194; -O0: bl __atomic_compare_exchange 5195; 5196; -O1-LABEL: atomicrmw_min_i128_unaligned_seq_cst: 5197; -O1: ldp x0, x1, [x0] 5198; -O1: cmp x21, x0 5199; -O1: csel x8, x1, x19, ge 5200; -O1: csel x9, x0, x21, ge 5201; -O1: bl __atomic_compare_exchange 5202 %r = atomicrmw min ptr %ptr, i128 %value seq_cst, align 1 5203 ret i128 %r 5204} 5205 5206define dso_local i8 @atomicrmw_umax_i8_aligned_monotonic(ptr %ptr, i8 %value) { 5207; CHECK-LABEL: atomicrmw_umax_i8_aligned_monotonic: 5208; CHECK: ldumaxb w1, w0, [x0] 5209 %r = atomicrmw umax ptr %ptr, i8 %value monotonic, align 1 5210 ret i8 %r 5211} 5212 5213define dso_local i8 @atomicrmw_umax_i8_aligned_acquire(ptr %ptr, i8 %value) { 5214; CHECK-LABEL: atomicrmw_umax_i8_aligned_acquire: 5215; CHECK: ldumaxab w1, w0, [x0] 5216 %r = atomicrmw umax ptr %ptr, i8 %value acquire, align 1 5217 ret i8 %r 5218} 5219 5220define dso_local i8 @atomicrmw_umax_i8_aligned_release(ptr %ptr, i8 %value) { 5221; CHECK-LABEL: atomicrmw_umax_i8_aligned_release: 5222; CHECK: ldumaxlb w1, w0, [x0] 5223 %r = atomicrmw umax ptr %ptr, i8 %value release, align 1 5224 ret i8 %r 5225} 5226 5227define dso_local i8 @atomicrmw_umax_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 5228; CHECK-LABEL: atomicrmw_umax_i8_aligned_acq_rel: 5229; CHECK: ldumaxalb w1, w0, [x0] 5230 %r = atomicrmw umax ptr %ptr, i8 %value acq_rel, align 1 5231 ret i8 %r 5232} 5233 5234define dso_local i8 @atomicrmw_umax_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 5235; CHECK-LABEL: atomicrmw_umax_i8_aligned_seq_cst: 5236; CHECK: ldumaxalb w1, w0, [x0] 5237 %r = atomicrmw umax ptr %ptr, i8 %value seq_cst, align 1 5238 ret i8 %r 5239} 5240 5241define dso_local i16 @atomicrmw_umax_i16_aligned_monotonic(ptr %ptr, i16 %value) { 5242; CHECK-LABEL: atomicrmw_umax_i16_aligned_monotonic: 5243; CHECK: ldumaxh w1, w0, [x0] 5244 %r = atomicrmw umax ptr %ptr, i16 %value monotonic, align 2 5245 ret i16 %r 5246} 5247 5248define dso_local i16 @atomicrmw_umax_i16_aligned_acquire(ptr %ptr, i16 %value) { 5249; CHECK-LABEL: atomicrmw_umax_i16_aligned_acquire: 5250; CHECK: ldumaxah w1, w0, [x0] 5251 %r = atomicrmw umax ptr %ptr, i16 %value acquire, align 2 5252 ret i16 %r 5253} 5254 5255define dso_local i16 @atomicrmw_umax_i16_aligned_release(ptr %ptr, i16 %value) { 5256; CHECK-LABEL: atomicrmw_umax_i16_aligned_release: 5257; CHECK: ldumaxlh w1, w0, [x0] 5258 %r = atomicrmw umax ptr %ptr, i16 %value release, align 2 5259 ret i16 %r 5260} 5261 5262define dso_local i16 @atomicrmw_umax_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 5263; CHECK-LABEL: atomicrmw_umax_i16_aligned_acq_rel: 5264; CHECK: ldumaxalh w1, w0, [x0] 5265 %r = atomicrmw umax ptr %ptr, i16 %value acq_rel, align 2 5266 ret i16 %r 5267} 5268 5269define dso_local i16 @atomicrmw_umax_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 5270; CHECK-LABEL: atomicrmw_umax_i16_aligned_seq_cst: 5271; CHECK: ldumaxalh w1, w0, [x0] 5272 %r = atomicrmw umax ptr %ptr, i16 %value seq_cst, align 2 5273 ret i16 %r 5274} 5275 5276define dso_local i32 @atomicrmw_umax_i32_aligned_monotonic(ptr %ptr, i32 %value) { 5277; CHECK-LABEL: atomicrmw_umax_i32_aligned_monotonic: 5278; CHECK: ldumax w1, w0, [x0] 5279 %r = atomicrmw umax ptr %ptr, i32 %value monotonic, align 4 5280 ret i32 %r 5281} 5282 5283define dso_local i32 @atomicrmw_umax_i32_aligned_acquire(ptr %ptr, i32 %value) { 5284; CHECK-LABEL: atomicrmw_umax_i32_aligned_acquire: 5285; CHECK: ldumaxa w1, w0, [x0] 5286 %r = atomicrmw umax ptr %ptr, i32 %value acquire, align 4 5287 ret i32 %r 5288} 5289 5290define dso_local i32 @atomicrmw_umax_i32_aligned_release(ptr %ptr, i32 %value) { 5291; CHECK-LABEL: atomicrmw_umax_i32_aligned_release: 5292; CHECK: ldumaxl w1, w0, [x0] 5293 %r = atomicrmw umax ptr %ptr, i32 %value release, align 4 5294 ret i32 %r 5295} 5296 5297define dso_local i32 @atomicrmw_umax_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 5298; CHECK-LABEL: atomicrmw_umax_i32_aligned_acq_rel: 5299; CHECK: ldumaxal w1, w0, [x0] 5300 %r = atomicrmw umax ptr %ptr, i32 %value acq_rel, align 4 5301 ret i32 %r 5302} 5303 5304define dso_local i32 @atomicrmw_umax_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 5305; CHECK-LABEL: atomicrmw_umax_i32_aligned_seq_cst: 5306; CHECK: ldumaxal w1, w0, [x0] 5307 %r = atomicrmw umax ptr %ptr, i32 %value seq_cst, align 4 5308 ret i32 %r 5309} 5310 5311define dso_local i64 @atomicrmw_umax_i64_aligned_monotonic(ptr %ptr, i64 %value) { 5312; CHECK-LABEL: atomicrmw_umax_i64_aligned_monotonic: 5313; CHECK: ldumax x1, x0, [x0] 5314 %r = atomicrmw umax ptr %ptr, i64 %value monotonic, align 8 5315 ret i64 %r 5316} 5317 5318define dso_local i64 @atomicrmw_umax_i64_aligned_acquire(ptr %ptr, i64 %value) { 5319; CHECK-LABEL: atomicrmw_umax_i64_aligned_acquire: 5320; CHECK: ldumaxa x1, x0, [x0] 5321 %r = atomicrmw umax ptr %ptr, i64 %value acquire, align 8 5322 ret i64 %r 5323} 5324 5325define dso_local i64 @atomicrmw_umax_i64_aligned_release(ptr %ptr, i64 %value) { 5326; CHECK-LABEL: atomicrmw_umax_i64_aligned_release: 5327; CHECK: ldumaxl x1, x0, [x0] 5328 %r = atomicrmw umax ptr %ptr, i64 %value release, align 8 5329 ret i64 %r 5330} 5331 5332define dso_local i64 @atomicrmw_umax_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 5333; CHECK-LABEL: atomicrmw_umax_i64_aligned_acq_rel: 5334; CHECK: ldumaxal x1, x0, [x0] 5335 %r = atomicrmw umax ptr %ptr, i64 %value acq_rel, align 8 5336 ret i64 %r 5337} 5338 5339define dso_local i64 @atomicrmw_umax_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 5340; CHECK-LABEL: atomicrmw_umax_i64_aligned_seq_cst: 5341; CHECK: ldumaxal x1, x0, [x0] 5342 %r = atomicrmw umax ptr %ptr, i64 %value seq_cst, align 8 5343 ret i64 %r 5344} 5345 5346define dso_local i128 @atomicrmw_umax_i128_aligned_monotonic(ptr %ptr, i128 %value) { 5347; -O0-LABEL: atomicrmw_umax_i128_aligned_monotonic: 5348; -O0: subs x9, x9, x12 5349; -O0: subs x11, x11, x10 5350; -O0: subs x13, x13, x10 5351; -O0: csel w11, w9, w11, eq 5352; -O0: ands w13, w11, #0x1 5353; -O0: csel x2, x9, x12, ne 5354; -O0: ands w11, w11, #0x1 5355; -O0: csel x9, x9, x10, ne 5356; -O0: casp x0, x1, x2, x3, [x8] 5357; -O0: eor x8, x10, x8 5358; -O0: eor x11, x9, x11 5359; -O0: orr x8, x8, x11 5360; -O0: subs x8, x8, #0 5361; 5362; -O1-LABEL: atomicrmw_umax_i128_aligned_monotonic: 5363; -O1: ldp x4, x5, [x0] 5364; -O1: cmp x2, x4 5365; -O1: csel x9, x7, x3, lo 5366; -O1: csel x8, x4, x2, lo 5367; -O1: casp x4, x5, x8, x9, [x0] 5368; -O1: cmp x5, x7 5369; -O1: ccmp x4, x6, #0, eq 5370 %r = atomicrmw umax ptr %ptr, i128 %value monotonic, align 16 5371 ret i128 %r 5372} 5373 5374define dso_local i128 @atomicrmw_umax_i128_aligned_acquire(ptr %ptr, i128 %value) { 5375; -O0-LABEL: atomicrmw_umax_i128_aligned_acquire: 5376; -O0: subs x9, x9, x12 5377; -O0: subs x11, x11, x10 5378; -O0: subs x13, x13, x10 5379; -O0: csel w11, w9, w11, eq 5380; -O0: ands w13, w11, #0x1 5381; -O0: csel x2, x9, x12, ne 5382; -O0: ands w11, w11, #0x1 5383; -O0: csel x9, x9, x10, ne 5384; -O0: caspa x0, x1, x2, x3, [x8] 5385; -O0: eor x8, x10, x8 5386; -O0: eor x11, x9, x11 5387; -O0: orr x8, x8, x11 5388; -O0: subs x8, x8, #0 5389; 5390; -O1-LABEL: atomicrmw_umax_i128_aligned_acquire: 5391; -O1: ldp x4, x5, [x0] 5392; -O1: cmp x2, x4 5393; -O1: csel x9, x7, x3, lo 5394; -O1: csel x8, x4, x2, lo 5395; -O1: caspa x4, x5, x8, x9, [x0] 5396; -O1: cmp x5, x7 5397; -O1: ccmp x4, x6, #0, eq 5398 %r = atomicrmw umax ptr %ptr, i128 %value acquire, align 16 5399 ret i128 %r 5400} 5401 5402define dso_local i128 @atomicrmw_umax_i128_aligned_release(ptr %ptr, i128 %value) { 5403; -O0-LABEL: atomicrmw_umax_i128_aligned_release: 5404; -O0: subs x9, x9, x12 5405; -O0: subs x11, x11, x10 5406; -O0: subs x13, x13, x10 5407; -O0: csel w11, w9, w11, eq 5408; -O0: ands w13, w11, #0x1 5409; -O0: csel x2, x9, x12, ne 5410; -O0: ands w11, w11, #0x1 5411; -O0: csel x9, x9, x10, ne 5412; -O0: caspl x0, x1, x2, x3, [x8] 5413; -O0: eor x8, x10, x8 5414; -O0: eor x11, x9, x11 5415; -O0: orr x8, x8, x11 5416; -O0: subs x8, x8, #0 5417; 5418; -O1-LABEL: atomicrmw_umax_i128_aligned_release: 5419; -O1: ldp x4, x5, [x0] 5420; -O1: cmp x2, x4 5421; -O1: csel x9, x7, x3, lo 5422; -O1: csel x8, x4, x2, lo 5423; -O1: caspl x4, x5, x8, x9, [x0] 5424; -O1: cmp x5, x7 5425; -O1: ccmp x4, x6, #0, eq 5426 %r = atomicrmw umax ptr %ptr, i128 %value release, align 16 5427 ret i128 %r 5428} 5429 5430define dso_local i128 @atomicrmw_umax_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 5431; -O0-LABEL: atomicrmw_umax_i128_aligned_acq_rel: 5432; -O0: subs x9, x9, x12 5433; -O0: subs x11, x11, x10 5434; -O0: subs x13, x13, x10 5435; -O0: csel w11, w9, w11, eq 5436; -O0: ands w13, w11, #0x1 5437; -O0: csel x2, x9, x12, ne 5438; -O0: ands w11, w11, #0x1 5439; -O0: csel x9, x9, x10, ne 5440; -O0: caspal x0, x1, x2, x3, [x8] 5441; -O0: eor x8, x10, x8 5442; -O0: eor x11, x9, x11 5443; -O0: orr x8, x8, x11 5444; -O0: subs x8, x8, #0 5445; 5446; -O1-LABEL: atomicrmw_umax_i128_aligned_acq_rel: 5447; -O1: ldp x4, x5, [x0] 5448; -O1: cmp x2, x4 5449; -O1: csel x9, x7, x3, lo 5450; -O1: csel x8, x4, x2, lo 5451; -O1: caspal x4, x5, x8, x9, [x0] 5452; -O1: cmp x5, x7 5453; -O1: ccmp x4, x6, #0, eq 5454 %r = atomicrmw umax ptr %ptr, i128 %value acq_rel, align 16 5455 ret i128 %r 5456} 5457 5458define dso_local i128 @atomicrmw_umax_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 5459; -O0-LABEL: atomicrmw_umax_i128_aligned_seq_cst: 5460; -O0: subs x9, x9, x12 5461; -O0: subs x11, x11, x10 5462; -O0: subs x13, x13, x10 5463; -O0: csel w11, w9, w11, eq 5464; -O0: ands w13, w11, #0x1 5465; -O0: csel x2, x9, x12, ne 5466; -O0: ands w11, w11, #0x1 5467; -O0: csel x9, x9, x10, ne 5468; -O0: caspal x0, x1, x2, x3, [x8] 5469; -O0: eor x8, x10, x8 5470; -O0: eor x11, x9, x11 5471; -O0: orr x8, x8, x11 5472; -O0: subs x8, x8, #0 5473; 5474; -O1-LABEL: atomicrmw_umax_i128_aligned_seq_cst: 5475; -O1: ldp x4, x5, [x0] 5476; -O1: cmp x2, x4 5477; -O1: csel x9, x7, x3, lo 5478; -O1: csel x8, x4, x2, lo 5479; -O1: caspal x4, x5, x8, x9, [x0] 5480; -O1: cmp x5, x7 5481; -O1: ccmp x4, x6, #0, eq 5482 %r = atomicrmw umax ptr %ptr, i128 %value seq_cst, align 16 5483 ret i128 %r 5484} 5485 5486define dso_local i8 @atomicrmw_umax_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 5487; CHECK-LABEL: atomicrmw_umax_i8_unaligned_monotonic: 5488; CHECK: ldumaxb w1, w0, [x0] 5489 %r = atomicrmw umax ptr %ptr, i8 %value monotonic, align 1 5490 ret i8 %r 5491} 5492 5493define dso_local i8 @atomicrmw_umax_i8_unaligned_acquire(ptr %ptr, i8 %value) { 5494; CHECK-LABEL: atomicrmw_umax_i8_unaligned_acquire: 5495; CHECK: ldumaxab w1, w0, [x0] 5496 %r = atomicrmw umax ptr %ptr, i8 %value acquire, align 1 5497 ret i8 %r 5498} 5499 5500define dso_local i8 @atomicrmw_umax_i8_unaligned_release(ptr %ptr, i8 %value) { 5501; CHECK-LABEL: atomicrmw_umax_i8_unaligned_release: 5502; CHECK: ldumaxlb w1, w0, [x0] 5503 %r = atomicrmw umax ptr %ptr, i8 %value release, align 1 5504 ret i8 %r 5505} 5506 5507define dso_local i8 @atomicrmw_umax_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 5508; CHECK-LABEL: atomicrmw_umax_i8_unaligned_acq_rel: 5509; CHECK: ldumaxalb w1, w0, [x0] 5510 %r = atomicrmw umax ptr %ptr, i8 %value acq_rel, align 1 5511 ret i8 %r 5512} 5513 5514define dso_local i8 @atomicrmw_umax_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 5515; CHECK-LABEL: atomicrmw_umax_i8_unaligned_seq_cst: 5516; CHECK: ldumaxalb w1, w0, [x0] 5517 %r = atomicrmw umax ptr %ptr, i8 %value seq_cst, align 1 5518 ret i8 %r 5519} 5520 5521define dso_local i16 @atomicrmw_umax_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 5522; -O0-LABEL: atomicrmw_umax_i16_unaligned_monotonic: 5523; -O0: subs w10, w10, w8, uxth 5524; -O0: csel w8, w9, w8, hi 5525; -O0: bl __atomic_compare_exchange 5526; 5527; -O1-LABEL: atomicrmw_umax_i16_unaligned_monotonic: 5528; -O1: and w8, w0, #0xffff 5529; -O1: cmp w8, w20, uxth 5530; -O1: csel w8, w0, w20, hi 5531; -O1: bl __atomic_compare_exchange 5532 %r = atomicrmw umax ptr %ptr, i16 %value monotonic, align 1 5533 ret i16 %r 5534} 5535 5536define dso_local i16 @atomicrmw_umax_i16_unaligned_acquire(ptr %ptr, i16 %value) { 5537; -O0-LABEL: atomicrmw_umax_i16_unaligned_acquire: 5538; -O0: subs w10, w10, w8, uxth 5539; -O0: csel w8, w9, w8, hi 5540; -O0: bl __atomic_compare_exchange 5541; 5542; -O1-LABEL: atomicrmw_umax_i16_unaligned_acquire: 5543; -O1: and w8, w0, #0xffff 5544; -O1: cmp w8, w20, uxth 5545; -O1: csel w8, w0, w20, hi 5546; -O1: bl __atomic_compare_exchange 5547 %r = atomicrmw umax ptr %ptr, i16 %value acquire, align 1 5548 ret i16 %r 5549} 5550 5551define dso_local i16 @atomicrmw_umax_i16_unaligned_release(ptr %ptr, i16 %value) { 5552; -O0-LABEL: atomicrmw_umax_i16_unaligned_release: 5553; -O0: subs w10, w10, w8, uxth 5554; -O0: csel w8, w9, w8, hi 5555; -O0: bl __atomic_compare_exchange 5556; 5557; -O1-LABEL: atomicrmw_umax_i16_unaligned_release: 5558; -O1: and w8, w0, #0xffff 5559; -O1: cmp w8, w20, uxth 5560; -O1: csel w8, w0, w20, hi 5561; -O1: bl __atomic_compare_exchange 5562 %r = atomicrmw umax ptr %ptr, i16 %value release, align 1 5563 ret i16 %r 5564} 5565 5566define dso_local i16 @atomicrmw_umax_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 5567; -O0-LABEL: atomicrmw_umax_i16_unaligned_acq_rel: 5568; -O0: subs w10, w10, w8, uxth 5569; -O0: csel w8, w9, w8, hi 5570; -O0: bl __atomic_compare_exchange 5571; 5572; -O1-LABEL: atomicrmw_umax_i16_unaligned_acq_rel: 5573; -O1: and w8, w0, #0xffff 5574; -O1: cmp w8, w20, uxth 5575; -O1: csel w8, w0, w20, hi 5576; -O1: bl __atomic_compare_exchange 5577 %r = atomicrmw umax ptr %ptr, i16 %value acq_rel, align 1 5578 ret i16 %r 5579} 5580 5581define dso_local i16 @atomicrmw_umax_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 5582; -O0-LABEL: atomicrmw_umax_i16_unaligned_seq_cst: 5583; -O0: subs w10, w10, w8, uxth 5584; -O0: csel w8, w9, w8, hi 5585; -O0: bl __atomic_compare_exchange 5586; 5587; -O1-LABEL: atomicrmw_umax_i16_unaligned_seq_cst: 5588; -O1: and w8, w0, #0xffff 5589; -O1: cmp w8, w20, uxth 5590; -O1: csel w8, w0, w20, hi 5591; -O1: bl __atomic_compare_exchange 5592 %r = atomicrmw umax ptr %ptr, i16 %value seq_cst, align 1 5593 ret i16 %r 5594} 5595 5596define dso_local i32 @atomicrmw_umax_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 5597; -O0-LABEL: atomicrmw_umax_i32_unaligned_monotonic: 5598; -O0: subs w10, w9, w8 5599; -O0: csel w8, w9, w8, hi 5600; -O0: bl __atomic_compare_exchange 5601; 5602; -O1-LABEL: atomicrmw_umax_i32_unaligned_monotonic: 5603; -O1: cmp w0, w20 5604; -O1: csel w8, w0, w20, hi 5605; -O1: bl __atomic_compare_exchange 5606 %r = atomicrmw umax ptr %ptr, i32 %value monotonic, align 1 5607 ret i32 %r 5608} 5609 5610define dso_local i32 @atomicrmw_umax_i32_unaligned_acquire(ptr %ptr, i32 %value) { 5611; -O0-LABEL: atomicrmw_umax_i32_unaligned_acquire: 5612; -O0: subs w10, w9, w8 5613; -O0: csel w8, w9, w8, hi 5614; -O0: bl __atomic_compare_exchange 5615; 5616; -O1-LABEL: atomicrmw_umax_i32_unaligned_acquire: 5617; -O1: cmp w0, w20 5618; -O1: csel w8, w0, w20, hi 5619; -O1: bl __atomic_compare_exchange 5620 %r = atomicrmw umax ptr %ptr, i32 %value acquire, align 1 5621 ret i32 %r 5622} 5623 5624define dso_local i32 @atomicrmw_umax_i32_unaligned_release(ptr %ptr, i32 %value) { 5625; -O0-LABEL: atomicrmw_umax_i32_unaligned_release: 5626; -O0: subs w10, w9, w8 5627; -O0: csel w8, w9, w8, hi 5628; -O0: bl __atomic_compare_exchange 5629; 5630; -O1-LABEL: atomicrmw_umax_i32_unaligned_release: 5631; -O1: cmp w0, w20 5632; -O1: csel w8, w0, w20, hi 5633; -O1: bl __atomic_compare_exchange 5634 %r = atomicrmw umax ptr %ptr, i32 %value release, align 1 5635 ret i32 %r 5636} 5637 5638define dso_local i32 @atomicrmw_umax_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 5639; -O0-LABEL: atomicrmw_umax_i32_unaligned_acq_rel: 5640; -O0: subs w10, w9, w8 5641; -O0: csel w8, w9, w8, hi 5642; -O0: bl __atomic_compare_exchange 5643; 5644; -O1-LABEL: atomicrmw_umax_i32_unaligned_acq_rel: 5645; -O1: cmp w0, w20 5646; -O1: csel w8, w0, w20, hi 5647; -O1: bl __atomic_compare_exchange 5648 %r = atomicrmw umax ptr %ptr, i32 %value acq_rel, align 1 5649 ret i32 %r 5650} 5651 5652define dso_local i32 @atomicrmw_umax_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 5653; -O0-LABEL: atomicrmw_umax_i32_unaligned_seq_cst: 5654; -O0: subs w10, w9, w8 5655; -O0: csel w8, w9, w8, hi 5656; -O0: bl __atomic_compare_exchange 5657; 5658; -O1-LABEL: atomicrmw_umax_i32_unaligned_seq_cst: 5659; -O1: cmp w0, w20 5660; -O1: csel w8, w0, w20, hi 5661; -O1: bl __atomic_compare_exchange 5662 %r = atomicrmw umax ptr %ptr, i32 %value seq_cst, align 1 5663 ret i32 %r 5664} 5665 5666define dso_local i64 @atomicrmw_umax_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 5667; -O0-LABEL: atomicrmw_umax_i64_unaligned_monotonic: 5668; -O0: subs x10, x9, x8 5669; -O0: csel x8, x9, x8, hi 5670; -O0: bl __atomic_compare_exchange 5671; 5672; -O1-LABEL: atomicrmw_umax_i64_unaligned_monotonic: 5673; -O1: cmp x0, x20 5674; -O1: csel x8, x0, x20, hi 5675; -O1: bl __atomic_compare_exchange 5676 %r = atomicrmw umax ptr %ptr, i64 %value monotonic, align 1 5677 ret i64 %r 5678} 5679 5680define dso_local i64 @atomicrmw_umax_i64_unaligned_acquire(ptr %ptr, i64 %value) { 5681; -O0-LABEL: atomicrmw_umax_i64_unaligned_acquire: 5682; -O0: subs x10, x9, x8 5683; -O0: csel x8, x9, x8, hi 5684; -O0: bl __atomic_compare_exchange 5685; 5686; -O1-LABEL: atomicrmw_umax_i64_unaligned_acquire: 5687; -O1: cmp x0, x20 5688; -O1: csel x8, x0, x20, hi 5689; -O1: bl __atomic_compare_exchange 5690 %r = atomicrmw umax ptr %ptr, i64 %value acquire, align 1 5691 ret i64 %r 5692} 5693 5694define dso_local i64 @atomicrmw_umax_i64_unaligned_release(ptr %ptr, i64 %value) { 5695; -O0-LABEL: atomicrmw_umax_i64_unaligned_release: 5696; -O0: subs x10, x9, x8 5697; -O0: csel x8, x9, x8, hi 5698; -O0: bl __atomic_compare_exchange 5699; 5700; -O1-LABEL: atomicrmw_umax_i64_unaligned_release: 5701; -O1: cmp x0, x20 5702; -O1: csel x8, x0, x20, hi 5703; -O1: bl __atomic_compare_exchange 5704 %r = atomicrmw umax ptr %ptr, i64 %value release, align 1 5705 ret i64 %r 5706} 5707 5708define dso_local i64 @atomicrmw_umax_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 5709; -O0-LABEL: atomicrmw_umax_i64_unaligned_acq_rel: 5710; -O0: subs x10, x9, x8 5711; -O0: csel x8, x9, x8, hi 5712; -O0: bl __atomic_compare_exchange 5713; 5714; -O1-LABEL: atomicrmw_umax_i64_unaligned_acq_rel: 5715; -O1: cmp x0, x20 5716; -O1: csel x8, x0, x20, hi 5717; -O1: bl __atomic_compare_exchange 5718 %r = atomicrmw umax ptr %ptr, i64 %value acq_rel, align 1 5719 ret i64 %r 5720} 5721 5722define dso_local i64 @atomicrmw_umax_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 5723; -O0-LABEL: atomicrmw_umax_i64_unaligned_seq_cst: 5724; -O0: subs x10, x9, x8 5725; -O0: csel x8, x9, x8, hi 5726; -O0: bl __atomic_compare_exchange 5727; 5728; -O1-LABEL: atomicrmw_umax_i64_unaligned_seq_cst: 5729; -O1: cmp x0, x20 5730; -O1: csel x8, x0, x20, hi 5731; -O1: bl __atomic_compare_exchange 5732 %r = atomicrmw umax ptr %ptr, i64 %value seq_cst, align 1 5733 ret i64 %r 5734} 5735 5736define dso_local i128 @atomicrmw_umax_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 5737; -O0-LABEL: atomicrmw_umax_i128_unaligned_monotonic: 5738; -O0: subs x8, x8, x9 5739; -O0: subs x11, x11, x10 5740; -O0: subs x12, x12, x10 5741; -O0: csel w11, w8, w11, eq 5742; -O0: ands w12, w11, #0x1 5743; -O0: csel x9, x8, x9, ne 5744; -O0: ands w11, w11, #0x1 5745; -O0: csel x8, x8, x10, ne 5746; -O0: bl __atomic_compare_exchange 5747; 5748; -O1-LABEL: atomicrmw_umax_i128_unaligned_monotonic: 5749; -O1: ldp x0, x1, [x0] 5750; -O1: cmp x21, x0 5751; -O1: csel x8, x1, x19, lo 5752; -O1: csel x9, x0, x21, lo 5753; -O1: bl __atomic_compare_exchange 5754 %r = atomicrmw umax ptr %ptr, i128 %value monotonic, align 1 5755 ret i128 %r 5756} 5757 5758define dso_local i128 @atomicrmw_umax_i128_unaligned_acquire(ptr %ptr, i128 %value) { 5759; -O0-LABEL: atomicrmw_umax_i128_unaligned_acquire: 5760; -O0: subs x8, x8, x9 5761; -O0: subs x11, x11, x10 5762; -O0: subs x12, x12, x10 5763; -O0: csel w11, w8, w11, eq 5764; -O0: ands w12, w11, #0x1 5765; -O0: csel x9, x8, x9, ne 5766; -O0: ands w11, w11, #0x1 5767; -O0: csel x8, x8, x10, ne 5768; -O0: bl __atomic_compare_exchange 5769; 5770; -O1-LABEL: atomicrmw_umax_i128_unaligned_acquire: 5771; -O1: ldp x0, x1, [x0] 5772; -O1: cmp x21, x0 5773; -O1: csel x8, x1, x19, lo 5774; -O1: csel x9, x0, x21, lo 5775; -O1: bl __atomic_compare_exchange 5776 %r = atomicrmw umax ptr %ptr, i128 %value acquire, align 1 5777 ret i128 %r 5778} 5779 5780define dso_local i128 @atomicrmw_umax_i128_unaligned_release(ptr %ptr, i128 %value) { 5781; -O0-LABEL: atomicrmw_umax_i128_unaligned_release: 5782; -O0: subs x8, x8, x9 5783; -O0: subs x11, x11, x10 5784; -O0: subs x12, x12, x10 5785; -O0: csel w11, w8, w11, eq 5786; -O0: ands w12, w11, #0x1 5787; -O0: csel x9, x8, x9, ne 5788; -O0: ands w11, w11, #0x1 5789; -O0: csel x8, x8, x10, ne 5790; -O0: bl __atomic_compare_exchange 5791; 5792; -O1-LABEL: atomicrmw_umax_i128_unaligned_release: 5793; -O1: ldp x0, x1, [x0] 5794; -O1: cmp x21, x0 5795; -O1: csel x8, x1, x19, lo 5796; -O1: csel x9, x0, x21, lo 5797; -O1: bl __atomic_compare_exchange 5798 %r = atomicrmw umax ptr %ptr, i128 %value release, align 1 5799 ret i128 %r 5800} 5801 5802define dso_local i128 @atomicrmw_umax_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 5803; -O0-LABEL: atomicrmw_umax_i128_unaligned_acq_rel: 5804; -O0: subs x8, x8, x9 5805; -O0: subs x11, x11, x10 5806; -O0: subs x12, x12, x10 5807; -O0: csel w11, w8, w11, eq 5808; -O0: ands w12, w11, #0x1 5809; -O0: csel x9, x8, x9, ne 5810; -O0: ands w11, w11, #0x1 5811; -O0: csel x8, x8, x10, ne 5812; -O0: bl __atomic_compare_exchange 5813; 5814; -O1-LABEL: atomicrmw_umax_i128_unaligned_acq_rel: 5815; -O1: ldp x0, x1, [x0] 5816; -O1: cmp x21, x0 5817; -O1: csel x8, x1, x19, lo 5818; -O1: csel x9, x0, x21, lo 5819; -O1: bl __atomic_compare_exchange 5820 %r = atomicrmw umax ptr %ptr, i128 %value acq_rel, align 1 5821 ret i128 %r 5822} 5823 5824define dso_local i128 @atomicrmw_umax_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 5825; -O0-LABEL: atomicrmw_umax_i128_unaligned_seq_cst: 5826; -O0: subs x8, x8, x9 5827; -O0: subs x11, x11, x10 5828; -O0: subs x12, x12, x10 5829; -O0: csel w11, w8, w11, eq 5830; -O0: ands w12, w11, #0x1 5831; -O0: csel x9, x8, x9, ne 5832; -O0: ands w11, w11, #0x1 5833; -O0: csel x8, x8, x10, ne 5834; -O0: bl __atomic_compare_exchange 5835; 5836; -O1-LABEL: atomicrmw_umax_i128_unaligned_seq_cst: 5837; -O1: ldp x0, x1, [x0] 5838; -O1: cmp x21, x0 5839; -O1: csel x8, x1, x19, lo 5840; -O1: csel x9, x0, x21, lo 5841; -O1: bl __atomic_compare_exchange 5842 %r = atomicrmw umax ptr %ptr, i128 %value seq_cst, align 1 5843 ret i128 %r 5844} 5845 5846define dso_local i8 @atomicrmw_umin_i8_aligned_monotonic(ptr %ptr, i8 %value) { 5847; CHECK-LABEL: atomicrmw_umin_i8_aligned_monotonic: 5848; CHECK: lduminb w1, w0, [x0] 5849 %r = atomicrmw umin ptr %ptr, i8 %value monotonic, align 1 5850 ret i8 %r 5851} 5852 5853define dso_local i8 @atomicrmw_umin_i8_aligned_acquire(ptr %ptr, i8 %value) { 5854; CHECK-LABEL: atomicrmw_umin_i8_aligned_acquire: 5855; CHECK: lduminab w1, w0, [x0] 5856 %r = atomicrmw umin ptr %ptr, i8 %value acquire, align 1 5857 ret i8 %r 5858} 5859 5860define dso_local i8 @atomicrmw_umin_i8_aligned_release(ptr %ptr, i8 %value) { 5861; CHECK-LABEL: atomicrmw_umin_i8_aligned_release: 5862; CHECK: lduminlb w1, w0, [x0] 5863 %r = atomicrmw umin ptr %ptr, i8 %value release, align 1 5864 ret i8 %r 5865} 5866 5867define dso_local i8 @atomicrmw_umin_i8_aligned_acq_rel(ptr %ptr, i8 %value) { 5868; CHECK-LABEL: atomicrmw_umin_i8_aligned_acq_rel: 5869; CHECK: lduminalb w1, w0, [x0] 5870 %r = atomicrmw umin ptr %ptr, i8 %value acq_rel, align 1 5871 ret i8 %r 5872} 5873 5874define dso_local i8 @atomicrmw_umin_i8_aligned_seq_cst(ptr %ptr, i8 %value) { 5875; CHECK-LABEL: atomicrmw_umin_i8_aligned_seq_cst: 5876; CHECK: lduminalb w1, w0, [x0] 5877 %r = atomicrmw umin ptr %ptr, i8 %value seq_cst, align 1 5878 ret i8 %r 5879} 5880 5881define dso_local i16 @atomicrmw_umin_i16_aligned_monotonic(ptr %ptr, i16 %value) { 5882; CHECK-LABEL: atomicrmw_umin_i16_aligned_monotonic: 5883; CHECK: lduminh w1, w0, [x0] 5884 %r = atomicrmw umin ptr %ptr, i16 %value monotonic, align 2 5885 ret i16 %r 5886} 5887 5888define dso_local i16 @atomicrmw_umin_i16_aligned_acquire(ptr %ptr, i16 %value) { 5889; CHECK-LABEL: atomicrmw_umin_i16_aligned_acquire: 5890; CHECK: lduminah w1, w0, [x0] 5891 %r = atomicrmw umin ptr %ptr, i16 %value acquire, align 2 5892 ret i16 %r 5893} 5894 5895define dso_local i16 @atomicrmw_umin_i16_aligned_release(ptr %ptr, i16 %value) { 5896; CHECK-LABEL: atomicrmw_umin_i16_aligned_release: 5897; CHECK: lduminlh w1, w0, [x0] 5898 %r = atomicrmw umin ptr %ptr, i16 %value release, align 2 5899 ret i16 %r 5900} 5901 5902define dso_local i16 @atomicrmw_umin_i16_aligned_acq_rel(ptr %ptr, i16 %value) { 5903; CHECK-LABEL: atomicrmw_umin_i16_aligned_acq_rel: 5904; CHECK: lduminalh w1, w0, [x0] 5905 %r = atomicrmw umin ptr %ptr, i16 %value acq_rel, align 2 5906 ret i16 %r 5907} 5908 5909define dso_local i16 @atomicrmw_umin_i16_aligned_seq_cst(ptr %ptr, i16 %value) { 5910; CHECK-LABEL: atomicrmw_umin_i16_aligned_seq_cst: 5911; CHECK: lduminalh w1, w0, [x0] 5912 %r = atomicrmw umin ptr %ptr, i16 %value seq_cst, align 2 5913 ret i16 %r 5914} 5915 5916define dso_local i32 @atomicrmw_umin_i32_aligned_monotonic(ptr %ptr, i32 %value) { 5917; CHECK-LABEL: atomicrmw_umin_i32_aligned_monotonic: 5918; CHECK: ldumin w1, w0, [x0] 5919 %r = atomicrmw umin ptr %ptr, i32 %value monotonic, align 4 5920 ret i32 %r 5921} 5922 5923define dso_local i32 @atomicrmw_umin_i32_aligned_acquire(ptr %ptr, i32 %value) { 5924; CHECK-LABEL: atomicrmw_umin_i32_aligned_acquire: 5925; CHECK: ldumina w1, w0, [x0] 5926 %r = atomicrmw umin ptr %ptr, i32 %value acquire, align 4 5927 ret i32 %r 5928} 5929 5930define dso_local i32 @atomicrmw_umin_i32_aligned_release(ptr %ptr, i32 %value) { 5931; CHECK-LABEL: atomicrmw_umin_i32_aligned_release: 5932; CHECK: lduminl w1, w0, [x0] 5933 %r = atomicrmw umin ptr %ptr, i32 %value release, align 4 5934 ret i32 %r 5935} 5936 5937define dso_local i32 @atomicrmw_umin_i32_aligned_acq_rel(ptr %ptr, i32 %value) { 5938; CHECK-LABEL: atomicrmw_umin_i32_aligned_acq_rel: 5939; CHECK: lduminal w1, w0, [x0] 5940 %r = atomicrmw umin ptr %ptr, i32 %value acq_rel, align 4 5941 ret i32 %r 5942} 5943 5944define dso_local i32 @atomicrmw_umin_i32_aligned_seq_cst(ptr %ptr, i32 %value) { 5945; CHECK-LABEL: atomicrmw_umin_i32_aligned_seq_cst: 5946; CHECK: lduminal w1, w0, [x0] 5947 %r = atomicrmw umin ptr %ptr, i32 %value seq_cst, align 4 5948 ret i32 %r 5949} 5950 5951define dso_local i64 @atomicrmw_umin_i64_aligned_monotonic(ptr %ptr, i64 %value) { 5952; CHECK-LABEL: atomicrmw_umin_i64_aligned_monotonic: 5953; CHECK: ldumin x1, x0, [x0] 5954 %r = atomicrmw umin ptr %ptr, i64 %value monotonic, align 8 5955 ret i64 %r 5956} 5957 5958define dso_local i64 @atomicrmw_umin_i64_aligned_acquire(ptr %ptr, i64 %value) { 5959; CHECK-LABEL: atomicrmw_umin_i64_aligned_acquire: 5960; CHECK: ldumina x1, x0, [x0] 5961 %r = atomicrmw umin ptr %ptr, i64 %value acquire, align 8 5962 ret i64 %r 5963} 5964 5965define dso_local i64 @atomicrmw_umin_i64_aligned_release(ptr %ptr, i64 %value) { 5966; CHECK-LABEL: atomicrmw_umin_i64_aligned_release: 5967; CHECK: lduminl x1, x0, [x0] 5968 %r = atomicrmw umin ptr %ptr, i64 %value release, align 8 5969 ret i64 %r 5970} 5971 5972define dso_local i64 @atomicrmw_umin_i64_aligned_acq_rel(ptr %ptr, i64 %value) { 5973; CHECK-LABEL: atomicrmw_umin_i64_aligned_acq_rel: 5974; CHECK: lduminal x1, x0, [x0] 5975 %r = atomicrmw umin ptr %ptr, i64 %value acq_rel, align 8 5976 ret i64 %r 5977} 5978 5979define dso_local i64 @atomicrmw_umin_i64_aligned_seq_cst(ptr %ptr, i64 %value) { 5980; CHECK-LABEL: atomicrmw_umin_i64_aligned_seq_cst: 5981; CHECK: lduminal x1, x0, [x0] 5982 %r = atomicrmw umin ptr %ptr, i64 %value seq_cst, align 8 5983 ret i64 %r 5984} 5985 5986define dso_local i128 @atomicrmw_umin_i128_aligned_monotonic(ptr %ptr, i128 %value) { 5987; -O0-LABEL: atomicrmw_umin_i128_aligned_monotonic: 5988; -O0: subs x9, x9, x12 5989; -O0: subs x11, x11, x10 5990; -O0: subs x13, x13, x10 5991; -O0: csel w11, w9, w11, eq 5992; -O0: ands w13, w11, #0x1 5993; -O0: csel x2, x9, x12, ne 5994; -O0: ands w11, w11, #0x1 5995; -O0: csel x9, x9, x10, ne 5996; -O0: casp x0, x1, x2, x3, [x8] 5997; -O0: eor x8, x10, x8 5998; -O0: eor x11, x9, x11 5999; -O0: orr x8, x8, x11 6000; -O0: subs x8, x8, #0 6001; 6002; -O1-LABEL: atomicrmw_umin_i128_aligned_monotonic: 6003; -O1: ldp x4, x5, [x0] 6004; -O1: cmp x2, x4 6005; -O1: csel x9, x7, x3, hs 6006; -O1: csel x8, x4, x2, hs 6007; -O1: casp x4, x5, x8, x9, [x0] 6008; -O1: cmp x5, x7 6009; -O1: ccmp x4, x6, #0, eq 6010 %r = atomicrmw umin ptr %ptr, i128 %value monotonic, align 16 6011 ret i128 %r 6012} 6013 6014define dso_local i128 @atomicrmw_umin_i128_aligned_acquire(ptr %ptr, i128 %value) { 6015; -O0-LABEL: atomicrmw_umin_i128_aligned_acquire: 6016; -O0: subs x9, x9, x12 6017; -O0: subs x11, x11, x10 6018; -O0: subs x13, x13, x10 6019; -O0: csel w11, w9, w11, eq 6020; -O0: ands w13, w11, #0x1 6021; -O0: csel x2, x9, x12, ne 6022; -O0: ands w11, w11, #0x1 6023; -O0: csel x9, x9, x10, ne 6024; -O0: caspa x0, x1, x2, x3, [x8] 6025; -O0: eor x8, x10, x8 6026; -O0: eor x11, x9, x11 6027; -O0: orr x8, x8, x11 6028; -O0: subs x8, x8, #0 6029; 6030; -O1-LABEL: atomicrmw_umin_i128_aligned_acquire: 6031; -O1: ldp x4, x5, [x0] 6032; -O1: cmp x2, x4 6033; -O1: csel x9, x7, x3, hs 6034; -O1: csel x8, x4, x2, hs 6035; -O1: caspa x4, x5, x8, x9, [x0] 6036; -O1: cmp x5, x7 6037; -O1: ccmp x4, x6, #0, eq 6038 %r = atomicrmw umin ptr %ptr, i128 %value acquire, align 16 6039 ret i128 %r 6040} 6041 6042define dso_local i128 @atomicrmw_umin_i128_aligned_release(ptr %ptr, i128 %value) { 6043; -O0-LABEL: atomicrmw_umin_i128_aligned_release: 6044; -O0: subs x9, x9, x12 6045; -O0: subs x11, x11, x10 6046; -O0: subs x13, x13, x10 6047; -O0: csel w11, w9, w11, eq 6048; -O0: ands w13, w11, #0x1 6049; -O0: csel x2, x9, x12, ne 6050; -O0: ands w11, w11, #0x1 6051; -O0: csel x9, x9, x10, ne 6052; -O0: caspl x0, x1, x2, x3, [x8] 6053; -O0: eor x8, x10, x8 6054; -O0: eor x11, x9, x11 6055; -O0: orr x8, x8, x11 6056; -O0: subs x8, x8, #0 6057; 6058; -O1-LABEL: atomicrmw_umin_i128_aligned_release: 6059; -O1: ldp x4, x5, [x0] 6060; -O1: cmp x2, x4 6061; -O1: csel x9, x7, x3, hs 6062; -O1: csel x8, x4, x2, hs 6063; -O1: caspl x4, x5, x8, x9, [x0] 6064; -O1: cmp x5, x7 6065; -O1: ccmp x4, x6, #0, eq 6066 %r = atomicrmw umin ptr %ptr, i128 %value release, align 16 6067 ret i128 %r 6068} 6069 6070define dso_local i128 @atomicrmw_umin_i128_aligned_acq_rel(ptr %ptr, i128 %value) { 6071; -O0-LABEL: atomicrmw_umin_i128_aligned_acq_rel: 6072; -O0: subs x9, x9, x12 6073; -O0: subs x11, x11, x10 6074; -O0: subs x13, x13, x10 6075; -O0: csel w11, w9, w11, eq 6076; -O0: ands w13, w11, #0x1 6077; -O0: csel x2, x9, x12, ne 6078; -O0: ands w11, w11, #0x1 6079; -O0: csel x9, x9, x10, ne 6080; -O0: caspal x0, x1, x2, x3, [x8] 6081; -O0: eor x8, x10, x8 6082; -O0: eor x11, x9, x11 6083; -O0: orr x8, x8, x11 6084; -O0: subs x8, x8, #0 6085; 6086; -O1-LABEL: atomicrmw_umin_i128_aligned_acq_rel: 6087; -O1: ldp x4, x5, [x0] 6088; -O1: cmp x2, x4 6089; -O1: csel x9, x7, x3, hs 6090; -O1: csel x8, x4, x2, hs 6091; -O1: caspal x4, x5, x8, x9, [x0] 6092; -O1: cmp x5, x7 6093; -O1: ccmp x4, x6, #0, eq 6094 %r = atomicrmw umin ptr %ptr, i128 %value acq_rel, align 16 6095 ret i128 %r 6096} 6097 6098define dso_local i128 @atomicrmw_umin_i128_aligned_seq_cst(ptr %ptr, i128 %value) { 6099; -O0-LABEL: atomicrmw_umin_i128_aligned_seq_cst: 6100; -O0: subs x9, x9, x12 6101; -O0: subs x11, x11, x10 6102; -O0: subs x13, x13, x10 6103; -O0: csel w11, w9, w11, eq 6104; -O0: ands w13, w11, #0x1 6105; -O0: csel x2, x9, x12, ne 6106; -O0: ands w11, w11, #0x1 6107; -O0: csel x9, x9, x10, ne 6108; -O0: caspal x0, x1, x2, x3, [x8] 6109; -O0: eor x8, x10, x8 6110; -O0: eor x11, x9, x11 6111; -O0: orr x8, x8, x11 6112; -O0: subs x8, x8, #0 6113; 6114; -O1-LABEL: atomicrmw_umin_i128_aligned_seq_cst: 6115; -O1: ldp x4, x5, [x0] 6116; -O1: cmp x2, x4 6117; -O1: csel x9, x7, x3, hs 6118; -O1: csel x8, x4, x2, hs 6119; -O1: caspal x4, x5, x8, x9, [x0] 6120; -O1: cmp x5, x7 6121; -O1: ccmp x4, x6, #0, eq 6122 %r = atomicrmw umin ptr %ptr, i128 %value seq_cst, align 16 6123 ret i128 %r 6124} 6125 6126define dso_local i8 @atomicrmw_umin_i8_unaligned_monotonic(ptr %ptr, i8 %value) { 6127; CHECK-LABEL: atomicrmw_umin_i8_unaligned_monotonic: 6128; CHECK: lduminb w1, w0, [x0] 6129 %r = atomicrmw umin ptr %ptr, i8 %value monotonic, align 1 6130 ret i8 %r 6131} 6132 6133define dso_local i8 @atomicrmw_umin_i8_unaligned_acquire(ptr %ptr, i8 %value) { 6134; CHECK-LABEL: atomicrmw_umin_i8_unaligned_acquire: 6135; CHECK: lduminab w1, w0, [x0] 6136 %r = atomicrmw umin ptr %ptr, i8 %value acquire, align 1 6137 ret i8 %r 6138} 6139 6140define dso_local i8 @atomicrmw_umin_i8_unaligned_release(ptr %ptr, i8 %value) { 6141; CHECK-LABEL: atomicrmw_umin_i8_unaligned_release: 6142; CHECK: lduminlb w1, w0, [x0] 6143 %r = atomicrmw umin ptr %ptr, i8 %value release, align 1 6144 ret i8 %r 6145} 6146 6147define dso_local i8 @atomicrmw_umin_i8_unaligned_acq_rel(ptr %ptr, i8 %value) { 6148; CHECK-LABEL: atomicrmw_umin_i8_unaligned_acq_rel: 6149; CHECK: lduminalb w1, w0, [x0] 6150 %r = atomicrmw umin ptr %ptr, i8 %value acq_rel, align 1 6151 ret i8 %r 6152} 6153 6154define dso_local i8 @atomicrmw_umin_i8_unaligned_seq_cst(ptr %ptr, i8 %value) { 6155; CHECK-LABEL: atomicrmw_umin_i8_unaligned_seq_cst: 6156; CHECK: lduminalb w1, w0, [x0] 6157 %r = atomicrmw umin ptr %ptr, i8 %value seq_cst, align 1 6158 ret i8 %r 6159} 6160 6161define dso_local i16 @atomicrmw_umin_i16_unaligned_monotonic(ptr %ptr, i16 %value) { 6162; -O0-LABEL: atomicrmw_umin_i16_unaligned_monotonic: 6163; -O0: subs w10, w10, w8, uxth 6164; -O0: csel w8, w9, w8, ls 6165; -O0: bl __atomic_compare_exchange 6166; 6167; -O1-LABEL: atomicrmw_umin_i16_unaligned_monotonic: 6168; -O1: and w8, w0, #0xffff 6169; -O1: cmp w8, w20, uxth 6170; -O1: csel w8, w0, w20, ls 6171; -O1: bl __atomic_compare_exchange 6172 %r = atomicrmw umin ptr %ptr, i16 %value monotonic, align 1 6173 ret i16 %r 6174} 6175 6176define dso_local i16 @atomicrmw_umin_i16_unaligned_acquire(ptr %ptr, i16 %value) { 6177; -O0-LABEL: atomicrmw_umin_i16_unaligned_acquire: 6178; -O0: subs w10, w10, w8, uxth 6179; -O0: csel w8, w9, w8, ls 6180; -O0: bl __atomic_compare_exchange 6181; 6182; -O1-LABEL: atomicrmw_umin_i16_unaligned_acquire: 6183; -O1: and w8, w0, #0xffff 6184; -O1: cmp w8, w20, uxth 6185; -O1: csel w8, w0, w20, ls 6186; -O1: bl __atomic_compare_exchange 6187 %r = atomicrmw umin ptr %ptr, i16 %value acquire, align 1 6188 ret i16 %r 6189} 6190 6191define dso_local i16 @atomicrmw_umin_i16_unaligned_release(ptr %ptr, i16 %value) { 6192; -O0-LABEL: atomicrmw_umin_i16_unaligned_release: 6193; -O0: subs w10, w10, w8, uxth 6194; -O0: csel w8, w9, w8, ls 6195; -O0: bl __atomic_compare_exchange 6196; 6197; -O1-LABEL: atomicrmw_umin_i16_unaligned_release: 6198; -O1: and w8, w0, #0xffff 6199; -O1: cmp w8, w20, uxth 6200; -O1: csel w8, w0, w20, ls 6201; -O1: bl __atomic_compare_exchange 6202 %r = atomicrmw umin ptr %ptr, i16 %value release, align 1 6203 ret i16 %r 6204} 6205 6206define dso_local i16 @atomicrmw_umin_i16_unaligned_acq_rel(ptr %ptr, i16 %value) { 6207; -O0-LABEL: atomicrmw_umin_i16_unaligned_acq_rel: 6208; -O0: subs w10, w10, w8, uxth 6209; -O0: csel w8, w9, w8, ls 6210; -O0: bl __atomic_compare_exchange 6211; 6212; -O1-LABEL: atomicrmw_umin_i16_unaligned_acq_rel: 6213; -O1: and w8, w0, #0xffff 6214; -O1: cmp w8, w20, uxth 6215; -O1: csel w8, w0, w20, ls 6216; -O1: bl __atomic_compare_exchange 6217 %r = atomicrmw umin ptr %ptr, i16 %value acq_rel, align 1 6218 ret i16 %r 6219} 6220 6221define dso_local i16 @atomicrmw_umin_i16_unaligned_seq_cst(ptr %ptr, i16 %value) { 6222; -O0-LABEL: atomicrmw_umin_i16_unaligned_seq_cst: 6223; -O0: subs w10, w10, w8, uxth 6224; -O0: csel w8, w9, w8, ls 6225; -O0: bl __atomic_compare_exchange 6226; 6227; -O1-LABEL: atomicrmw_umin_i16_unaligned_seq_cst: 6228; -O1: and w8, w0, #0xffff 6229; -O1: cmp w8, w20, uxth 6230; -O1: csel w8, w0, w20, ls 6231; -O1: bl __atomic_compare_exchange 6232 %r = atomicrmw umin ptr %ptr, i16 %value seq_cst, align 1 6233 ret i16 %r 6234} 6235 6236define dso_local i32 @atomicrmw_umin_i32_unaligned_monotonic(ptr %ptr, i32 %value) { 6237; -O0-LABEL: atomicrmw_umin_i32_unaligned_monotonic: 6238; -O0: subs w10, w9, w8 6239; -O0: csel w8, w9, w8, ls 6240; -O0: bl __atomic_compare_exchange 6241; 6242; -O1-LABEL: atomicrmw_umin_i32_unaligned_monotonic: 6243; -O1: cmp w0, w20 6244; -O1: csel w8, w0, w20, ls 6245; -O1: bl __atomic_compare_exchange 6246 %r = atomicrmw umin ptr %ptr, i32 %value monotonic, align 1 6247 ret i32 %r 6248} 6249 6250define dso_local i32 @atomicrmw_umin_i32_unaligned_acquire(ptr %ptr, i32 %value) { 6251; -O0-LABEL: atomicrmw_umin_i32_unaligned_acquire: 6252; -O0: subs w10, w9, w8 6253; -O0: csel w8, w9, w8, ls 6254; -O0: bl __atomic_compare_exchange 6255; 6256; -O1-LABEL: atomicrmw_umin_i32_unaligned_acquire: 6257; -O1: cmp w0, w20 6258; -O1: csel w8, w0, w20, ls 6259; -O1: bl __atomic_compare_exchange 6260 %r = atomicrmw umin ptr %ptr, i32 %value acquire, align 1 6261 ret i32 %r 6262} 6263 6264define dso_local i32 @atomicrmw_umin_i32_unaligned_release(ptr %ptr, i32 %value) { 6265; -O0-LABEL: atomicrmw_umin_i32_unaligned_release: 6266; -O0: subs w10, w9, w8 6267; -O0: csel w8, w9, w8, ls 6268; -O0: bl __atomic_compare_exchange 6269; 6270; -O1-LABEL: atomicrmw_umin_i32_unaligned_release: 6271; -O1: cmp w0, w20 6272; -O1: csel w8, w0, w20, ls 6273; -O1: bl __atomic_compare_exchange 6274 %r = atomicrmw umin ptr %ptr, i32 %value release, align 1 6275 ret i32 %r 6276} 6277 6278define dso_local i32 @atomicrmw_umin_i32_unaligned_acq_rel(ptr %ptr, i32 %value) { 6279; -O0-LABEL: atomicrmw_umin_i32_unaligned_acq_rel: 6280; -O0: subs w10, w9, w8 6281; -O0: csel w8, w9, w8, ls 6282; -O0: bl __atomic_compare_exchange 6283; 6284; -O1-LABEL: atomicrmw_umin_i32_unaligned_acq_rel: 6285; -O1: cmp w0, w20 6286; -O1: csel w8, w0, w20, ls 6287; -O1: bl __atomic_compare_exchange 6288 %r = atomicrmw umin ptr %ptr, i32 %value acq_rel, align 1 6289 ret i32 %r 6290} 6291 6292define dso_local i32 @atomicrmw_umin_i32_unaligned_seq_cst(ptr %ptr, i32 %value) { 6293; -O0-LABEL: atomicrmw_umin_i32_unaligned_seq_cst: 6294; -O0: subs w10, w9, w8 6295; -O0: csel w8, w9, w8, ls 6296; -O0: bl __atomic_compare_exchange 6297; 6298; -O1-LABEL: atomicrmw_umin_i32_unaligned_seq_cst: 6299; -O1: cmp w0, w20 6300; -O1: csel w8, w0, w20, ls 6301; -O1: bl __atomic_compare_exchange 6302 %r = atomicrmw umin ptr %ptr, i32 %value seq_cst, align 1 6303 ret i32 %r 6304} 6305 6306define dso_local i64 @atomicrmw_umin_i64_unaligned_monotonic(ptr %ptr, i64 %value) { 6307; -O0-LABEL: atomicrmw_umin_i64_unaligned_monotonic: 6308; -O0: subs x10, x9, x8 6309; -O0: csel x8, x9, x8, ls 6310; -O0: bl __atomic_compare_exchange 6311; 6312; -O1-LABEL: atomicrmw_umin_i64_unaligned_monotonic: 6313; -O1: cmp x0, x20 6314; -O1: csel x8, x0, x20, ls 6315; -O1: bl __atomic_compare_exchange 6316 %r = atomicrmw umin ptr %ptr, i64 %value monotonic, align 1 6317 ret i64 %r 6318} 6319 6320define dso_local i64 @atomicrmw_umin_i64_unaligned_acquire(ptr %ptr, i64 %value) { 6321; -O0-LABEL: atomicrmw_umin_i64_unaligned_acquire: 6322; -O0: subs x10, x9, x8 6323; -O0: csel x8, x9, x8, ls 6324; -O0: bl __atomic_compare_exchange 6325; 6326; -O1-LABEL: atomicrmw_umin_i64_unaligned_acquire: 6327; -O1: cmp x0, x20 6328; -O1: csel x8, x0, x20, ls 6329; -O1: bl __atomic_compare_exchange 6330 %r = atomicrmw umin ptr %ptr, i64 %value acquire, align 1 6331 ret i64 %r 6332} 6333 6334define dso_local i64 @atomicrmw_umin_i64_unaligned_release(ptr %ptr, i64 %value) { 6335; -O0-LABEL: atomicrmw_umin_i64_unaligned_release: 6336; -O0: subs x10, x9, x8 6337; -O0: csel x8, x9, x8, ls 6338; -O0: bl __atomic_compare_exchange 6339; 6340; -O1-LABEL: atomicrmw_umin_i64_unaligned_release: 6341; -O1: cmp x0, x20 6342; -O1: csel x8, x0, x20, ls 6343; -O1: bl __atomic_compare_exchange 6344 %r = atomicrmw umin ptr %ptr, i64 %value release, align 1 6345 ret i64 %r 6346} 6347 6348define dso_local i64 @atomicrmw_umin_i64_unaligned_acq_rel(ptr %ptr, i64 %value) { 6349; -O0-LABEL: atomicrmw_umin_i64_unaligned_acq_rel: 6350; -O0: subs x10, x9, x8 6351; -O0: csel x8, x9, x8, ls 6352; -O0: bl __atomic_compare_exchange 6353; 6354; -O1-LABEL: atomicrmw_umin_i64_unaligned_acq_rel: 6355; -O1: cmp x0, x20 6356; -O1: csel x8, x0, x20, ls 6357; -O1: bl __atomic_compare_exchange 6358 %r = atomicrmw umin ptr %ptr, i64 %value acq_rel, align 1 6359 ret i64 %r 6360} 6361 6362define dso_local i64 @atomicrmw_umin_i64_unaligned_seq_cst(ptr %ptr, i64 %value) { 6363; -O0-LABEL: atomicrmw_umin_i64_unaligned_seq_cst: 6364; -O0: subs x10, x9, x8 6365; -O0: csel x8, x9, x8, ls 6366; -O0: bl __atomic_compare_exchange 6367; 6368; -O1-LABEL: atomicrmw_umin_i64_unaligned_seq_cst: 6369; -O1: cmp x0, x20 6370; -O1: csel x8, x0, x20, ls 6371; -O1: bl __atomic_compare_exchange 6372 %r = atomicrmw umin ptr %ptr, i64 %value seq_cst, align 1 6373 ret i64 %r 6374} 6375 6376define dso_local i128 @atomicrmw_umin_i128_unaligned_monotonic(ptr %ptr, i128 %value) { 6377; -O0-LABEL: atomicrmw_umin_i128_unaligned_monotonic: 6378; -O0: subs x8, x8, x9 6379; -O0: subs x11, x11, x10 6380; -O0: subs x12, x12, x10 6381; -O0: csel w11, w8, w11, eq 6382; -O0: ands w12, w11, #0x1 6383; -O0: csel x9, x8, x9, ne 6384; -O0: ands w11, w11, #0x1 6385; -O0: csel x8, x8, x10, ne 6386; -O0: bl __atomic_compare_exchange 6387; 6388; -O1-LABEL: atomicrmw_umin_i128_unaligned_monotonic: 6389; -O1: ldp x0, x1, [x0] 6390; -O1: cmp x21, x0 6391; -O1: csel x8, x1, x19, hs 6392; -O1: csel x9, x0, x21, hs 6393; -O1: bl __atomic_compare_exchange 6394 %r = atomicrmw umin ptr %ptr, i128 %value monotonic, align 1 6395 ret i128 %r 6396} 6397 6398define dso_local i128 @atomicrmw_umin_i128_unaligned_acquire(ptr %ptr, i128 %value) { 6399; -O0-LABEL: atomicrmw_umin_i128_unaligned_acquire: 6400; -O0: subs x8, x8, x9 6401; -O0: subs x11, x11, x10 6402; -O0: subs x12, x12, x10 6403; -O0: csel w11, w8, w11, eq 6404; -O0: ands w12, w11, #0x1 6405; -O0: csel x9, x8, x9, ne 6406; -O0: ands w11, w11, #0x1 6407; -O0: csel x8, x8, x10, ne 6408; -O0: bl __atomic_compare_exchange 6409; 6410; -O1-LABEL: atomicrmw_umin_i128_unaligned_acquire: 6411; -O1: ldp x0, x1, [x0] 6412; -O1: cmp x21, x0 6413; -O1: csel x8, x1, x19, hs 6414; -O1: csel x9, x0, x21, hs 6415; -O1: bl __atomic_compare_exchange 6416 %r = atomicrmw umin ptr %ptr, i128 %value acquire, align 1 6417 ret i128 %r 6418} 6419 6420define dso_local i128 @atomicrmw_umin_i128_unaligned_release(ptr %ptr, i128 %value) { 6421; -O0-LABEL: atomicrmw_umin_i128_unaligned_release: 6422; -O0: subs x8, x8, x9 6423; -O0: subs x11, x11, x10 6424; -O0: subs x12, x12, x10 6425; -O0: csel w11, w8, w11, eq 6426; -O0: ands w12, w11, #0x1 6427; -O0: csel x9, x8, x9, ne 6428; -O0: ands w11, w11, #0x1 6429; -O0: csel x8, x8, x10, ne 6430; -O0: bl __atomic_compare_exchange 6431; 6432; -O1-LABEL: atomicrmw_umin_i128_unaligned_release: 6433; -O1: ldp x0, x1, [x0] 6434; -O1: cmp x21, x0 6435; -O1: csel x8, x1, x19, hs 6436; -O1: csel x9, x0, x21, hs 6437; -O1: bl __atomic_compare_exchange 6438 %r = atomicrmw umin ptr %ptr, i128 %value release, align 1 6439 ret i128 %r 6440} 6441 6442define dso_local i128 @atomicrmw_umin_i128_unaligned_acq_rel(ptr %ptr, i128 %value) { 6443; -O0-LABEL: atomicrmw_umin_i128_unaligned_acq_rel: 6444; -O0: subs x8, x8, x9 6445; -O0: subs x11, x11, x10 6446; -O0: subs x12, x12, x10 6447; -O0: csel w11, w8, w11, eq 6448; -O0: ands w12, w11, #0x1 6449; -O0: csel x9, x8, x9, ne 6450; -O0: ands w11, w11, #0x1 6451; -O0: csel x8, x8, x10, ne 6452; -O0: bl __atomic_compare_exchange 6453; 6454; -O1-LABEL: atomicrmw_umin_i128_unaligned_acq_rel: 6455; -O1: ldp x0, x1, [x0] 6456; -O1: cmp x21, x0 6457; -O1: csel x8, x1, x19, hs 6458; -O1: csel x9, x0, x21, hs 6459; -O1: bl __atomic_compare_exchange 6460 %r = atomicrmw umin ptr %ptr, i128 %value acq_rel, align 1 6461 ret i128 %r 6462} 6463 6464define dso_local i128 @atomicrmw_umin_i128_unaligned_seq_cst(ptr %ptr, i128 %value) { 6465; -O0-LABEL: atomicrmw_umin_i128_unaligned_seq_cst: 6466; -O0: subs x8, x8, x9 6467; -O0: subs x11, x11, x10 6468; -O0: subs x12, x12, x10 6469; -O0: csel w11, w8, w11, eq 6470; -O0: ands w12, w11, #0x1 6471; -O0: csel x9, x8, x9, ne 6472; -O0: ands w11, w11, #0x1 6473; -O0: csel x8, x8, x10, ne 6474; -O0: bl __atomic_compare_exchange 6475; 6476; -O1-LABEL: atomicrmw_umin_i128_unaligned_seq_cst: 6477; -O1: ldp x0, x1, [x0] 6478; -O1: cmp x21, x0 6479; -O1: csel x8, x1, x19, hs 6480; -O1: csel x9, x0, x21, hs 6481; -O1: bl __atomic_compare_exchange 6482 %r = atomicrmw umin ptr %ptr, i128 %value seq_cst, align 1 6483 ret i128 %r 6484} 6485