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