1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefix=RV32I %s 4; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \ 5; RUN: | FileCheck -check-prefix=RV32IA %s 6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefix=RV64I %s 8; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64IA %s 10 11define i8 @atomicrmw_xchg_i8_monotonic(i8* %a, i8 %b) nounwind { 12; RV32I-LABEL: atomicrmw_xchg_i8_monotonic: 13; RV32I: # %bb.0: 14; RV32I-NEXT: addi sp, sp, -16 15; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 16; RV32I-NEXT: li a2, 0 17; RV32I-NEXT: call __atomic_exchange_1@plt 18; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 19; RV32I-NEXT: addi sp, sp, 16 20; RV32I-NEXT: ret 21; 22; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic: 23; RV32IA: # %bb.0: 24; RV32IA-NEXT: andi a2, a0, -4 25; RV32IA-NEXT: slli a0, a0, 3 26; RV32IA-NEXT: li a3, 255 27; RV32IA-NEXT: sll a3, a3, a0 28; RV32IA-NEXT: andi a1, a1, 255 29; RV32IA-NEXT: sll a1, a1, a0 30; RV32IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 31; RV32IA-NEXT: lr.w a4, (a2) 32; RV32IA-NEXT: mv a5, a1 33; RV32IA-NEXT: xor a5, a4, a5 34; RV32IA-NEXT: and a5, a5, a3 35; RV32IA-NEXT: xor a5, a4, a5 36; RV32IA-NEXT: sc.w a5, a5, (a2) 37; RV32IA-NEXT: bnez a5, .LBB0_1 38; RV32IA-NEXT: # %bb.2: 39; RV32IA-NEXT: srl a0, a4, a0 40; RV32IA-NEXT: ret 41; 42; RV64I-LABEL: atomicrmw_xchg_i8_monotonic: 43; RV64I: # %bb.0: 44; RV64I-NEXT: addi sp, sp, -16 45; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 46; RV64I-NEXT: li a2, 0 47; RV64I-NEXT: call __atomic_exchange_1@plt 48; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 49; RV64I-NEXT: addi sp, sp, 16 50; RV64I-NEXT: ret 51; 52; RV64IA-LABEL: atomicrmw_xchg_i8_monotonic: 53; RV64IA: # %bb.0: 54; RV64IA-NEXT: andi a2, a0, -4 55; RV64IA-NEXT: slliw a0, a0, 3 56; RV64IA-NEXT: li a3, 255 57; RV64IA-NEXT: sllw a3, a3, a0 58; RV64IA-NEXT: andi a1, a1, 255 59; RV64IA-NEXT: sllw a1, a1, a0 60; RV64IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 61; RV64IA-NEXT: lr.w a4, (a2) 62; RV64IA-NEXT: mv a5, a1 63; RV64IA-NEXT: xor a5, a4, a5 64; RV64IA-NEXT: and a5, a5, a3 65; RV64IA-NEXT: xor a5, a4, a5 66; RV64IA-NEXT: sc.w a5, a5, (a2) 67; RV64IA-NEXT: bnez a5, .LBB0_1 68; RV64IA-NEXT: # %bb.2: 69; RV64IA-NEXT: srlw a0, a4, a0 70; RV64IA-NEXT: ret 71 %1 = atomicrmw xchg i8* %a, i8 %b monotonic 72 ret i8 %1 73} 74 75define i8 @atomicrmw_xchg_i8_acquire(i8* %a, i8 %b) nounwind { 76; RV32I-LABEL: atomicrmw_xchg_i8_acquire: 77; RV32I: # %bb.0: 78; RV32I-NEXT: addi sp, sp, -16 79; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 80; RV32I-NEXT: li a2, 2 81; RV32I-NEXT: call __atomic_exchange_1@plt 82; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 83; RV32I-NEXT: addi sp, sp, 16 84; RV32I-NEXT: ret 85; 86; RV32IA-LABEL: atomicrmw_xchg_i8_acquire: 87; RV32IA: # %bb.0: 88; RV32IA-NEXT: andi a2, a0, -4 89; RV32IA-NEXT: slli a0, a0, 3 90; RV32IA-NEXT: li a3, 255 91; RV32IA-NEXT: sll a3, a3, a0 92; RV32IA-NEXT: andi a1, a1, 255 93; RV32IA-NEXT: sll a1, a1, a0 94; RV32IA-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 95; RV32IA-NEXT: lr.w.aq a4, (a2) 96; RV32IA-NEXT: mv a5, a1 97; RV32IA-NEXT: xor a5, a4, a5 98; RV32IA-NEXT: and a5, a5, a3 99; RV32IA-NEXT: xor a5, a4, a5 100; RV32IA-NEXT: sc.w a5, a5, (a2) 101; RV32IA-NEXT: bnez a5, .LBB1_1 102; RV32IA-NEXT: # %bb.2: 103; RV32IA-NEXT: srl a0, a4, a0 104; RV32IA-NEXT: ret 105; 106; RV64I-LABEL: atomicrmw_xchg_i8_acquire: 107; RV64I: # %bb.0: 108; RV64I-NEXT: addi sp, sp, -16 109; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 110; RV64I-NEXT: li a2, 2 111; RV64I-NEXT: call __atomic_exchange_1@plt 112; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 113; RV64I-NEXT: addi sp, sp, 16 114; RV64I-NEXT: ret 115; 116; RV64IA-LABEL: atomicrmw_xchg_i8_acquire: 117; RV64IA: # %bb.0: 118; RV64IA-NEXT: andi a2, a0, -4 119; RV64IA-NEXT: slliw a0, a0, 3 120; RV64IA-NEXT: li a3, 255 121; RV64IA-NEXT: sllw a3, a3, a0 122; RV64IA-NEXT: andi a1, a1, 255 123; RV64IA-NEXT: sllw a1, a1, a0 124; RV64IA-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 125; RV64IA-NEXT: lr.w.aq a4, (a2) 126; RV64IA-NEXT: mv a5, a1 127; RV64IA-NEXT: xor a5, a4, a5 128; RV64IA-NEXT: and a5, a5, a3 129; RV64IA-NEXT: xor a5, a4, a5 130; RV64IA-NEXT: sc.w a5, a5, (a2) 131; RV64IA-NEXT: bnez a5, .LBB1_1 132; RV64IA-NEXT: # %bb.2: 133; RV64IA-NEXT: srlw a0, a4, a0 134; RV64IA-NEXT: ret 135 %1 = atomicrmw xchg i8* %a, i8 %b acquire 136 ret i8 %1 137} 138 139define i8 @atomicrmw_xchg_i8_release(i8* %a, i8 %b) nounwind { 140; RV32I-LABEL: atomicrmw_xchg_i8_release: 141; RV32I: # %bb.0: 142; RV32I-NEXT: addi sp, sp, -16 143; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 144; RV32I-NEXT: li a2, 3 145; RV32I-NEXT: call __atomic_exchange_1@plt 146; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 147; RV32I-NEXT: addi sp, sp, 16 148; RV32I-NEXT: ret 149; 150; RV32IA-LABEL: atomicrmw_xchg_i8_release: 151; RV32IA: # %bb.0: 152; RV32IA-NEXT: andi a2, a0, -4 153; RV32IA-NEXT: slli a0, a0, 3 154; RV32IA-NEXT: li a3, 255 155; RV32IA-NEXT: sll a3, a3, a0 156; RV32IA-NEXT: andi a1, a1, 255 157; RV32IA-NEXT: sll a1, a1, a0 158; RV32IA-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 159; RV32IA-NEXT: lr.w a4, (a2) 160; RV32IA-NEXT: mv a5, a1 161; RV32IA-NEXT: xor a5, a4, a5 162; RV32IA-NEXT: and a5, a5, a3 163; RV32IA-NEXT: xor a5, a4, a5 164; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 165; RV32IA-NEXT: bnez a5, .LBB2_1 166; RV32IA-NEXT: # %bb.2: 167; RV32IA-NEXT: srl a0, a4, a0 168; RV32IA-NEXT: ret 169; 170; RV64I-LABEL: atomicrmw_xchg_i8_release: 171; RV64I: # %bb.0: 172; RV64I-NEXT: addi sp, sp, -16 173; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 174; RV64I-NEXT: li a2, 3 175; RV64I-NEXT: call __atomic_exchange_1@plt 176; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 177; RV64I-NEXT: addi sp, sp, 16 178; RV64I-NEXT: ret 179; 180; RV64IA-LABEL: atomicrmw_xchg_i8_release: 181; RV64IA: # %bb.0: 182; RV64IA-NEXT: andi a2, a0, -4 183; RV64IA-NEXT: slliw a0, a0, 3 184; RV64IA-NEXT: li a3, 255 185; RV64IA-NEXT: sllw a3, a3, a0 186; RV64IA-NEXT: andi a1, a1, 255 187; RV64IA-NEXT: sllw a1, a1, a0 188; RV64IA-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 189; RV64IA-NEXT: lr.w a4, (a2) 190; RV64IA-NEXT: mv a5, a1 191; RV64IA-NEXT: xor a5, a4, a5 192; RV64IA-NEXT: and a5, a5, a3 193; RV64IA-NEXT: xor a5, a4, a5 194; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 195; RV64IA-NEXT: bnez a5, .LBB2_1 196; RV64IA-NEXT: # %bb.2: 197; RV64IA-NEXT: srlw a0, a4, a0 198; RV64IA-NEXT: ret 199 %1 = atomicrmw xchg i8* %a, i8 %b release 200 ret i8 %1 201} 202 203define i8 @atomicrmw_xchg_i8_acq_rel(i8* %a, i8 %b) nounwind { 204; RV32I-LABEL: atomicrmw_xchg_i8_acq_rel: 205; RV32I: # %bb.0: 206; RV32I-NEXT: addi sp, sp, -16 207; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 208; RV32I-NEXT: li a2, 4 209; RV32I-NEXT: call __atomic_exchange_1@plt 210; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 211; RV32I-NEXT: addi sp, sp, 16 212; RV32I-NEXT: ret 213; 214; RV32IA-LABEL: atomicrmw_xchg_i8_acq_rel: 215; RV32IA: # %bb.0: 216; RV32IA-NEXT: andi a2, a0, -4 217; RV32IA-NEXT: slli a0, a0, 3 218; RV32IA-NEXT: li a3, 255 219; RV32IA-NEXT: sll a3, a3, a0 220; RV32IA-NEXT: andi a1, a1, 255 221; RV32IA-NEXT: sll a1, a1, a0 222; RV32IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 223; RV32IA-NEXT: lr.w.aq a4, (a2) 224; RV32IA-NEXT: mv a5, a1 225; RV32IA-NEXT: xor a5, a4, a5 226; RV32IA-NEXT: and a5, a5, a3 227; RV32IA-NEXT: xor a5, a4, a5 228; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 229; RV32IA-NEXT: bnez a5, .LBB3_1 230; RV32IA-NEXT: # %bb.2: 231; RV32IA-NEXT: srl a0, a4, a0 232; RV32IA-NEXT: ret 233; 234; RV64I-LABEL: atomicrmw_xchg_i8_acq_rel: 235; RV64I: # %bb.0: 236; RV64I-NEXT: addi sp, sp, -16 237; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 238; RV64I-NEXT: li a2, 4 239; RV64I-NEXT: call __atomic_exchange_1@plt 240; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 241; RV64I-NEXT: addi sp, sp, 16 242; RV64I-NEXT: ret 243; 244; RV64IA-LABEL: atomicrmw_xchg_i8_acq_rel: 245; RV64IA: # %bb.0: 246; RV64IA-NEXT: andi a2, a0, -4 247; RV64IA-NEXT: slliw a0, a0, 3 248; RV64IA-NEXT: li a3, 255 249; RV64IA-NEXT: sllw a3, a3, a0 250; RV64IA-NEXT: andi a1, a1, 255 251; RV64IA-NEXT: sllw a1, a1, a0 252; RV64IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 253; RV64IA-NEXT: lr.w.aq a4, (a2) 254; RV64IA-NEXT: mv a5, a1 255; RV64IA-NEXT: xor a5, a4, a5 256; RV64IA-NEXT: and a5, a5, a3 257; RV64IA-NEXT: xor a5, a4, a5 258; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 259; RV64IA-NEXT: bnez a5, .LBB3_1 260; RV64IA-NEXT: # %bb.2: 261; RV64IA-NEXT: srlw a0, a4, a0 262; RV64IA-NEXT: ret 263 %1 = atomicrmw xchg i8* %a, i8 %b acq_rel 264 ret i8 %1 265} 266 267define i8 @atomicrmw_xchg_i8_seq_cst(i8* %a, i8 %b) nounwind { 268; RV32I-LABEL: atomicrmw_xchg_i8_seq_cst: 269; RV32I: # %bb.0: 270; RV32I-NEXT: addi sp, sp, -16 271; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 272; RV32I-NEXT: li a2, 5 273; RV32I-NEXT: call __atomic_exchange_1@plt 274; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 275; RV32I-NEXT: addi sp, sp, 16 276; RV32I-NEXT: ret 277; 278; RV32IA-LABEL: atomicrmw_xchg_i8_seq_cst: 279; RV32IA: # %bb.0: 280; RV32IA-NEXT: andi a2, a0, -4 281; RV32IA-NEXT: slli a0, a0, 3 282; RV32IA-NEXT: li a3, 255 283; RV32IA-NEXT: sll a3, a3, a0 284; RV32IA-NEXT: andi a1, a1, 255 285; RV32IA-NEXT: sll a1, a1, a0 286; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 287; RV32IA-NEXT: lr.w.aqrl a4, (a2) 288; RV32IA-NEXT: mv a5, a1 289; RV32IA-NEXT: xor a5, a4, a5 290; RV32IA-NEXT: and a5, a5, a3 291; RV32IA-NEXT: xor a5, a4, a5 292; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 293; RV32IA-NEXT: bnez a5, .LBB4_1 294; RV32IA-NEXT: # %bb.2: 295; RV32IA-NEXT: srl a0, a4, a0 296; RV32IA-NEXT: ret 297; 298; RV64I-LABEL: atomicrmw_xchg_i8_seq_cst: 299; RV64I: # %bb.0: 300; RV64I-NEXT: addi sp, sp, -16 301; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 302; RV64I-NEXT: li a2, 5 303; RV64I-NEXT: call __atomic_exchange_1@plt 304; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 305; RV64I-NEXT: addi sp, sp, 16 306; RV64I-NEXT: ret 307; 308; RV64IA-LABEL: atomicrmw_xchg_i8_seq_cst: 309; RV64IA: # %bb.0: 310; RV64IA-NEXT: andi a2, a0, -4 311; RV64IA-NEXT: slliw a0, a0, 3 312; RV64IA-NEXT: li a3, 255 313; RV64IA-NEXT: sllw a3, a3, a0 314; RV64IA-NEXT: andi a1, a1, 255 315; RV64IA-NEXT: sllw a1, a1, a0 316; RV64IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 317; RV64IA-NEXT: lr.w.aqrl a4, (a2) 318; RV64IA-NEXT: mv a5, a1 319; RV64IA-NEXT: xor a5, a4, a5 320; RV64IA-NEXT: and a5, a5, a3 321; RV64IA-NEXT: xor a5, a4, a5 322; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 323; RV64IA-NEXT: bnez a5, .LBB4_1 324; RV64IA-NEXT: # %bb.2: 325; RV64IA-NEXT: srlw a0, a4, a0 326; RV64IA-NEXT: ret 327 %1 = atomicrmw xchg i8* %a, i8 %b seq_cst 328 ret i8 %1 329} 330 331define i8 @atomicrmw_add_i8_monotonic(i8 *%a, i8 %b) nounwind { 332; RV32I-LABEL: atomicrmw_add_i8_monotonic: 333; RV32I: # %bb.0: 334; RV32I-NEXT: addi sp, sp, -16 335; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 336; RV32I-NEXT: li a2, 0 337; RV32I-NEXT: call __atomic_fetch_add_1@plt 338; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 339; RV32I-NEXT: addi sp, sp, 16 340; RV32I-NEXT: ret 341; 342; RV32IA-LABEL: atomicrmw_add_i8_monotonic: 343; RV32IA: # %bb.0: 344; RV32IA-NEXT: andi a2, a0, -4 345; RV32IA-NEXT: slli a0, a0, 3 346; RV32IA-NEXT: li a3, 255 347; RV32IA-NEXT: sll a3, a3, a0 348; RV32IA-NEXT: andi a1, a1, 255 349; RV32IA-NEXT: sll a1, a1, a0 350; RV32IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 351; RV32IA-NEXT: lr.w a4, (a2) 352; RV32IA-NEXT: add a5, a4, a1 353; RV32IA-NEXT: xor a5, a4, a5 354; RV32IA-NEXT: and a5, a5, a3 355; RV32IA-NEXT: xor a5, a4, a5 356; RV32IA-NEXT: sc.w a5, a5, (a2) 357; RV32IA-NEXT: bnez a5, .LBB5_1 358; RV32IA-NEXT: # %bb.2: 359; RV32IA-NEXT: srl a0, a4, a0 360; RV32IA-NEXT: ret 361; 362; RV64I-LABEL: atomicrmw_add_i8_monotonic: 363; RV64I: # %bb.0: 364; RV64I-NEXT: addi sp, sp, -16 365; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 366; RV64I-NEXT: li a2, 0 367; RV64I-NEXT: call __atomic_fetch_add_1@plt 368; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 369; RV64I-NEXT: addi sp, sp, 16 370; RV64I-NEXT: ret 371; 372; RV64IA-LABEL: atomicrmw_add_i8_monotonic: 373; RV64IA: # %bb.0: 374; RV64IA-NEXT: andi a2, a0, -4 375; RV64IA-NEXT: slliw a0, a0, 3 376; RV64IA-NEXT: li a3, 255 377; RV64IA-NEXT: sllw a3, a3, a0 378; RV64IA-NEXT: andi a1, a1, 255 379; RV64IA-NEXT: sllw a1, a1, a0 380; RV64IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 381; RV64IA-NEXT: lr.w a4, (a2) 382; RV64IA-NEXT: add a5, a4, a1 383; RV64IA-NEXT: xor a5, a4, a5 384; RV64IA-NEXT: and a5, a5, a3 385; RV64IA-NEXT: xor a5, a4, a5 386; RV64IA-NEXT: sc.w a5, a5, (a2) 387; RV64IA-NEXT: bnez a5, .LBB5_1 388; RV64IA-NEXT: # %bb.2: 389; RV64IA-NEXT: srlw a0, a4, a0 390; RV64IA-NEXT: ret 391 %1 = atomicrmw add i8* %a, i8 %b monotonic 392 ret i8 %1 393} 394 395define i8 @atomicrmw_add_i8_acquire(i8 *%a, i8 %b) nounwind { 396; RV32I-LABEL: atomicrmw_add_i8_acquire: 397; RV32I: # %bb.0: 398; RV32I-NEXT: addi sp, sp, -16 399; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 400; RV32I-NEXT: li a2, 2 401; RV32I-NEXT: call __atomic_fetch_add_1@plt 402; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 403; RV32I-NEXT: addi sp, sp, 16 404; RV32I-NEXT: ret 405; 406; RV32IA-LABEL: atomicrmw_add_i8_acquire: 407; RV32IA: # %bb.0: 408; RV32IA-NEXT: andi a2, a0, -4 409; RV32IA-NEXT: slli a0, a0, 3 410; RV32IA-NEXT: li a3, 255 411; RV32IA-NEXT: sll a3, a3, a0 412; RV32IA-NEXT: andi a1, a1, 255 413; RV32IA-NEXT: sll a1, a1, a0 414; RV32IA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1 415; RV32IA-NEXT: lr.w.aq a4, (a2) 416; RV32IA-NEXT: add a5, a4, a1 417; RV32IA-NEXT: xor a5, a4, a5 418; RV32IA-NEXT: and a5, a5, a3 419; RV32IA-NEXT: xor a5, a4, a5 420; RV32IA-NEXT: sc.w a5, a5, (a2) 421; RV32IA-NEXT: bnez a5, .LBB6_1 422; RV32IA-NEXT: # %bb.2: 423; RV32IA-NEXT: srl a0, a4, a0 424; RV32IA-NEXT: ret 425; 426; RV64I-LABEL: atomicrmw_add_i8_acquire: 427; RV64I: # %bb.0: 428; RV64I-NEXT: addi sp, sp, -16 429; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 430; RV64I-NEXT: li a2, 2 431; RV64I-NEXT: call __atomic_fetch_add_1@plt 432; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 433; RV64I-NEXT: addi sp, sp, 16 434; RV64I-NEXT: ret 435; 436; RV64IA-LABEL: atomicrmw_add_i8_acquire: 437; RV64IA: # %bb.0: 438; RV64IA-NEXT: andi a2, a0, -4 439; RV64IA-NEXT: slliw a0, a0, 3 440; RV64IA-NEXT: li a3, 255 441; RV64IA-NEXT: sllw a3, a3, a0 442; RV64IA-NEXT: andi a1, a1, 255 443; RV64IA-NEXT: sllw a1, a1, a0 444; RV64IA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1 445; RV64IA-NEXT: lr.w.aq a4, (a2) 446; RV64IA-NEXT: add a5, a4, a1 447; RV64IA-NEXT: xor a5, a4, a5 448; RV64IA-NEXT: and a5, a5, a3 449; RV64IA-NEXT: xor a5, a4, a5 450; RV64IA-NEXT: sc.w a5, a5, (a2) 451; RV64IA-NEXT: bnez a5, .LBB6_1 452; RV64IA-NEXT: # %bb.2: 453; RV64IA-NEXT: srlw a0, a4, a0 454; RV64IA-NEXT: ret 455 %1 = atomicrmw add i8* %a, i8 %b acquire 456 ret i8 %1 457} 458 459define i8 @atomicrmw_add_i8_release(i8 *%a, i8 %b) nounwind { 460; RV32I-LABEL: atomicrmw_add_i8_release: 461; RV32I: # %bb.0: 462; RV32I-NEXT: addi sp, sp, -16 463; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 464; RV32I-NEXT: li a2, 3 465; RV32I-NEXT: call __atomic_fetch_add_1@plt 466; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 467; RV32I-NEXT: addi sp, sp, 16 468; RV32I-NEXT: ret 469; 470; RV32IA-LABEL: atomicrmw_add_i8_release: 471; RV32IA: # %bb.0: 472; RV32IA-NEXT: andi a2, a0, -4 473; RV32IA-NEXT: slli a0, a0, 3 474; RV32IA-NEXT: li a3, 255 475; RV32IA-NEXT: sll a3, a3, a0 476; RV32IA-NEXT: andi a1, a1, 255 477; RV32IA-NEXT: sll a1, a1, a0 478; RV32IA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 479; RV32IA-NEXT: lr.w a4, (a2) 480; RV32IA-NEXT: add a5, a4, a1 481; RV32IA-NEXT: xor a5, a4, a5 482; RV32IA-NEXT: and a5, a5, a3 483; RV32IA-NEXT: xor a5, a4, a5 484; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 485; RV32IA-NEXT: bnez a5, .LBB7_1 486; RV32IA-NEXT: # %bb.2: 487; RV32IA-NEXT: srl a0, a4, a0 488; RV32IA-NEXT: ret 489; 490; RV64I-LABEL: atomicrmw_add_i8_release: 491; RV64I: # %bb.0: 492; RV64I-NEXT: addi sp, sp, -16 493; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 494; RV64I-NEXT: li a2, 3 495; RV64I-NEXT: call __atomic_fetch_add_1@plt 496; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 497; RV64I-NEXT: addi sp, sp, 16 498; RV64I-NEXT: ret 499; 500; RV64IA-LABEL: atomicrmw_add_i8_release: 501; RV64IA: # %bb.0: 502; RV64IA-NEXT: andi a2, a0, -4 503; RV64IA-NEXT: slliw a0, a0, 3 504; RV64IA-NEXT: li a3, 255 505; RV64IA-NEXT: sllw a3, a3, a0 506; RV64IA-NEXT: andi a1, a1, 255 507; RV64IA-NEXT: sllw a1, a1, a0 508; RV64IA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 509; RV64IA-NEXT: lr.w a4, (a2) 510; RV64IA-NEXT: add a5, a4, a1 511; RV64IA-NEXT: xor a5, a4, a5 512; RV64IA-NEXT: and a5, a5, a3 513; RV64IA-NEXT: xor a5, a4, a5 514; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 515; RV64IA-NEXT: bnez a5, .LBB7_1 516; RV64IA-NEXT: # %bb.2: 517; RV64IA-NEXT: srlw a0, a4, a0 518; RV64IA-NEXT: ret 519 %1 = atomicrmw add i8* %a, i8 %b release 520 ret i8 %1 521} 522 523define i8 @atomicrmw_add_i8_acq_rel(i8 *%a, i8 %b) nounwind { 524; RV32I-LABEL: atomicrmw_add_i8_acq_rel: 525; RV32I: # %bb.0: 526; RV32I-NEXT: addi sp, sp, -16 527; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 528; RV32I-NEXT: li a2, 4 529; RV32I-NEXT: call __atomic_fetch_add_1@plt 530; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 531; RV32I-NEXT: addi sp, sp, 16 532; RV32I-NEXT: ret 533; 534; RV32IA-LABEL: atomicrmw_add_i8_acq_rel: 535; RV32IA: # %bb.0: 536; RV32IA-NEXT: andi a2, a0, -4 537; RV32IA-NEXT: slli a0, a0, 3 538; RV32IA-NEXT: li a3, 255 539; RV32IA-NEXT: sll a3, a3, a0 540; RV32IA-NEXT: andi a1, a1, 255 541; RV32IA-NEXT: sll a1, a1, a0 542; RV32IA-NEXT: .LBB8_1: # =>This Inner Loop Header: Depth=1 543; RV32IA-NEXT: lr.w.aq a4, (a2) 544; RV32IA-NEXT: add a5, a4, a1 545; RV32IA-NEXT: xor a5, a4, a5 546; RV32IA-NEXT: and a5, a5, a3 547; RV32IA-NEXT: xor a5, a4, a5 548; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 549; RV32IA-NEXT: bnez a5, .LBB8_1 550; RV32IA-NEXT: # %bb.2: 551; RV32IA-NEXT: srl a0, a4, a0 552; RV32IA-NEXT: ret 553; 554; RV64I-LABEL: atomicrmw_add_i8_acq_rel: 555; RV64I: # %bb.0: 556; RV64I-NEXT: addi sp, sp, -16 557; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 558; RV64I-NEXT: li a2, 4 559; RV64I-NEXT: call __atomic_fetch_add_1@plt 560; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 561; RV64I-NEXT: addi sp, sp, 16 562; RV64I-NEXT: ret 563; 564; RV64IA-LABEL: atomicrmw_add_i8_acq_rel: 565; RV64IA: # %bb.0: 566; RV64IA-NEXT: andi a2, a0, -4 567; RV64IA-NEXT: slliw a0, a0, 3 568; RV64IA-NEXT: li a3, 255 569; RV64IA-NEXT: sllw a3, a3, a0 570; RV64IA-NEXT: andi a1, a1, 255 571; RV64IA-NEXT: sllw a1, a1, a0 572; RV64IA-NEXT: .LBB8_1: # =>This Inner Loop Header: Depth=1 573; RV64IA-NEXT: lr.w.aq a4, (a2) 574; RV64IA-NEXT: add a5, a4, a1 575; RV64IA-NEXT: xor a5, a4, a5 576; RV64IA-NEXT: and a5, a5, a3 577; RV64IA-NEXT: xor a5, a4, a5 578; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 579; RV64IA-NEXT: bnez a5, .LBB8_1 580; RV64IA-NEXT: # %bb.2: 581; RV64IA-NEXT: srlw a0, a4, a0 582; RV64IA-NEXT: ret 583 %1 = atomicrmw add i8* %a, i8 %b acq_rel 584 ret i8 %1 585} 586 587define i8 @atomicrmw_add_i8_seq_cst(i8 *%a, i8 %b) nounwind { 588; RV32I-LABEL: atomicrmw_add_i8_seq_cst: 589; RV32I: # %bb.0: 590; RV32I-NEXT: addi sp, sp, -16 591; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 592; RV32I-NEXT: li a2, 5 593; RV32I-NEXT: call __atomic_fetch_add_1@plt 594; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 595; RV32I-NEXT: addi sp, sp, 16 596; RV32I-NEXT: ret 597; 598; RV32IA-LABEL: atomicrmw_add_i8_seq_cst: 599; RV32IA: # %bb.0: 600; RV32IA-NEXT: andi a2, a0, -4 601; RV32IA-NEXT: slli a0, a0, 3 602; RV32IA-NEXT: li a3, 255 603; RV32IA-NEXT: sll a3, a3, a0 604; RV32IA-NEXT: andi a1, a1, 255 605; RV32IA-NEXT: sll a1, a1, a0 606; RV32IA-NEXT: .LBB9_1: # =>This Inner Loop Header: Depth=1 607; RV32IA-NEXT: lr.w.aqrl a4, (a2) 608; RV32IA-NEXT: add a5, a4, a1 609; RV32IA-NEXT: xor a5, a4, a5 610; RV32IA-NEXT: and a5, a5, a3 611; RV32IA-NEXT: xor a5, a4, a5 612; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 613; RV32IA-NEXT: bnez a5, .LBB9_1 614; RV32IA-NEXT: # %bb.2: 615; RV32IA-NEXT: srl a0, a4, a0 616; RV32IA-NEXT: ret 617; 618; RV64I-LABEL: atomicrmw_add_i8_seq_cst: 619; RV64I: # %bb.0: 620; RV64I-NEXT: addi sp, sp, -16 621; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 622; RV64I-NEXT: li a2, 5 623; RV64I-NEXT: call __atomic_fetch_add_1@plt 624; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 625; RV64I-NEXT: addi sp, sp, 16 626; RV64I-NEXT: ret 627; 628; RV64IA-LABEL: atomicrmw_add_i8_seq_cst: 629; RV64IA: # %bb.0: 630; RV64IA-NEXT: andi a2, a0, -4 631; RV64IA-NEXT: slliw a0, a0, 3 632; RV64IA-NEXT: li a3, 255 633; RV64IA-NEXT: sllw a3, a3, a0 634; RV64IA-NEXT: andi a1, a1, 255 635; RV64IA-NEXT: sllw a1, a1, a0 636; RV64IA-NEXT: .LBB9_1: # =>This Inner Loop Header: Depth=1 637; RV64IA-NEXT: lr.w.aqrl a4, (a2) 638; RV64IA-NEXT: add a5, a4, a1 639; RV64IA-NEXT: xor a5, a4, a5 640; RV64IA-NEXT: and a5, a5, a3 641; RV64IA-NEXT: xor a5, a4, a5 642; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 643; RV64IA-NEXT: bnez a5, .LBB9_1 644; RV64IA-NEXT: # %bb.2: 645; RV64IA-NEXT: srlw a0, a4, a0 646; RV64IA-NEXT: ret 647 %1 = atomicrmw add i8* %a, i8 %b seq_cst 648 ret i8 %1 649} 650 651define i8 @atomicrmw_sub_i8_monotonic(i8* %a, i8 %b) nounwind { 652; RV32I-LABEL: atomicrmw_sub_i8_monotonic: 653; RV32I: # %bb.0: 654; RV32I-NEXT: addi sp, sp, -16 655; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 656; RV32I-NEXT: li a2, 0 657; RV32I-NEXT: call __atomic_fetch_sub_1@plt 658; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 659; RV32I-NEXT: addi sp, sp, 16 660; RV32I-NEXT: ret 661; 662; RV32IA-LABEL: atomicrmw_sub_i8_monotonic: 663; RV32IA: # %bb.0: 664; RV32IA-NEXT: andi a2, a0, -4 665; RV32IA-NEXT: slli a0, a0, 3 666; RV32IA-NEXT: li a3, 255 667; RV32IA-NEXT: sll a3, a3, a0 668; RV32IA-NEXT: andi a1, a1, 255 669; RV32IA-NEXT: sll a1, a1, a0 670; RV32IA-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 671; RV32IA-NEXT: lr.w a4, (a2) 672; RV32IA-NEXT: sub a5, a4, a1 673; RV32IA-NEXT: xor a5, a4, a5 674; RV32IA-NEXT: and a5, a5, a3 675; RV32IA-NEXT: xor a5, a4, a5 676; RV32IA-NEXT: sc.w a5, a5, (a2) 677; RV32IA-NEXT: bnez a5, .LBB10_1 678; RV32IA-NEXT: # %bb.2: 679; RV32IA-NEXT: srl a0, a4, a0 680; RV32IA-NEXT: ret 681; 682; RV64I-LABEL: atomicrmw_sub_i8_monotonic: 683; RV64I: # %bb.0: 684; RV64I-NEXT: addi sp, sp, -16 685; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 686; RV64I-NEXT: li a2, 0 687; RV64I-NEXT: call __atomic_fetch_sub_1@plt 688; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 689; RV64I-NEXT: addi sp, sp, 16 690; RV64I-NEXT: ret 691; 692; RV64IA-LABEL: atomicrmw_sub_i8_monotonic: 693; RV64IA: # %bb.0: 694; RV64IA-NEXT: andi a2, a0, -4 695; RV64IA-NEXT: slliw a0, a0, 3 696; RV64IA-NEXT: li a3, 255 697; RV64IA-NEXT: sllw a3, a3, a0 698; RV64IA-NEXT: andi a1, a1, 255 699; RV64IA-NEXT: sllw a1, a1, a0 700; RV64IA-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 701; RV64IA-NEXT: lr.w a4, (a2) 702; RV64IA-NEXT: sub a5, a4, a1 703; RV64IA-NEXT: xor a5, a4, a5 704; RV64IA-NEXT: and a5, a5, a3 705; RV64IA-NEXT: xor a5, a4, a5 706; RV64IA-NEXT: sc.w a5, a5, (a2) 707; RV64IA-NEXT: bnez a5, .LBB10_1 708; RV64IA-NEXT: # %bb.2: 709; RV64IA-NEXT: srlw a0, a4, a0 710; RV64IA-NEXT: ret 711 %1 = atomicrmw sub i8* %a, i8 %b monotonic 712 ret i8 %1 713} 714 715define i8 @atomicrmw_sub_i8_acquire(i8* %a, i8 %b) nounwind { 716; RV32I-LABEL: atomicrmw_sub_i8_acquire: 717; RV32I: # %bb.0: 718; RV32I-NEXT: addi sp, sp, -16 719; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 720; RV32I-NEXT: li a2, 2 721; RV32I-NEXT: call __atomic_fetch_sub_1@plt 722; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 723; RV32I-NEXT: addi sp, sp, 16 724; RV32I-NEXT: ret 725; 726; RV32IA-LABEL: atomicrmw_sub_i8_acquire: 727; RV32IA: # %bb.0: 728; RV32IA-NEXT: andi a2, a0, -4 729; RV32IA-NEXT: slli a0, a0, 3 730; RV32IA-NEXT: li a3, 255 731; RV32IA-NEXT: sll a3, a3, a0 732; RV32IA-NEXT: andi a1, a1, 255 733; RV32IA-NEXT: sll a1, a1, a0 734; RV32IA-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 735; RV32IA-NEXT: lr.w.aq a4, (a2) 736; RV32IA-NEXT: sub a5, a4, a1 737; RV32IA-NEXT: xor a5, a4, a5 738; RV32IA-NEXT: and a5, a5, a3 739; RV32IA-NEXT: xor a5, a4, a5 740; RV32IA-NEXT: sc.w a5, a5, (a2) 741; RV32IA-NEXT: bnez a5, .LBB11_1 742; RV32IA-NEXT: # %bb.2: 743; RV32IA-NEXT: srl a0, a4, a0 744; RV32IA-NEXT: ret 745; 746; RV64I-LABEL: atomicrmw_sub_i8_acquire: 747; RV64I: # %bb.0: 748; RV64I-NEXT: addi sp, sp, -16 749; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 750; RV64I-NEXT: li a2, 2 751; RV64I-NEXT: call __atomic_fetch_sub_1@plt 752; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 753; RV64I-NEXT: addi sp, sp, 16 754; RV64I-NEXT: ret 755; 756; RV64IA-LABEL: atomicrmw_sub_i8_acquire: 757; RV64IA: # %bb.0: 758; RV64IA-NEXT: andi a2, a0, -4 759; RV64IA-NEXT: slliw a0, a0, 3 760; RV64IA-NEXT: li a3, 255 761; RV64IA-NEXT: sllw a3, a3, a0 762; RV64IA-NEXT: andi a1, a1, 255 763; RV64IA-NEXT: sllw a1, a1, a0 764; RV64IA-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 765; RV64IA-NEXT: lr.w.aq a4, (a2) 766; RV64IA-NEXT: sub a5, a4, a1 767; RV64IA-NEXT: xor a5, a4, a5 768; RV64IA-NEXT: and a5, a5, a3 769; RV64IA-NEXT: xor a5, a4, a5 770; RV64IA-NEXT: sc.w a5, a5, (a2) 771; RV64IA-NEXT: bnez a5, .LBB11_1 772; RV64IA-NEXT: # %bb.2: 773; RV64IA-NEXT: srlw a0, a4, a0 774; RV64IA-NEXT: ret 775 %1 = atomicrmw sub i8* %a, i8 %b acquire 776 ret i8 %1 777} 778 779define i8 @atomicrmw_sub_i8_release(i8* %a, i8 %b) nounwind { 780; RV32I-LABEL: atomicrmw_sub_i8_release: 781; RV32I: # %bb.0: 782; RV32I-NEXT: addi sp, sp, -16 783; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 784; RV32I-NEXT: li a2, 3 785; RV32I-NEXT: call __atomic_fetch_sub_1@plt 786; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 787; RV32I-NEXT: addi sp, sp, 16 788; RV32I-NEXT: ret 789; 790; RV32IA-LABEL: atomicrmw_sub_i8_release: 791; RV32IA: # %bb.0: 792; RV32IA-NEXT: andi a2, a0, -4 793; RV32IA-NEXT: slli a0, a0, 3 794; RV32IA-NEXT: li a3, 255 795; RV32IA-NEXT: sll a3, a3, a0 796; RV32IA-NEXT: andi a1, a1, 255 797; RV32IA-NEXT: sll a1, a1, a0 798; RV32IA-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 799; RV32IA-NEXT: lr.w a4, (a2) 800; RV32IA-NEXT: sub a5, a4, a1 801; RV32IA-NEXT: xor a5, a4, a5 802; RV32IA-NEXT: and a5, a5, a3 803; RV32IA-NEXT: xor a5, a4, a5 804; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 805; RV32IA-NEXT: bnez a5, .LBB12_1 806; RV32IA-NEXT: # %bb.2: 807; RV32IA-NEXT: srl a0, a4, a0 808; RV32IA-NEXT: ret 809; 810; RV64I-LABEL: atomicrmw_sub_i8_release: 811; RV64I: # %bb.0: 812; RV64I-NEXT: addi sp, sp, -16 813; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 814; RV64I-NEXT: li a2, 3 815; RV64I-NEXT: call __atomic_fetch_sub_1@plt 816; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 817; RV64I-NEXT: addi sp, sp, 16 818; RV64I-NEXT: ret 819; 820; RV64IA-LABEL: atomicrmw_sub_i8_release: 821; RV64IA: # %bb.0: 822; RV64IA-NEXT: andi a2, a0, -4 823; RV64IA-NEXT: slliw a0, a0, 3 824; RV64IA-NEXT: li a3, 255 825; RV64IA-NEXT: sllw a3, a3, a0 826; RV64IA-NEXT: andi a1, a1, 255 827; RV64IA-NEXT: sllw a1, a1, a0 828; RV64IA-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 829; RV64IA-NEXT: lr.w a4, (a2) 830; RV64IA-NEXT: sub a5, a4, a1 831; RV64IA-NEXT: xor a5, a4, a5 832; RV64IA-NEXT: and a5, a5, a3 833; RV64IA-NEXT: xor a5, a4, a5 834; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 835; RV64IA-NEXT: bnez a5, .LBB12_1 836; RV64IA-NEXT: # %bb.2: 837; RV64IA-NEXT: srlw a0, a4, a0 838; RV64IA-NEXT: ret 839 %1 = atomicrmw sub i8* %a, i8 %b release 840 ret i8 %1 841} 842 843define i8 @atomicrmw_sub_i8_acq_rel(i8* %a, i8 %b) nounwind { 844; RV32I-LABEL: atomicrmw_sub_i8_acq_rel: 845; RV32I: # %bb.0: 846; RV32I-NEXT: addi sp, sp, -16 847; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 848; RV32I-NEXT: li a2, 4 849; RV32I-NEXT: call __atomic_fetch_sub_1@plt 850; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 851; RV32I-NEXT: addi sp, sp, 16 852; RV32I-NEXT: ret 853; 854; RV32IA-LABEL: atomicrmw_sub_i8_acq_rel: 855; RV32IA: # %bb.0: 856; RV32IA-NEXT: andi a2, a0, -4 857; RV32IA-NEXT: slli a0, a0, 3 858; RV32IA-NEXT: li a3, 255 859; RV32IA-NEXT: sll a3, a3, a0 860; RV32IA-NEXT: andi a1, a1, 255 861; RV32IA-NEXT: sll a1, a1, a0 862; RV32IA-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 863; RV32IA-NEXT: lr.w.aq a4, (a2) 864; RV32IA-NEXT: sub a5, a4, a1 865; RV32IA-NEXT: xor a5, a4, a5 866; RV32IA-NEXT: and a5, a5, a3 867; RV32IA-NEXT: xor a5, a4, a5 868; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 869; RV32IA-NEXT: bnez a5, .LBB13_1 870; RV32IA-NEXT: # %bb.2: 871; RV32IA-NEXT: srl a0, a4, a0 872; RV32IA-NEXT: ret 873; 874; RV64I-LABEL: atomicrmw_sub_i8_acq_rel: 875; RV64I: # %bb.0: 876; RV64I-NEXT: addi sp, sp, -16 877; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 878; RV64I-NEXT: li a2, 4 879; RV64I-NEXT: call __atomic_fetch_sub_1@plt 880; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 881; RV64I-NEXT: addi sp, sp, 16 882; RV64I-NEXT: ret 883; 884; RV64IA-LABEL: atomicrmw_sub_i8_acq_rel: 885; RV64IA: # %bb.0: 886; RV64IA-NEXT: andi a2, a0, -4 887; RV64IA-NEXT: slliw a0, a0, 3 888; RV64IA-NEXT: li a3, 255 889; RV64IA-NEXT: sllw a3, a3, a0 890; RV64IA-NEXT: andi a1, a1, 255 891; RV64IA-NEXT: sllw a1, a1, a0 892; RV64IA-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 893; RV64IA-NEXT: lr.w.aq a4, (a2) 894; RV64IA-NEXT: sub a5, a4, a1 895; RV64IA-NEXT: xor a5, a4, a5 896; RV64IA-NEXT: and a5, a5, a3 897; RV64IA-NEXT: xor a5, a4, a5 898; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 899; RV64IA-NEXT: bnez a5, .LBB13_1 900; RV64IA-NEXT: # %bb.2: 901; RV64IA-NEXT: srlw a0, a4, a0 902; RV64IA-NEXT: ret 903 %1 = atomicrmw sub i8* %a, i8 %b acq_rel 904 ret i8 %1 905} 906 907define i8 @atomicrmw_sub_i8_seq_cst(i8* %a, i8 %b) nounwind { 908; RV32I-LABEL: atomicrmw_sub_i8_seq_cst: 909; RV32I: # %bb.0: 910; RV32I-NEXT: addi sp, sp, -16 911; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 912; RV32I-NEXT: li a2, 5 913; RV32I-NEXT: call __atomic_fetch_sub_1@plt 914; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 915; RV32I-NEXT: addi sp, sp, 16 916; RV32I-NEXT: ret 917; 918; RV32IA-LABEL: atomicrmw_sub_i8_seq_cst: 919; RV32IA: # %bb.0: 920; RV32IA-NEXT: andi a2, a0, -4 921; RV32IA-NEXT: slli a0, a0, 3 922; RV32IA-NEXT: li a3, 255 923; RV32IA-NEXT: sll a3, a3, a0 924; RV32IA-NEXT: andi a1, a1, 255 925; RV32IA-NEXT: sll a1, a1, a0 926; RV32IA-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 927; RV32IA-NEXT: lr.w.aqrl a4, (a2) 928; RV32IA-NEXT: sub a5, a4, a1 929; RV32IA-NEXT: xor a5, a4, a5 930; RV32IA-NEXT: and a5, a5, a3 931; RV32IA-NEXT: xor a5, a4, a5 932; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 933; RV32IA-NEXT: bnez a5, .LBB14_1 934; RV32IA-NEXT: # %bb.2: 935; RV32IA-NEXT: srl a0, a4, a0 936; RV32IA-NEXT: ret 937; 938; RV64I-LABEL: atomicrmw_sub_i8_seq_cst: 939; RV64I: # %bb.0: 940; RV64I-NEXT: addi sp, sp, -16 941; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 942; RV64I-NEXT: li a2, 5 943; RV64I-NEXT: call __atomic_fetch_sub_1@plt 944; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 945; RV64I-NEXT: addi sp, sp, 16 946; RV64I-NEXT: ret 947; 948; RV64IA-LABEL: atomicrmw_sub_i8_seq_cst: 949; RV64IA: # %bb.0: 950; RV64IA-NEXT: andi a2, a0, -4 951; RV64IA-NEXT: slliw a0, a0, 3 952; RV64IA-NEXT: li a3, 255 953; RV64IA-NEXT: sllw a3, a3, a0 954; RV64IA-NEXT: andi a1, a1, 255 955; RV64IA-NEXT: sllw a1, a1, a0 956; RV64IA-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 957; RV64IA-NEXT: lr.w.aqrl a4, (a2) 958; RV64IA-NEXT: sub a5, a4, a1 959; RV64IA-NEXT: xor a5, a4, a5 960; RV64IA-NEXT: and a5, a5, a3 961; RV64IA-NEXT: xor a5, a4, a5 962; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 963; RV64IA-NEXT: bnez a5, .LBB14_1 964; RV64IA-NEXT: # %bb.2: 965; RV64IA-NEXT: srlw a0, a4, a0 966; RV64IA-NEXT: ret 967 %1 = atomicrmw sub i8* %a, i8 %b seq_cst 968 ret i8 %1 969} 970 971define i8 @atomicrmw_and_i8_monotonic(i8 *%a, i8 %b) nounwind { 972; RV32I-LABEL: atomicrmw_and_i8_monotonic: 973; RV32I: # %bb.0: 974; RV32I-NEXT: addi sp, sp, -16 975; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 976; RV32I-NEXT: li a2, 0 977; RV32I-NEXT: call __atomic_fetch_and_1@plt 978; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 979; RV32I-NEXT: addi sp, sp, 16 980; RV32I-NEXT: ret 981; 982; RV32IA-LABEL: atomicrmw_and_i8_monotonic: 983; RV32IA: # %bb.0: 984; RV32IA-NEXT: andi a2, a0, -4 985; RV32IA-NEXT: slli a0, a0, 3 986; RV32IA-NEXT: li a3, 255 987; RV32IA-NEXT: sll a3, a3, a0 988; RV32IA-NEXT: not a3, a3 989; RV32IA-NEXT: andi a1, a1, 255 990; RV32IA-NEXT: sll a1, a1, a0 991; RV32IA-NEXT: or a1, a3, a1 992; RV32IA-NEXT: amoand.w a1, a1, (a2) 993; RV32IA-NEXT: srl a0, a1, a0 994; RV32IA-NEXT: ret 995; 996; RV64I-LABEL: atomicrmw_and_i8_monotonic: 997; RV64I: # %bb.0: 998; RV64I-NEXT: addi sp, sp, -16 999; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1000; RV64I-NEXT: li a2, 0 1001; RV64I-NEXT: call __atomic_fetch_and_1@plt 1002; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1003; RV64I-NEXT: addi sp, sp, 16 1004; RV64I-NEXT: ret 1005; 1006; RV64IA-LABEL: atomicrmw_and_i8_monotonic: 1007; RV64IA: # %bb.0: 1008; RV64IA-NEXT: andi a2, a0, -4 1009; RV64IA-NEXT: slliw a0, a0, 3 1010; RV64IA-NEXT: li a3, 255 1011; RV64IA-NEXT: sllw a3, a3, a0 1012; RV64IA-NEXT: not a3, a3 1013; RV64IA-NEXT: andi a1, a1, 255 1014; RV64IA-NEXT: sllw a1, a1, a0 1015; RV64IA-NEXT: or a1, a3, a1 1016; RV64IA-NEXT: amoand.w a1, a1, (a2) 1017; RV64IA-NEXT: srlw a0, a1, a0 1018; RV64IA-NEXT: ret 1019 %1 = atomicrmw and i8* %a, i8 %b monotonic 1020 ret i8 %1 1021} 1022 1023define i8 @atomicrmw_and_i8_acquire(i8 *%a, i8 %b) nounwind { 1024; RV32I-LABEL: atomicrmw_and_i8_acquire: 1025; RV32I: # %bb.0: 1026; RV32I-NEXT: addi sp, sp, -16 1027; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1028; RV32I-NEXT: li a2, 2 1029; RV32I-NEXT: call __atomic_fetch_and_1@plt 1030; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1031; RV32I-NEXT: addi sp, sp, 16 1032; RV32I-NEXT: ret 1033; 1034; RV32IA-LABEL: atomicrmw_and_i8_acquire: 1035; RV32IA: # %bb.0: 1036; RV32IA-NEXT: andi a2, a0, -4 1037; RV32IA-NEXT: slli a0, a0, 3 1038; RV32IA-NEXT: li a3, 255 1039; RV32IA-NEXT: sll a3, a3, a0 1040; RV32IA-NEXT: not a3, a3 1041; RV32IA-NEXT: andi a1, a1, 255 1042; RV32IA-NEXT: sll a1, a1, a0 1043; RV32IA-NEXT: or a1, a3, a1 1044; RV32IA-NEXT: amoand.w.aq a1, a1, (a2) 1045; RV32IA-NEXT: srl a0, a1, a0 1046; RV32IA-NEXT: ret 1047; 1048; RV64I-LABEL: atomicrmw_and_i8_acquire: 1049; RV64I: # %bb.0: 1050; RV64I-NEXT: addi sp, sp, -16 1051; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1052; RV64I-NEXT: li a2, 2 1053; RV64I-NEXT: call __atomic_fetch_and_1@plt 1054; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1055; RV64I-NEXT: addi sp, sp, 16 1056; RV64I-NEXT: ret 1057; 1058; RV64IA-LABEL: atomicrmw_and_i8_acquire: 1059; RV64IA: # %bb.0: 1060; RV64IA-NEXT: andi a2, a0, -4 1061; RV64IA-NEXT: slliw a0, a0, 3 1062; RV64IA-NEXT: li a3, 255 1063; RV64IA-NEXT: sllw a3, a3, a0 1064; RV64IA-NEXT: not a3, a3 1065; RV64IA-NEXT: andi a1, a1, 255 1066; RV64IA-NEXT: sllw a1, a1, a0 1067; RV64IA-NEXT: or a1, a3, a1 1068; RV64IA-NEXT: amoand.w.aq a1, a1, (a2) 1069; RV64IA-NEXT: srlw a0, a1, a0 1070; RV64IA-NEXT: ret 1071 %1 = atomicrmw and i8* %a, i8 %b acquire 1072 ret i8 %1 1073} 1074 1075define i8 @atomicrmw_and_i8_release(i8 *%a, i8 %b) nounwind { 1076; RV32I-LABEL: atomicrmw_and_i8_release: 1077; RV32I: # %bb.0: 1078; RV32I-NEXT: addi sp, sp, -16 1079; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1080; RV32I-NEXT: li a2, 3 1081; RV32I-NEXT: call __atomic_fetch_and_1@plt 1082; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1083; RV32I-NEXT: addi sp, sp, 16 1084; RV32I-NEXT: ret 1085; 1086; RV32IA-LABEL: atomicrmw_and_i8_release: 1087; RV32IA: # %bb.0: 1088; RV32IA-NEXT: andi a2, a0, -4 1089; RV32IA-NEXT: slli a0, a0, 3 1090; RV32IA-NEXT: li a3, 255 1091; RV32IA-NEXT: sll a3, a3, a0 1092; RV32IA-NEXT: not a3, a3 1093; RV32IA-NEXT: andi a1, a1, 255 1094; RV32IA-NEXT: sll a1, a1, a0 1095; RV32IA-NEXT: or a1, a3, a1 1096; RV32IA-NEXT: amoand.w.rl a1, a1, (a2) 1097; RV32IA-NEXT: srl a0, a1, a0 1098; RV32IA-NEXT: ret 1099; 1100; RV64I-LABEL: atomicrmw_and_i8_release: 1101; RV64I: # %bb.0: 1102; RV64I-NEXT: addi sp, sp, -16 1103; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1104; RV64I-NEXT: li a2, 3 1105; RV64I-NEXT: call __atomic_fetch_and_1@plt 1106; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1107; RV64I-NEXT: addi sp, sp, 16 1108; RV64I-NEXT: ret 1109; 1110; RV64IA-LABEL: atomicrmw_and_i8_release: 1111; RV64IA: # %bb.0: 1112; RV64IA-NEXT: andi a2, a0, -4 1113; RV64IA-NEXT: slliw a0, a0, 3 1114; RV64IA-NEXT: li a3, 255 1115; RV64IA-NEXT: sllw a3, a3, a0 1116; RV64IA-NEXT: not a3, a3 1117; RV64IA-NEXT: andi a1, a1, 255 1118; RV64IA-NEXT: sllw a1, a1, a0 1119; RV64IA-NEXT: or a1, a3, a1 1120; RV64IA-NEXT: amoand.w.rl a1, a1, (a2) 1121; RV64IA-NEXT: srlw a0, a1, a0 1122; RV64IA-NEXT: ret 1123 %1 = atomicrmw and i8* %a, i8 %b release 1124 ret i8 %1 1125} 1126 1127define i8 @atomicrmw_and_i8_acq_rel(i8 *%a, i8 %b) nounwind { 1128; RV32I-LABEL: atomicrmw_and_i8_acq_rel: 1129; RV32I: # %bb.0: 1130; RV32I-NEXT: addi sp, sp, -16 1131; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1132; RV32I-NEXT: li a2, 4 1133; RV32I-NEXT: call __atomic_fetch_and_1@plt 1134; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1135; RV32I-NEXT: addi sp, sp, 16 1136; RV32I-NEXT: ret 1137; 1138; RV32IA-LABEL: atomicrmw_and_i8_acq_rel: 1139; RV32IA: # %bb.0: 1140; RV32IA-NEXT: andi a2, a0, -4 1141; RV32IA-NEXT: slli a0, a0, 3 1142; RV32IA-NEXT: li a3, 255 1143; RV32IA-NEXT: sll a3, a3, a0 1144; RV32IA-NEXT: not a3, a3 1145; RV32IA-NEXT: andi a1, a1, 255 1146; RV32IA-NEXT: sll a1, a1, a0 1147; RV32IA-NEXT: or a1, a3, a1 1148; RV32IA-NEXT: amoand.w.aqrl a1, a1, (a2) 1149; RV32IA-NEXT: srl a0, a1, a0 1150; RV32IA-NEXT: ret 1151; 1152; RV64I-LABEL: atomicrmw_and_i8_acq_rel: 1153; RV64I: # %bb.0: 1154; RV64I-NEXT: addi sp, sp, -16 1155; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1156; RV64I-NEXT: li a2, 4 1157; RV64I-NEXT: call __atomic_fetch_and_1@plt 1158; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1159; RV64I-NEXT: addi sp, sp, 16 1160; RV64I-NEXT: ret 1161; 1162; RV64IA-LABEL: atomicrmw_and_i8_acq_rel: 1163; RV64IA: # %bb.0: 1164; RV64IA-NEXT: andi a2, a0, -4 1165; RV64IA-NEXT: slliw a0, a0, 3 1166; RV64IA-NEXT: li a3, 255 1167; RV64IA-NEXT: sllw a3, a3, a0 1168; RV64IA-NEXT: not a3, a3 1169; RV64IA-NEXT: andi a1, a1, 255 1170; RV64IA-NEXT: sllw a1, a1, a0 1171; RV64IA-NEXT: or a1, a3, a1 1172; RV64IA-NEXT: amoand.w.aqrl a1, a1, (a2) 1173; RV64IA-NEXT: srlw a0, a1, a0 1174; RV64IA-NEXT: ret 1175 %1 = atomicrmw and i8* %a, i8 %b acq_rel 1176 ret i8 %1 1177} 1178 1179define i8 @atomicrmw_and_i8_seq_cst(i8 *%a, i8 %b) nounwind { 1180; RV32I-LABEL: atomicrmw_and_i8_seq_cst: 1181; RV32I: # %bb.0: 1182; RV32I-NEXT: addi sp, sp, -16 1183; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1184; RV32I-NEXT: li a2, 5 1185; RV32I-NEXT: call __atomic_fetch_and_1@plt 1186; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1187; RV32I-NEXT: addi sp, sp, 16 1188; RV32I-NEXT: ret 1189; 1190; RV32IA-LABEL: atomicrmw_and_i8_seq_cst: 1191; RV32IA: # %bb.0: 1192; RV32IA-NEXT: andi a2, a0, -4 1193; RV32IA-NEXT: slli a0, a0, 3 1194; RV32IA-NEXT: li a3, 255 1195; RV32IA-NEXT: sll a3, a3, a0 1196; RV32IA-NEXT: not a3, a3 1197; RV32IA-NEXT: andi a1, a1, 255 1198; RV32IA-NEXT: sll a1, a1, a0 1199; RV32IA-NEXT: or a1, a3, a1 1200; RV32IA-NEXT: amoand.w.aqrl a1, a1, (a2) 1201; RV32IA-NEXT: srl a0, a1, a0 1202; RV32IA-NEXT: ret 1203; 1204; RV64I-LABEL: atomicrmw_and_i8_seq_cst: 1205; RV64I: # %bb.0: 1206; RV64I-NEXT: addi sp, sp, -16 1207; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1208; RV64I-NEXT: li a2, 5 1209; RV64I-NEXT: call __atomic_fetch_and_1@plt 1210; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1211; RV64I-NEXT: addi sp, sp, 16 1212; RV64I-NEXT: ret 1213; 1214; RV64IA-LABEL: atomicrmw_and_i8_seq_cst: 1215; RV64IA: # %bb.0: 1216; RV64IA-NEXT: andi a2, a0, -4 1217; RV64IA-NEXT: slliw a0, a0, 3 1218; RV64IA-NEXT: li a3, 255 1219; RV64IA-NEXT: sllw a3, a3, a0 1220; RV64IA-NEXT: not a3, a3 1221; RV64IA-NEXT: andi a1, a1, 255 1222; RV64IA-NEXT: sllw a1, a1, a0 1223; RV64IA-NEXT: or a1, a3, a1 1224; RV64IA-NEXT: amoand.w.aqrl a1, a1, (a2) 1225; RV64IA-NEXT: srlw a0, a1, a0 1226; RV64IA-NEXT: ret 1227 %1 = atomicrmw and i8* %a, i8 %b seq_cst 1228 ret i8 %1 1229} 1230 1231define i8 @atomicrmw_nand_i8_monotonic(i8* %a, i8 %b) nounwind { 1232; RV32I-LABEL: atomicrmw_nand_i8_monotonic: 1233; RV32I: # %bb.0: 1234; RV32I-NEXT: addi sp, sp, -16 1235; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1236; RV32I-NEXT: li a2, 0 1237; RV32I-NEXT: call __atomic_fetch_nand_1@plt 1238; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1239; RV32I-NEXT: addi sp, sp, 16 1240; RV32I-NEXT: ret 1241; 1242; RV32IA-LABEL: atomicrmw_nand_i8_monotonic: 1243; RV32IA: # %bb.0: 1244; RV32IA-NEXT: andi a2, a0, -4 1245; RV32IA-NEXT: slli a0, a0, 3 1246; RV32IA-NEXT: li a3, 255 1247; RV32IA-NEXT: sll a3, a3, a0 1248; RV32IA-NEXT: andi a1, a1, 255 1249; RV32IA-NEXT: sll a1, a1, a0 1250; RV32IA-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 1251; RV32IA-NEXT: lr.w a4, (a2) 1252; RV32IA-NEXT: and a5, a4, a1 1253; RV32IA-NEXT: not a5, a5 1254; RV32IA-NEXT: xor a5, a4, a5 1255; RV32IA-NEXT: and a5, a5, a3 1256; RV32IA-NEXT: xor a5, a4, a5 1257; RV32IA-NEXT: sc.w a5, a5, (a2) 1258; RV32IA-NEXT: bnez a5, .LBB20_1 1259; RV32IA-NEXT: # %bb.2: 1260; RV32IA-NEXT: srl a0, a4, a0 1261; RV32IA-NEXT: ret 1262; 1263; RV64I-LABEL: atomicrmw_nand_i8_monotonic: 1264; RV64I: # %bb.0: 1265; RV64I-NEXT: addi sp, sp, -16 1266; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1267; RV64I-NEXT: li a2, 0 1268; RV64I-NEXT: call __atomic_fetch_nand_1@plt 1269; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1270; RV64I-NEXT: addi sp, sp, 16 1271; RV64I-NEXT: ret 1272; 1273; RV64IA-LABEL: atomicrmw_nand_i8_monotonic: 1274; RV64IA: # %bb.0: 1275; RV64IA-NEXT: andi a2, a0, -4 1276; RV64IA-NEXT: slliw a0, a0, 3 1277; RV64IA-NEXT: li a3, 255 1278; RV64IA-NEXT: sllw a3, a3, a0 1279; RV64IA-NEXT: andi a1, a1, 255 1280; RV64IA-NEXT: sllw a1, a1, a0 1281; RV64IA-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 1282; RV64IA-NEXT: lr.w a4, (a2) 1283; RV64IA-NEXT: and a5, a4, a1 1284; RV64IA-NEXT: not a5, a5 1285; RV64IA-NEXT: xor a5, a4, a5 1286; RV64IA-NEXT: and a5, a5, a3 1287; RV64IA-NEXT: xor a5, a4, a5 1288; RV64IA-NEXT: sc.w a5, a5, (a2) 1289; RV64IA-NEXT: bnez a5, .LBB20_1 1290; RV64IA-NEXT: # %bb.2: 1291; RV64IA-NEXT: srlw a0, a4, a0 1292; RV64IA-NEXT: ret 1293 %1 = atomicrmw nand i8* %a, i8 %b monotonic 1294 ret i8 %1 1295} 1296 1297define i8 @atomicrmw_nand_i8_acquire(i8* %a, i8 %b) nounwind { 1298; RV32I-LABEL: atomicrmw_nand_i8_acquire: 1299; RV32I: # %bb.0: 1300; RV32I-NEXT: addi sp, sp, -16 1301; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1302; RV32I-NEXT: li a2, 2 1303; RV32I-NEXT: call __atomic_fetch_nand_1@plt 1304; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1305; RV32I-NEXT: addi sp, sp, 16 1306; RV32I-NEXT: ret 1307; 1308; RV32IA-LABEL: atomicrmw_nand_i8_acquire: 1309; RV32IA: # %bb.0: 1310; RV32IA-NEXT: andi a2, a0, -4 1311; RV32IA-NEXT: slli a0, a0, 3 1312; RV32IA-NEXT: li a3, 255 1313; RV32IA-NEXT: sll a3, a3, a0 1314; RV32IA-NEXT: andi a1, a1, 255 1315; RV32IA-NEXT: sll a1, a1, a0 1316; RV32IA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 1317; RV32IA-NEXT: lr.w.aq a4, (a2) 1318; RV32IA-NEXT: and a5, a4, a1 1319; RV32IA-NEXT: not a5, a5 1320; RV32IA-NEXT: xor a5, a4, a5 1321; RV32IA-NEXT: and a5, a5, a3 1322; RV32IA-NEXT: xor a5, a4, a5 1323; RV32IA-NEXT: sc.w a5, a5, (a2) 1324; RV32IA-NEXT: bnez a5, .LBB21_1 1325; RV32IA-NEXT: # %bb.2: 1326; RV32IA-NEXT: srl a0, a4, a0 1327; RV32IA-NEXT: ret 1328; 1329; RV64I-LABEL: atomicrmw_nand_i8_acquire: 1330; RV64I: # %bb.0: 1331; RV64I-NEXT: addi sp, sp, -16 1332; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1333; RV64I-NEXT: li a2, 2 1334; RV64I-NEXT: call __atomic_fetch_nand_1@plt 1335; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1336; RV64I-NEXT: addi sp, sp, 16 1337; RV64I-NEXT: ret 1338; 1339; RV64IA-LABEL: atomicrmw_nand_i8_acquire: 1340; RV64IA: # %bb.0: 1341; RV64IA-NEXT: andi a2, a0, -4 1342; RV64IA-NEXT: slliw a0, a0, 3 1343; RV64IA-NEXT: li a3, 255 1344; RV64IA-NEXT: sllw a3, a3, a0 1345; RV64IA-NEXT: andi a1, a1, 255 1346; RV64IA-NEXT: sllw a1, a1, a0 1347; RV64IA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 1348; RV64IA-NEXT: lr.w.aq a4, (a2) 1349; RV64IA-NEXT: and a5, a4, a1 1350; RV64IA-NEXT: not a5, a5 1351; RV64IA-NEXT: xor a5, a4, a5 1352; RV64IA-NEXT: and a5, a5, a3 1353; RV64IA-NEXT: xor a5, a4, a5 1354; RV64IA-NEXT: sc.w a5, a5, (a2) 1355; RV64IA-NEXT: bnez a5, .LBB21_1 1356; RV64IA-NEXT: # %bb.2: 1357; RV64IA-NEXT: srlw a0, a4, a0 1358; RV64IA-NEXT: ret 1359 %1 = atomicrmw nand i8* %a, i8 %b acquire 1360 ret i8 %1 1361} 1362 1363define i8 @atomicrmw_nand_i8_release(i8* %a, i8 %b) nounwind { 1364; RV32I-LABEL: atomicrmw_nand_i8_release: 1365; RV32I: # %bb.0: 1366; RV32I-NEXT: addi sp, sp, -16 1367; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1368; RV32I-NEXT: li a2, 3 1369; RV32I-NEXT: call __atomic_fetch_nand_1@plt 1370; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1371; RV32I-NEXT: addi sp, sp, 16 1372; RV32I-NEXT: ret 1373; 1374; RV32IA-LABEL: atomicrmw_nand_i8_release: 1375; RV32IA: # %bb.0: 1376; RV32IA-NEXT: andi a2, a0, -4 1377; RV32IA-NEXT: slli a0, a0, 3 1378; RV32IA-NEXT: li a3, 255 1379; RV32IA-NEXT: sll a3, a3, a0 1380; RV32IA-NEXT: andi a1, a1, 255 1381; RV32IA-NEXT: sll a1, a1, a0 1382; RV32IA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 1383; RV32IA-NEXT: lr.w a4, (a2) 1384; RV32IA-NEXT: and a5, a4, a1 1385; RV32IA-NEXT: not a5, a5 1386; RV32IA-NEXT: xor a5, a4, a5 1387; RV32IA-NEXT: and a5, a5, a3 1388; RV32IA-NEXT: xor a5, a4, a5 1389; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 1390; RV32IA-NEXT: bnez a5, .LBB22_1 1391; RV32IA-NEXT: # %bb.2: 1392; RV32IA-NEXT: srl a0, a4, a0 1393; RV32IA-NEXT: ret 1394; 1395; RV64I-LABEL: atomicrmw_nand_i8_release: 1396; RV64I: # %bb.0: 1397; RV64I-NEXT: addi sp, sp, -16 1398; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1399; RV64I-NEXT: li a2, 3 1400; RV64I-NEXT: call __atomic_fetch_nand_1@plt 1401; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1402; RV64I-NEXT: addi sp, sp, 16 1403; RV64I-NEXT: ret 1404; 1405; RV64IA-LABEL: atomicrmw_nand_i8_release: 1406; RV64IA: # %bb.0: 1407; RV64IA-NEXT: andi a2, a0, -4 1408; RV64IA-NEXT: slliw a0, a0, 3 1409; RV64IA-NEXT: li a3, 255 1410; RV64IA-NEXT: sllw a3, a3, a0 1411; RV64IA-NEXT: andi a1, a1, 255 1412; RV64IA-NEXT: sllw a1, a1, a0 1413; RV64IA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 1414; RV64IA-NEXT: lr.w a4, (a2) 1415; RV64IA-NEXT: and a5, a4, a1 1416; RV64IA-NEXT: not a5, a5 1417; RV64IA-NEXT: xor a5, a4, a5 1418; RV64IA-NEXT: and a5, a5, a3 1419; RV64IA-NEXT: xor a5, a4, a5 1420; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 1421; RV64IA-NEXT: bnez a5, .LBB22_1 1422; RV64IA-NEXT: # %bb.2: 1423; RV64IA-NEXT: srlw a0, a4, a0 1424; RV64IA-NEXT: ret 1425 %1 = atomicrmw nand i8* %a, i8 %b release 1426 ret i8 %1 1427} 1428 1429define i8 @atomicrmw_nand_i8_acq_rel(i8* %a, i8 %b) nounwind { 1430; RV32I-LABEL: atomicrmw_nand_i8_acq_rel: 1431; RV32I: # %bb.0: 1432; RV32I-NEXT: addi sp, sp, -16 1433; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1434; RV32I-NEXT: li a2, 4 1435; RV32I-NEXT: call __atomic_fetch_nand_1@plt 1436; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1437; RV32I-NEXT: addi sp, sp, 16 1438; RV32I-NEXT: ret 1439; 1440; RV32IA-LABEL: atomicrmw_nand_i8_acq_rel: 1441; RV32IA: # %bb.0: 1442; RV32IA-NEXT: andi a2, a0, -4 1443; RV32IA-NEXT: slli a0, a0, 3 1444; RV32IA-NEXT: li a3, 255 1445; RV32IA-NEXT: sll a3, a3, a0 1446; RV32IA-NEXT: andi a1, a1, 255 1447; RV32IA-NEXT: sll a1, a1, a0 1448; RV32IA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 1449; RV32IA-NEXT: lr.w.aq a4, (a2) 1450; RV32IA-NEXT: and a5, a4, a1 1451; RV32IA-NEXT: not a5, a5 1452; RV32IA-NEXT: xor a5, a4, a5 1453; RV32IA-NEXT: and a5, a5, a3 1454; RV32IA-NEXT: xor a5, a4, a5 1455; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 1456; RV32IA-NEXT: bnez a5, .LBB23_1 1457; RV32IA-NEXT: # %bb.2: 1458; RV32IA-NEXT: srl a0, a4, a0 1459; RV32IA-NEXT: ret 1460; 1461; RV64I-LABEL: atomicrmw_nand_i8_acq_rel: 1462; RV64I: # %bb.0: 1463; RV64I-NEXT: addi sp, sp, -16 1464; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1465; RV64I-NEXT: li a2, 4 1466; RV64I-NEXT: call __atomic_fetch_nand_1@plt 1467; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1468; RV64I-NEXT: addi sp, sp, 16 1469; RV64I-NEXT: ret 1470; 1471; RV64IA-LABEL: atomicrmw_nand_i8_acq_rel: 1472; RV64IA: # %bb.0: 1473; RV64IA-NEXT: andi a2, a0, -4 1474; RV64IA-NEXT: slliw a0, a0, 3 1475; RV64IA-NEXT: li a3, 255 1476; RV64IA-NEXT: sllw a3, a3, a0 1477; RV64IA-NEXT: andi a1, a1, 255 1478; RV64IA-NEXT: sllw a1, a1, a0 1479; RV64IA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 1480; RV64IA-NEXT: lr.w.aq a4, (a2) 1481; RV64IA-NEXT: and a5, a4, a1 1482; RV64IA-NEXT: not a5, a5 1483; RV64IA-NEXT: xor a5, a4, a5 1484; RV64IA-NEXT: and a5, a5, a3 1485; RV64IA-NEXT: xor a5, a4, a5 1486; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 1487; RV64IA-NEXT: bnez a5, .LBB23_1 1488; RV64IA-NEXT: # %bb.2: 1489; RV64IA-NEXT: srlw a0, a4, a0 1490; RV64IA-NEXT: ret 1491 %1 = atomicrmw nand i8* %a, i8 %b acq_rel 1492 ret i8 %1 1493} 1494 1495define i8 @atomicrmw_nand_i8_seq_cst(i8* %a, i8 %b) nounwind { 1496; RV32I-LABEL: atomicrmw_nand_i8_seq_cst: 1497; RV32I: # %bb.0: 1498; RV32I-NEXT: addi sp, sp, -16 1499; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1500; RV32I-NEXT: li a2, 5 1501; RV32I-NEXT: call __atomic_fetch_nand_1@plt 1502; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1503; RV32I-NEXT: addi sp, sp, 16 1504; RV32I-NEXT: ret 1505; 1506; RV32IA-LABEL: atomicrmw_nand_i8_seq_cst: 1507; RV32IA: # %bb.0: 1508; RV32IA-NEXT: andi a2, a0, -4 1509; RV32IA-NEXT: slli a0, a0, 3 1510; RV32IA-NEXT: li a3, 255 1511; RV32IA-NEXT: sll a3, a3, a0 1512; RV32IA-NEXT: andi a1, a1, 255 1513; RV32IA-NEXT: sll a1, a1, a0 1514; RV32IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 1515; RV32IA-NEXT: lr.w.aqrl a4, (a2) 1516; RV32IA-NEXT: and a5, a4, a1 1517; RV32IA-NEXT: not a5, a5 1518; RV32IA-NEXT: xor a5, a4, a5 1519; RV32IA-NEXT: and a5, a5, a3 1520; RV32IA-NEXT: xor a5, a4, a5 1521; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 1522; RV32IA-NEXT: bnez a5, .LBB24_1 1523; RV32IA-NEXT: # %bb.2: 1524; RV32IA-NEXT: srl a0, a4, a0 1525; RV32IA-NEXT: ret 1526; 1527; RV64I-LABEL: atomicrmw_nand_i8_seq_cst: 1528; RV64I: # %bb.0: 1529; RV64I-NEXT: addi sp, sp, -16 1530; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1531; RV64I-NEXT: li a2, 5 1532; RV64I-NEXT: call __atomic_fetch_nand_1@plt 1533; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1534; RV64I-NEXT: addi sp, sp, 16 1535; RV64I-NEXT: ret 1536; 1537; RV64IA-LABEL: atomicrmw_nand_i8_seq_cst: 1538; RV64IA: # %bb.0: 1539; RV64IA-NEXT: andi a2, a0, -4 1540; RV64IA-NEXT: slliw a0, a0, 3 1541; RV64IA-NEXT: li a3, 255 1542; RV64IA-NEXT: sllw a3, a3, a0 1543; RV64IA-NEXT: andi a1, a1, 255 1544; RV64IA-NEXT: sllw a1, a1, a0 1545; RV64IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 1546; RV64IA-NEXT: lr.w.aqrl a4, (a2) 1547; RV64IA-NEXT: and a5, a4, a1 1548; RV64IA-NEXT: not a5, a5 1549; RV64IA-NEXT: xor a5, a4, a5 1550; RV64IA-NEXT: and a5, a5, a3 1551; RV64IA-NEXT: xor a5, a4, a5 1552; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 1553; RV64IA-NEXT: bnez a5, .LBB24_1 1554; RV64IA-NEXT: # %bb.2: 1555; RV64IA-NEXT: srlw a0, a4, a0 1556; RV64IA-NEXT: ret 1557 %1 = atomicrmw nand i8* %a, i8 %b seq_cst 1558 ret i8 %1 1559} 1560 1561define i8 @atomicrmw_or_i8_monotonic(i8 *%a, i8 %b) nounwind { 1562; RV32I-LABEL: atomicrmw_or_i8_monotonic: 1563; RV32I: # %bb.0: 1564; RV32I-NEXT: addi sp, sp, -16 1565; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1566; RV32I-NEXT: li a2, 0 1567; RV32I-NEXT: call __atomic_fetch_or_1@plt 1568; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1569; RV32I-NEXT: addi sp, sp, 16 1570; RV32I-NEXT: ret 1571; 1572; RV32IA-LABEL: atomicrmw_or_i8_monotonic: 1573; RV32IA: # %bb.0: 1574; RV32IA-NEXT: andi a2, a0, -4 1575; RV32IA-NEXT: slli a0, a0, 3 1576; RV32IA-NEXT: andi a1, a1, 255 1577; RV32IA-NEXT: sll a1, a1, a0 1578; RV32IA-NEXT: amoor.w a1, a1, (a2) 1579; RV32IA-NEXT: srl a0, a1, a0 1580; RV32IA-NEXT: ret 1581; 1582; RV64I-LABEL: atomicrmw_or_i8_monotonic: 1583; RV64I: # %bb.0: 1584; RV64I-NEXT: addi sp, sp, -16 1585; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1586; RV64I-NEXT: li a2, 0 1587; RV64I-NEXT: call __atomic_fetch_or_1@plt 1588; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1589; RV64I-NEXT: addi sp, sp, 16 1590; RV64I-NEXT: ret 1591; 1592; RV64IA-LABEL: atomicrmw_or_i8_monotonic: 1593; RV64IA: # %bb.0: 1594; RV64IA-NEXT: andi a2, a0, -4 1595; RV64IA-NEXT: slliw a0, a0, 3 1596; RV64IA-NEXT: andi a1, a1, 255 1597; RV64IA-NEXT: sllw a1, a1, a0 1598; RV64IA-NEXT: amoor.w a1, a1, (a2) 1599; RV64IA-NEXT: srlw a0, a1, a0 1600; RV64IA-NEXT: ret 1601 %1 = atomicrmw or i8* %a, i8 %b monotonic 1602 ret i8 %1 1603} 1604 1605define i8 @atomicrmw_or_i8_acquire(i8 *%a, i8 %b) nounwind { 1606; RV32I-LABEL: atomicrmw_or_i8_acquire: 1607; RV32I: # %bb.0: 1608; RV32I-NEXT: addi sp, sp, -16 1609; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1610; RV32I-NEXT: li a2, 2 1611; RV32I-NEXT: call __atomic_fetch_or_1@plt 1612; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1613; RV32I-NEXT: addi sp, sp, 16 1614; RV32I-NEXT: ret 1615; 1616; RV32IA-LABEL: atomicrmw_or_i8_acquire: 1617; RV32IA: # %bb.0: 1618; RV32IA-NEXT: andi a2, a0, -4 1619; RV32IA-NEXT: slli a0, a0, 3 1620; RV32IA-NEXT: andi a1, a1, 255 1621; RV32IA-NEXT: sll a1, a1, a0 1622; RV32IA-NEXT: amoor.w.aq a1, a1, (a2) 1623; RV32IA-NEXT: srl a0, a1, a0 1624; RV32IA-NEXT: ret 1625; 1626; RV64I-LABEL: atomicrmw_or_i8_acquire: 1627; RV64I: # %bb.0: 1628; RV64I-NEXT: addi sp, sp, -16 1629; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1630; RV64I-NEXT: li a2, 2 1631; RV64I-NEXT: call __atomic_fetch_or_1@plt 1632; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1633; RV64I-NEXT: addi sp, sp, 16 1634; RV64I-NEXT: ret 1635; 1636; RV64IA-LABEL: atomicrmw_or_i8_acquire: 1637; RV64IA: # %bb.0: 1638; RV64IA-NEXT: andi a2, a0, -4 1639; RV64IA-NEXT: slliw a0, a0, 3 1640; RV64IA-NEXT: andi a1, a1, 255 1641; RV64IA-NEXT: sllw a1, a1, a0 1642; RV64IA-NEXT: amoor.w.aq a1, a1, (a2) 1643; RV64IA-NEXT: srlw a0, a1, a0 1644; RV64IA-NEXT: ret 1645 %1 = atomicrmw or i8* %a, i8 %b acquire 1646 ret i8 %1 1647} 1648 1649define i8 @atomicrmw_or_i8_release(i8 *%a, i8 %b) nounwind { 1650; RV32I-LABEL: atomicrmw_or_i8_release: 1651; RV32I: # %bb.0: 1652; RV32I-NEXT: addi sp, sp, -16 1653; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1654; RV32I-NEXT: li a2, 3 1655; RV32I-NEXT: call __atomic_fetch_or_1@plt 1656; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1657; RV32I-NEXT: addi sp, sp, 16 1658; RV32I-NEXT: ret 1659; 1660; RV32IA-LABEL: atomicrmw_or_i8_release: 1661; RV32IA: # %bb.0: 1662; RV32IA-NEXT: andi a2, a0, -4 1663; RV32IA-NEXT: slli a0, a0, 3 1664; RV32IA-NEXT: andi a1, a1, 255 1665; RV32IA-NEXT: sll a1, a1, a0 1666; RV32IA-NEXT: amoor.w.rl a1, a1, (a2) 1667; RV32IA-NEXT: srl a0, a1, a0 1668; RV32IA-NEXT: ret 1669; 1670; RV64I-LABEL: atomicrmw_or_i8_release: 1671; RV64I: # %bb.0: 1672; RV64I-NEXT: addi sp, sp, -16 1673; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1674; RV64I-NEXT: li a2, 3 1675; RV64I-NEXT: call __atomic_fetch_or_1@plt 1676; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1677; RV64I-NEXT: addi sp, sp, 16 1678; RV64I-NEXT: ret 1679; 1680; RV64IA-LABEL: atomicrmw_or_i8_release: 1681; RV64IA: # %bb.0: 1682; RV64IA-NEXT: andi a2, a0, -4 1683; RV64IA-NEXT: slliw a0, a0, 3 1684; RV64IA-NEXT: andi a1, a1, 255 1685; RV64IA-NEXT: sllw a1, a1, a0 1686; RV64IA-NEXT: amoor.w.rl a1, a1, (a2) 1687; RV64IA-NEXT: srlw a0, a1, a0 1688; RV64IA-NEXT: ret 1689 %1 = atomicrmw or i8* %a, i8 %b release 1690 ret i8 %1 1691} 1692 1693define i8 @atomicrmw_or_i8_acq_rel(i8 *%a, i8 %b) nounwind { 1694; RV32I-LABEL: atomicrmw_or_i8_acq_rel: 1695; RV32I: # %bb.0: 1696; RV32I-NEXT: addi sp, sp, -16 1697; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1698; RV32I-NEXT: li a2, 4 1699; RV32I-NEXT: call __atomic_fetch_or_1@plt 1700; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1701; RV32I-NEXT: addi sp, sp, 16 1702; RV32I-NEXT: ret 1703; 1704; RV32IA-LABEL: atomicrmw_or_i8_acq_rel: 1705; RV32IA: # %bb.0: 1706; RV32IA-NEXT: andi a2, a0, -4 1707; RV32IA-NEXT: slli a0, a0, 3 1708; RV32IA-NEXT: andi a1, a1, 255 1709; RV32IA-NEXT: sll a1, a1, a0 1710; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) 1711; RV32IA-NEXT: srl a0, a1, a0 1712; RV32IA-NEXT: ret 1713; 1714; RV64I-LABEL: atomicrmw_or_i8_acq_rel: 1715; RV64I: # %bb.0: 1716; RV64I-NEXT: addi sp, sp, -16 1717; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1718; RV64I-NEXT: li a2, 4 1719; RV64I-NEXT: call __atomic_fetch_or_1@plt 1720; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1721; RV64I-NEXT: addi sp, sp, 16 1722; RV64I-NEXT: ret 1723; 1724; RV64IA-LABEL: atomicrmw_or_i8_acq_rel: 1725; RV64IA: # %bb.0: 1726; RV64IA-NEXT: andi a2, a0, -4 1727; RV64IA-NEXT: slliw a0, a0, 3 1728; RV64IA-NEXT: andi a1, a1, 255 1729; RV64IA-NEXT: sllw a1, a1, a0 1730; RV64IA-NEXT: amoor.w.aqrl a1, a1, (a2) 1731; RV64IA-NEXT: srlw a0, a1, a0 1732; RV64IA-NEXT: ret 1733 %1 = atomicrmw or i8* %a, i8 %b acq_rel 1734 ret i8 %1 1735} 1736 1737define i8 @atomicrmw_or_i8_seq_cst(i8 *%a, i8 %b) nounwind { 1738; RV32I-LABEL: atomicrmw_or_i8_seq_cst: 1739; RV32I: # %bb.0: 1740; RV32I-NEXT: addi sp, sp, -16 1741; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1742; RV32I-NEXT: li a2, 5 1743; RV32I-NEXT: call __atomic_fetch_or_1@plt 1744; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1745; RV32I-NEXT: addi sp, sp, 16 1746; RV32I-NEXT: ret 1747; 1748; RV32IA-LABEL: atomicrmw_or_i8_seq_cst: 1749; RV32IA: # %bb.0: 1750; RV32IA-NEXT: andi a2, a0, -4 1751; RV32IA-NEXT: slli a0, a0, 3 1752; RV32IA-NEXT: andi a1, a1, 255 1753; RV32IA-NEXT: sll a1, a1, a0 1754; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) 1755; RV32IA-NEXT: srl a0, a1, a0 1756; RV32IA-NEXT: ret 1757; 1758; RV64I-LABEL: atomicrmw_or_i8_seq_cst: 1759; RV64I: # %bb.0: 1760; RV64I-NEXT: addi sp, sp, -16 1761; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1762; RV64I-NEXT: li a2, 5 1763; RV64I-NEXT: call __atomic_fetch_or_1@plt 1764; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1765; RV64I-NEXT: addi sp, sp, 16 1766; RV64I-NEXT: ret 1767; 1768; RV64IA-LABEL: atomicrmw_or_i8_seq_cst: 1769; RV64IA: # %bb.0: 1770; RV64IA-NEXT: andi a2, a0, -4 1771; RV64IA-NEXT: slliw a0, a0, 3 1772; RV64IA-NEXT: andi a1, a1, 255 1773; RV64IA-NEXT: sllw a1, a1, a0 1774; RV64IA-NEXT: amoor.w.aqrl a1, a1, (a2) 1775; RV64IA-NEXT: srlw a0, a1, a0 1776; RV64IA-NEXT: ret 1777 %1 = atomicrmw or i8* %a, i8 %b seq_cst 1778 ret i8 %1 1779} 1780 1781define i8 @atomicrmw_xor_i8_monotonic(i8 *%a, i8 %b) nounwind { 1782; RV32I-LABEL: atomicrmw_xor_i8_monotonic: 1783; RV32I: # %bb.0: 1784; RV32I-NEXT: addi sp, sp, -16 1785; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1786; RV32I-NEXT: li a2, 0 1787; RV32I-NEXT: call __atomic_fetch_xor_1@plt 1788; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1789; RV32I-NEXT: addi sp, sp, 16 1790; RV32I-NEXT: ret 1791; 1792; RV32IA-LABEL: atomicrmw_xor_i8_monotonic: 1793; RV32IA: # %bb.0: 1794; RV32IA-NEXT: andi a2, a0, -4 1795; RV32IA-NEXT: slli a0, a0, 3 1796; RV32IA-NEXT: andi a1, a1, 255 1797; RV32IA-NEXT: sll a1, a1, a0 1798; RV32IA-NEXT: amoxor.w a1, a1, (a2) 1799; RV32IA-NEXT: srl a0, a1, a0 1800; RV32IA-NEXT: ret 1801; 1802; RV64I-LABEL: atomicrmw_xor_i8_monotonic: 1803; RV64I: # %bb.0: 1804; RV64I-NEXT: addi sp, sp, -16 1805; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1806; RV64I-NEXT: li a2, 0 1807; RV64I-NEXT: call __atomic_fetch_xor_1@plt 1808; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1809; RV64I-NEXT: addi sp, sp, 16 1810; RV64I-NEXT: ret 1811; 1812; RV64IA-LABEL: atomicrmw_xor_i8_monotonic: 1813; RV64IA: # %bb.0: 1814; RV64IA-NEXT: andi a2, a0, -4 1815; RV64IA-NEXT: slliw a0, a0, 3 1816; RV64IA-NEXT: andi a1, a1, 255 1817; RV64IA-NEXT: sllw a1, a1, a0 1818; RV64IA-NEXT: amoxor.w a1, a1, (a2) 1819; RV64IA-NEXT: srlw a0, a1, a0 1820; RV64IA-NEXT: ret 1821 %1 = atomicrmw xor i8* %a, i8 %b monotonic 1822 ret i8 %1 1823} 1824 1825define i8 @atomicrmw_xor_i8_acquire(i8 *%a, i8 %b) nounwind { 1826; RV32I-LABEL: atomicrmw_xor_i8_acquire: 1827; RV32I: # %bb.0: 1828; RV32I-NEXT: addi sp, sp, -16 1829; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1830; RV32I-NEXT: li a2, 2 1831; RV32I-NEXT: call __atomic_fetch_xor_1@plt 1832; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1833; RV32I-NEXT: addi sp, sp, 16 1834; RV32I-NEXT: ret 1835; 1836; RV32IA-LABEL: atomicrmw_xor_i8_acquire: 1837; RV32IA: # %bb.0: 1838; RV32IA-NEXT: andi a2, a0, -4 1839; RV32IA-NEXT: slli a0, a0, 3 1840; RV32IA-NEXT: andi a1, a1, 255 1841; RV32IA-NEXT: sll a1, a1, a0 1842; RV32IA-NEXT: amoxor.w.aq a1, a1, (a2) 1843; RV32IA-NEXT: srl a0, a1, a0 1844; RV32IA-NEXT: ret 1845; 1846; RV64I-LABEL: atomicrmw_xor_i8_acquire: 1847; RV64I: # %bb.0: 1848; RV64I-NEXT: addi sp, sp, -16 1849; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1850; RV64I-NEXT: li a2, 2 1851; RV64I-NEXT: call __atomic_fetch_xor_1@plt 1852; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1853; RV64I-NEXT: addi sp, sp, 16 1854; RV64I-NEXT: ret 1855; 1856; RV64IA-LABEL: atomicrmw_xor_i8_acquire: 1857; RV64IA: # %bb.0: 1858; RV64IA-NEXT: andi a2, a0, -4 1859; RV64IA-NEXT: slliw a0, a0, 3 1860; RV64IA-NEXT: andi a1, a1, 255 1861; RV64IA-NEXT: sllw a1, a1, a0 1862; RV64IA-NEXT: amoxor.w.aq a1, a1, (a2) 1863; RV64IA-NEXT: srlw a0, a1, a0 1864; RV64IA-NEXT: ret 1865 %1 = atomicrmw xor i8* %a, i8 %b acquire 1866 ret i8 %1 1867} 1868 1869define i8 @atomicrmw_xor_i8_release(i8 *%a, i8 %b) nounwind { 1870; RV32I-LABEL: atomicrmw_xor_i8_release: 1871; RV32I: # %bb.0: 1872; RV32I-NEXT: addi sp, sp, -16 1873; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1874; RV32I-NEXT: li a2, 3 1875; RV32I-NEXT: call __atomic_fetch_xor_1@plt 1876; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1877; RV32I-NEXT: addi sp, sp, 16 1878; RV32I-NEXT: ret 1879; 1880; RV32IA-LABEL: atomicrmw_xor_i8_release: 1881; RV32IA: # %bb.0: 1882; RV32IA-NEXT: andi a2, a0, -4 1883; RV32IA-NEXT: slli a0, a0, 3 1884; RV32IA-NEXT: andi a1, a1, 255 1885; RV32IA-NEXT: sll a1, a1, a0 1886; RV32IA-NEXT: amoxor.w.rl a1, a1, (a2) 1887; RV32IA-NEXT: srl a0, a1, a0 1888; RV32IA-NEXT: ret 1889; 1890; RV64I-LABEL: atomicrmw_xor_i8_release: 1891; RV64I: # %bb.0: 1892; RV64I-NEXT: addi sp, sp, -16 1893; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1894; RV64I-NEXT: li a2, 3 1895; RV64I-NEXT: call __atomic_fetch_xor_1@plt 1896; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1897; RV64I-NEXT: addi sp, sp, 16 1898; RV64I-NEXT: ret 1899; 1900; RV64IA-LABEL: atomicrmw_xor_i8_release: 1901; RV64IA: # %bb.0: 1902; RV64IA-NEXT: andi a2, a0, -4 1903; RV64IA-NEXT: slliw a0, a0, 3 1904; RV64IA-NEXT: andi a1, a1, 255 1905; RV64IA-NEXT: sllw a1, a1, a0 1906; RV64IA-NEXT: amoxor.w.rl a1, a1, (a2) 1907; RV64IA-NEXT: srlw a0, a1, a0 1908; RV64IA-NEXT: ret 1909 %1 = atomicrmw xor i8* %a, i8 %b release 1910 ret i8 %1 1911} 1912 1913define i8 @atomicrmw_xor_i8_acq_rel(i8 *%a, i8 %b) nounwind { 1914; RV32I-LABEL: atomicrmw_xor_i8_acq_rel: 1915; RV32I: # %bb.0: 1916; RV32I-NEXT: addi sp, sp, -16 1917; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1918; RV32I-NEXT: li a2, 4 1919; RV32I-NEXT: call __atomic_fetch_xor_1@plt 1920; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1921; RV32I-NEXT: addi sp, sp, 16 1922; RV32I-NEXT: ret 1923; 1924; RV32IA-LABEL: atomicrmw_xor_i8_acq_rel: 1925; RV32IA: # %bb.0: 1926; RV32IA-NEXT: andi a2, a0, -4 1927; RV32IA-NEXT: slli a0, a0, 3 1928; RV32IA-NEXT: andi a1, a1, 255 1929; RV32IA-NEXT: sll a1, a1, a0 1930; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 1931; RV32IA-NEXT: srl a0, a1, a0 1932; RV32IA-NEXT: ret 1933; 1934; RV64I-LABEL: atomicrmw_xor_i8_acq_rel: 1935; RV64I: # %bb.0: 1936; RV64I-NEXT: addi sp, sp, -16 1937; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1938; RV64I-NEXT: li a2, 4 1939; RV64I-NEXT: call __atomic_fetch_xor_1@plt 1940; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1941; RV64I-NEXT: addi sp, sp, 16 1942; RV64I-NEXT: ret 1943; 1944; RV64IA-LABEL: atomicrmw_xor_i8_acq_rel: 1945; RV64IA: # %bb.0: 1946; RV64IA-NEXT: andi a2, a0, -4 1947; RV64IA-NEXT: slliw a0, a0, 3 1948; RV64IA-NEXT: andi a1, a1, 255 1949; RV64IA-NEXT: sllw a1, a1, a0 1950; RV64IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 1951; RV64IA-NEXT: srlw a0, a1, a0 1952; RV64IA-NEXT: ret 1953 %1 = atomicrmw xor i8* %a, i8 %b acq_rel 1954 ret i8 %1 1955} 1956 1957define i8 @atomicrmw_xor_i8_seq_cst(i8 *%a, i8 %b) nounwind { 1958; RV32I-LABEL: atomicrmw_xor_i8_seq_cst: 1959; RV32I: # %bb.0: 1960; RV32I-NEXT: addi sp, sp, -16 1961; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1962; RV32I-NEXT: li a2, 5 1963; RV32I-NEXT: call __atomic_fetch_xor_1@plt 1964; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1965; RV32I-NEXT: addi sp, sp, 16 1966; RV32I-NEXT: ret 1967; 1968; RV32IA-LABEL: atomicrmw_xor_i8_seq_cst: 1969; RV32IA: # %bb.0: 1970; RV32IA-NEXT: andi a2, a0, -4 1971; RV32IA-NEXT: slli a0, a0, 3 1972; RV32IA-NEXT: andi a1, a1, 255 1973; RV32IA-NEXT: sll a1, a1, a0 1974; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 1975; RV32IA-NEXT: srl a0, a1, a0 1976; RV32IA-NEXT: ret 1977; 1978; RV64I-LABEL: atomicrmw_xor_i8_seq_cst: 1979; RV64I: # %bb.0: 1980; RV64I-NEXT: addi sp, sp, -16 1981; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1982; RV64I-NEXT: li a2, 5 1983; RV64I-NEXT: call __atomic_fetch_xor_1@plt 1984; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1985; RV64I-NEXT: addi sp, sp, 16 1986; RV64I-NEXT: ret 1987; 1988; RV64IA-LABEL: atomicrmw_xor_i8_seq_cst: 1989; RV64IA: # %bb.0: 1990; RV64IA-NEXT: andi a2, a0, -4 1991; RV64IA-NEXT: slliw a0, a0, 3 1992; RV64IA-NEXT: andi a1, a1, 255 1993; RV64IA-NEXT: sllw a1, a1, a0 1994; RV64IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 1995; RV64IA-NEXT: srlw a0, a1, a0 1996; RV64IA-NEXT: ret 1997 %1 = atomicrmw xor i8* %a, i8 %b seq_cst 1998 ret i8 %1 1999} 2000 2001define i8 @atomicrmw_max_i8_monotonic(i8 *%a, i8 %b) nounwind { 2002; RV32I-LABEL: atomicrmw_max_i8_monotonic: 2003; RV32I: # %bb.0: 2004; RV32I-NEXT: addi sp, sp, -32 2005; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2006; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2007; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2008; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2009; RV32I-NEXT: mv s0, a0 2010; RV32I-NEXT: lbu a3, 0(a0) 2011; RV32I-NEXT: mv s2, a1 2012; RV32I-NEXT: slli a0, a1, 24 2013; RV32I-NEXT: srai s1, a0, 24 2014; RV32I-NEXT: j .LBB35_2 2015; RV32I-NEXT: .LBB35_1: # %atomicrmw.start 2016; RV32I-NEXT: # in Loop: Header=BB35_2 Depth=1 2017; RV32I-NEXT: sb a3, 15(sp) 2018; RV32I-NEXT: addi a1, sp, 15 2019; RV32I-NEXT: mv a0, s0 2020; RV32I-NEXT: li a3, 0 2021; RV32I-NEXT: li a4, 0 2022; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2023; RV32I-NEXT: lb a3, 15(sp) 2024; RV32I-NEXT: bnez a0, .LBB35_4 2025; RV32I-NEXT: .LBB35_2: # %atomicrmw.start 2026; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2027; RV32I-NEXT: slli a0, a3, 24 2028; RV32I-NEXT: srai a0, a0, 24 2029; RV32I-NEXT: mv a2, a3 2030; RV32I-NEXT: blt s1, a0, .LBB35_1 2031; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2032; RV32I-NEXT: # in Loop: Header=BB35_2 Depth=1 2033; RV32I-NEXT: mv a2, s2 2034; RV32I-NEXT: j .LBB35_1 2035; RV32I-NEXT: .LBB35_4: # %atomicrmw.end 2036; RV32I-NEXT: mv a0, a3 2037; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2038; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2039; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2040; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2041; RV32I-NEXT: addi sp, sp, 32 2042; RV32I-NEXT: ret 2043; 2044; RV32IA-LABEL: atomicrmw_max_i8_monotonic: 2045; RV32IA: # %bb.0: 2046; RV32IA-NEXT: andi a6, a0, -4 2047; RV32IA-NEXT: slli a0, a0, 3 2048; RV32IA-NEXT: andi a3, a0, 24 2049; RV32IA-NEXT: li a4, 255 2050; RV32IA-NEXT: sll a7, a4, a0 2051; RV32IA-NEXT: slli a1, a1, 24 2052; RV32IA-NEXT: srai a1, a1, 24 2053; RV32IA-NEXT: sll a1, a1, a0 2054; RV32IA-NEXT: li a5, 24 2055; RV32IA-NEXT: sub a3, a5, a3 2056; RV32IA-NEXT: .LBB35_1: # =>This Inner Loop Header: Depth=1 2057; RV32IA-NEXT: lr.w a5, (a6) 2058; RV32IA-NEXT: and a4, a5, a7 2059; RV32IA-NEXT: mv a2, a5 2060; RV32IA-NEXT: sll a4, a4, a3 2061; RV32IA-NEXT: sra a4, a4, a3 2062; RV32IA-NEXT: bge a4, a1, .LBB35_3 2063; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB35_1 Depth=1 2064; RV32IA-NEXT: xor a2, a5, a1 2065; RV32IA-NEXT: and a2, a2, a7 2066; RV32IA-NEXT: xor a2, a5, a2 2067; RV32IA-NEXT: .LBB35_3: # in Loop: Header=BB35_1 Depth=1 2068; RV32IA-NEXT: sc.w a2, a2, (a6) 2069; RV32IA-NEXT: bnez a2, .LBB35_1 2070; RV32IA-NEXT: # %bb.4: 2071; RV32IA-NEXT: srl a0, a5, a0 2072; RV32IA-NEXT: ret 2073; 2074; RV64I-LABEL: atomicrmw_max_i8_monotonic: 2075; RV64I: # %bb.0: 2076; RV64I-NEXT: addi sp, sp, -48 2077; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2078; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2079; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2080; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2081; RV64I-NEXT: mv s0, a0 2082; RV64I-NEXT: lbu a3, 0(a0) 2083; RV64I-NEXT: mv s2, a1 2084; RV64I-NEXT: slli a0, a1, 56 2085; RV64I-NEXT: srai s1, a0, 56 2086; RV64I-NEXT: j .LBB35_2 2087; RV64I-NEXT: .LBB35_1: # %atomicrmw.start 2088; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2089; RV64I-NEXT: sb a3, 15(sp) 2090; RV64I-NEXT: addi a1, sp, 15 2091; RV64I-NEXT: mv a0, s0 2092; RV64I-NEXT: li a3, 0 2093; RV64I-NEXT: li a4, 0 2094; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2095; RV64I-NEXT: lb a3, 15(sp) 2096; RV64I-NEXT: bnez a0, .LBB35_4 2097; RV64I-NEXT: .LBB35_2: # %atomicrmw.start 2098; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2099; RV64I-NEXT: slli a0, a3, 56 2100; RV64I-NEXT: srai a0, a0, 56 2101; RV64I-NEXT: mv a2, a3 2102; RV64I-NEXT: blt s1, a0, .LBB35_1 2103; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2104; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2105; RV64I-NEXT: mv a2, s2 2106; RV64I-NEXT: j .LBB35_1 2107; RV64I-NEXT: .LBB35_4: # %atomicrmw.end 2108; RV64I-NEXT: mv a0, a3 2109; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2110; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2111; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2112; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2113; RV64I-NEXT: addi sp, sp, 48 2114; RV64I-NEXT: ret 2115; 2116; RV64IA-LABEL: atomicrmw_max_i8_monotonic: 2117; RV64IA: # %bb.0: 2118; RV64IA-NEXT: andi a6, a0, -4 2119; RV64IA-NEXT: slliw a0, a0, 3 2120; RV64IA-NEXT: andi a3, a0, 24 2121; RV64IA-NEXT: li a4, 255 2122; RV64IA-NEXT: sllw a7, a4, a0 2123; RV64IA-NEXT: slli a1, a1, 56 2124; RV64IA-NEXT: srai a1, a1, 56 2125; RV64IA-NEXT: sllw a1, a1, a0 2126; RV64IA-NEXT: li a5, 56 2127; RV64IA-NEXT: sub a3, a5, a3 2128; RV64IA-NEXT: .LBB35_1: # =>This Inner Loop Header: Depth=1 2129; RV64IA-NEXT: lr.w a5, (a6) 2130; RV64IA-NEXT: and a4, a5, a7 2131; RV64IA-NEXT: mv a2, a5 2132; RV64IA-NEXT: sll a4, a4, a3 2133; RV64IA-NEXT: sra a4, a4, a3 2134; RV64IA-NEXT: bge a4, a1, .LBB35_3 2135; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB35_1 Depth=1 2136; RV64IA-NEXT: xor a2, a5, a1 2137; RV64IA-NEXT: and a2, a2, a7 2138; RV64IA-NEXT: xor a2, a5, a2 2139; RV64IA-NEXT: .LBB35_3: # in Loop: Header=BB35_1 Depth=1 2140; RV64IA-NEXT: sc.w a2, a2, (a6) 2141; RV64IA-NEXT: bnez a2, .LBB35_1 2142; RV64IA-NEXT: # %bb.4: 2143; RV64IA-NEXT: srlw a0, a5, a0 2144; RV64IA-NEXT: ret 2145 %1 = atomicrmw max i8* %a, i8 %b monotonic 2146 ret i8 %1 2147} 2148 2149define i8 @atomicrmw_max_i8_acquire(i8 *%a, i8 %b) nounwind { 2150; RV32I-LABEL: atomicrmw_max_i8_acquire: 2151; RV32I: # %bb.0: 2152; RV32I-NEXT: addi sp, sp, -32 2153; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2154; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2155; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2156; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2157; RV32I-NEXT: mv s0, a0 2158; RV32I-NEXT: lbu a3, 0(a0) 2159; RV32I-NEXT: mv s2, a1 2160; RV32I-NEXT: slli a0, a1, 24 2161; RV32I-NEXT: srai s1, a0, 24 2162; RV32I-NEXT: j .LBB36_2 2163; RV32I-NEXT: .LBB36_1: # %atomicrmw.start 2164; RV32I-NEXT: # in Loop: Header=BB36_2 Depth=1 2165; RV32I-NEXT: sb a3, 15(sp) 2166; RV32I-NEXT: addi a1, sp, 15 2167; RV32I-NEXT: li a3, 2 2168; RV32I-NEXT: li a4, 2 2169; RV32I-NEXT: mv a0, s0 2170; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2171; RV32I-NEXT: lb a3, 15(sp) 2172; RV32I-NEXT: bnez a0, .LBB36_4 2173; RV32I-NEXT: .LBB36_2: # %atomicrmw.start 2174; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2175; RV32I-NEXT: slli a0, a3, 24 2176; RV32I-NEXT: srai a0, a0, 24 2177; RV32I-NEXT: mv a2, a3 2178; RV32I-NEXT: blt s1, a0, .LBB36_1 2179; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2180; RV32I-NEXT: # in Loop: Header=BB36_2 Depth=1 2181; RV32I-NEXT: mv a2, s2 2182; RV32I-NEXT: j .LBB36_1 2183; RV32I-NEXT: .LBB36_4: # %atomicrmw.end 2184; RV32I-NEXT: mv a0, a3 2185; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2186; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2187; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2188; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2189; RV32I-NEXT: addi sp, sp, 32 2190; RV32I-NEXT: ret 2191; 2192; RV32IA-LABEL: atomicrmw_max_i8_acquire: 2193; RV32IA: # %bb.0: 2194; RV32IA-NEXT: andi a6, a0, -4 2195; RV32IA-NEXT: slli a0, a0, 3 2196; RV32IA-NEXT: andi a3, a0, 24 2197; RV32IA-NEXT: li a4, 255 2198; RV32IA-NEXT: sll a7, a4, a0 2199; RV32IA-NEXT: slli a1, a1, 24 2200; RV32IA-NEXT: srai a1, a1, 24 2201; RV32IA-NEXT: sll a1, a1, a0 2202; RV32IA-NEXT: li a5, 24 2203; RV32IA-NEXT: sub a3, a5, a3 2204; RV32IA-NEXT: .LBB36_1: # =>This Inner Loop Header: Depth=1 2205; RV32IA-NEXT: lr.w.aq a5, (a6) 2206; RV32IA-NEXT: and a4, a5, a7 2207; RV32IA-NEXT: mv a2, a5 2208; RV32IA-NEXT: sll a4, a4, a3 2209; RV32IA-NEXT: sra a4, a4, a3 2210; RV32IA-NEXT: bge a4, a1, .LBB36_3 2211; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB36_1 Depth=1 2212; RV32IA-NEXT: xor a2, a5, a1 2213; RV32IA-NEXT: and a2, a2, a7 2214; RV32IA-NEXT: xor a2, a5, a2 2215; RV32IA-NEXT: .LBB36_3: # in Loop: Header=BB36_1 Depth=1 2216; RV32IA-NEXT: sc.w a2, a2, (a6) 2217; RV32IA-NEXT: bnez a2, .LBB36_1 2218; RV32IA-NEXT: # %bb.4: 2219; RV32IA-NEXT: srl a0, a5, a0 2220; RV32IA-NEXT: ret 2221; 2222; RV64I-LABEL: atomicrmw_max_i8_acquire: 2223; RV64I: # %bb.0: 2224; RV64I-NEXT: addi sp, sp, -48 2225; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2226; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2227; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2228; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2229; RV64I-NEXT: mv s0, a0 2230; RV64I-NEXT: lbu a3, 0(a0) 2231; RV64I-NEXT: mv s2, a1 2232; RV64I-NEXT: slli a0, a1, 56 2233; RV64I-NEXT: srai s1, a0, 56 2234; RV64I-NEXT: j .LBB36_2 2235; RV64I-NEXT: .LBB36_1: # %atomicrmw.start 2236; RV64I-NEXT: # in Loop: Header=BB36_2 Depth=1 2237; RV64I-NEXT: sb a3, 15(sp) 2238; RV64I-NEXT: addi a1, sp, 15 2239; RV64I-NEXT: li a3, 2 2240; RV64I-NEXT: li a4, 2 2241; RV64I-NEXT: mv a0, s0 2242; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2243; RV64I-NEXT: lb a3, 15(sp) 2244; RV64I-NEXT: bnez a0, .LBB36_4 2245; RV64I-NEXT: .LBB36_2: # %atomicrmw.start 2246; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2247; RV64I-NEXT: slli a0, a3, 56 2248; RV64I-NEXT: srai a0, a0, 56 2249; RV64I-NEXT: mv a2, a3 2250; RV64I-NEXT: blt s1, a0, .LBB36_1 2251; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2252; RV64I-NEXT: # in Loop: Header=BB36_2 Depth=1 2253; RV64I-NEXT: mv a2, s2 2254; RV64I-NEXT: j .LBB36_1 2255; RV64I-NEXT: .LBB36_4: # %atomicrmw.end 2256; RV64I-NEXT: mv a0, a3 2257; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2258; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2259; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2260; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2261; RV64I-NEXT: addi sp, sp, 48 2262; RV64I-NEXT: ret 2263; 2264; RV64IA-LABEL: atomicrmw_max_i8_acquire: 2265; RV64IA: # %bb.0: 2266; RV64IA-NEXT: andi a6, a0, -4 2267; RV64IA-NEXT: slliw a0, a0, 3 2268; RV64IA-NEXT: andi a3, a0, 24 2269; RV64IA-NEXT: li a4, 255 2270; RV64IA-NEXT: sllw a7, a4, a0 2271; RV64IA-NEXT: slli a1, a1, 56 2272; RV64IA-NEXT: srai a1, a1, 56 2273; RV64IA-NEXT: sllw a1, a1, a0 2274; RV64IA-NEXT: li a5, 56 2275; RV64IA-NEXT: sub a3, a5, a3 2276; RV64IA-NEXT: .LBB36_1: # =>This Inner Loop Header: Depth=1 2277; RV64IA-NEXT: lr.w.aq a5, (a6) 2278; RV64IA-NEXT: and a4, a5, a7 2279; RV64IA-NEXT: mv a2, a5 2280; RV64IA-NEXT: sll a4, a4, a3 2281; RV64IA-NEXT: sra a4, a4, a3 2282; RV64IA-NEXT: bge a4, a1, .LBB36_3 2283; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB36_1 Depth=1 2284; RV64IA-NEXT: xor a2, a5, a1 2285; RV64IA-NEXT: and a2, a2, a7 2286; RV64IA-NEXT: xor a2, a5, a2 2287; RV64IA-NEXT: .LBB36_3: # in Loop: Header=BB36_1 Depth=1 2288; RV64IA-NEXT: sc.w a2, a2, (a6) 2289; RV64IA-NEXT: bnez a2, .LBB36_1 2290; RV64IA-NEXT: # %bb.4: 2291; RV64IA-NEXT: srlw a0, a5, a0 2292; RV64IA-NEXT: ret 2293 %1 = atomicrmw max i8* %a, i8 %b acquire 2294 ret i8 %1 2295} 2296 2297define i8 @atomicrmw_max_i8_release(i8 *%a, i8 %b) nounwind { 2298; RV32I-LABEL: atomicrmw_max_i8_release: 2299; RV32I: # %bb.0: 2300; RV32I-NEXT: addi sp, sp, -32 2301; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2302; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2303; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2304; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2305; RV32I-NEXT: mv s0, a0 2306; RV32I-NEXT: lbu a3, 0(a0) 2307; RV32I-NEXT: mv s2, a1 2308; RV32I-NEXT: slli a0, a1, 24 2309; RV32I-NEXT: srai s1, a0, 24 2310; RV32I-NEXT: j .LBB37_2 2311; RV32I-NEXT: .LBB37_1: # %atomicrmw.start 2312; RV32I-NEXT: # in Loop: Header=BB37_2 Depth=1 2313; RV32I-NEXT: sb a3, 15(sp) 2314; RV32I-NEXT: addi a1, sp, 15 2315; RV32I-NEXT: li a3, 3 2316; RV32I-NEXT: mv a0, s0 2317; RV32I-NEXT: li a4, 0 2318; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2319; RV32I-NEXT: lb a3, 15(sp) 2320; RV32I-NEXT: bnez a0, .LBB37_4 2321; RV32I-NEXT: .LBB37_2: # %atomicrmw.start 2322; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2323; RV32I-NEXT: slli a0, a3, 24 2324; RV32I-NEXT: srai a0, a0, 24 2325; RV32I-NEXT: mv a2, a3 2326; RV32I-NEXT: blt s1, a0, .LBB37_1 2327; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2328; RV32I-NEXT: # in Loop: Header=BB37_2 Depth=1 2329; RV32I-NEXT: mv a2, s2 2330; RV32I-NEXT: j .LBB37_1 2331; RV32I-NEXT: .LBB37_4: # %atomicrmw.end 2332; RV32I-NEXT: mv a0, a3 2333; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2334; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2335; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2336; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2337; RV32I-NEXT: addi sp, sp, 32 2338; RV32I-NEXT: ret 2339; 2340; RV32IA-LABEL: atomicrmw_max_i8_release: 2341; RV32IA: # %bb.0: 2342; RV32IA-NEXT: andi a6, a0, -4 2343; RV32IA-NEXT: slli a0, a0, 3 2344; RV32IA-NEXT: andi a3, a0, 24 2345; RV32IA-NEXT: li a4, 255 2346; RV32IA-NEXT: sll a7, a4, a0 2347; RV32IA-NEXT: slli a1, a1, 24 2348; RV32IA-NEXT: srai a1, a1, 24 2349; RV32IA-NEXT: sll a1, a1, a0 2350; RV32IA-NEXT: li a5, 24 2351; RV32IA-NEXT: sub a3, a5, a3 2352; RV32IA-NEXT: .LBB37_1: # =>This Inner Loop Header: Depth=1 2353; RV32IA-NEXT: lr.w a5, (a6) 2354; RV32IA-NEXT: and a4, a5, a7 2355; RV32IA-NEXT: mv a2, a5 2356; RV32IA-NEXT: sll a4, a4, a3 2357; RV32IA-NEXT: sra a4, a4, a3 2358; RV32IA-NEXT: bge a4, a1, .LBB37_3 2359; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB37_1 Depth=1 2360; RV32IA-NEXT: xor a2, a5, a1 2361; RV32IA-NEXT: and a2, a2, a7 2362; RV32IA-NEXT: xor a2, a5, a2 2363; RV32IA-NEXT: .LBB37_3: # in Loop: Header=BB37_1 Depth=1 2364; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 2365; RV32IA-NEXT: bnez a2, .LBB37_1 2366; RV32IA-NEXT: # %bb.4: 2367; RV32IA-NEXT: srl a0, a5, a0 2368; RV32IA-NEXT: ret 2369; 2370; RV64I-LABEL: atomicrmw_max_i8_release: 2371; RV64I: # %bb.0: 2372; RV64I-NEXT: addi sp, sp, -48 2373; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2374; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2375; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2376; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2377; RV64I-NEXT: mv s0, a0 2378; RV64I-NEXT: lbu a3, 0(a0) 2379; RV64I-NEXT: mv s2, a1 2380; RV64I-NEXT: slli a0, a1, 56 2381; RV64I-NEXT: srai s1, a0, 56 2382; RV64I-NEXT: j .LBB37_2 2383; RV64I-NEXT: .LBB37_1: # %atomicrmw.start 2384; RV64I-NEXT: # in Loop: Header=BB37_2 Depth=1 2385; RV64I-NEXT: sb a3, 15(sp) 2386; RV64I-NEXT: addi a1, sp, 15 2387; RV64I-NEXT: li a3, 3 2388; RV64I-NEXT: mv a0, s0 2389; RV64I-NEXT: li a4, 0 2390; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2391; RV64I-NEXT: lb a3, 15(sp) 2392; RV64I-NEXT: bnez a0, .LBB37_4 2393; RV64I-NEXT: .LBB37_2: # %atomicrmw.start 2394; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2395; RV64I-NEXT: slli a0, a3, 56 2396; RV64I-NEXT: srai a0, a0, 56 2397; RV64I-NEXT: mv a2, a3 2398; RV64I-NEXT: blt s1, a0, .LBB37_1 2399; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2400; RV64I-NEXT: # in Loop: Header=BB37_2 Depth=1 2401; RV64I-NEXT: mv a2, s2 2402; RV64I-NEXT: j .LBB37_1 2403; RV64I-NEXT: .LBB37_4: # %atomicrmw.end 2404; RV64I-NEXT: mv a0, a3 2405; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2406; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2407; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2408; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2409; RV64I-NEXT: addi sp, sp, 48 2410; RV64I-NEXT: ret 2411; 2412; RV64IA-LABEL: atomicrmw_max_i8_release: 2413; RV64IA: # %bb.0: 2414; RV64IA-NEXT: andi a6, a0, -4 2415; RV64IA-NEXT: slliw a0, a0, 3 2416; RV64IA-NEXT: andi a3, a0, 24 2417; RV64IA-NEXT: li a4, 255 2418; RV64IA-NEXT: sllw a7, a4, a0 2419; RV64IA-NEXT: slli a1, a1, 56 2420; RV64IA-NEXT: srai a1, a1, 56 2421; RV64IA-NEXT: sllw a1, a1, a0 2422; RV64IA-NEXT: li a5, 56 2423; RV64IA-NEXT: sub a3, a5, a3 2424; RV64IA-NEXT: .LBB37_1: # =>This Inner Loop Header: Depth=1 2425; RV64IA-NEXT: lr.w a5, (a6) 2426; RV64IA-NEXT: and a4, a5, a7 2427; RV64IA-NEXT: mv a2, a5 2428; RV64IA-NEXT: sll a4, a4, a3 2429; RV64IA-NEXT: sra a4, a4, a3 2430; RV64IA-NEXT: bge a4, a1, .LBB37_3 2431; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB37_1 Depth=1 2432; RV64IA-NEXT: xor a2, a5, a1 2433; RV64IA-NEXT: and a2, a2, a7 2434; RV64IA-NEXT: xor a2, a5, a2 2435; RV64IA-NEXT: .LBB37_3: # in Loop: Header=BB37_1 Depth=1 2436; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 2437; RV64IA-NEXT: bnez a2, .LBB37_1 2438; RV64IA-NEXT: # %bb.4: 2439; RV64IA-NEXT: srlw a0, a5, a0 2440; RV64IA-NEXT: ret 2441 %1 = atomicrmw max i8* %a, i8 %b release 2442 ret i8 %1 2443} 2444 2445define i8 @atomicrmw_max_i8_acq_rel(i8 *%a, i8 %b) nounwind { 2446; RV32I-LABEL: atomicrmw_max_i8_acq_rel: 2447; RV32I: # %bb.0: 2448; RV32I-NEXT: addi sp, sp, -32 2449; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2450; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2451; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2452; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2453; RV32I-NEXT: mv s0, a0 2454; RV32I-NEXT: lbu a3, 0(a0) 2455; RV32I-NEXT: mv s2, a1 2456; RV32I-NEXT: slli a0, a1, 24 2457; RV32I-NEXT: srai s1, a0, 24 2458; RV32I-NEXT: j .LBB38_2 2459; RV32I-NEXT: .LBB38_1: # %atomicrmw.start 2460; RV32I-NEXT: # in Loop: Header=BB38_2 Depth=1 2461; RV32I-NEXT: sb a3, 15(sp) 2462; RV32I-NEXT: addi a1, sp, 15 2463; RV32I-NEXT: li a3, 4 2464; RV32I-NEXT: li a4, 2 2465; RV32I-NEXT: mv a0, s0 2466; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2467; RV32I-NEXT: lb a3, 15(sp) 2468; RV32I-NEXT: bnez a0, .LBB38_4 2469; RV32I-NEXT: .LBB38_2: # %atomicrmw.start 2470; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2471; RV32I-NEXT: slli a0, a3, 24 2472; RV32I-NEXT: srai a0, a0, 24 2473; RV32I-NEXT: mv a2, a3 2474; RV32I-NEXT: blt s1, a0, .LBB38_1 2475; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2476; RV32I-NEXT: # in Loop: Header=BB38_2 Depth=1 2477; RV32I-NEXT: mv a2, s2 2478; RV32I-NEXT: j .LBB38_1 2479; RV32I-NEXT: .LBB38_4: # %atomicrmw.end 2480; RV32I-NEXT: mv a0, a3 2481; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2482; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2483; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2484; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2485; RV32I-NEXT: addi sp, sp, 32 2486; RV32I-NEXT: ret 2487; 2488; RV32IA-LABEL: atomicrmw_max_i8_acq_rel: 2489; RV32IA: # %bb.0: 2490; RV32IA-NEXT: andi a6, a0, -4 2491; RV32IA-NEXT: slli a0, a0, 3 2492; RV32IA-NEXT: andi a3, a0, 24 2493; RV32IA-NEXT: li a4, 255 2494; RV32IA-NEXT: sll a7, a4, a0 2495; RV32IA-NEXT: slli a1, a1, 24 2496; RV32IA-NEXT: srai a1, a1, 24 2497; RV32IA-NEXT: sll a1, a1, a0 2498; RV32IA-NEXT: li a5, 24 2499; RV32IA-NEXT: sub a3, a5, a3 2500; RV32IA-NEXT: .LBB38_1: # =>This Inner Loop Header: Depth=1 2501; RV32IA-NEXT: lr.w.aq a5, (a6) 2502; RV32IA-NEXT: and a4, a5, a7 2503; RV32IA-NEXT: mv a2, a5 2504; RV32IA-NEXT: sll a4, a4, a3 2505; RV32IA-NEXT: sra a4, a4, a3 2506; RV32IA-NEXT: bge a4, a1, .LBB38_3 2507; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB38_1 Depth=1 2508; RV32IA-NEXT: xor a2, a5, a1 2509; RV32IA-NEXT: and a2, a2, a7 2510; RV32IA-NEXT: xor a2, a5, a2 2511; RV32IA-NEXT: .LBB38_3: # in Loop: Header=BB38_1 Depth=1 2512; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 2513; RV32IA-NEXT: bnez a2, .LBB38_1 2514; RV32IA-NEXT: # %bb.4: 2515; RV32IA-NEXT: srl a0, a5, a0 2516; RV32IA-NEXT: ret 2517; 2518; RV64I-LABEL: atomicrmw_max_i8_acq_rel: 2519; RV64I: # %bb.0: 2520; RV64I-NEXT: addi sp, sp, -48 2521; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2522; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2523; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2524; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2525; RV64I-NEXT: mv s0, a0 2526; RV64I-NEXT: lbu a3, 0(a0) 2527; RV64I-NEXT: mv s2, a1 2528; RV64I-NEXT: slli a0, a1, 56 2529; RV64I-NEXT: srai s1, a0, 56 2530; RV64I-NEXT: j .LBB38_2 2531; RV64I-NEXT: .LBB38_1: # %atomicrmw.start 2532; RV64I-NEXT: # in Loop: Header=BB38_2 Depth=1 2533; RV64I-NEXT: sb a3, 15(sp) 2534; RV64I-NEXT: addi a1, sp, 15 2535; RV64I-NEXT: li a3, 4 2536; RV64I-NEXT: li a4, 2 2537; RV64I-NEXT: mv a0, s0 2538; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2539; RV64I-NEXT: lb a3, 15(sp) 2540; RV64I-NEXT: bnez a0, .LBB38_4 2541; RV64I-NEXT: .LBB38_2: # %atomicrmw.start 2542; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2543; RV64I-NEXT: slli a0, a3, 56 2544; RV64I-NEXT: srai a0, a0, 56 2545; RV64I-NEXT: mv a2, a3 2546; RV64I-NEXT: blt s1, a0, .LBB38_1 2547; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2548; RV64I-NEXT: # in Loop: Header=BB38_2 Depth=1 2549; RV64I-NEXT: mv a2, s2 2550; RV64I-NEXT: j .LBB38_1 2551; RV64I-NEXT: .LBB38_4: # %atomicrmw.end 2552; RV64I-NEXT: mv a0, a3 2553; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2554; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2555; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2556; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2557; RV64I-NEXT: addi sp, sp, 48 2558; RV64I-NEXT: ret 2559; 2560; RV64IA-LABEL: atomicrmw_max_i8_acq_rel: 2561; RV64IA: # %bb.0: 2562; RV64IA-NEXT: andi a6, a0, -4 2563; RV64IA-NEXT: slliw a0, a0, 3 2564; RV64IA-NEXT: andi a3, a0, 24 2565; RV64IA-NEXT: li a4, 255 2566; RV64IA-NEXT: sllw a7, a4, a0 2567; RV64IA-NEXT: slli a1, a1, 56 2568; RV64IA-NEXT: srai a1, a1, 56 2569; RV64IA-NEXT: sllw a1, a1, a0 2570; RV64IA-NEXT: li a5, 56 2571; RV64IA-NEXT: sub a3, a5, a3 2572; RV64IA-NEXT: .LBB38_1: # =>This Inner Loop Header: Depth=1 2573; RV64IA-NEXT: lr.w.aq a5, (a6) 2574; RV64IA-NEXT: and a4, a5, a7 2575; RV64IA-NEXT: mv a2, a5 2576; RV64IA-NEXT: sll a4, a4, a3 2577; RV64IA-NEXT: sra a4, a4, a3 2578; RV64IA-NEXT: bge a4, a1, .LBB38_3 2579; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB38_1 Depth=1 2580; RV64IA-NEXT: xor a2, a5, a1 2581; RV64IA-NEXT: and a2, a2, a7 2582; RV64IA-NEXT: xor a2, a5, a2 2583; RV64IA-NEXT: .LBB38_3: # in Loop: Header=BB38_1 Depth=1 2584; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 2585; RV64IA-NEXT: bnez a2, .LBB38_1 2586; RV64IA-NEXT: # %bb.4: 2587; RV64IA-NEXT: srlw a0, a5, a0 2588; RV64IA-NEXT: ret 2589 %1 = atomicrmw max i8* %a, i8 %b acq_rel 2590 ret i8 %1 2591} 2592 2593define i8 @atomicrmw_max_i8_seq_cst(i8 *%a, i8 %b) nounwind { 2594; RV32I-LABEL: atomicrmw_max_i8_seq_cst: 2595; RV32I: # %bb.0: 2596; RV32I-NEXT: addi sp, sp, -32 2597; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2598; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2599; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2600; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2601; RV32I-NEXT: mv s0, a0 2602; RV32I-NEXT: lbu a3, 0(a0) 2603; RV32I-NEXT: mv s2, a1 2604; RV32I-NEXT: slli a0, a1, 24 2605; RV32I-NEXT: srai s1, a0, 24 2606; RV32I-NEXT: j .LBB39_2 2607; RV32I-NEXT: .LBB39_1: # %atomicrmw.start 2608; RV32I-NEXT: # in Loop: Header=BB39_2 Depth=1 2609; RV32I-NEXT: sb a3, 15(sp) 2610; RV32I-NEXT: addi a1, sp, 15 2611; RV32I-NEXT: li a3, 5 2612; RV32I-NEXT: li a4, 5 2613; RV32I-NEXT: mv a0, s0 2614; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2615; RV32I-NEXT: lb a3, 15(sp) 2616; RV32I-NEXT: bnez a0, .LBB39_4 2617; RV32I-NEXT: .LBB39_2: # %atomicrmw.start 2618; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2619; RV32I-NEXT: slli a0, a3, 24 2620; RV32I-NEXT: srai a0, a0, 24 2621; RV32I-NEXT: mv a2, a3 2622; RV32I-NEXT: blt s1, a0, .LBB39_1 2623; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2624; RV32I-NEXT: # in Loop: Header=BB39_2 Depth=1 2625; RV32I-NEXT: mv a2, s2 2626; RV32I-NEXT: j .LBB39_1 2627; RV32I-NEXT: .LBB39_4: # %atomicrmw.end 2628; RV32I-NEXT: mv a0, a3 2629; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2630; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2631; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2632; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2633; RV32I-NEXT: addi sp, sp, 32 2634; RV32I-NEXT: ret 2635; 2636; RV32IA-LABEL: atomicrmw_max_i8_seq_cst: 2637; RV32IA: # %bb.0: 2638; RV32IA-NEXT: andi a6, a0, -4 2639; RV32IA-NEXT: slli a0, a0, 3 2640; RV32IA-NEXT: andi a3, a0, 24 2641; RV32IA-NEXT: li a4, 255 2642; RV32IA-NEXT: sll a7, a4, a0 2643; RV32IA-NEXT: slli a1, a1, 24 2644; RV32IA-NEXT: srai a1, a1, 24 2645; RV32IA-NEXT: sll a1, a1, a0 2646; RV32IA-NEXT: li a5, 24 2647; RV32IA-NEXT: sub a3, a5, a3 2648; RV32IA-NEXT: .LBB39_1: # =>This Inner Loop Header: Depth=1 2649; RV32IA-NEXT: lr.w.aqrl a5, (a6) 2650; RV32IA-NEXT: and a4, a5, a7 2651; RV32IA-NEXT: mv a2, a5 2652; RV32IA-NEXT: sll a4, a4, a3 2653; RV32IA-NEXT: sra a4, a4, a3 2654; RV32IA-NEXT: bge a4, a1, .LBB39_3 2655; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB39_1 Depth=1 2656; RV32IA-NEXT: xor a2, a5, a1 2657; RV32IA-NEXT: and a2, a2, a7 2658; RV32IA-NEXT: xor a2, a5, a2 2659; RV32IA-NEXT: .LBB39_3: # in Loop: Header=BB39_1 Depth=1 2660; RV32IA-NEXT: sc.w.aqrl a2, a2, (a6) 2661; RV32IA-NEXT: bnez a2, .LBB39_1 2662; RV32IA-NEXT: # %bb.4: 2663; RV32IA-NEXT: srl a0, a5, a0 2664; RV32IA-NEXT: ret 2665; 2666; RV64I-LABEL: atomicrmw_max_i8_seq_cst: 2667; RV64I: # %bb.0: 2668; RV64I-NEXT: addi sp, sp, -48 2669; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2670; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2671; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2672; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2673; RV64I-NEXT: mv s0, a0 2674; RV64I-NEXT: lbu a3, 0(a0) 2675; RV64I-NEXT: mv s2, a1 2676; RV64I-NEXT: slli a0, a1, 56 2677; RV64I-NEXT: srai s1, a0, 56 2678; RV64I-NEXT: j .LBB39_2 2679; RV64I-NEXT: .LBB39_1: # %atomicrmw.start 2680; RV64I-NEXT: # in Loop: Header=BB39_2 Depth=1 2681; RV64I-NEXT: sb a3, 15(sp) 2682; RV64I-NEXT: addi a1, sp, 15 2683; RV64I-NEXT: li a3, 5 2684; RV64I-NEXT: li a4, 5 2685; RV64I-NEXT: mv a0, s0 2686; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2687; RV64I-NEXT: lb a3, 15(sp) 2688; RV64I-NEXT: bnez a0, .LBB39_4 2689; RV64I-NEXT: .LBB39_2: # %atomicrmw.start 2690; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2691; RV64I-NEXT: slli a0, a3, 56 2692; RV64I-NEXT: srai a0, a0, 56 2693; RV64I-NEXT: mv a2, a3 2694; RV64I-NEXT: blt s1, a0, .LBB39_1 2695; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2696; RV64I-NEXT: # in Loop: Header=BB39_2 Depth=1 2697; RV64I-NEXT: mv a2, s2 2698; RV64I-NEXT: j .LBB39_1 2699; RV64I-NEXT: .LBB39_4: # %atomicrmw.end 2700; RV64I-NEXT: mv a0, a3 2701; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2702; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2703; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2704; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2705; RV64I-NEXT: addi sp, sp, 48 2706; RV64I-NEXT: ret 2707; 2708; RV64IA-LABEL: atomicrmw_max_i8_seq_cst: 2709; RV64IA: # %bb.0: 2710; RV64IA-NEXT: andi a6, a0, -4 2711; RV64IA-NEXT: slliw a0, a0, 3 2712; RV64IA-NEXT: andi a3, a0, 24 2713; RV64IA-NEXT: li a4, 255 2714; RV64IA-NEXT: sllw a7, a4, a0 2715; RV64IA-NEXT: slli a1, a1, 56 2716; RV64IA-NEXT: srai a1, a1, 56 2717; RV64IA-NEXT: sllw a1, a1, a0 2718; RV64IA-NEXT: li a5, 56 2719; RV64IA-NEXT: sub a3, a5, a3 2720; RV64IA-NEXT: .LBB39_1: # =>This Inner Loop Header: Depth=1 2721; RV64IA-NEXT: lr.w.aqrl a5, (a6) 2722; RV64IA-NEXT: and a4, a5, a7 2723; RV64IA-NEXT: mv a2, a5 2724; RV64IA-NEXT: sll a4, a4, a3 2725; RV64IA-NEXT: sra a4, a4, a3 2726; RV64IA-NEXT: bge a4, a1, .LBB39_3 2727; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB39_1 Depth=1 2728; RV64IA-NEXT: xor a2, a5, a1 2729; RV64IA-NEXT: and a2, a2, a7 2730; RV64IA-NEXT: xor a2, a5, a2 2731; RV64IA-NEXT: .LBB39_3: # in Loop: Header=BB39_1 Depth=1 2732; RV64IA-NEXT: sc.w.aqrl a2, a2, (a6) 2733; RV64IA-NEXT: bnez a2, .LBB39_1 2734; RV64IA-NEXT: # %bb.4: 2735; RV64IA-NEXT: srlw a0, a5, a0 2736; RV64IA-NEXT: ret 2737 %1 = atomicrmw max i8* %a, i8 %b seq_cst 2738 ret i8 %1 2739} 2740 2741define i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind { 2742; RV32I-LABEL: atomicrmw_min_i8_monotonic: 2743; RV32I: # %bb.0: 2744; RV32I-NEXT: addi sp, sp, -32 2745; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2746; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2747; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2748; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2749; RV32I-NEXT: mv s0, a0 2750; RV32I-NEXT: lbu a3, 0(a0) 2751; RV32I-NEXT: mv s2, a1 2752; RV32I-NEXT: slli a0, a1, 24 2753; RV32I-NEXT: srai s1, a0, 24 2754; RV32I-NEXT: j .LBB40_2 2755; RV32I-NEXT: .LBB40_1: # %atomicrmw.start 2756; RV32I-NEXT: # in Loop: Header=BB40_2 Depth=1 2757; RV32I-NEXT: sb a3, 15(sp) 2758; RV32I-NEXT: addi a1, sp, 15 2759; RV32I-NEXT: mv a0, s0 2760; RV32I-NEXT: li a3, 0 2761; RV32I-NEXT: li a4, 0 2762; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2763; RV32I-NEXT: lb a3, 15(sp) 2764; RV32I-NEXT: bnez a0, .LBB40_4 2765; RV32I-NEXT: .LBB40_2: # %atomicrmw.start 2766; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2767; RV32I-NEXT: slli a0, a3, 24 2768; RV32I-NEXT: srai a0, a0, 24 2769; RV32I-NEXT: mv a2, a3 2770; RV32I-NEXT: bge s1, a0, .LBB40_1 2771; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2772; RV32I-NEXT: # in Loop: Header=BB40_2 Depth=1 2773; RV32I-NEXT: mv a2, s2 2774; RV32I-NEXT: j .LBB40_1 2775; RV32I-NEXT: .LBB40_4: # %atomicrmw.end 2776; RV32I-NEXT: mv a0, a3 2777; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2778; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2779; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2780; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2781; RV32I-NEXT: addi sp, sp, 32 2782; RV32I-NEXT: ret 2783; 2784; RV32IA-LABEL: atomicrmw_min_i8_monotonic: 2785; RV32IA: # %bb.0: 2786; RV32IA-NEXT: andi a6, a0, -4 2787; RV32IA-NEXT: slli a0, a0, 3 2788; RV32IA-NEXT: andi a3, a0, 24 2789; RV32IA-NEXT: li a4, 255 2790; RV32IA-NEXT: sll a7, a4, a0 2791; RV32IA-NEXT: slli a1, a1, 24 2792; RV32IA-NEXT: srai a1, a1, 24 2793; RV32IA-NEXT: sll a1, a1, a0 2794; RV32IA-NEXT: li a5, 24 2795; RV32IA-NEXT: sub a3, a5, a3 2796; RV32IA-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 2797; RV32IA-NEXT: lr.w a5, (a6) 2798; RV32IA-NEXT: and a4, a5, a7 2799; RV32IA-NEXT: mv a2, a5 2800; RV32IA-NEXT: sll a4, a4, a3 2801; RV32IA-NEXT: sra a4, a4, a3 2802; RV32IA-NEXT: bge a1, a4, .LBB40_3 2803; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB40_1 Depth=1 2804; RV32IA-NEXT: xor a2, a5, a1 2805; RV32IA-NEXT: and a2, a2, a7 2806; RV32IA-NEXT: xor a2, a5, a2 2807; RV32IA-NEXT: .LBB40_3: # in Loop: Header=BB40_1 Depth=1 2808; RV32IA-NEXT: sc.w a2, a2, (a6) 2809; RV32IA-NEXT: bnez a2, .LBB40_1 2810; RV32IA-NEXT: # %bb.4: 2811; RV32IA-NEXT: srl a0, a5, a0 2812; RV32IA-NEXT: ret 2813; 2814; RV64I-LABEL: atomicrmw_min_i8_monotonic: 2815; RV64I: # %bb.0: 2816; RV64I-NEXT: addi sp, sp, -48 2817; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2818; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2819; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2820; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2821; RV64I-NEXT: mv s0, a0 2822; RV64I-NEXT: lbu a3, 0(a0) 2823; RV64I-NEXT: mv s2, a1 2824; RV64I-NEXT: slli a0, a1, 56 2825; RV64I-NEXT: srai s1, a0, 56 2826; RV64I-NEXT: j .LBB40_2 2827; RV64I-NEXT: .LBB40_1: # %atomicrmw.start 2828; RV64I-NEXT: # in Loop: Header=BB40_2 Depth=1 2829; RV64I-NEXT: sb a3, 15(sp) 2830; RV64I-NEXT: addi a1, sp, 15 2831; RV64I-NEXT: mv a0, s0 2832; RV64I-NEXT: li a3, 0 2833; RV64I-NEXT: li a4, 0 2834; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2835; RV64I-NEXT: lb a3, 15(sp) 2836; RV64I-NEXT: bnez a0, .LBB40_4 2837; RV64I-NEXT: .LBB40_2: # %atomicrmw.start 2838; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2839; RV64I-NEXT: slli a0, a3, 56 2840; RV64I-NEXT: srai a0, a0, 56 2841; RV64I-NEXT: mv a2, a3 2842; RV64I-NEXT: bge s1, a0, .LBB40_1 2843; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2844; RV64I-NEXT: # in Loop: Header=BB40_2 Depth=1 2845; RV64I-NEXT: mv a2, s2 2846; RV64I-NEXT: j .LBB40_1 2847; RV64I-NEXT: .LBB40_4: # %atomicrmw.end 2848; RV64I-NEXT: mv a0, a3 2849; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2850; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2851; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2852; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2853; RV64I-NEXT: addi sp, sp, 48 2854; RV64I-NEXT: ret 2855; 2856; RV64IA-LABEL: atomicrmw_min_i8_monotonic: 2857; RV64IA: # %bb.0: 2858; RV64IA-NEXT: andi a6, a0, -4 2859; RV64IA-NEXT: slliw a0, a0, 3 2860; RV64IA-NEXT: andi a3, a0, 24 2861; RV64IA-NEXT: li a4, 255 2862; RV64IA-NEXT: sllw a7, a4, a0 2863; RV64IA-NEXT: slli a1, a1, 56 2864; RV64IA-NEXT: srai a1, a1, 56 2865; RV64IA-NEXT: sllw a1, a1, a0 2866; RV64IA-NEXT: li a5, 56 2867; RV64IA-NEXT: sub a3, a5, a3 2868; RV64IA-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 2869; RV64IA-NEXT: lr.w a5, (a6) 2870; RV64IA-NEXT: and a4, a5, a7 2871; RV64IA-NEXT: mv a2, a5 2872; RV64IA-NEXT: sll a4, a4, a3 2873; RV64IA-NEXT: sra a4, a4, a3 2874; RV64IA-NEXT: bge a1, a4, .LBB40_3 2875; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB40_1 Depth=1 2876; RV64IA-NEXT: xor a2, a5, a1 2877; RV64IA-NEXT: and a2, a2, a7 2878; RV64IA-NEXT: xor a2, a5, a2 2879; RV64IA-NEXT: .LBB40_3: # in Loop: Header=BB40_1 Depth=1 2880; RV64IA-NEXT: sc.w a2, a2, (a6) 2881; RV64IA-NEXT: bnez a2, .LBB40_1 2882; RV64IA-NEXT: # %bb.4: 2883; RV64IA-NEXT: srlw a0, a5, a0 2884; RV64IA-NEXT: ret 2885 %1 = atomicrmw min i8* %a, i8 %b monotonic 2886 ret i8 %1 2887} 2888 2889define i8 @atomicrmw_min_i8_acquire(i8 *%a, i8 %b) nounwind { 2890; RV32I-LABEL: atomicrmw_min_i8_acquire: 2891; RV32I: # %bb.0: 2892; RV32I-NEXT: addi sp, sp, -32 2893; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2894; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2895; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2896; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2897; RV32I-NEXT: mv s0, a0 2898; RV32I-NEXT: lbu a3, 0(a0) 2899; RV32I-NEXT: mv s2, a1 2900; RV32I-NEXT: slli a0, a1, 24 2901; RV32I-NEXT: srai s1, a0, 24 2902; RV32I-NEXT: j .LBB41_2 2903; RV32I-NEXT: .LBB41_1: # %atomicrmw.start 2904; RV32I-NEXT: # in Loop: Header=BB41_2 Depth=1 2905; RV32I-NEXT: sb a3, 15(sp) 2906; RV32I-NEXT: addi a1, sp, 15 2907; RV32I-NEXT: li a3, 2 2908; RV32I-NEXT: li a4, 2 2909; RV32I-NEXT: mv a0, s0 2910; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2911; RV32I-NEXT: lb a3, 15(sp) 2912; RV32I-NEXT: bnez a0, .LBB41_4 2913; RV32I-NEXT: .LBB41_2: # %atomicrmw.start 2914; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2915; RV32I-NEXT: slli a0, a3, 24 2916; RV32I-NEXT: srai a0, a0, 24 2917; RV32I-NEXT: mv a2, a3 2918; RV32I-NEXT: bge s1, a0, .LBB41_1 2919; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2920; RV32I-NEXT: # in Loop: Header=BB41_2 Depth=1 2921; RV32I-NEXT: mv a2, s2 2922; RV32I-NEXT: j .LBB41_1 2923; RV32I-NEXT: .LBB41_4: # %atomicrmw.end 2924; RV32I-NEXT: mv a0, a3 2925; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2926; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2927; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2928; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2929; RV32I-NEXT: addi sp, sp, 32 2930; RV32I-NEXT: ret 2931; 2932; RV32IA-LABEL: atomicrmw_min_i8_acquire: 2933; RV32IA: # %bb.0: 2934; RV32IA-NEXT: andi a6, a0, -4 2935; RV32IA-NEXT: slli a0, a0, 3 2936; RV32IA-NEXT: andi a3, a0, 24 2937; RV32IA-NEXT: li a4, 255 2938; RV32IA-NEXT: sll a7, a4, a0 2939; RV32IA-NEXT: slli a1, a1, 24 2940; RV32IA-NEXT: srai a1, a1, 24 2941; RV32IA-NEXT: sll a1, a1, a0 2942; RV32IA-NEXT: li a5, 24 2943; RV32IA-NEXT: sub a3, a5, a3 2944; RV32IA-NEXT: .LBB41_1: # =>This Inner Loop Header: Depth=1 2945; RV32IA-NEXT: lr.w.aq a5, (a6) 2946; RV32IA-NEXT: and a4, a5, a7 2947; RV32IA-NEXT: mv a2, a5 2948; RV32IA-NEXT: sll a4, a4, a3 2949; RV32IA-NEXT: sra a4, a4, a3 2950; RV32IA-NEXT: bge a1, a4, .LBB41_3 2951; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB41_1 Depth=1 2952; RV32IA-NEXT: xor a2, a5, a1 2953; RV32IA-NEXT: and a2, a2, a7 2954; RV32IA-NEXT: xor a2, a5, a2 2955; RV32IA-NEXT: .LBB41_3: # in Loop: Header=BB41_1 Depth=1 2956; RV32IA-NEXT: sc.w a2, a2, (a6) 2957; RV32IA-NEXT: bnez a2, .LBB41_1 2958; RV32IA-NEXT: # %bb.4: 2959; RV32IA-NEXT: srl a0, a5, a0 2960; RV32IA-NEXT: ret 2961; 2962; RV64I-LABEL: atomicrmw_min_i8_acquire: 2963; RV64I: # %bb.0: 2964; RV64I-NEXT: addi sp, sp, -48 2965; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2966; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2967; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2968; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2969; RV64I-NEXT: mv s0, a0 2970; RV64I-NEXT: lbu a3, 0(a0) 2971; RV64I-NEXT: mv s2, a1 2972; RV64I-NEXT: slli a0, a1, 56 2973; RV64I-NEXT: srai s1, a0, 56 2974; RV64I-NEXT: j .LBB41_2 2975; RV64I-NEXT: .LBB41_1: # %atomicrmw.start 2976; RV64I-NEXT: # in Loop: Header=BB41_2 Depth=1 2977; RV64I-NEXT: sb a3, 15(sp) 2978; RV64I-NEXT: addi a1, sp, 15 2979; RV64I-NEXT: li a3, 2 2980; RV64I-NEXT: li a4, 2 2981; RV64I-NEXT: mv a0, s0 2982; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2983; RV64I-NEXT: lb a3, 15(sp) 2984; RV64I-NEXT: bnez a0, .LBB41_4 2985; RV64I-NEXT: .LBB41_2: # %atomicrmw.start 2986; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2987; RV64I-NEXT: slli a0, a3, 56 2988; RV64I-NEXT: srai a0, a0, 56 2989; RV64I-NEXT: mv a2, a3 2990; RV64I-NEXT: bge s1, a0, .LBB41_1 2991; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2992; RV64I-NEXT: # in Loop: Header=BB41_2 Depth=1 2993; RV64I-NEXT: mv a2, s2 2994; RV64I-NEXT: j .LBB41_1 2995; RV64I-NEXT: .LBB41_4: # %atomicrmw.end 2996; RV64I-NEXT: mv a0, a3 2997; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2998; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2999; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3000; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3001; RV64I-NEXT: addi sp, sp, 48 3002; RV64I-NEXT: ret 3003; 3004; RV64IA-LABEL: atomicrmw_min_i8_acquire: 3005; RV64IA: # %bb.0: 3006; RV64IA-NEXT: andi a6, a0, -4 3007; RV64IA-NEXT: slliw a0, a0, 3 3008; RV64IA-NEXT: andi a3, a0, 24 3009; RV64IA-NEXT: li a4, 255 3010; RV64IA-NEXT: sllw a7, a4, a0 3011; RV64IA-NEXT: slli a1, a1, 56 3012; RV64IA-NEXT: srai a1, a1, 56 3013; RV64IA-NEXT: sllw a1, a1, a0 3014; RV64IA-NEXT: li a5, 56 3015; RV64IA-NEXT: sub a3, a5, a3 3016; RV64IA-NEXT: .LBB41_1: # =>This Inner Loop Header: Depth=1 3017; RV64IA-NEXT: lr.w.aq a5, (a6) 3018; RV64IA-NEXT: and a4, a5, a7 3019; RV64IA-NEXT: mv a2, a5 3020; RV64IA-NEXT: sll a4, a4, a3 3021; RV64IA-NEXT: sra a4, a4, a3 3022; RV64IA-NEXT: bge a1, a4, .LBB41_3 3023; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB41_1 Depth=1 3024; RV64IA-NEXT: xor a2, a5, a1 3025; RV64IA-NEXT: and a2, a2, a7 3026; RV64IA-NEXT: xor a2, a5, a2 3027; RV64IA-NEXT: .LBB41_3: # in Loop: Header=BB41_1 Depth=1 3028; RV64IA-NEXT: sc.w a2, a2, (a6) 3029; RV64IA-NEXT: bnez a2, .LBB41_1 3030; RV64IA-NEXT: # %bb.4: 3031; RV64IA-NEXT: srlw a0, a5, a0 3032; RV64IA-NEXT: ret 3033 %1 = atomicrmw min i8* %a, i8 %b acquire 3034 ret i8 %1 3035} 3036 3037define i8 @atomicrmw_min_i8_release(i8 *%a, i8 %b) nounwind { 3038; RV32I-LABEL: atomicrmw_min_i8_release: 3039; RV32I: # %bb.0: 3040; RV32I-NEXT: addi sp, sp, -32 3041; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3042; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3043; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3044; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3045; RV32I-NEXT: mv s0, a0 3046; RV32I-NEXT: lbu a3, 0(a0) 3047; RV32I-NEXT: mv s2, a1 3048; RV32I-NEXT: slli a0, a1, 24 3049; RV32I-NEXT: srai s1, a0, 24 3050; RV32I-NEXT: j .LBB42_2 3051; RV32I-NEXT: .LBB42_1: # %atomicrmw.start 3052; RV32I-NEXT: # in Loop: Header=BB42_2 Depth=1 3053; RV32I-NEXT: sb a3, 15(sp) 3054; RV32I-NEXT: addi a1, sp, 15 3055; RV32I-NEXT: li a3, 3 3056; RV32I-NEXT: mv a0, s0 3057; RV32I-NEXT: li a4, 0 3058; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3059; RV32I-NEXT: lb a3, 15(sp) 3060; RV32I-NEXT: bnez a0, .LBB42_4 3061; RV32I-NEXT: .LBB42_2: # %atomicrmw.start 3062; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3063; RV32I-NEXT: slli a0, a3, 24 3064; RV32I-NEXT: srai a0, a0, 24 3065; RV32I-NEXT: mv a2, a3 3066; RV32I-NEXT: bge s1, a0, .LBB42_1 3067; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3068; RV32I-NEXT: # in Loop: Header=BB42_2 Depth=1 3069; RV32I-NEXT: mv a2, s2 3070; RV32I-NEXT: j .LBB42_1 3071; RV32I-NEXT: .LBB42_4: # %atomicrmw.end 3072; RV32I-NEXT: mv a0, a3 3073; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3074; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3075; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3076; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3077; RV32I-NEXT: addi sp, sp, 32 3078; RV32I-NEXT: ret 3079; 3080; RV32IA-LABEL: atomicrmw_min_i8_release: 3081; RV32IA: # %bb.0: 3082; RV32IA-NEXT: andi a6, a0, -4 3083; RV32IA-NEXT: slli a0, a0, 3 3084; RV32IA-NEXT: andi a3, a0, 24 3085; RV32IA-NEXT: li a4, 255 3086; RV32IA-NEXT: sll a7, a4, a0 3087; RV32IA-NEXT: slli a1, a1, 24 3088; RV32IA-NEXT: srai a1, a1, 24 3089; RV32IA-NEXT: sll a1, a1, a0 3090; RV32IA-NEXT: li a5, 24 3091; RV32IA-NEXT: sub a3, a5, a3 3092; RV32IA-NEXT: .LBB42_1: # =>This Inner Loop Header: Depth=1 3093; RV32IA-NEXT: lr.w a5, (a6) 3094; RV32IA-NEXT: and a4, a5, a7 3095; RV32IA-NEXT: mv a2, a5 3096; RV32IA-NEXT: sll a4, a4, a3 3097; RV32IA-NEXT: sra a4, a4, a3 3098; RV32IA-NEXT: bge a1, a4, .LBB42_3 3099; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB42_1 Depth=1 3100; RV32IA-NEXT: xor a2, a5, a1 3101; RV32IA-NEXT: and a2, a2, a7 3102; RV32IA-NEXT: xor a2, a5, a2 3103; RV32IA-NEXT: .LBB42_3: # in Loop: Header=BB42_1 Depth=1 3104; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 3105; RV32IA-NEXT: bnez a2, .LBB42_1 3106; RV32IA-NEXT: # %bb.4: 3107; RV32IA-NEXT: srl a0, a5, a0 3108; RV32IA-NEXT: ret 3109; 3110; RV64I-LABEL: atomicrmw_min_i8_release: 3111; RV64I: # %bb.0: 3112; RV64I-NEXT: addi sp, sp, -48 3113; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3114; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3115; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3116; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3117; RV64I-NEXT: mv s0, a0 3118; RV64I-NEXT: lbu a3, 0(a0) 3119; RV64I-NEXT: mv s2, a1 3120; RV64I-NEXT: slli a0, a1, 56 3121; RV64I-NEXT: srai s1, a0, 56 3122; RV64I-NEXT: j .LBB42_2 3123; RV64I-NEXT: .LBB42_1: # %atomicrmw.start 3124; RV64I-NEXT: # in Loop: Header=BB42_2 Depth=1 3125; RV64I-NEXT: sb a3, 15(sp) 3126; RV64I-NEXT: addi a1, sp, 15 3127; RV64I-NEXT: li a3, 3 3128; RV64I-NEXT: mv a0, s0 3129; RV64I-NEXT: li a4, 0 3130; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3131; RV64I-NEXT: lb a3, 15(sp) 3132; RV64I-NEXT: bnez a0, .LBB42_4 3133; RV64I-NEXT: .LBB42_2: # %atomicrmw.start 3134; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3135; RV64I-NEXT: slli a0, a3, 56 3136; RV64I-NEXT: srai a0, a0, 56 3137; RV64I-NEXT: mv a2, a3 3138; RV64I-NEXT: bge s1, a0, .LBB42_1 3139; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3140; RV64I-NEXT: # in Loop: Header=BB42_2 Depth=1 3141; RV64I-NEXT: mv a2, s2 3142; RV64I-NEXT: j .LBB42_1 3143; RV64I-NEXT: .LBB42_4: # %atomicrmw.end 3144; RV64I-NEXT: mv a0, a3 3145; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3146; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3147; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3148; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3149; RV64I-NEXT: addi sp, sp, 48 3150; RV64I-NEXT: ret 3151; 3152; RV64IA-LABEL: atomicrmw_min_i8_release: 3153; RV64IA: # %bb.0: 3154; RV64IA-NEXT: andi a6, a0, -4 3155; RV64IA-NEXT: slliw a0, a0, 3 3156; RV64IA-NEXT: andi a3, a0, 24 3157; RV64IA-NEXT: li a4, 255 3158; RV64IA-NEXT: sllw a7, a4, a0 3159; RV64IA-NEXT: slli a1, a1, 56 3160; RV64IA-NEXT: srai a1, a1, 56 3161; RV64IA-NEXT: sllw a1, a1, a0 3162; RV64IA-NEXT: li a5, 56 3163; RV64IA-NEXT: sub a3, a5, a3 3164; RV64IA-NEXT: .LBB42_1: # =>This Inner Loop Header: Depth=1 3165; RV64IA-NEXT: lr.w a5, (a6) 3166; RV64IA-NEXT: and a4, a5, a7 3167; RV64IA-NEXT: mv a2, a5 3168; RV64IA-NEXT: sll a4, a4, a3 3169; RV64IA-NEXT: sra a4, a4, a3 3170; RV64IA-NEXT: bge a1, a4, .LBB42_3 3171; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB42_1 Depth=1 3172; RV64IA-NEXT: xor a2, a5, a1 3173; RV64IA-NEXT: and a2, a2, a7 3174; RV64IA-NEXT: xor a2, a5, a2 3175; RV64IA-NEXT: .LBB42_3: # in Loop: Header=BB42_1 Depth=1 3176; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 3177; RV64IA-NEXT: bnez a2, .LBB42_1 3178; RV64IA-NEXT: # %bb.4: 3179; RV64IA-NEXT: srlw a0, a5, a0 3180; RV64IA-NEXT: ret 3181 %1 = atomicrmw min i8* %a, i8 %b release 3182 ret i8 %1 3183} 3184 3185define i8 @atomicrmw_min_i8_acq_rel(i8 *%a, i8 %b) nounwind { 3186; RV32I-LABEL: atomicrmw_min_i8_acq_rel: 3187; RV32I: # %bb.0: 3188; RV32I-NEXT: addi sp, sp, -32 3189; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3190; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3191; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3192; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3193; RV32I-NEXT: mv s0, a0 3194; RV32I-NEXT: lbu a3, 0(a0) 3195; RV32I-NEXT: mv s2, a1 3196; RV32I-NEXT: slli a0, a1, 24 3197; RV32I-NEXT: srai s1, a0, 24 3198; RV32I-NEXT: j .LBB43_2 3199; RV32I-NEXT: .LBB43_1: # %atomicrmw.start 3200; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3201; RV32I-NEXT: sb a3, 15(sp) 3202; RV32I-NEXT: addi a1, sp, 15 3203; RV32I-NEXT: li a3, 4 3204; RV32I-NEXT: li a4, 2 3205; RV32I-NEXT: mv a0, s0 3206; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3207; RV32I-NEXT: lb a3, 15(sp) 3208; RV32I-NEXT: bnez a0, .LBB43_4 3209; RV32I-NEXT: .LBB43_2: # %atomicrmw.start 3210; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3211; RV32I-NEXT: slli a0, a3, 24 3212; RV32I-NEXT: srai a0, a0, 24 3213; RV32I-NEXT: mv a2, a3 3214; RV32I-NEXT: bge s1, a0, .LBB43_1 3215; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3216; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3217; RV32I-NEXT: mv a2, s2 3218; RV32I-NEXT: j .LBB43_1 3219; RV32I-NEXT: .LBB43_4: # %atomicrmw.end 3220; RV32I-NEXT: mv a0, a3 3221; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3222; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3223; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3224; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3225; RV32I-NEXT: addi sp, sp, 32 3226; RV32I-NEXT: ret 3227; 3228; RV32IA-LABEL: atomicrmw_min_i8_acq_rel: 3229; RV32IA: # %bb.0: 3230; RV32IA-NEXT: andi a6, a0, -4 3231; RV32IA-NEXT: slli a0, a0, 3 3232; RV32IA-NEXT: andi a3, a0, 24 3233; RV32IA-NEXT: li a4, 255 3234; RV32IA-NEXT: sll a7, a4, a0 3235; RV32IA-NEXT: slli a1, a1, 24 3236; RV32IA-NEXT: srai a1, a1, 24 3237; RV32IA-NEXT: sll a1, a1, a0 3238; RV32IA-NEXT: li a5, 24 3239; RV32IA-NEXT: sub a3, a5, a3 3240; RV32IA-NEXT: .LBB43_1: # =>This Inner Loop Header: Depth=1 3241; RV32IA-NEXT: lr.w.aq a5, (a6) 3242; RV32IA-NEXT: and a4, a5, a7 3243; RV32IA-NEXT: mv a2, a5 3244; RV32IA-NEXT: sll a4, a4, a3 3245; RV32IA-NEXT: sra a4, a4, a3 3246; RV32IA-NEXT: bge a1, a4, .LBB43_3 3247; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB43_1 Depth=1 3248; RV32IA-NEXT: xor a2, a5, a1 3249; RV32IA-NEXT: and a2, a2, a7 3250; RV32IA-NEXT: xor a2, a5, a2 3251; RV32IA-NEXT: .LBB43_3: # in Loop: Header=BB43_1 Depth=1 3252; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 3253; RV32IA-NEXT: bnez a2, .LBB43_1 3254; RV32IA-NEXT: # %bb.4: 3255; RV32IA-NEXT: srl a0, a5, a0 3256; RV32IA-NEXT: ret 3257; 3258; RV64I-LABEL: atomicrmw_min_i8_acq_rel: 3259; RV64I: # %bb.0: 3260; RV64I-NEXT: addi sp, sp, -48 3261; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3262; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3263; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3264; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3265; RV64I-NEXT: mv s0, a0 3266; RV64I-NEXT: lbu a3, 0(a0) 3267; RV64I-NEXT: mv s2, a1 3268; RV64I-NEXT: slli a0, a1, 56 3269; RV64I-NEXT: srai s1, a0, 56 3270; RV64I-NEXT: j .LBB43_2 3271; RV64I-NEXT: .LBB43_1: # %atomicrmw.start 3272; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3273; RV64I-NEXT: sb a3, 15(sp) 3274; RV64I-NEXT: addi a1, sp, 15 3275; RV64I-NEXT: li a3, 4 3276; RV64I-NEXT: li a4, 2 3277; RV64I-NEXT: mv a0, s0 3278; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3279; RV64I-NEXT: lb a3, 15(sp) 3280; RV64I-NEXT: bnez a0, .LBB43_4 3281; RV64I-NEXT: .LBB43_2: # %atomicrmw.start 3282; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3283; RV64I-NEXT: slli a0, a3, 56 3284; RV64I-NEXT: srai a0, a0, 56 3285; RV64I-NEXT: mv a2, a3 3286; RV64I-NEXT: bge s1, a0, .LBB43_1 3287; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3288; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3289; RV64I-NEXT: mv a2, s2 3290; RV64I-NEXT: j .LBB43_1 3291; RV64I-NEXT: .LBB43_4: # %atomicrmw.end 3292; RV64I-NEXT: mv a0, a3 3293; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3294; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3295; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3296; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3297; RV64I-NEXT: addi sp, sp, 48 3298; RV64I-NEXT: ret 3299; 3300; RV64IA-LABEL: atomicrmw_min_i8_acq_rel: 3301; RV64IA: # %bb.0: 3302; RV64IA-NEXT: andi a6, a0, -4 3303; RV64IA-NEXT: slliw a0, a0, 3 3304; RV64IA-NEXT: andi a3, a0, 24 3305; RV64IA-NEXT: li a4, 255 3306; RV64IA-NEXT: sllw a7, a4, a0 3307; RV64IA-NEXT: slli a1, a1, 56 3308; RV64IA-NEXT: srai a1, a1, 56 3309; RV64IA-NEXT: sllw a1, a1, a0 3310; RV64IA-NEXT: li a5, 56 3311; RV64IA-NEXT: sub a3, a5, a3 3312; RV64IA-NEXT: .LBB43_1: # =>This Inner Loop Header: Depth=1 3313; RV64IA-NEXT: lr.w.aq a5, (a6) 3314; RV64IA-NEXT: and a4, a5, a7 3315; RV64IA-NEXT: mv a2, a5 3316; RV64IA-NEXT: sll a4, a4, a3 3317; RV64IA-NEXT: sra a4, a4, a3 3318; RV64IA-NEXT: bge a1, a4, .LBB43_3 3319; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB43_1 Depth=1 3320; RV64IA-NEXT: xor a2, a5, a1 3321; RV64IA-NEXT: and a2, a2, a7 3322; RV64IA-NEXT: xor a2, a5, a2 3323; RV64IA-NEXT: .LBB43_3: # in Loop: Header=BB43_1 Depth=1 3324; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 3325; RV64IA-NEXT: bnez a2, .LBB43_1 3326; RV64IA-NEXT: # %bb.4: 3327; RV64IA-NEXT: srlw a0, a5, a0 3328; RV64IA-NEXT: ret 3329 %1 = atomicrmw min i8* %a, i8 %b acq_rel 3330 ret i8 %1 3331} 3332 3333define i8 @atomicrmw_min_i8_seq_cst(i8 *%a, i8 %b) nounwind { 3334; RV32I-LABEL: atomicrmw_min_i8_seq_cst: 3335; RV32I: # %bb.0: 3336; RV32I-NEXT: addi sp, sp, -32 3337; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3338; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3339; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3340; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3341; RV32I-NEXT: mv s0, a0 3342; RV32I-NEXT: lbu a3, 0(a0) 3343; RV32I-NEXT: mv s2, a1 3344; RV32I-NEXT: slli a0, a1, 24 3345; RV32I-NEXT: srai s1, a0, 24 3346; RV32I-NEXT: j .LBB44_2 3347; RV32I-NEXT: .LBB44_1: # %atomicrmw.start 3348; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3349; RV32I-NEXT: sb a3, 15(sp) 3350; RV32I-NEXT: addi a1, sp, 15 3351; RV32I-NEXT: li a3, 5 3352; RV32I-NEXT: li a4, 5 3353; RV32I-NEXT: mv a0, s0 3354; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3355; RV32I-NEXT: lb a3, 15(sp) 3356; RV32I-NEXT: bnez a0, .LBB44_4 3357; RV32I-NEXT: .LBB44_2: # %atomicrmw.start 3358; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3359; RV32I-NEXT: slli a0, a3, 24 3360; RV32I-NEXT: srai a0, a0, 24 3361; RV32I-NEXT: mv a2, a3 3362; RV32I-NEXT: bge s1, a0, .LBB44_1 3363; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3364; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3365; RV32I-NEXT: mv a2, s2 3366; RV32I-NEXT: j .LBB44_1 3367; RV32I-NEXT: .LBB44_4: # %atomicrmw.end 3368; RV32I-NEXT: mv a0, a3 3369; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3370; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3371; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3372; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3373; RV32I-NEXT: addi sp, sp, 32 3374; RV32I-NEXT: ret 3375; 3376; RV32IA-LABEL: atomicrmw_min_i8_seq_cst: 3377; RV32IA: # %bb.0: 3378; RV32IA-NEXT: andi a6, a0, -4 3379; RV32IA-NEXT: slli a0, a0, 3 3380; RV32IA-NEXT: andi a3, a0, 24 3381; RV32IA-NEXT: li a4, 255 3382; RV32IA-NEXT: sll a7, a4, a0 3383; RV32IA-NEXT: slli a1, a1, 24 3384; RV32IA-NEXT: srai a1, a1, 24 3385; RV32IA-NEXT: sll a1, a1, a0 3386; RV32IA-NEXT: li a5, 24 3387; RV32IA-NEXT: sub a3, a5, a3 3388; RV32IA-NEXT: .LBB44_1: # =>This Inner Loop Header: Depth=1 3389; RV32IA-NEXT: lr.w.aqrl a5, (a6) 3390; RV32IA-NEXT: and a4, a5, a7 3391; RV32IA-NEXT: mv a2, a5 3392; RV32IA-NEXT: sll a4, a4, a3 3393; RV32IA-NEXT: sra a4, a4, a3 3394; RV32IA-NEXT: bge a1, a4, .LBB44_3 3395; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB44_1 Depth=1 3396; RV32IA-NEXT: xor a2, a5, a1 3397; RV32IA-NEXT: and a2, a2, a7 3398; RV32IA-NEXT: xor a2, a5, a2 3399; RV32IA-NEXT: .LBB44_3: # in Loop: Header=BB44_1 Depth=1 3400; RV32IA-NEXT: sc.w.aqrl a2, a2, (a6) 3401; RV32IA-NEXT: bnez a2, .LBB44_1 3402; RV32IA-NEXT: # %bb.4: 3403; RV32IA-NEXT: srl a0, a5, a0 3404; RV32IA-NEXT: ret 3405; 3406; RV64I-LABEL: atomicrmw_min_i8_seq_cst: 3407; RV64I: # %bb.0: 3408; RV64I-NEXT: addi sp, sp, -48 3409; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3410; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3411; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3412; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3413; RV64I-NEXT: mv s0, a0 3414; RV64I-NEXT: lbu a3, 0(a0) 3415; RV64I-NEXT: mv s2, a1 3416; RV64I-NEXT: slli a0, a1, 56 3417; RV64I-NEXT: srai s1, a0, 56 3418; RV64I-NEXT: j .LBB44_2 3419; RV64I-NEXT: .LBB44_1: # %atomicrmw.start 3420; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3421; RV64I-NEXT: sb a3, 15(sp) 3422; RV64I-NEXT: addi a1, sp, 15 3423; RV64I-NEXT: li a3, 5 3424; RV64I-NEXT: li a4, 5 3425; RV64I-NEXT: mv a0, s0 3426; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3427; RV64I-NEXT: lb a3, 15(sp) 3428; RV64I-NEXT: bnez a0, .LBB44_4 3429; RV64I-NEXT: .LBB44_2: # %atomicrmw.start 3430; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3431; RV64I-NEXT: slli a0, a3, 56 3432; RV64I-NEXT: srai a0, a0, 56 3433; RV64I-NEXT: mv a2, a3 3434; RV64I-NEXT: bge s1, a0, .LBB44_1 3435; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3436; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3437; RV64I-NEXT: mv a2, s2 3438; RV64I-NEXT: j .LBB44_1 3439; RV64I-NEXT: .LBB44_4: # %atomicrmw.end 3440; RV64I-NEXT: mv a0, a3 3441; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3442; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3443; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3444; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3445; RV64I-NEXT: addi sp, sp, 48 3446; RV64I-NEXT: ret 3447; 3448; RV64IA-LABEL: atomicrmw_min_i8_seq_cst: 3449; RV64IA: # %bb.0: 3450; RV64IA-NEXT: andi a6, a0, -4 3451; RV64IA-NEXT: slliw a0, a0, 3 3452; RV64IA-NEXT: andi a3, a0, 24 3453; RV64IA-NEXT: li a4, 255 3454; RV64IA-NEXT: sllw a7, a4, a0 3455; RV64IA-NEXT: slli a1, a1, 56 3456; RV64IA-NEXT: srai a1, a1, 56 3457; RV64IA-NEXT: sllw a1, a1, a0 3458; RV64IA-NEXT: li a5, 56 3459; RV64IA-NEXT: sub a3, a5, a3 3460; RV64IA-NEXT: .LBB44_1: # =>This Inner Loop Header: Depth=1 3461; RV64IA-NEXT: lr.w.aqrl a5, (a6) 3462; RV64IA-NEXT: and a4, a5, a7 3463; RV64IA-NEXT: mv a2, a5 3464; RV64IA-NEXT: sll a4, a4, a3 3465; RV64IA-NEXT: sra a4, a4, a3 3466; RV64IA-NEXT: bge a1, a4, .LBB44_3 3467; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB44_1 Depth=1 3468; RV64IA-NEXT: xor a2, a5, a1 3469; RV64IA-NEXT: and a2, a2, a7 3470; RV64IA-NEXT: xor a2, a5, a2 3471; RV64IA-NEXT: .LBB44_3: # in Loop: Header=BB44_1 Depth=1 3472; RV64IA-NEXT: sc.w.aqrl a2, a2, (a6) 3473; RV64IA-NEXT: bnez a2, .LBB44_1 3474; RV64IA-NEXT: # %bb.4: 3475; RV64IA-NEXT: srlw a0, a5, a0 3476; RV64IA-NEXT: ret 3477 %1 = atomicrmw min i8* %a, i8 %b seq_cst 3478 ret i8 %1 3479} 3480 3481define i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind { 3482; RV32I-LABEL: atomicrmw_umax_i8_monotonic: 3483; RV32I: # %bb.0: 3484; RV32I-NEXT: addi sp, sp, -32 3485; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3486; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3487; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3488; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3489; RV32I-NEXT: mv s0, a0 3490; RV32I-NEXT: lbu a3, 0(a0) 3491; RV32I-NEXT: mv s2, a1 3492; RV32I-NEXT: andi s1, a1, 255 3493; RV32I-NEXT: j .LBB45_2 3494; RV32I-NEXT: .LBB45_1: # %atomicrmw.start 3495; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3496; RV32I-NEXT: sb a3, 15(sp) 3497; RV32I-NEXT: addi a1, sp, 15 3498; RV32I-NEXT: mv a0, s0 3499; RV32I-NEXT: li a3, 0 3500; RV32I-NEXT: li a4, 0 3501; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3502; RV32I-NEXT: lb a3, 15(sp) 3503; RV32I-NEXT: bnez a0, .LBB45_4 3504; RV32I-NEXT: .LBB45_2: # %atomicrmw.start 3505; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3506; RV32I-NEXT: andi a0, a3, 255 3507; RV32I-NEXT: mv a2, a3 3508; RV32I-NEXT: bltu s1, a0, .LBB45_1 3509; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3510; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3511; RV32I-NEXT: mv a2, s2 3512; RV32I-NEXT: j .LBB45_1 3513; RV32I-NEXT: .LBB45_4: # %atomicrmw.end 3514; RV32I-NEXT: mv a0, a3 3515; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3516; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3517; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3518; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3519; RV32I-NEXT: addi sp, sp, 32 3520; RV32I-NEXT: ret 3521; 3522; RV32IA-LABEL: atomicrmw_umax_i8_monotonic: 3523; RV32IA: # %bb.0: 3524; RV32IA-NEXT: andi a6, a0, -4 3525; RV32IA-NEXT: slli a0, a0, 3 3526; RV32IA-NEXT: li a3, 255 3527; RV32IA-NEXT: sll a3, a3, a0 3528; RV32IA-NEXT: andi a1, a1, 255 3529; RV32IA-NEXT: sll a1, a1, a0 3530; RV32IA-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 3531; RV32IA-NEXT: lr.w a4, (a6) 3532; RV32IA-NEXT: and a2, a4, a3 3533; RV32IA-NEXT: mv a5, a4 3534; RV32IA-NEXT: bgeu a2, a1, .LBB45_3 3535; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 3536; RV32IA-NEXT: xor a5, a4, a1 3537; RV32IA-NEXT: and a5, a5, a3 3538; RV32IA-NEXT: xor a5, a4, a5 3539; RV32IA-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 3540; RV32IA-NEXT: sc.w a5, a5, (a6) 3541; RV32IA-NEXT: bnez a5, .LBB45_1 3542; RV32IA-NEXT: # %bb.4: 3543; RV32IA-NEXT: srl a0, a4, a0 3544; RV32IA-NEXT: ret 3545; 3546; RV64I-LABEL: atomicrmw_umax_i8_monotonic: 3547; RV64I: # %bb.0: 3548; RV64I-NEXT: addi sp, sp, -48 3549; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3550; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3551; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3552; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3553; RV64I-NEXT: mv s0, a0 3554; RV64I-NEXT: lbu a3, 0(a0) 3555; RV64I-NEXT: mv s2, a1 3556; RV64I-NEXT: andi s1, a1, 255 3557; RV64I-NEXT: j .LBB45_2 3558; RV64I-NEXT: .LBB45_1: # %atomicrmw.start 3559; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3560; RV64I-NEXT: sb a3, 15(sp) 3561; RV64I-NEXT: addi a1, sp, 15 3562; RV64I-NEXT: mv a0, s0 3563; RV64I-NEXT: li a3, 0 3564; RV64I-NEXT: li a4, 0 3565; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3566; RV64I-NEXT: lb a3, 15(sp) 3567; RV64I-NEXT: bnez a0, .LBB45_4 3568; RV64I-NEXT: .LBB45_2: # %atomicrmw.start 3569; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3570; RV64I-NEXT: andi a0, a3, 255 3571; RV64I-NEXT: mv a2, a3 3572; RV64I-NEXT: bltu s1, a0, .LBB45_1 3573; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3574; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3575; RV64I-NEXT: mv a2, s2 3576; RV64I-NEXT: j .LBB45_1 3577; RV64I-NEXT: .LBB45_4: # %atomicrmw.end 3578; RV64I-NEXT: mv a0, a3 3579; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3580; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3581; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3582; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3583; RV64I-NEXT: addi sp, sp, 48 3584; RV64I-NEXT: ret 3585; 3586; RV64IA-LABEL: atomicrmw_umax_i8_monotonic: 3587; RV64IA: # %bb.0: 3588; RV64IA-NEXT: andi a6, a0, -4 3589; RV64IA-NEXT: slliw a0, a0, 3 3590; RV64IA-NEXT: li a3, 255 3591; RV64IA-NEXT: sllw a3, a3, a0 3592; RV64IA-NEXT: andi a1, a1, 255 3593; RV64IA-NEXT: sllw a1, a1, a0 3594; RV64IA-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 3595; RV64IA-NEXT: lr.w a4, (a6) 3596; RV64IA-NEXT: and a2, a4, a3 3597; RV64IA-NEXT: mv a5, a4 3598; RV64IA-NEXT: bgeu a2, a1, .LBB45_3 3599; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 3600; RV64IA-NEXT: xor a5, a4, a1 3601; RV64IA-NEXT: and a5, a5, a3 3602; RV64IA-NEXT: xor a5, a4, a5 3603; RV64IA-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 3604; RV64IA-NEXT: sc.w a5, a5, (a6) 3605; RV64IA-NEXT: bnez a5, .LBB45_1 3606; RV64IA-NEXT: # %bb.4: 3607; RV64IA-NEXT: srlw a0, a4, a0 3608; RV64IA-NEXT: ret 3609 %1 = atomicrmw umax i8* %a, i8 %b monotonic 3610 ret i8 %1 3611} 3612 3613define i8 @atomicrmw_umax_i8_acquire(i8 *%a, i8 %b) nounwind { 3614; RV32I-LABEL: atomicrmw_umax_i8_acquire: 3615; RV32I: # %bb.0: 3616; RV32I-NEXT: addi sp, sp, -32 3617; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3618; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3619; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3620; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3621; RV32I-NEXT: mv s0, a0 3622; RV32I-NEXT: lbu a3, 0(a0) 3623; RV32I-NEXT: mv s2, a1 3624; RV32I-NEXT: andi s1, a1, 255 3625; RV32I-NEXT: j .LBB46_2 3626; RV32I-NEXT: .LBB46_1: # %atomicrmw.start 3627; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3628; RV32I-NEXT: sb a3, 15(sp) 3629; RV32I-NEXT: addi a1, sp, 15 3630; RV32I-NEXT: li a3, 2 3631; RV32I-NEXT: li a4, 2 3632; RV32I-NEXT: mv a0, s0 3633; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3634; RV32I-NEXT: lb a3, 15(sp) 3635; RV32I-NEXT: bnez a0, .LBB46_4 3636; RV32I-NEXT: .LBB46_2: # %atomicrmw.start 3637; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3638; RV32I-NEXT: andi a0, a3, 255 3639; RV32I-NEXT: mv a2, a3 3640; RV32I-NEXT: bltu s1, a0, .LBB46_1 3641; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3642; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3643; RV32I-NEXT: mv a2, s2 3644; RV32I-NEXT: j .LBB46_1 3645; RV32I-NEXT: .LBB46_4: # %atomicrmw.end 3646; RV32I-NEXT: mv a0, a3 3647; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3648; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3649; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3650; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3651; RV32I-NEXT: addi sp, sp, 32 3652; RV32I-NEXT: ret 3653; 3654; RV32IA-LABEL: atomicrmw_umax_i8_acquire: 3655; RV32IA: # %bb.0: 3656; RV32IA-NEXT: andi a6, a0, -4 3657; RV32IA-NEXT: slli a0, a0, 3 3658; RV32IA-NEXT: li a3, 255 3659; RV32IA-NEXT: sll a3, a3, a0 3660; RV32IA-NEXT: andi a1, a1, 255 3661; RV32IA-NEXT: sll a1, a1, a0 3662; RV32IA-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 3663; RV32IA-NEXT: lr.w.aq a4, (a6) 3664; RV32IA-NEXT: and a2, a4, a3 3665; RV32IA-NEXT: mv a5, a4 3666; RV32IA-NEXT: bgeu a2, a1, .LBB46_3 3667; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 3668; RV32IA-NEXT: xor a5, a4, a1 3669; RV32IA-NEXT: and a5, a5, a3 3670; RV32IA-NEXT: xor a5, a4, a5 3671; RV32IA-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 3672; RV32IA-NEXT: sc.w a5, a5, (a6) 3673; RV32IA-NEXT: bnez a5, .LBB46_1 3674; RV32IA-NEXT: # %bb.4: 3675; RV32IA-NEXT: srl a0, a4, a0 3676; RV32IA-NEXT: ret 3677; 3678; RV64I-LABEL: atomicrmw_umax_i8_acquire: 3679; RV64I: # %bb.0: 3680; RV64I-NEXT: addi sp, sp, -48 3681; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3682; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3683; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3684; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3685; RV64I-NEXT: mv s0, a0 3686; RV64I-NEXT: lbu a3, 0(a0) 3687; RV64I-NEXT: mv s2, a1 3688; RV64I-NEXT: andi s1, a1, 255 3689; RV64I-NEXT: j .LBB46_2 3690; RV64I-NEXT: .LBB46_1: # %atomicrmw.start 3691; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3692; RV64I-NEXT: sb a3, 15(sp) 3693; RV64I-NEXT: addi a1, sp, 15 3694; RV64I-NEXT: li a3, 2 3695; RV64I-NEXT: li a4, 2 3696; RV64I-NEXT: mv a0, s0 3697; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3698; RV64I-NEXT: lb a3, 15(sp) 3699; RV64I-NEXT: bnez a0, .LBB46_4 3700; RV64I-NEXT: .LBB46_2: # %atomicrmw.start 3701; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3702; RV64I-NEXT: andi a0, a3, 255 3703; RV64I-NEXT: mv a2, a3 3704; RV64I-NEXT: bltu s1, a0, .LBB46_1 3705; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3706; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3707; RV64I-NEXT: mv a2, s2 3708; RV64I-NEXT: j .LBB46_1 3709; RV64I-NEXT: .LBB46_4: # %atomicrmw.end 3710; RV64I-NEXT: mv a0, a3 3711; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3712; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3713; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3714; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3715; RV64I-NEXT: addi sp, sp, 48 3716; RV64I-NEXT: ret 3717; 3718; RV64IA-LABEL: atomicrmw_umax_i8_acquire: 3719; RV64IA: # %bb.0: 3720; RV64IA-NEXT: andi a6, a0, -4 3721; RV64IA-NEXT: slliw a0, a0, 3 3722; RV64IA-NEXT: li a3, 255 3723; RV64IA-NEXT: sllw a3, a3, a0 3724; RV64IA-NEXT: andi a1, a1, 255 3725; RV64IA-NEXT: sllw a1, a1, a0 3726; RV64IA-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 3727; RV64IA-NEXT: lr.w.aq a4, (a6) 3728; RV64IA-NEXT: and a2, a4, a3 3729; RV64IA-NEXT: mv a5, a4 3730; RV64IA-NEXT: bgeu a2, a1, .LBB46_3 3731; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 3732; RV64IA-NEXT: xor a5, a4, a1 3733; RV64IA-NEXT: and a5, a5, a3 3734; RV64IA-NEXT: xor a5, a4, a5 3735; RV64IA-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 3736; RV64IA-NEXT: sc.w a5, a5, (a6) 3737; RV64IA-NEXT: bnez a5, .LBB46_1 3738; RV64IA-NEXT: # %bb.4: 3739; RV64IA-NEXT: srlw a0, a4, a0 3740; RV64IA-NEXT: ret 3741 %1 = atomicrmw umax i8* %a, i8 %b acquire 3742 ret i8 %1 3743} 3744 3745define i8 @atomicrmw_umax_i8_release(i8 *%a, i8 %b) nounwind { 3746; RV32I-LABEL: atomicrmw_umax_i8_release: 3747; RV32I: # %bb.0: 3748; RV32I-NEXT: addi sp, sp, -32 3749; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3750; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3751; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3752; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3753; RV32I-NEXT: mv s0, a0 3754; RV32I-NEXT: lbu a3, 0(a0) 3755; RV32I-NEXT: mv s2, a1 3756; RV32I-NEXT: andi s1, a1, 255 3757; RV32I-NEXT: j .LBB47_2 3758; RV32I-NEXT: .LBB47_1: # %atomicrmw.start 3759; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1 3760; RV32I-NEXT: sb a3, 15(sp) 3761; RV32I-NEXT: addi a1, sp, 15 3762; RV32I-NEXT: li a3, 3 3763; RV32I-NEXT: mv a0, s0 3764; RV32I-NEXT: li a4, 0 3765; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3766; RV32I-NEXT: lb a3, 15(sp) 3767; RV32I-NEXT: bnez a0, .LBB47_4 3768; RV32I-NEXT: .LBB47_2: # %atomicrmw.start 3769; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3770; RV32I-NEXT: andi a0, a3, 255 3771; RV32I-NEXT: mv a2, a3 3772; RV32I-NEXT: bltu s1, a0, .LBB47_1 3773; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3774; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1 3775; RV32I-NEXT: mv a2, s2 3776; RV32I-NEXT: j .LBB47_1 3777; RV32I-NEXT: .LBB47_4: # %atomicrmw.end 3778; RV32I-NEXT: mv a0, a3 3779; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3780; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3781; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3782; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3783; RV32I-NEXT: addi sp, sp, 32 3784; RV32I-NEXT: ret 3785; 3786; RV32IA-LABEL: atomicrmw_umax_i8_release: 3787; RV32IA: # %bb.0: 3788; RV32IA-NEXT: andi a6, a0, -4 3789; RV32IA-NEXT: slli a0, a0, 3 3790; RV32IA-NEXT: li a3, 255 3791; RV32IA-NEXT: sll a3, a3, a0 3792; RV32IA-NEXT: andi a1, a1, 255 3793; RV32IA-NEXT: sll a1, a1, a0 3794; RV32IA-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 3795; RV32IA-NEXT: lr.w a4, (a6) 3796; RV32IA-NEXT: and a2, a4, a3 3797; RV32IA-NEXT: mv a5, a4 3798; RV32IA-NEXT: bgeu a2, a1, .LBB47_3 3799; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 3800; RV32IA-NEXT: xor a5, a4, a1 3801; RV32IA-NEXT: and a5, a5, a3 3802; RV32IA-NEXT: xor a5, a4, a5 3803; RV32IA-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 3804; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 3805; RV32IA-NEXT: bnez a5, .LBB47_1 3806; RV32IA-NEXT: # %bb.4: 3807; RV32IA-NEXT: srl a0, a4, a0 3808; RV32IA-NEXT: ret 3809; 3810; RV64I-LABEL: atomicrmw_umax_i8_release: 3811; RV64I: # %bb.0: 3812; RV64I-NEXT: addi sp, sp, -48 3813; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3814; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3815; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3816; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3817; RV64I-NEXT: mv s0, a0 3818; RV64I-NEXT: lbu a3, 0(a0) 3819; RV64I-NEXT: mv s2, a1 3820; RV64I-NEXT: andi s1, a1, 255 3821; RV64I-NEXT: j .LBB47_2 3822; RV64I-NEXT: .LBB47_1: # %atomicrmw.start 3823; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1 3824; RV64I-NEXT: sb a3, 15(sp) 3825; RV64I-NEXT: addi a1, sp, 15 3826; RV64I-NEXT: li a3, 3 3827; RV64I-NEXT: mv a0, s0 3828; RV64I-NEXT: li a4, 0 3829; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3830; RV64I-NEXT: lb a3, 15(sp) 3831; RV64I-NEXT: bnez a0, .LBB47_4 3832; RV64I-NEXT: .LBB47_2: # %atomicrmw.start 3833; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3834; RV64I-NEXT: andi a0, a3, 255 3835; RV64I-NEXT: mv a2, a3 3836; RV64I-NEXT: bltu s1, a0, .LBB47_1 3837; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3838; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1 3839; RV64I-NEXT: mv a2, s2 3840; RV64I-NEXT: j .LBB47_1 3841; RV64I-NEXT: .LBB47_4: # %atomicrmw.end 3842; RV64I-NEXT: mv a0, a3 3843; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3844; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3845; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3846; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3847; RV64I-NEXT: addi sp, sp, 48 3848; RV64I-NEXT: ret 3849; 3850; RV64IA-LABEL: atomicrmw_umax_i8_release: 3851; RV64IA: # %bb.0: 3852; RV64IA-NEXT: andi a6, a0, -4 3853; RV64IA-NEXT: slliw a0, a0, 3 3854; RV64IA-NEXT: li a3, 255 3855; RV64IA-NEXT: sllw a3, a3, a0 3856; RV64IA-NEXT: andi a1, a1, 255 3857; RV64IA-NEXT: sllw a1, a1, a0 3858; RV64IA-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 3859; RV64IA-NEXT: lr.w a4, (a6) 3860; RV64IA-NEXT: and a2, a4, a3 3861; RV64IA-NEXT: mv a5, a4 3862; RV64IA-NEXT: bgeu a2, a1, .LBB47_3 3863; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 3864; RV64IA-NEXT: xor a5, a4, a1 3865; RV64IA-NEXT: and a5, a5, a3 3866; RV64IA-NEXT: xor a5, a4, a5 3867; RV64IA-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 3868; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 3869; RV64IA-NEXT: bnez a5, .LBB47_1 3870; RV64IA-NEXT: # %bb.4: 3871; RV64IA-NEXT: srlw a0, a4, a0 3872; RV64IA-NEXT: ret 3873 %1 = atomicrmw umax i8* %a, i8 %b release 3874 ret i8 %1 3875} 3876 3877define i8 @atomicrmw_umax_i8_acq_rel(i8 *%a, i8 %b) nounwind { 3878; RV32I-LABEL: atomicrmw_umax_i8_acq_rel: 3879; RV32I: # %bb.0: 3880; RV32I-NEXT: addi sp, sp, -32 3881; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3882; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3883; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3884; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3885; RV32I-NEXT: mv s0, a0 3886; RV32I-NEXT: lbu a3, 0(a0) 3887; RV32I-NEXT: mv s2, a1 3888; RV32I-NEXT: andi s1, a1, 255 3889; RV32I-NEXT: j .LBB48_2 3890; RV32I-NEXT: .LBB48_1: # %atomicrmw.start 3891; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1 3892; RV32I-NEXT: sb a3, 15(sp) 3893; RV32I-NEXT: addi a1, sp, 15 3894; RV32I-NEXT: li a3, 4 3895; RV32I-NEXT: li a4, 2 3896; RV32I-NEXT: mv a0, s0 3897; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3898; RV32I-NEXT: lb a3, 15(sp) 3899; RV32I-NEXT: bnez a0, .LBB48_4 3900; RV32I-NEXT: .LBB48_2: # %atomicrmw.start 3901; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3902; RV32I-NEXT: andi a0, a3, 255 3903; RV32I-NEXT: mv a2, a3 3904; RV32I-NEXT: bltu s1, a0, .LBB48_1 3905; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3906; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1 3907; RV32I-NEXT: mv a2, s2 3908; RV32I-NEXT: j .LBB48_1 3909; RV32I-NEXT: .LBB48_4: # %atomicrmw.end 3910; RV32I-NEXT: mv a0, a3 3911; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3912; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3913; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3914; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3915; RV32I-NEXT: addi sp, sp, 32 3916; RV32I-NEXT: ret 3917; 3918; RV32IA-LABEL: atomicrmw_umax_i8_acq_rel: 3919; RV32IA: # %bb.0: 3920; RV32IA-NEXT: andi a6, a0, -4 3921; RV32IA-NEXT: slli a0, a0, 3 3922; RV32IA-NEXT: li a3, 255 3923; RV32IA-NEXT: sll a3, a3, a0 3924; RV32IA-NEXT: andi a1, a1, 255 3925; RV32IA-NEXT: sll a1, a1, a0 3926; RV32IA-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 3927; RV32IA-NEXT: lr.w.aq a4, (a6) 3928; RV32IA-NEXT: and a2, a4, a3 3929; RV32IA-NEXT: mv a5, a4 3930; RV32IA-NEXT: bgeu a2, a1, .LBB48_3 3931; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 3932; RV32IA-NEXT: xor a5, a4, a1 3933; RV32IA-NEXT: and a5, a5, a3 3934; RV32IA-NEXT: xor a5, a4, a5 3935; RV32IA-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 3936; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 3937; RV32IA-NEXT: bnez a5, .LBB48_1 3938; RV32IA-NEXT: # %bb.4: 3939; RV32IA-NEXT: srl a0, a4, a0 3940; RV32IA-NEXT: ret 3941; 3942; RV64I-LABEL: atomicrmw_umax_i8_acq_rel: 3943; RV64I: # %bb.0: 3944; RV64I-NEXT: addi sp, sp, -48 3945; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3946; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3947; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3948; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3949; RV64I-NEXT: mv s0, a0 3950; RV64I-NEXT: lbu a3, 0(a0) 3951; RV64I-NEXT: mv s2, a1 3952; RV64I-NEXT: andi s1, a1, 255 3953; RV64I-NEXT: j .LBB48_2 3954; RV64I-NEXT: .LBB48_1: # %atomicrmw.start 3955; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1 3956; RV64I-NEXT: sb a3, 15(sp) 3957; RV64I-NEXT: addi a1, sp, 15 3958; RV64I-NEXT: li a3, 4 3959; RV64I-NEXT: li a4, 2 3960; RV64I-NEXT: mv a0, s0 3961; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3962; RV64I-NEXT: lb a3, 15(sp) 3963; RV64I-NEXT: bnez a0, .LBB48_4 3964; RV64I-NEXT: .LBB48_2: # %atomicrmw.start 3965; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3966; RV64I-NEXT: andi a0, a3, 255 3967; RV64I-NEXT: mv a2, a3 3968; RV64I-NEXT: bltu s1, a0, .LBB48_1 3969; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3970; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1 3971; RV64I-NEXT: mv a2, s2 3972; RV64I-NEXT: j .LBB48_1 3973; RV64I-NEXT: .LBB48_4: # %atomicrmw.end 3974; RV64I-NEXT: mv a0, a3 3975; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3976; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3977; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3978; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3979; RV64I-NEXT: addi sp, sp, 48 3980; RV64I-NEXT: ret 3981; 3982; RV64IA-LABEL: atomicrmw_umax_i8_acq_rel: 3983; RV64IA: # %bb.0: 3984; RV64IA-NEXT: andi a6, a0, -4 3985; RV64IA-NEXT: slliw a0, a0, 3 3986; RV64IA-NEXT: li a3, 255 3987; RV64IA-NEXT: sllw a3, a3, a0 3988; RV64IA-NEXT: andi a1, a1, 255 3989; RV64IA-NEXT: sllw a1, a1, a0 3990; RV64IA-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 3991; RV64IA-NEXT: lr.w.aq a4, (a6) 3992; RV64IA-NEXT: and a2, a4, a3 3993; RV64IA-NEXT: mv a5, a4 3994; RV64IA-NEXT: bgeu a2, a1, .LBB48_3 3995; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 3996; RV64IA-NEXT: xor a5, a4, a1 3997; RV64IA-NEXT: and a5, a5, a3 3998; RV64IA-NEXT: xor a5, a4, a5 3999; RV64IA-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 4000; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 4001; RV64IA-NEXT: bnez a5, .LBB48_1 4002; RV64IA-NEXT: # %bb.4: 4003; RV64IA-NEXT: srlw a0, a4, a0 4004; RV64IA-NEXT: ret 4005 %1 = atomicrmw umax i8* %a, i8 %b acq_rel 4006 ret i8 %1 4007} 4008 4009define i8 @atomicrmw_umax_i8_seq_cst(i8 *%a, i8 %b) nounwind { 4010; RV32I-LABEL: atomicrmw_umax_i8_seq_cst: 4011; RV32I: # %bb.0: 4012; RV32I-NEXT: addi sp, sp, -32 4013; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4014; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4015; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4016; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4017; RV32I-NEXT: mv s0, a0 4018; RV32I-NEXT: lbu a3, 0(a0) 4019; RV32I-NEXT: mv s2, a1 4020; RV32I-NEXT: andi s1, a1, 255 4021; RV32I-NEXT: j .LBB49_2 4022; RV32I-NEXT: .LBB49_1: # %atomicrmw.start 4023; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1 4024; RV32I-NEXT: sb a3, 15(sp) 4025; RV32I-NEXT: addi a1, sp, 15 4026; RV32I-NEXT: li a3, 5 4027; RV32I-NEXT: li a4, 5 4028; RV32I-NEXT: mv a0, s0 4029; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4030; RV32I-NEXT: lb a3, 15(sp) 4031; RV32I-NEXT: bnez a0, .LBB49_4 4032; RV32I-NEXT: .LBB49_2: # %atomicrmw.start 4033; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4034; RV32I-NEXT: andi a0, a3, 255 4035; RV32I-NEXT: mv a2, a3 4036; RV32I-NEXT: bltu s1, a0, .LBB49_1 4037; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4038; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1 4039; RV32I-NEXT: mv a2, s2 4040; RV32I-NEXT: j .LBB49_1 4041; RV32I-NEXT: .LBB49_4: # %atomicrmw.end 4042; RV32I-NEXT: mv a0, a3 4043; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4044; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4045; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4046; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4047; RV32I-NEXT: addi sp, sp, 32 4048; RV32I-NEXT: ret 4049; 4050; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst: 4051; RV32IA: # %bb.0: 4052; RV32IA-NEXT: andi a6, a0, -4 4053; RV32IA-NEXT: slli a0, a0, 3 4054; RV32IA-NEXT: li a3, 255 4055; RV32IA-NEXT: sll a3, a3, a0 4056; RV32IA-NEXT: andi a1, a1, 255 4057; RV32IA-NEXT: sll a1, a1, a0 4058; RV32IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 4059; RV32IA-NEXT: lr.w.aqrl a4, (a6) 4060; RV32IA-NEXT: and a2, a4, a3 4061; RV32IA-NEXT: mv a5, a4 4062; RV32IA-NEXT: bgeu a2, a1, .LBB49_3 4063; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 4064; RV32IA-NEXT: xor a5, a4, a1 4065; RV32IA-NEXT: and a5, a5, a3 4066; RV32IA-NEXT: xor a5, a4, a5 4067; RV32IA-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 4068; RV32IA-NEXT: sc.w.aqrl a5, a5, (a6) 4069; RV32IA-NEXT: bnez a5, .LBB49_1 4070; RV32IA-NEXT: # %bb.4: 4071; RV32IA-NEXT: srl a0, a4, a0 4072; RV32IA-NEXT: ret 4073; 4074; RV64I-LABEL: atomicrmw_umax_i8_seq_cst: 4075; RV64I: # %bb.0: 4076; RV64I-NEXT: addi sp, sp, -48 4077; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4078; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4079; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4080; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4081; RV64I-NEXT: mv s0, a0 4082; RV64I-NEXT: lbu a3, 0(a0) 4083; RV64I-NEXT: mv s2, a1 4084; RV64I-NEXT: andi s1, a1, 255 4085; RV64I-NEXT: j .LBB49_2 4086; RV64I-NEXT: .LBB49_1: # %atomicrmw.start 4087; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1 4088; RV64I-NEXT: sb a3, 15(sp) 4089; RV64I-NEXT: addi a1, sp, 15 4090; RV64I-NEXT: li a3, 5 4091; RV64I-NEXT: li a4, 5 4092; RV64I-NEXT: mv a0, s0 4093; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4094; RV64I-NEXT: lb a3, 15(sp) 4095; RV64I-NEXT: bnez a0, .LBB49_4 4096; RV64I-NEXT: .LBB49_2: # %atomicrmw.start 4097; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4098; RV64I-NEXT: andi a0, a3, 255 4099; RV64I-NEXT: mv a2, a3 4100; RV64I-NEXT: bltu s1, a0, .LBB49_1 4101; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4102; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1 4103; RV64I-NEXT: mv a2, s2 4104; RV64I-NEXT: j .LBB49_1 4105; RV64I-NEXT: .LBB49_4: # %atomicrmw.end 4106; RV64I-NEXT: mv a0, a3 4107; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4108; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4109; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4110; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4111; RV64I-NEXT: addi sp, sp, 48 4112; RV64I-NEXT: ret 4113; 4114; RV64IA-LABEL: atomicrmw_umax_i8_seq_cst: 4115; RV64IA: # %bb.0: 4116; RV64IA-NEXT: andi a6, a0, -4 4117; RV64IA-NEXT: slliw a0, a0, 3 4118; RV64IA-NEXT: li a3, 255 4119; RV64IA-NEXT: sllw a3, a3, a0 4120; RV64IA-NEXT: andi a1, a1, 255 4121; RV64IA-NEXT: sllw a1, a1, a0 4122; RV64IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 4123; RV64IA-NEXT: lr.w.aqrl a4, (a6) 4124; RV64IA-NEXT: and a2, a4, a3 4125; RV64IA-NEXT: mv a5, a4 4126; RV64IA-NEXT: bgeu a2, a1, .LBB49_3 4127; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 4128; RV64IA-NEXT: xor a5, a4, a1 4129; RV64IA-NEXT: and a5, a5, a3 4130; RV64IA-NEXT: xor a5, a4, a5 4131; RV64IA-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 4132; RV64IA-NEXT: sc.w.aqrl a5, a5, (a6) 4133; RV64IA-NEXT: bnez a5, .LBB49_1 4134; RV64IA-NEXT: # %bb.4: 4135; RV64IA-NEXT: srlw a0, a4, a0 4136; RV64IA-NEXT: ret 4137 %1 = atomicrmw umax i8* %a, i8 %b seq_cst 4138 ret i8 %1 4139} 4140 4141define i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind { 4142; RV32I-LABEL: atomicrmw_umin_i8_monotonic: 4143; RV32I: # %bb.0: 4144; RV32I-NEXT: addi sp, sp, -32 4145; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4146; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4147; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4148; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4149; RV32I-NEXT: mv s0, a0 4150; RV32I-NEXT: lbu a3, 0(a0) 4151; RV32I-NEXT: mv s2, a1 4152; RV32I-NEXT: andi s1, a1, 255 4153; RV32I-NEXT: j .LBB50_2 4154; RV32I-NEXT: .LBB50_1: # %atomicrmw.start 4155; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1 4156; RV32I-NEXT: sb a3, 15(sp) 4157; RV32I-NEXT: addi a1, sp, 15 4158; RV32I-NEXT: mv a0, s0 4159; RV32I-NEXT: li a3, 0 4160; RV32I-NEXT: li a4, 0 4161; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4162; RV32I-NEXT: lb a3, 15(sp) 4163; RV32I-NEXT: bnez a0, .LBB50_4 4164; RV32I-NEXT: .LBB50_2: # %atomicrmw.start 4165; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4166; RV32I-NEXT: andi a0, a3, 255 4167; RV32I-NEXT: mv a2, a3 4168; RV32I-NEXT: bgeu s1, a0, .LBB50_1 4169; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4170; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1 4171; RV32I-NEXT: mv a2, s2 4172; RV32I-NEXT: j .LBB50_1 4173; RV32I-NEXT: .LBB50_4: # %atomicrmw.end 4174; RV32I-NEXT: mv a0, a3 4175; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4176; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4177; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4178; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4179; RV32I-NEXT: addi sp, sp, 32 4180; RV32I-NEXT: ret 4181; 4182; RV32IA-LABEL: atomicrmw_umin_i8_monotonic: 4183; RV32IA: # %bb.0: 4184; RV32IA-NEXT: andi a6, a0, -4 4185; RV32IA-NEXT: slli a0, a0, 3 4186; RV32IA-NEXT: li a3, 255 4187; RV32IA-NEXT: sll a3, a3, a0 4188; RV32IA-NEXT: andi a1, a1, 255 4189; RV32IA-NEXT: sll a1, a1, a0 4190; RV32IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 4191; RV32IA-NEXT: lr.w a4, (a6) 4192; RV32IA-NEXT: and a2, a4, a3 4193; RV32IA-NEXT: mv a5, a4 4194; RV32IA-NEXT: bgeu a1, a2, .LBB50_3 4195; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 4196; RV32IA-NEXT: xor a5, a4, a1 4197; RV32IA-NEXT: and a5, a5, a3 4198; RV32IA-NEXT: xor a5, a4, a5 4199; RV32IA-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 4200; RV32IA-NEXT: sc.w a5, a5, (a6) 4201; RV32IA-NEXT: bnez a5, .LBB50_1 4202; RV32IA-NEXT: # %bb.4: 4203; RV32IA-NEXT: srl a0, a4, a0 4204; RV32IA-NEXT: ret 4205; 4206; RV64I-LABEL: atomicrmw_umin_i8_monotonic: 4207; RV64I: # %bb.0: 4208; RV64I-NEXT: addi sp, sp, -48 4209; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4210; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4211; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4212; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4213; RV64I-NEXT: mv s0, a0 4214; RV64I-NEXT: lbu a3, 0(a0) 4215; RV64I-NEXT: mv s2, a1 4216; RV64I-NEXT: andi s1, a1, 255 4217; RV64I-NEXT: j .LBB50_2 4218; RV64I-NEXT: .LBB50_1: # %atomicrmw.start 4219; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1 4220; RV64I-NEXT: sb a3, 15(sp) 4221; RV64I-NEXT: addi a1, sp, 15 4222; RV64I-NEXT: mv a0, s0 4223; RV64I-NEXT: li a3, 0 4224; RV64I-NEXT: li a4, 0 4225; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4226; RV64I-NEXT: lb a3, 15(sp) 4227; RV64I-NEXT: bnez a0, .LBB50_4 4228; RV64I-NEXT: .LBB50_2: # %atomicrmw.start 4229; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4230; RV64I-NEXT: andi a0, a3, 255 4231; RV64I-NEXT: mv a2, a3 4232; RV64I-NEXT: bgeu s1, a0, .LBB50_1 4233; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4234; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1 4235; RV64I-NEXT: mv a2, s2 4236; RV64I-NEXT: j .LBB50_1 4237; RV64I-NEXT: .LBB50_4: # %atomicrmw.end 4238; RV64I-NEXT: mv a0, a3 4239; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4240; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4241; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4242; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4243; RV64I-NEXT: addi sp, sp, 48 4244; RV64I-NEXT: ret 4245; 4246; RV64IA-LABEL: atomicrmw_umin_i8_monotonic: 4247; RV64IA: # %bb.0: 4248; RV64IA-NEXT: andi a6, a0, -4 4249; RV64IA-NEXT: slliw a0, a0, 3 4250; RV64IA-NEXT: li a3, 255 4251; RV64IA-NEXT: sllw a3, a3, a0 4252; RV64IA-NEXT: andi a1, a1, 255 4253; RV64IA-NEXT: sllw a1, a1, a0 4254; RV64IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 4255; RV64IA-NEXT: lr.w a4, (a6) 4256; RV64IA-NEXT: and a2, a4, a3 4257; RV64IA-NEXT: mv a5, a4 4258; RV64IA-NEXT: bgeu a1, a2, .LBB50_3 4259; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 4260; RV64IA-NEXT: xor a5, a4, a1 4261; RV64IA-NEXT: and a5, a5, a3 4262; RV64IA-NEXT: xor a5, a4, a5 4263; RV64IA-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 4264; RV64IA-NEXT: sc.w a5, a5, (a6) 4265; RV64IA-NEXT: bnez a5, .LBB50_1 4266; RV64IA-NEXT: # %bb.4: 4267; RV64IA-NEXT: srlw a0, a4, a0 4268; RV64IA-NEXT: ret 4269 %1 = atomicrmw umin i8* %a, i8 %b monotonic 4270 ret i8 %1 4271} 4272 4273define i8 @atomicrmw_umin_i8_acquire(i8 *%a, i8 %b) nounwind { 4274; RV32I-LABEL: atomicrmw_umin_i8_acquire: 4275; RV32I: # %bb.0: 4276; RV32I-NEXT: addi sp, sp, -32 4277; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4278; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4279; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4280; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4281; RV32I-NEXT: mv s0, a0 4282; RV32I-NEXT: lbu a3, 0(a0) 4283; RV32I-NEXT: mv s2, a1 4284; RV32I-NEXT: andi s1, a1, 255 4285; RV32I-NEXT: j .LBB51_2 4286; RV32I-NEXT: .LBB51_1: # %atomicrmw.start 4287; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1 4288; RV32I-NEXT: sb a3, 15(sp) 4289; RV32I-NEXT: addi a1, sp, 15 4290; RV32I-NEXT: li a3, 2 4291; RV32I-NEXT: li a4, 2 4292; RV32I-NEXT: mv a0, s0 4293; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4294; RV32I-NEXT: lb a3, 15(sp) 4295; RV32I-NEXT: bnez a0, .LBB51_4 4296; RV32I-NEXT: .LBB51_2: # %atomicrmw.start 4297; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4298; RV32I-NEXT: andi a0, a3, 255 4299; RV32I-NEXT: mv a2, a3 4300; RV32I-NEXT: bgeu s1, a0, .LBB51_1 4301; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4302; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1 4303; RV32I-NEXT: mv a2, s2 4304; RV32I-NEXT: j .LBB51_1 4305; RV32I-NEXT: .LBB51_4: # %atomicrmw.end 4306; RV32I-NEXT: mv a0, a3 4307; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4308; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4309; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4310; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4311; RV32I-NEXT: addi sp, sp, 32 4312; RV32I-NEXT: ret 4313; 4314; RV32IA-LABEL: atomicrmw_umin_i8_acquire: 4315; RV32IA: # %bb.0: 4316; RV32IA-NEXT: andi a6, a0, -4 4317; RV32IA-NEXT: slli a0, a0, 3 4318; RV32IA-NEXT: li a3, 255 4319; RV32IA-NEXT: sll a3, a3, a0 4320; RV32IA-NEXT: andi a1, a1, 255 4321; RV32IA-NEXT: sll a1, a1, a0 4322; RV32IA-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 4323; RV32IA-NEXT: lr.w.aq a4, (a6) 4324; RV32IA-NEXT: and a2, a4, a3 4325; RV32IA-NEXT: mv a5, a4 4326; RV32IA-NEXT: bgeu a1, a2, .LBB51_3 4327; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 4328; RV32IA-NEXT: xor a5, a4, a1 4329; RV32IA-NEXT: and a5, a5, a3 4330; RV32IA-NEXT: xor a5, a4, a5 4331; RV32IA-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 4332; RV32IA-NEXT: sc.w a5, a5, (a6) 4333; RV32IA-NEXT: bnez a5, .LBB51_1 4334; RV32IA-NEXT: # %bb.4: 4335; RV32IA-NEXT: srl a0, a4, a0 4336; RV32IA-NEXT: ret 4337; 4338; RV64I-LABEL: atomicrmw_umin_i8_acquire: 4339; RV64I: # %bb.0: 4340; RV64I-NEXT: addi sp, sp, -48 4341; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4342; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4343; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4344; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4345; RV64I-NEXT: mv s0, a0 4346; RV64I-NEXT: lbu a3, 0(a0) 4347; RV64I-NEXT: mv s2, a1 4348; RV64I-NEXT: andi s1, a1, 255 4349; RV64I-NEXT: j .LBB51_2 4350; RV64I-NEXT: .LBB51_1: # %atomicrmw.start 4351; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1 4352; RV64I-NEXT: sb a3, 15(sp) 4353; RV64I-NEXT: addi a1, sp, 15 4354; RV64I-NEXT: li a3, 2 4355; RV64I-NEXT: li a4, 2 4356; RV64I-NEXT: mv a0, s0 4357; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4358; RV64I-NEXT: lb a3, 15(sp) 4359; RV64I-NEXT: bnez a0, .LBB51_4 4360; RV64I-NEXT: .LBB51_2: # %atomicrmw.start 4361; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4362; RV64I-NEXT: andi a0, a3, 255 4363; RV64I-NEXT: mv a2, a3 4364; RV64I-NEXT: bgeu s1, a0, .LBB51_1 4365; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4366; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1 4367; RV64I-NEXT: mv a2, s2 4368; RV64I-NEXT: j .LBB51_1 4369; RV64I-NEXT: .LBB51_4: # %atomicrmw.end 4370; RV64I-NEXT: mv a0, a3 4371; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4372; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4373; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4374; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4375; RV64I-NEXT: addi sp, sp, 48 4376; RV64I-NEXT: ret 4377; 4378; RV64IA-LABEL: atomicrmw_umin_i8_acquire: 4379; RV64IA: # %bb.0: 4380; RV64IA-NEXT: andi a6, a0, -4 4381; RV64IA-NEXT: slliw a0, a0, 3 4382; RV64IA-NEXT: li a3, 255 4383; RV64IA-NEXT: sllw a3, a3, a0 4384; RV64IA-NEXT: andi a1, a1, 255 4385; RV64IA-NEXT: sllw a1, a1, a0 4386; RV64IA-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 4387; RV64IA-NEXT: lr.w.aq a4, (a6) 4388; RV64IA-NEXT: and a2, a4, a3 4389; RV64IA-NEXT: mv a5, a4 4390; RV64IA-NEXT: bgeu a1, a2, .LBB51_3 4391; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 4392; RV64IA-NEXT: xor a5, a4, a1 4393; RV64IA-NEXT: and a5, a5, a3 4394; RV64IA-NEXT: xor a5, a4, a5 4395; RV64IA-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 4396; RV64IA-NEXT: sc.w a5, a5, (a6) 4397; RV64IA-NEXT: bnez a5, .LBB51_1 4398; RV64IA-NEXT: # %bb.4: 4399; RV64IA-NEXT: srlw a0, a4, a0 4400; RV64IA-NEXT: ret 4401 %1 = atomicrmw umin i8* %a, i8 %b acquire 4402 ret i8 %1 4403} 4404 4405define i8 @atomicrmw_umin_i8_release(i8 *%a, i8 %b) nounwind { 4406; RV32I-LABEL: atomicrmw_umin_i8_release: 4407; RV32I: # %bb.0: 4408; RV32I-NEXT: addi sp, sp, -32 4409; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4410; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4411; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4412; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4413; RV32I-NEXT: mv s0, a0 4414; RV32I-NEXT: lbu a3, 0(a0) 4415; RV32I-NEXT: mv s2, a1 4416; RV32I-NEXT: andi s1, a1, 255 4417; RV32I-NEXT: j .LBB52_2 4418; RV32I-NEXT: .LBB52_1: # %atomicrmw.start 4419; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1 4420; RV32I-NEXT: sb a3, 15(sp) 4421; RV32I-NEXT: addi a1, sp, 15 4422; RV32I-NEXT: li a3, 3 4423; RV32I-NEXT: mv a0, s0 4424; RV32I-NEXT: li a4, 0 4425; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4426; RV32I-NEXT: lb a3, 15(sp) 4427; RV32I-NEXT: bnez a0, .LBB52_4 4428; RV32I-NEXT: .LBB52_2: # %atomicrmw.start 4429; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4430; RV32I-NEXT: andi a0, a3, 255 4431; RV32I-NEXT: mv a2, a3 4432; RV32I-NEXT: bgeu s1, a0, .LBB52_1 4433; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4434; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1 4435; RV32I-NEXT: mv a2, s2 4436; RV32I-NEXT: j .LBB52_1 4437; RV32I-NEXT: .LBB52_4: # %atomicrmw.end 4438; RV32I-NEXT: mv a0, a3 4439; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4440; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4441; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4442; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4443; RV32I-NEXT: addi sp, sp, 32 4444; RV32I-NEXT: ret 4445; 4446; RV32IA-LABEL: atomicrmw_umin_i8_release: 4447; RV32IA: # %bb.0: 4448; RV32IA-NEXT: andi a6, a0, -4 4449; RV32IA-NEXT: slli a0, a0, 3 4450; RV32IA-NEXT: li a3, 255 4451; RV32IA-NEXT: sll a3, a3, a0 4452; RV32IA-NEXT: andi a1, a1, 255 4453; RV32IA-NEXT: sll a1, a1, a0 4454; RV32IA-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 4455; RV32IA-NEXT: lr.w a4, (a6) 4456; RV32IA-NEXT: and a2, a4, a3 4457; RV32IA-NEXT: mv a5, a4 4458; RV32IA-NEXT: bgeu a1, a2, .LBB52_3 4459; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 4460; RV32IA-NEXT: xor a5, a4, a1 4461; RV32IA-NEXT: and a5, a5, a3 4462; RV32IA-NEXT: xor a5, a4, a5 4463; RV32IA-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 4464; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 4465; RV32IA-NEXT: bnez a5, .LBB52_1 4466; RV32IA-NEXT: # %bb.4: 4467; RV32IA-NEXT: srl a0, a4, a0 4468; RV32IA-NEXT: ret 4469; 4470; RV64I-LABEL: atomicrmw_umin_i8_release: 4471; RV64I: # %bb.0: 4472; RV64I-NEXT: addi sp, sp, -48 4473; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4474; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4475; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4476; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4477; RV64I-NEXT: mv s0, a0 4478; RV64I-NEXT: lbu a3, 0(a0) 4479; RV64I-NEXT: mv s2, a1 4480; RV64I-NEXT: andi s1, a1, 255 4481; RV64I-NEXT: j .LBB52_2 4482; RV64I-NEXT: .LBB52_1: # %atomicrmw.start 4483; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1 4484; RV64I-NEXT: sb a3, 15(sp) 4485; RV64I-NEXT: addi a1, sp, 15 4486; RV64I-NEXT: li a3, 3 4487; RV64I-NEXT: mv a0, s0 4488; RV64I-NEXT: li a4, 0 4489; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4490; RV64I-NEXT: lb a3, 15(sp) 4491; RV64I-NEXT: bnez a0, .LBB52_4 4492; RV64I-NEXT: .LBB52_2: # %atomicrmw.start 4493; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4494; RV64I-NEXT: andi a0, a3, 255 4495; RV64I-NEXT: mv a2, a3 4496; RV64I-NEXT: bgeu s1, a0, .LBB52_1 4497; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4498; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1 4499; RV64I-NEXT: mv a2, s2 4500; RV64I-NEXT: j .LBB52_1 4501; RV64I-NEXT: .LBB52_4: # %atomicrmw.end 4502; RV64I-NEXT: mv a0, a3 4503; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4504; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4505; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4506; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4507; RV64I-NEXT: addi sp, sp, 48 4508; RV64I-NEXT: ret 4509; 4510; RV64IA-LABEL: atomicrmw_umin_i8_release: 4511; RV64IA: # %bb.0: 4512; RV64IA-NEXT: andi a6, a0, -4 4513; RV64IA-NEXT: slliw a0, a0, 3 4514; RV64IA-NEXT: li a3, 255 4515; RV64IA-NEXT: sllw a3, a3, a0 4516; RV64IA-NEXT: andi a1, a1, 255 4517; RV64IA-NEXT: sllw a1, a1, a0 4518; RV64IA-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 4519; RV64IA-NEXT: lr.w a4, (a6) 4520; RV64IA-NEXT: and a2, a4, a3 4521; RV64IA-NEXT: mv a5, a4 4522; RV64IA-NEXT: bgeu a1, a2, .LBB52_3 4523; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 4524; RV64IA-NEXT: xor a5, a4, a1 4525; RV64IA-NEXT: and a5, a5, a3 4526; RV64IA-NEXT: xor a5, a4, a5 4527; RV64IA-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 4528; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 4529; RV64IA-NEXT: bnez a5, .LBB52_1 4530; RV64IA-NEXT: # %bb.4: 4531; RV64IA-NEXT: srlw a0, a4, a0 4532; RV64IA-NEXT: ret 4533 %1 = atomicrmw umin i8* %a, i8 %b release 4534 ret i8 %1 4535} 4536 4537define i8 @atomicrmw_umin_i8_acq_rel(i8 *%a, i8 %b) nounwind { 4538; RV32I-LABEL: atomicrmw_umin_i8_acq_rel: 4539; RV32I: # %bb.0: 4540; RV32I-NEXT: addi sp, sp, -32 4541; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4542; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4543; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4544; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4545; RV32I-NEXT: mv s0, a0 4546; RV32I-NEXT: lbu a3, 0(a0) 4547; RV32I-NEXT: mv s2, a1 4548; RV32I-NEXT: andi s1, a1, 255 4549; RV32I-NEXT: j .LBB53_2 4550; RV32I-NEXT: .LBB53_1: # %atomicrmw.start 4551; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1 4552; RV32I-NEXT: sb a3, 15(sp) 4553; RV32I-NEXT: addi a1, sp, 15 4554; RV32I-NEXT: li a3, 4 4555; RV32I-NEXT: li a4, 2 4556; RV32I-NEXT: mv a0, s0 4557; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4558; RV32I-NEXT: lb a3, 15(sp) 4559; RV32I-NEXT: bnez a0, .LBB53_4 4560; RV32I-NEXT: .LBB53_2: # %atomicrmw.start 4561; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4562; RV32I-NEXT: andi a0, a3, 255 4563; RV32I-NEXT: mv a2, a3 4564; RV32I-NEXT: bgeu s1, a0, .LBB53_1 4565; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4566; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1 4567; RV32I-NEXT: mv a2, s2 4568; RV32I-NEXT: j .LBB53_1 4569; RV32I-NEXT: .LBB53_4: # %atomicrmw.end 4570; RV32I-NEXT: mv a0, a3 4571; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4572; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4573; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4574; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4575; RV32I-NEXT: addi sp, sp, 32 4576; RV32I-NEXT: ret 4577; 4578; RV32IA-LABEL: atomicrmw_umin_i8_acq_rel: 4579; RV32IA: # %bb.0: 4580; RV32IA-NEXT: andi a6, a0, -4 4581; RV32IA-NEXT: slli a0, a0, 3 4582; RV32IA-NEXT: li a3, 255 4583; RV32IA-NEXT: sll a3, a3, a0 4584; RV32IA-NEXT: andi a1, a1, 255 4585; RV32IA-NEXT: sll a1, a1, a0 4586; RV32IA-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 4587; RV32IA-NEXT: lr.w.aq a4, (a6) 4588; RV32IA-NEXT: and a2, a4, a3 4589; RV32IA-NEXT: mv a5, a4 4590; RV32IA-NEXT: bgeu a1, a2, .LBB53_3 4591; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 4592; RV32IA-NEXT: xor a5, a4, a1 4593; RV32IA-NEXT: and a5, a5, a3 4594; RV32IA-NEXT: xor a5, a4, a5 4595; RV32IA-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 4596; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 4597; RV32IA-NEXT: bnez a5, .LBB53_1 4598; RV32IA-NEXT: # %bb.4: 4599; RV32IA-NEXT: srl a0, a4, a0 4600; RV32IA-NEXT: ret 4601; 4602; RV64I-LABEL: atomicrmw_umin_i8_acq_rel: 4603; RV64I: # %bb.0: 4604; RV64I-NEXT: addi sp, sp, -48 4605; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4606; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4607; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4608; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4609; RV64I-NEXT: mv s0, a0 4610; RV64I-NEXT: lbu a3, 0(a0) 4611; RV64I-NEXT: mv s2, a1 4612; RV64I-NEXT: andi s1, a1, 255 4613; RV64I-NEXT: j .LBB53_2 4614; RV64I-NEXT: .LBB53_1: # %atomicrmw.start 4615; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1 4616; RV64I-NEXT: sb a3, 15(sp) 4617; RV64I-NEXT: addi a1, sp, 15 4618; RV64I-NEXT: li a3, 4 4619; RV64I-NEXT: li a4, 2 4620; RV64I-NEXT: mv a0, s0 4621; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4622; RV64I-NEXT: lb a3, 15(sp) 4623; RV64I-NEXT: bnez a0, .LBB53_4 4624; RV64I-NEXT: .LBB53_2: # %atomicrmw.start 4625; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4626; RV64I-NEXT: andi a0, a3, 255 4627; RV64I-NEXT: mv a2, a3 4628; RV64I-NEXT: bgeu s1, a0, .LBB53_1 4629; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4630; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1 4631; RV64I-NEXT: mv a2, s2 4632; RV64I-NEXT: j .LBB53_1 4633; RV64I-NEXT: .LBB53_4: # %atomicrmw.end 4634; RV64I-NEXT: mv a0, a3 4635; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4636; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4637; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4638; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4639; RV64I-NEXT: addi sp, sp, 48 4640; RV64I-NEXT: ret 4641; 4642; RV64IA-LABEL: atomicrmw_umin_i8_acq_rel: 4643; RV64IA: # %bb.0: 4644; RV64IA-NEXT: andi a6, a0, -4 4645; RV64IA-NEXT: slliw a0, a0, 3 4646; RV64IA-NEXT: li a3, 255 4647; RV64IA-NEXT: sllw a3, a3, a0 4648; RV64IA-NEXT: andi a1, a1, 255 4649; RV64IA-NEXT: sllw a1, a1, a0 4650; RV64IA-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 4651; RV64IA-NEXT: lr.w.aq a4, (a6) 4652; RV64IA-NEXT: and a2, a4, a3 4653; RV64IA-NEXT: mv a5, a4 4654; RV64IA-NEXT: bgeu a1, a2, .LBB53_3 4655; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 4656; RV64IA-NEXT: xor a5, a4, a1 4657; RV64IA-NEXT: and a5, a5, a3 4658; RV64IA-NEXT: xor a5, a4, a5 4659; RV64IA-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 4660; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 4661; RV64IA-NEXT: bnez a5, .LBB53_1 4662; RV64IA-NEXT: # %bb.4: 4663; RV64IA-NEXT: srlw a0, a4, a0 4664; RV64IA-NEXT: ret 4665 %1 = atomicrmw umin i8* %a, i8 %b acq_rel 4666 ret i8 %1 4667} 4668 4669define i8 @atomicrmw_umin_i8_seq_cst(i8 *%a, i8 %b) nounwind { 4670; RV32I-LABEL: atomicrmw_umin_i8_seq_cst: 4671; RV32I: # %bb.0: 4672; RV32I-NEXT: addi sp, sp, -32 4673; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4674; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4675; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4676; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4677; RV32I-NEXT: mv s0, a0 4678; RV32I-NEXT: lbu a3, 0(a0) 4679; RV32I-NEXT: mv s2, a1 4680; RV32I-NEXT: andi s1, a1, 255 4681; RV32I-NEXT: j .LBB54_2 4682; RV32I-NEXT: .LBB54_1: # %atomicrmw.start 4683; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1 4684; RV32I-NEXT: sb a3, 15(sp) 4685; RV32I-NEXT: addi a1, sp, 15 4686; RV32I-NEXT: li a3, 5 4687; RV32I-NEXT: li a4, 5 4688; RV32I-NEXT: mv a0, s0 4689; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4690; RV32I-NEXT: lb a3, 15(sp) 4691; RV32I-NEXT: bnez a0, .LBB54_4 4692; RV32I-NEXT: .LBB54_2: # %atomicrmw.start 4693; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4694; RV32I-NEXT: andi a0, a3, 255 4695; RV32I-NEXT: mv a2, a3 4696; RV32I-NEXT: bgeu s1, a0, .LBB54_1 4697; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4698; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1 4699; RV32I-NEXT: mv a2, s2 4700; RV32I-NEXT: j .LBB54_1 4701; RV32I-NEXT: .LBB54_4: # %atomicrmw.end 4702; RV32I-NEXT: mv a0, a3 4703; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4704; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4705; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4706; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4707; RV32I-NEXT: addi sp, sp, 32 4708; RV32I-NEXT: ret 4709; 4710; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst: 4711; RV32IA: # %bb.0: 4712; RV32IA-NEXT: andi a6, a0, -4 4713; RV32IA-NEXT: slli a0, a0, 3 4714; RV32IA-NEXT: li a3, 255 4715; RV32IA-NEXT: sll a3, a3, a0 4716; RV32IA-NEXT: andi a1, a1, 255 4717; RV32IA-NEXT: sll a1, a1, a0 4718; RV32IA-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 4719; RV32IA-NEXT: lr.w.aqrl a4, (a6) 4720; RV32IA-NEXT: and a2, a4, a3 4721; RV32IA-NEXT: mv a5, a4 4722; RV32IA-NEXT: bgeu a1, a2, .LBB54_3 4723; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 4724; RV32IA-NEXT: xor a5, a4, a1 4725; RV32IA-NEXT: and a5, a5, a3 4726; RV32IA-NEXT: xor a5, a4, a5 4727; RV32IA-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 4728; RV32IA-NEXT: sc.w.aqrl a5, a5, (a6) 4729; RV32IA-NEXT: bnez a5, .LBB54_1 4730; RV32IA-NEXT: # %bb.4: 4731; RV32IA-NEXT: srl a0, a4, a0 4732; RV32IA-NEXT: ret 4733; 4734; RV64I-LABEL: atomicrmw_umin_i8_seq_cst: 4735; RV64I: # %bb.0: 4736; RV64I-NEXT: addi sp, sp, -48 4737; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4738; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4739; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4740; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4741; RV64I-NEXT: mv s0, a0 4742; RV64I-NEXT: lbu a3, 0(a0) 4743; RV64I-NEXT: mv s2, a1 4744; RV64I-NEXT: andi s1, a1, 255 4745; RV64I-NEXT: j .LBB54_2 4746; RV64I-NEXT: .LBB54_1: # %atomicrmw.start 4747; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1 4748; RV64I-NEXT: sb a3, 15(sp) 4749; RV64I-NEXT: addi a1, sp, 15 4750; RV64I-NEXT: li a3, 5 4751; RV64I-NEXT: li a4, 5 4752; RV64I-NEXT: mv a0, s0 4753; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4754; RV64I-NEXT: lb a3, 15(sp) 4755; RV64I-NEXT: bnez a0, .LBB54_4 4756; RV64I-NEXT: .LBB54_2: # %atomicrmw.start 4757; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4758; RV64I-NEXT: andi a0, a3, 255 4759; RV64I-NEXT: mv a2, a3 4760; RV64I-NEXT: bgeu s1, a0, .LBB54_1 4761; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4762; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1 4763; RV64I-NEXT: mv a2, s2 4764; RV64I-NEXT: j .LBB54_1 4765; RV64I-NEXT: .LBB54_4: # %atomicrmw.end 4766; RV64I-NEXT: mv a0, a3 4767; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4768; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4769; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4770; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4771; RV64I-NEXT: addi sp, sp, 48 4772; RV64I-NEXT: ret 4773; 4774; RV64IA-LABEL: atomicrmw_umin_i8_seq_cst: 4775; RV64IA: # %bb.0: 4776; RV64IA-NEXT: andi a6, a0, -4 4777; RV64IA-NEXT: slliw a0, a0, 3 4778; RV64IA-NEXT: li a3, 255 4779; RV64IA-NEXT: sllw a3, a3, a0 4780; RV64IA-NEXT: andi a1, a1, 255 4781; RV64IA-NEXT: sllw a1, a1, a0 4782; RV64IA-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 4783; RV64IA-NEXT: lr.w.aqrl a4, (a6) 4784; RV64IA-NEXT: and a2, a4, a3 4785; RV64IA-NEXT: mv a5, a4 4786; RV64IA-NEXT: bgeu a1, a2, .LBB54_3 4787; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 4788; RV64IA-NEXT: xor a5, a4, a1 4789; RV64IA-NEXT: and a5, a5, a3 4790; RV64IA-NEXT: xor a5, a4, a5 4791; RV64IA-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 4792; RV64IA-NEXT: sc.w.aqrl a5, a5, (a6) 4793; RV64IA-NEXT: bnez a5, .LBB54_1 4794; RV64IA-NEXT: # %bb.4: 4795; RV64IA-NEXT: srlw a0, a4, a0 4796; RV64IA-NEXT: ret 4797 %1 = atomicrmw umin i8* %a, i8 %b seq_cst 4798 ret i8 %1 4799} 4800 4801define i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind { 4802; RV32I-LABEL: atomicrmw_xchg_i16_monotonic: 4803; RV32I: # %bb.0: 4804; RV32I-NEXT: addi sp, sp, -16 4805; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4806; RV32I-NEXT: li a2, 0 4807; RV32I-NEXT: call __atomic_exchange_2@plt 4808; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4809; RV32I-NEXT: addi sp, sp, 16 4810; RV32I-NEXT: ret 4811; 4812; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic: 4813; RV32IA: # %bb.0: 4814; RV32IA-NEXT: andi a2, a0, -4 4815; RV32IA-NEXT: slli a0, a0, 3 4816; RV32IA-NEXT: lui a3, 16 4817; RV32IA-NEXT: addi a3, a3, -1 4818; RV32IA-NEXT: sll a4, a3, a0 4819; RV32IA-NEXT: and a1, a1, a3 4820; RV32IA-NEXT: sll a1, a1, a0 4821; RV32IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 4822; RV32IA-NEXT: lr.w a3, (a2) 4823; RV32IA-NEXT: mv a5, a1 4824; RV32IA-NEXT: xor a5, a3, a5 4825; RV32IA-NEXT: and a5, a5, a4 4826; RV32IA-NEXT: xor a5, a3, a5 4827; RV32IA-NEXT: sc.w a5, a5, (a2) 4828; RV32IA-NEXT: bnez a5, .LBB55_1 4829; RV32IA-NEXT: # %bb.2: 4830; RV32IA-NEXT: srl a0, a3, a0 4831; RV32IA-NEXT: ret 4832; 4833; RV64I-LABEL: atomicrmw_xchg_i16_monotonic: 4834; RV64I: # %bb.0: 4835; RV64I-NEXT: addi sp, sp, -16 4836; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4837; RV64I-NEXT: li a2, 0 4838; RV64I-NEXT: call __atomic_exchange_2@plt 4839; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4840; RV64I-NEXT: addi sp, sp, 16 4841; RV64I-NEXT: ret 4842; 4843; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic: 4844; RV64IA: # %bb.0: 4845; RV64IA-NEXT: andi a2, a0, -4 4846; RV64IA-NEXT: slliw a0, a0, 3 4847; RV64IA-NEXT: lui a3, 16 4848; RV64IA-NEXT: addiw a3, a3, -1 4849; RV64IA-NEXT: sllw a4, a3, a0 4850; RV64IA-NEXT: and a1, a1, a3 4851; RV64IA-NEXT: sllw a1, a1, a0 4852; RV64IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 4853; RV64IA-NEXT: lr.w a3, (a2) 4854; RV64IA-NEXT: mv a5, a1 4855; RV64IA-NEXT: xor a5, a3, a5 4856; RV64IA-NEXT: and a5, a5, a4 4857; RV64IA-NEXT: xor a5, a3, a5 4858; RV64IA-NEXT: sc.w a5, a5, (a2) 4859; RV64IA-NEXT: bnez a5, .LBB55_1 4860; RV64IA-NEXT: # %bb.2: 4861; RV64IA-NEXT: srlw a0, a3, a0 4862; RV64IA-NEXT: ret 4863 %1 = atomicrmw xchg i16* %a, i16 %b monotonic 4864 ret i16 %1 4865} 4866 4867define i16 @atomicrmw_xchg_i16_acquire(i16* %a, i16 %b) nounwind { 4868; RV32I-LABEL: atomicrmw_xchg_i16_acquire: 4869; RV32I: # %bb.0: 4870; RV32I-NEXT: addi sp, sp, -16 4871; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4872; RV32I-NEXT: li a2, 2 4873; RV32I-NEXT: call __atomic_exchange_2@plt 4874; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4875; RV32I-NEXT: addi sp, sp, 16 4876; RV32I-NEXT: ret 4877; 4878; RV32IA-LABEL: atomicrmw_xchg_i16_acquire: 4879; RV32IA: # %bb.0: 4880; RV32IA-NEXT: andi a2, a0, -4 4881; RV32IA-NEXT: slli a0, a0, 3 4882; RV32IA-NEXT: lui a3, 16 4883; RV32IA-NEXT: addi a3, a3, -1 4884; RV32IA-NEXT: sll a4, a3, a0 4885; RV32IA-NEXT: and a1, a1, a3 4886; RV32IA-NEXT: sll a1, a1, a0 4887; RV32IA-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 4888; RV32IA-NEXT: lr.w.aq a3, (a2) 4889; RV32IA-NEXT: mv a5, a1 4890; RV32IA-NEXT: xor a5, a3, a5 4891; RV32IA-NEXT: and a5, a5, a4 4892; RV32IA-NEXT: xor a5, a3, a5 4893; RV32IA-NEXT: sc.w a5, a5, (a2) 4894; RV32IA-NEXT: bnez a5, .LBB56_1 4895; RV32IA-NEXT: # %bb.2: 4896; RV32IA-NEXT: srl a0, a3, a0 4897; RV32IA-NEXT: ret 4898; 4899; RV64I-LABEL: atomicrmw_xchg_i16_acquire: 4900; RV64I: # %bb.0: 4901; RV64I-NEXT: addi sp, sp, -16 4902; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4903; RV64I-NEXT: li a2, 2 4904; RV64I-NEXT: call __atomic_exchange_2@plt 4905; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4906; RV64I-NEXT: addi sp, sp, 16 4907; RV64I-NEXT: ret 4908; 4909; RV64IA-LABEL: atomicrmw_xchg_i16_acquire: 4910; RV64IA: # %bb.0: 4911; RV64IA-NEXT: andi a2, a0, -4 4912; RV64IA-NEXT: slliw a0, a0, 3 4913; RV64IA-NEXT: lui a3, 16 4914; RV64IA-NEXT: addiw a3, a3, -1 4915; RV64IA-NEXT: sllw a4, a3, a0 4916; RV64IA-NEXT: and a1, a1, a3 4917; RV64IA-NEXT: sllw a1, a1, a0 4918; RV64IA-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 4919; RV64IA-NEXT: lr.w.aq a3, (a2) 4920; RV64IA-NEXT: mv a5, a1 4921; RV64IA-NEXT: xor a5, a3, a5 4922; RV64IA-NEXT: and a5, a5, a4 4923; RV64IA-NEXT: xor a5, a3, a5 4924; RV64IA-NEXT: sc.w a5, a5, (a2) 4925; RV64IA-NEXT: bnez a5, .LBB56_1 4926; RV64IA-NEXT: # %bb.2: 4927; RV64IA-NEXT: srlw a0, a3, a0 4928; RV64IA-NEXT: ret 4929 %1 = atomicrmw xchg i16* %a, i16 %b acquire 4930 ret i16 %1 4931} 4932 4933define i16 @atomicrmw_xchg_i16_release(i16* %a, i16 %b) nounwind { 4934; RV32I-LABEL: atomicrmw_xchg_i16_release: 4935; RV32I: # %bb.0: 4936; RV32I-NEXT: addi sp, sp, -16 4937; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4938; RV32I-NEXT: li a2, 3 4939; RV32I-NEXT: call __atomic_exchange_2@plt 4940; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4941; RV32I-NEXT: addi sp, sp, 16 4942; RV32I-NEXT: ret 4943; 4944; RV32IA-LABEL: atomicrmw_xchg_i16_release: 4945; RV32IA: # %bb.0: 4946; RV32IA-NEXT: andi a2, a0, -4 4947; RV32IA-NEXT: slli a0, a0, 3 4948; RV32IA-NEXT: lui a3, 16 4949; RV32IA-NEXT: addi a3, a3, -1 4950; RV32IA-NEXT: sll a4, a3, a0 4951; RV32IA-NEXT: and a1, a1, a3 4952; RV32IA-NEXT: sll a1, a1, a0 4953; RV32IA-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 4954; RV32IA-NEXT: lr.w a3, (a2) 4955; RV32IA-NEXT: mv a5, a1 4956; RV32IA-NEXT: xor a5, a3, a5 4957; RV32IA-NEXT: and a5, a5, a4 4958; RV32IA-NEXT: xor a5, a3, a5 4959; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 4960; RV32IA-NEXT: bnez a5, .LBB57_1 4961; RV32IA-NEXT: # %bb.2: 4962; RV32IA-NEXT: srl a0, a3, a0 4963; RV32IA-NEXT: ret 4964; 4965; RV64I-LABEL: atomicrmw_xchg_i16_release: 4966; RV64I: # %bb.0: 4967; RV64I-NEXT: addi sp, sp, -16 4968; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4969; RV64I-NEXT: li a2, 3 4970; RV64I-NEXT: call __atomic_exchange_2@plt 4971; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4972; RV64I-NEXT: addi sp, sp, 16 4973; RV64I-NEXT: ret 4974; 4975; RV64IA-LABEL: atomicrmw_xchg_i16_release: 4976; RV64IA: # %bb.0: 4977; RV64IA-NEXT: andi a2, a0, -4 4978; RV64IA-NEXT: slliw a0, a0, 3 4979; RV64IA-NEXT: lui a3, 16 4980; RV64IA-NEXT: addiw a3, a3, -1 4981; RV64IA-NEXT: sllw a4, a3, a0 4982; RV64IA-NEXT: and a1, a1, a3 4983; RV64IA-NEXT: sllw a1, a1, a0 4984; RV64IA-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 4985; RV64IA-NEXT: lr.w a3, (a2) 4986; RV64IA-NEXT: mv a5, a1 4987; RV64IA-NEXT: xor a5, a3, a5 4988; RV64IA-NEXT: and a5, a5, a4 4989; RV64IA-NEXT: xor a5, a3, a5 4990; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 4991; RV64IA-NEXT: bnez a5, .LBB57_1 4992; RV64IA-NEXT: # %bb.2: 4993; RV64IA-NEXT: srlw a0, a3, a0 4994; RV64IA-NEXT: ret 4995 %1 = atomicrmw xchg i16* %a, i16 %b release 4996 ret i16 %1 4997} 4998 4999define i16 @atomicrmw_xchg_i16_acq_rel(i16* %a, i16 %b) nounwind { 5000; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel: 5001; RV32I: # %bb.0: 5002; RV32I-NEXT: addi sp, sp, -16 5003; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5004; RV32I-NEXT: li a2, 4 5005; RV32I-NEXT: call __atomic_exchange_2@plt 5006; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5007; RV32I-NEXT: addi sp, sp, 16 5008; RV32I-NEXT: ret 5009; 5010; RV32IA-LABEL: atomicrmw_xchg_i16_acq_rel: 5011; RV32IA: # %bb.0: 5012; RV32IA-NEXT: andi a2, a0, -4 5013; RV32IA-NEXT: slli a0, a0, 3 5014; RV32IA-NEXT: lui a3, 16 5015; RV32IA-NEXT: addi a3, a3, -1 5016; RV32IA-NEXT: sll a4, a3, a0 5017; RV32IA-NEXT: and a1, a1, a3 5018; RV32IA-NEXT: sll a1, a1, a0 5019; RV32IA-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 5020; RV32IA-NEXT: lr.w.aq a3, (a2) 5021; RV32IA-NEXT: mv a5, a1 5022; RV32IA-NEXT: xor a5, a3, a5 5023; RV32IA-NEXT: and a5, a5, a4 5024; RV32IA-NEXT: xor a5, a3, a5 5025; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5026; RV32IA-NEXT: bnez a5, .LBB58_1 5027; RV32IA-NEXT: # %bb.2: 5028; RV32IA-NEXT: srl a0, a3, a0 5029; RV32IA-NEXT: ret 5030; 5031; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel: 5032; RV64I: # %bb.0: 5033; RV64I-NEXT: addi sp, sp, -16 5034; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5035; RV64I-NEXT: li a2, 4 5036; RV64I-NEXT: call __atomic_exchange_2@plt 5037; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5038; RV64I-NEXT: addi sp, sp, 16 5039; RV64I-NEXT: ret 5040; 5041; RV64IA-LABEL: atomicrmw_xchg_i16_acq_rel: 5042; RV64IA: # %bb.0: 5043; RV64IA-NEXT: andi a2, a0, -4 5044; RV64IA-NEXT: slliw a0, a0, 3 5045; RV64IA-NEXT: lui a3, 16 5046; RV64IA-NEXT: addiw a3, a3, -1 5047; RV64IA-NEXT: sllw a4, a3, a0 5048; RV64IA-NEXT: and a1, a1, a3 5049; RV64IA-NEXT: sllw a1, a1, a0 5050; RV64IA-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 5051; RV64IA-NEXT: lr.w.aq a3, (a2) 5052; RV64IA-NEXT: mv a5, a1 5053; RV64IA-NEXT: xor a5, a3, a5 5054; RV64IA-NEXT: and a5, a5, a4 5055; RV64IA-NEXT: xor a5, a3, a5 5056; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5057; RV64IA-NEXT: bnez a5, .LBB58_1 5058; RV64IA-NEXT: # %bb.2: 5059; RV64IA-NEXT: srlw a0, a3, a0 5060; RV64IA-NEXT: ret 5061 %1 = atomicrmw xchg i16* %a, i16 %b acq_rel 5062 ret i16 %1 5063} 5064 5065define i16 @atomicrmw_xchg_i16_seq_cst(i16* %a, i16 %b) nounwind { 5066; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst: 5067; RV32I: # %bb.0: 5068; RV32I-NEXT: addi sp, sp, -16 5069; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5070; RV32I-NEXT: li a2, 5 5071; RV32I-NEXT: call __atomic_exchange_2@plt 5072; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5073; RV32I-NEXT: addi sp, sp, 16 5074; RV32I-NEXT: ret 5075; 5076; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst: 5077; RV32IA: # %bb.0: 5078; RV32IA-NEXT: andi a2, a0, -4 5079; RV32IA-NEXT: slli a0, a0, 3 5080; RV32IA-NEXT: lui a3, 16 5081; RV32IA-NEXT: addi a3, a3, -1 5082; RV32IA-NEXT: sll a4, a3, a0 5083; RV32IA-NEXT: and a1, a1, a3 5084; RV32IA-NEXT: sll a1, a1, a0 5085; RV32IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 5086; RV32IA-NEXT: lr.w.aqrl a3, (a2) 5087; RV32IA-NEXT: mv a5, a1 5088; RV32IA-NEXT: xor a5, a3, a5 5089; RV32IA-NEXT: and a5, a5, a4 5090; RV32IA-NEXT: xor a5, a3, a5 5091; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 5092; RV32IA-NEXT: bnez a5, .LBB59_1 5093; RV32IA-NEXT: # %bb.2: 5094; RV32IA-NEXT: srl a0, a3, a0 5095; RV32IA-NEXT: ret 5096; 5097; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst: 5098; RV64I: # %bb.0: 5099; RV64I-NEXT: addi sp, sp, -16 5100; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5101; RV64I-NEXT: li a2, 5 5102; RV64I-NEXT: call __atomic_exchange_2@plt 5103; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5104; RV64I-NEXT: addi sp, sp, 16 5105; RV64I-NEXT: ret 5106; 5107; RV64IA-LABEL: atomicrmw_xchg_i16_seq_cst: 5108; RV64IA: # %bb.0: 5109; RV64IA-NEXT: andi a2, a0, -4 5110; RV64IA-NEXT: slliw a0, a0, 3 5111; RV64IA-NEXT: lui a3, 16 5112; RV64IA-NEXT: addiw a3, a3, -1 5113; RV64IA-NEXT: sllw a4, a3, a0 5114; RV64IA-NEXT: and a1, a1, a3 5115; RV64IA-NEXT: sllw a1, a1, a0 5116; RV64IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 5117; RV64IA-NEXT: lr.w.aqrl a3, (a2) 5118; RV64IA-NEXT: mv a5, a1 5119; RV64IA-NEXT: xor a5, a3, a5 5120; RV64IA-NEXT: and a5, a5, a4 5121; RV64IA-NEXT: xor a5, a3, a5 5122; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 5123; RV64IA-NEXT: bnez a5, .LBB59_1 5124; RV64IA-NEXT: # %bb.2: 5125; RV64IA-NEXT: srlw a0, a3, a0 5126; RV64IA-NEXT: ret 5127 %1 = atomicrmw xchg i16* %a, i16 %b seq_cst 5128 ret i16 %1 5129} 5130 5131define i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind { 5132; RV32I-LABEL: atomicrmw_add_i16_monotonic: 5133; RV32I: # %bb.0: 5134; RV32I-NEXT: addi sp, sp, -16 5135; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5136; RV32I-NEXT: li a2, 0 5137; RV32I-NEXT: call __atomic_fetch_add_2@plt 5138; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5139; RV32I-NEXT: addi sp, sp, 16 5140; RV32I-NEXT: ret 5141; 5142; RV32IA-LABEL: atomicrmw_add_i16_monotonic: 5143; RV32IA: # %bb.0: 5144; RV32IA-NEXT: andi a2, a0, -4 5145; RV32IA-NEXT: slli a0, a0, 3 5146; RV32IA-NEXT: lui a3, 16 5147; RV32IA-NEXT: addi a3, a3, -1 5148; RV32IA-NEXT: sll a4, a3, a0 5149; RV32IA-NEXT: and a1, a1, a3 5150; RV32IA-NEXT: sll a1, a1, a0 5151; RV32IA-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 5152; RV32IA-NEXT: lr.w a3, (a2) 5153; RV32IA-NEXT: add a5, a3, a1 5154; RV32IA-NEXT: xor a5, a3, a5 5155; RV32IA-NEXT: and a5, a5, a4 5156; RV32IA-NEXT: xor a5, a3, a5 5157; RV32IA-NEXT: sc.w a5, a5, (a2) 5158; RV32IA-NEXT: bnez a5, .LBB60_1 5159; RV32IA-NEXT: # %bb.2: 5160; RV32IA-NEXT: srl a0, a3, a0 5161; RV32IA-NEXT: ret 5162; 5163; RV64I-LABEL: atomicrmw_add_i16_monotonic: 5164; RV64I: # %bb.0: 5165; RV64I-NEXT: addi sp, sp, -16 5166; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5167; RV64I-NEXT: li a2, 0 5168; RV64I-NEXT: call __atomic_fetch_add_2@plt 5169; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5170; RV64I-NEXT: addi sp, sp, 16 5171; RV64I-NEXT: ret 5172; 5173; RV64IA-LABEL: atomicrmw_add_i16_monotonic: 5174; RV64IA: # %bb.0: 5175; RV64IA-NEXT: andi a2, a0, -4 5176; RV64IA-NEXT: slliw a0, a0, 3 5177; RV64IA-NEXT: lui a3, 16 5178; RV64IA-NEXT: addiw a3, a3, -1 5179; RV64IA-NEXT: sllw a4, a3, a0 5180; RV64IA-NEXT: and a1, a1, a3 5181; RV64IA-NEXT: sllw a1, a1, a0 5182; RV64IA-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 5183; RV64IA-NEXT: lr.w a3, (a2) 5184; RV64IA-NEXT: add a5, a3, a1 5185; RV64IA-NEXT: xor a5, a3, a5 5186; RV64IA-NEXT: and a5, a5, a4 5187; RV64IA-NEXT: xor a5, a3, a5 5188; RV64IA-NEXT: sc.w a5, a5, (a2) 5189; RV64IA-NEXT: bnez a5, .LBB60_1 5190; RV64IA-NEXT: # %bb.2: 5191; RV64IA-NEXT: srlw a0, a3, a0 5192; RV64IA-NEXT: ret 5193 %1 = atomicrmw add i16* %a, i16 %b monotonic 5194 ret i16 %1 5195} 5196 5197define i16 @atomicrmw_add_i16_acquire(i16 *%a, i16 %b) nounwind { 5198; RV32I-LABEL: atomicrmw_add_i16_acquire: 5199; RV32I: # %bb.0: 5200; RV32I-NEXT: addi sp, sp, -16 5201; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5202; RV32I-NEXT: li a2, 2 5203; RV32I-NEXT: call __atomic_fetch_add_2@plt 5204; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5205; RV32I-NEXT: addi sp, sp, 16 5206; RV32I-NEXT: ret 5207; 5208; RV32IA-LABEL: atomicrmw_add_i16_acquire: 5209; RV32IA: # %bb.0: 5210; RV32IA-NEXT: andi a2, a0, -4 5211; RV32IA-NEXT: slli a0, a0, 3 5212; RV32IA-NEXT: lui a3, 16 5213; RV32IA-NEXT: addi a3, a3, -1 5214; RV32IA-NEXT: sll a4, a3, a0 5215; RV32IA-NEXT: and a1, a1, a3 5216; RV32IA-NEXT: sll a1, a1, a0 5217; RV32IA-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 5218; RV32IA-NEXT: lr.w.aq a3, (a2) 5219; RV32IA-NEXT: add a5, a3, a1 5220; RV32IA-NEXT: xor a5, a3, a5 5221; RV32IA-NEXT: and a5, a5, a4 5222; RV32IA-NEXT: xor a5, a3, a5 5223; RV32IA-NEXT: sc.w a5, a5, (a2) 5224; RV32IA-NEXT: bnez a5, .LBB61_1 5225; RV32IA-NEXT: # %bb.2: 5226; RV32IA-NEXT: srl a0, a3, a0 5227; RV32IA-NEXT: ret 5228; 5229; RV64I-LABEL: atomicrmw_add_i16_acquire: 5230; RV64I: # %bb.0: 5231; RV64I-NEXT: addi sp, sp, -16 5232; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5233; RV64I-NEXT: li a2, 2 5234; RV64I-NEXT: call __atomic_fetch_add_2@plt 5235; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5236; RV64I-NEXT: addi sp, sp, 16 5237; RV64I-NEXT: ret 5238; 5239; RV64IA-LABEL: atomicrmw_add_i16_acquire: 5240; RV64IA: # %bb.0: 5241; RV64IA-NEXT: andi a2, a0, -4 5242; RV64IA-NEXT: slliw a0, a0, 3 5243; RV64IA-NEXT: lui a3, 16 5244; RV64IA-NEXT: addiw a3, a3, -1 5245; RV64IA-NEXT: sllw a4, a3, a0 5246; RV64IA-NEXT: and a1, a1, a3 5247; RV64IA-NEXT: sllw a1, a1, a0 5248; RV64IA-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 5249; RV64IA-NEXT: lr.w.aq a3, (a2) 5250; RV64IA-NEXT: add a5, a3, a1 5251; RV64IA-NEXT: xor a5, a3, a5 5252; RV64IA-NEXT: and a5, a5, a4 5253; RV64IA-NEXT: xor a5, a3, a5 5254; RV64IA-NEXT: sc.w a5, a5, (a2) 5255; RV64IA-NEXT: bnez a5, .LBB61_1 5256; RV64IA-NEXT: # %bb.2: 5257; RV64IA-NEXT: srlw a0, a3, a0 5258; RV64IA-NEXT: ret 5259 %1 = atomicrmw add i16* %a, i16 %b acquire 5260 ret i16 %1 5261} 5262 5263define i16 @atomicrmw_add_i16_release(i16 *%a, i16 %b) nounwind { 5264; RV32I-LABEL: atomicrmw_add_i16_release: 5265; RV32I: # %bb.0: 5266; RV32I-NEXT: addi sp, sp, -16 5267; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5268; RV32I-NEXT: li a2, 3 5269; RV32I-NEXT: call __atomic_fetch_add_2@plt 5270; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5271; RV32I-NEXT: addi sp, sp, 16 5272; RV32I-NEXT: ret 5273; 5274; RV32IA-LABEL: atomicrmw_add_i16_release: 5275; RV32IA: # %bb.0: 5276; RV32IA-NEXT: andi a2, a0, -4 5277; RV32IA-NEXT: slli a0, a0, 3 5278; RV32IA-NEXT: lui a3, 16 5279; RV32IA-NEXT: addi a3, a3, -1 5280; RV32IA-NEXT: sll a4, a3, a0 5281; RV32IA-NEXT: and a1, a1, a3 5282; RV32IA-NEXT: sll a1, a1, a0 5283; RV32IA-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 5284; RV32IA-NEXT: lr.w a3, (a2) 5285; RV32IA-NEXT: add a5, a3, a1 5286; RV32IA-NEXT: xor a5, a3, a5 5287; RV32IA-NEXT: and a5, a5, a4 5288; RV32IA-NEXT: xor a5, a3, a5 5289; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5290; RV32IA-NEXT: bnez a5, .LBB62_1 5291; RV32IA-NEXT: # %bb.2: 5292; RV32IA-NEXT: srl a0, a3, a0 5293; RV32IA-NEXT: ret 5294; 5295; RV64I-LABEL: atomicrmw_add_i16_release: 5296; RV64I: # %bb.0: 5297; RV64I-NEXT: addi sp, sp, -16 5298; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5299; RV64I-NEXT: li a2, 3 5300; RV64I-NEXT: call __atomic_fetch_add_2@plt 5301; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5302; RV64I-NEXT: addi sp, sp, 16 5303; RV64I-NEXT: ret 5304; 5305; RV64IA-LABEL: atomicrmw_add_i16_release: 5306; RV64IA: # %bb.0: 5307; RV64IA-NEXT: andi a2, a0, -4 5308; RV64IA-NEXT: slliw a0, a0, 3 5309; RV64IA-NEXT: lui a3, 16 5310; RV64IA-NEXT: addiw a3, a3, -1 5311; RV64IA-NEXT: sllw a4, a3, a0 5312; RV64IA-NEXT: and a1, a1, a3 5313; RV64IA-NEXT: sllw a1, a1, a0 5314; RV64IA-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 5315; RV64IA-NEXT: lr.w a3, (a2) 5316; RV64IA-NEXT: add a5, a3, a1 5317; RV64IA-NEXT: xor a5, a3, a5 5318; RV64IA-NEXT: and a5, a5, a4 5319; RV64IA-NEXT: xor a5, a3, a5 5320; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5321; RV64IA-NEXT: bnez a5, .LBB62_1 5322; RV64IA-NEXT: # %bb.2: 5323; RV64IA-NEXT: srlw a0, a3, a0 5324; RV64IA-NEXT: ret 5325 %1 = atomicrmw add i16* %a, i16 %b release 5326 ret i16 %1 5327} 5328 5329define i16 @atomicrmw_add_i16_acq_rel(i16 *%a, i16 %b) nounwind { 5330; RV32I-LABEL: atomicrmw_add_i16_acq_rel: 5331; RV32I: # %bb.0: 5332; RV32I-NEXT: addi sp, sp, -16 5333; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5334; RV32I-NEXT: li a2, 4 5335; RV32I-NEXT: call __atomic_fetch_add_2@plt 5336; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5337; RV32I-NEXT: addi sp, sp, 16 5338; RV32I-NEXT: ret 5339; 5340; RV32IA-LABEL: atomicrmw_add_i16_acq_rel: 5341; RV32IA: # %bb.0: 5342; RV32IA-NEXT: andi a2, a0, -4 5343; RV32IA-NEXT: slli a0, a0, 3 5344; RV32IA-NEXT: lui a3, 16 5345; RV32IA-NEXT: addi a3, a3, -1 5346; RV32IA-NEXT: sll a4, a3, a0 5347; RV32IA-NEXT: and a1, a1, a3 5348; RV32IA-NEXT: sll a1, a1, a0 5349; RV32IA-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 5350; RV32IA-NEXT: lr.w.aq a3, (a2) 5351; RV32IA-NEXT: add a5, a3, a1 5352; RV32IA-NEXT: xor a5, a3, a5 5353; RV32IA-NEXT: and a5, a5, a4 5354; RV32IA-NEXT: xor a5, a3, a5 5355; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5356; RV32IA-NEXT: bnez a5, .LBB63_1 5357; RV32IA-NEXT: # %bb.2: 5358; RV32IA-NEXT: srl a0, a3, a0 5359; RV32IA-NEXT: ret 5360; 5361; RV64I-LABEL: atomicrmw_add_i16_acq_rel: 5362; RV64I: # %bb.0: 5363; RV64I-NEXT: addi sp, sp, -16 5364; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5365; RV64I-NEXT: li a2, 4 5366; RV64I-NEXT: call __atomic_fetch_add_2@plt 5367; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5368; RV64I-NEXT: addi sp, sp, 16 5369; RV64I-NEXT: ret 5370; 5371; RV64IA-LABEL: atomicrmw_add_i16_acq_rel: 5372; RV64IA: # %bb.0: 5373; RV64IA-NEXT: andi a2, a0, -4 5374; RV64IA-NEXT: slliw a0, a0, 3 5375; RV64IA-NEXT: lui a3, 16 5376; RV64IA-NEXT: addiw a3, a3, -1 5377; RV64IA-NEXT: sllw a4, a3, a0 5378; RV64IA-NEXT: and a1, a1, a3 5379; RV64IA-NEXT: sllw a1, a1, a0 5380; RV64IA-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 5381; RV64IA-NEXT: lr.w.aq a3, (a2) 5382; RV64IA-NEXT: add a5, a3, a1 5383; RV64IA-NEXT: xor a5, a3, a5 5384; RV64IA-NEXT: and a5, a5, a4 5385; RV64IA-NEXT: xor a5, a3, a5 5386; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5387; RV64IA-NEXT: bnez a5, .LBB63_1 5388; RV64IA-NEXT: # %bb.2: 5389; RV64IA-NEXT: srlw a0, a3, a0 5390; RV64IA-NEXT: ret 5391 %1 = atomicrmw add i16* %a, i16 %b acq_rel 5392 ret i16 %1 5393} 5394 5395define i16 @atomicrmw_add_i16_seq_cst(i16 *%a, i16 %b) nounwind { 5396; RV32I-LABEL: atomicrmw_add_i16_seq_cst: 5397; RV32I: # %bb.0: 5398; RV32I-NEXT: addi sp, sp, -16 5399; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5400; RV32I-NEXT: li a2, 5 5401; RV32I-NEXT: call __atomic_fetch_add_2@plt 5402; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5403; RV32I-NEXT: addi sp, sp, 16 5404; RV32I-NEXT: ret 5405; 5406; RV32IA-LABEL: atomicrmw_add_i16_seq_cst: 5407; RV32IA: # %bb.0: 5408; RV32IA-NEXT: andi a2, a0, -4 5409; RV32IA-NEXT: slli a0, a0, 3 5410; RV32IA-NEXT: lui a3, 16 5411; RV32IA-NEXT: addi a3, a3, -1 5412; RV32IA-NEXT: sll a4, a3, a0 5413; RV32IA-NEXT: and a1, a1, a3 5414; RV32IA-NEXT: sll a1, a1, a0 5415; RV32IA-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 5416; RV32IA-NEXT: lr.w.aqrl a3, (a2) 5417; RV32IA-NEXT: add a5, a3, a1 5418; RV32IA-NEXT: xor a5, a3, a5 5419; RV32IA-NEXT: and a5, a5, a4 5420; RV32IA-NEXT: xor a5, a3, a5 5421; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 5422; RV32IA-NEXT: bnez a5, .LBB64_1 5423; RV32IA-NEXT: # %bb.2: 5424; RV32IA-NEXT: srl a0, a3, a0 5425; RV32IA-NEXT: ret 5426; 5427; RV64I-LABEL: atomicrmw_add_i16_seq_cst: 5428; RV64I: # %bb.0: 5429; RV64I-NEXT: addi sp, sp, -16 5430; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5431; RV64I-NEXT: li a2, 5 5432; RV64I-NEXT: call __atomic_fetch_add_2@plt 5433; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5434; RV64I-NEXT: addi sp, sp, 16 5435; RV64I-NEXT: ret 5436; 5437; RV64IA-LABEL: atomicrmw_add_i16_seq_cst: 5438; RV64IA: # %bb.0: 5439; RV64IA-NEXT: andi a2, a0, -4 5440; RV64IA-NEXT: slliw a0, a0, 3 5441; RV64IA-NEXT: lui a3, 16 5442; RV64IA-NEXT: addiw a3, a3, -1 5443; RV64IA-NEXT: sllw a4, a3, a0 5444; RV64IA-NEXT: and a1, a1, a3 5445; RV64IA-NEXT: sllw a1, a1, a0 5446; RV64IA-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 5447; RV64IA-NEXT: lr.w.aqrl a3, (a2) 5448; RV64IA-NEXT: add a5, a3, a1 5449; RV64IA-NEXT: xor a5, a3, a5 5450; RV64IA-NEXT: and a5, a5, a4 5451; RV64IA-NEXT: xor a5, a3, a5 5452; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 5453; RV64IA-NEXT: bnez a5, .LBB64_1 5454; RV64IA-NEXT: # %bb.2: 5455; RV64IA-NEXT: srlw a0, a3, a0 5456; RV64IA-NEXT: ret 5457 %1 = atomicrmw add i16* %a, i16 %b seq_cst 5458 ret i16 %1 5459} 5460 5461define i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind { 5462; RV32I-LABEL: atomicrmw_sub_i16_monotonic: 5463; RV32I: # %bb.0: 5464; RV32I-NEXT: addi sp, sp, -16 5465; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5466; RV32I-NEXT: li a2, 0 5467; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5468; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5469; RV32I-NEXT: addi sp, sp, 16 5470; RV32I-NEXT: ret 5471; 5472; RV32IA-LABEL: atomicrmw_sub_i16_monotonic: 5473; RV32IA: # %bb.0: 5474; RV32IA-NEXT: andi a2, a0, -4 5475; RV32IA-NEXT: slli a0, a0, 3 5476; RV32IA-NEXT: lui a3, 16 5477; RV32IA-NEXT: addi a3, a3, -1 5478; RV32IA-NEXT: sll a4, a3, a0 5479; RV32IA-NEXT: and a1, a1, a3 5480; RV32IA-NEXT: sll a1, a1, a0 5481; RV32IA-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 5482; RV32IA-NEXT: lr.w a3, (a2) 5483; RV32IA-NEXT: sub a5, a3, a1 5484; RV32IA-NEXT: xor a5, a3, a5 5485; RV32IA-NEXT: and a5, a5, a4 5486; RV32IA-NEXT: xor a5, a3, a5 5487; RV32IA-NEXT: sc.w a5, a5, (a2) 5488; RV32IA-NEXT: bnez a5, .LBB65_1 5489; RV32IA-NEXT: # %bb.2: 5490; RV32IA-NEXT: srl a0, a3, a0 5491; RV32IA-NEXT: ret 5492; 5493; RV64I-LABEL: atomicrmw_sub_i16_monotonic: 5494; RV64I: # %bb.0: 5495; RV64I-NEXT: addi sp, sp, -16 5496; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5497; RV64I-NEXT: li a2, 0 5498; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5499; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5500; RV64I-NEXT: addi sp, sp, 16 5501; RV64I-NEXT: ret 5502; 5503; RV64IA-LABEL: atomicrmw_sub_i16_monotonic: 5504; RV64IA: # %bb.0: 5505; RV64IA-NEXT: andi a2, a0, -4 5506; RV64IA-NEXT: slliw a0, a0, 3 5507; RV64IA-NEXT: lui a3, 16 5508; RV64IA-NEXT: addiw a3, a3, -1 5509; RV64IA-NEXT: sllw a4, a3, a0 5510; RV64IA-NEXT: and a1, a1, a3 5511; RV64IA-NEXT: sllw a1, a1, a0 5512; RV64IA-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 5513; RV64IA-NEXT: lr.w a3, (a2) 5514; RV64IA-NEXT: sub a5, a3, a1 5515; RV64IA-NEXT: xor a5, a3, a5 5516; RV64IA-NEXT: and a5, a5, a4 5517; RV64IA-NEXT: xor a5, a3, a5 5518; RV64IA-NEXT: sc.w a5, a5, (a2) 5519; RV64IA-NEXT: bnez a5, .LBB65_1 5520; RV64IA-NEXT: # %bb.2: 5521; RV64IA-NEXT: srlw a0, a3, a0 5522; RV64IA-NEXT: ret 5523 %1 = atomicrmw sub i16* %a, i16 %b monotonic 5524 ret i16 %1 5525} 5526 5527define i16 @atomicrmw_sub_i16_acquire(i16* %a, i16 %b) nounwind { 5528; RV32I-LABEL: atomicrmw_sub_i16_acquire: 5529; RV32I: # %bb.0: 5530; RV32I-NEXT: addi sp, sp, -16 5531; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5532; RV32I-NEXT: li a2, 2 5533; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5534; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5535; RV32I-NEXT: addi sp, sp, 16 5536; RV32I-NEXT: ret 5537; 5538; RV32IA-LABEL: atomicrmw_sub_i16_acquire: 5539; RV32IA: # %bb.0: 5540; RV32IA-NEXT: andi a2, a0, -4 5541; RV32IA-NEXT: slli a0, a0, 3 5542; RV32IA-NEXT: lui a3, 16 5543; RV32IA-NEXT: addi a3, a3, -1 5544; RV32IA-NEXT: sll a4, a3, a0 5545; RV32IA-NEXT: and a1, a1, a3 5546; RV32IA-NEXT: sll a1, a1, a0 5547; RV32IA-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 5548; RV32IA-NEXT: lr.w.aq a3, (a2) 5549; RV32IA-NEXT: sub a5, a3, a1 5550; RV32IA-NEXT: xor a5, a3, a5 5551; RV32IA-NEXT: and a5, a5, a4 5552; RV32IA-NEXT: xor a5, a3, a5 5553; RV32IA-NEXT: sc.w a5, a5, (a2) 5554; RV32IA-NEXT: bnez a5, .LBB66_1 5555; RV32IA-NEXT: # %bb.2: 5556; RV32IA-NEXT: srl a0, a3, a0 5557; RV32IA-NEXT: ret 5558; 5559; RV64I-LABEL: atomicrmw_sub_i16_acquire: 5560; RV64I: # %bb.0: 5561; RV64I-NEXT: addi sp, sp, -16 5562; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5563; RV64I-NEXT: li a2, 2 5564; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5565; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5566; RV64I-NEXT: addi sp, sp, 16 5567; RV64I-NEXT: ret 5568; 5569; RV64IA-LABEL: atomicrmw_sub_i16_acquire: 5570; RV64IA: # %bb.0: 5571; RV64IA-NEXT: andi a2, a0, -4 5572; RV64IA-NEXT: slliw a0, a0, 3 5573; RV64IA-NEXT: lui a3, 16 5574; RV64IA-NEXT: addiw a3, a3, -1 5575; RV64IA-NEXT: sllw a4, a3, a0 5576; RV64IA-NEXT: and a1, a1, a3 5577; RV64IA-NEXT: sllw a1, a1, a0 5578; RV64IA-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 5579; RV64IA-NEXT: lr.w.aq a3, (a2) 5580; RV64IA-NEXT: sub a5, a3, a1 5581; RV64IA-NEXT: xor a5, a3, a5 5582; RV64IA-NEXT: and a5, a5, a4 5583; RV64IA-NEXT: xor a5, a3, a5 5584; RV64IA-NEXT: sc.w a5, a5, (a2) 5585; RV64IA-NEXT: bnez a5, .LBB66_1 5586; RV64IA-NEXT: # %bb.2: 5587; RV64IA-NEXT: srlw a0, a3, a0 5588; RV64IA-NEXT: ret 5589 %1 = atomicrmw sub i16* %a, i16 %b acquire 5590 ret i16 %1 5591} 5592 5593define i16 @atomicrmw_sub_i16_release(i16* %a, i16 %b) nounwind { 5594; RV32I-LABEL: atomicrmw_sub_i16_release: 5595; RV32I: # %bb.0: 5596; RV32I-NEXT: addi sp, sp, -16 5597; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5598; RV32I-NEXT: li a2, 3 5599; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5600; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5601; RV32I-NEXT: addi sp, sp, 16 5602; RV32I-NEXT: ret 5603; 5604; RV32IA-LABEL: atomicrmw_sub_i16_release: 5605; RV32IA: # %bb.0: 5606; RV32IA-NEXT: andi a2, a0, -4 5607; RV32IA-NEXT: slli a0, a0, 3 5608; RV32IA-NEXT: lui a3, 16 5609; RV32IA-NEXT: addi a3, a3, -1 5610; RV32IA-NEXT: sll a4, a3, a0 5611; RV32IA-NEXT: and a1, a1, a3 5612; RV32IA-NEXT: sll a1, a1, a0 5613; RV32IA-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 5614; RV32IA-NEXT: lr.w a3, (a2) 5615; RV32IA-NEXT: sub a5, a3, a1 5616; RV32IA-NEXT: xor a5, a3, a5 5617; RV32IA-NEXT: and a5, a5, a4 5618; RV32IA-NEXT: xor a5, a3, a5 5619; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5620; RV32IA-NEXT: bnez a5, .LBB67_1 5621; RV32IA-NEXT: # %bb.2: 5622; RV32IA-NEXT: srl a0, a3, a0 5623; RV32IA-NEXT: ret 5624; 5625; RV64I-LABEL: atomicrmw_sub_i16_release: 5626; RV64I: # %bb.0: 5627; RV64I-NEXT: addi sp, sp, -16 5628; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5629; RV64I-NEXT: li a2, 3 5630; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5631; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5632; RV64I-NEXT: addi sp, sp, 16 5633; RV64I-NEXT: ret 5634; 5635; RV64IA-LABEL: atomicrmw_sub_i16_release: 5636; RV64IA: # %bb.0: 5637; RV64IA-NEXT: andi a2, a0, -4 5638; RV64IA-NEXT: slliw a0, a0, 3 5639; RV64IA-NEXT: lui a3, 16 5640; RV64IA-NEXT: addiw a3, a3, -1 5641; RV64IA-NEXT: sllw a4, a3, a0 5642; RV64IA-NEXT: and a1, a1, a3 5643; RV64IA-NEXT: sllw a1, a1, a0 5644; RV64IA-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 5645; RV64IA-NEXT: lr.w a3, (a2) 5646; RV64IA-NEXT: sub a5, a3, a1 5647; RV64IA-NEXT: xor a5, a3, a5 5648; RV64IA-NEXT: and a5, a5, a4 5649; RV64IA-NEXT: xor a5, a3, a5 5650; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5651; RV64IA-NEXT: bnez a5, .LBB67_1 5652; RV64IA-NEXT: # %bb.2: 5653; RV64IA-NEXT: srlw a0, a3, a0 5654; RV64IA-NEXT: ret 5655 %1 = atomicrmw sub i16* %a, i16 %b release 5656 ret i16 %1 5657} 5658 5659define i16 @atomicrmw_sub_i16_acq_rel(i16* %a, i16 %b) nounwind { 5660; RV32I-LABEL: atomicrmw_sub_i16_acq_rel: 5661; RV32I: # %bb.0: 5662; RV32I-NEXT: addi sp, sp, -16 5663; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5664; RV32I-NEXT: li a2, 4 5665; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5666; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5667; RV32I-NEXT: addi sp, sp, 16 5668; RV32I-NEXT: ret 5669; 5670; RV32IA-LABEL: atomicrmw_sub_i16_acq_rel: 5671; RV32IA: # %bb.0: 5672; RV32IA-NEXT: andi a2, a0, -4 5673; RV32IA-NEXT: slli a0, a0, 3 5674; RV32IA-NEXT: lui a3, 16 5675; RV32IA-NEXT: addi a3, a3, -1 5676; RV32IA-NEXT: sll a4, a3, a0 5677; RV32IA-NEXT: and a1, a1, a3 5678; RV32IA-NEXT: sll a1, a1, a0 5679; RV32IA-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 5680; RV32IA-NEXT: lr.w.aq a3, (a2) 5681; RV32IA-NEXT: sub a5, a3, a1 5682; RV32IA-NEXT: xor a5, a3, a5 5683; RV32IA-NEXT: and a5, a5, a4 5684; RV32IA-NEXT: xor a5, a3, a5 5685; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5686; RV32IA-NEXT: bnez a5, .LBB68_1 5687; RV32IA-NEXT: # %bb.2: 5688; RV32IA-NEXT: srl a0, a3, a0 5689; RV32IA-NEXT: ret 5690; 5691; RV64I-LABEL: atomicrmw_sub_i16_acq_rel: 5692; RV64I: # %bb.0: 5693; RV64I-NEXT: addi sp, sp, -16 5694; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5695; RV64I-NEXT: li a2, 4 5696; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5697; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5698; RV64I-NEXT: addi sp, sp, 16 5699; RV64I-NEXT: ret 5700; 5701; RV64IA-LABEL: atomicrmw_sub_i16_acq_rel: 5702; RV64IA: # %bb.0: 5703; RV64IA-NEXT: andi a2, a0, -4 5704; RV64IA-NEXT: slliw a0, a0, 3 5705; RV64IA-NEXT: lui a3, 16 5706; RV64IA-NEXT: addiw a3, a3, -1 5707; RV64IA-NEXT: sllw a4, a3, a0 5708; RV64IA-NEXT: and a1, a1, a3 5709; RV64IA-NEXT: sllw a1, a1, a0 5710; RV64IA-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 5711; RV64IA-NEXT: lr.w.aq a3, (a2) 5712; RV64IA-NEXT: sub a5, a3, a1 5713; RV64IA-NEXT: xor a5, a3, a5 5714; RV64IA-NEXT: and a5, a5, a4 5715; RV64IA-NEXT: xor a5, a3, a5 5716; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5717; RV64IA-NEXT: bnez a5, .LBB68_1 5718; RV64IA-NEXT: # %bb.2: 5719; RV64IA-NEXT: srlw a0, a3, a0 5720; RV64IA-NEXT: ret 5721 %1 = atomicrmw sub i16* %a, i16 %b acq_rel 5722 ret i16 %1 5723} 5724 5725define i16 @atomicrmw_sub_i16_seq_cst(i16* %a, i16 %b) nounwind { 5726; RV32I-LABEL: atomicrmw_sub_i16_seq_cst: 5727; RV32I: # %bb.0: 5728; RV32I-NEXT: addi sp, sp, -16 5729; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5730; RV32I-NEXT: li a2, 5 5731; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5732; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5733; RV32I-NEXT: addi sp, sp, 16 5734; RV32I-NEXT: ret 5735; 5736; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst: 5737; RV32IA: # %bb.0: 5738; RV32IA-NEXT: andi a2, a0, -4 5739; RV32IA-NEXT: slli a0, a0, 3 5740; RV32IA-NEXT: lui a3, 16 5741; RV32IA-NEXT: addi a3, a3, -1 5742; RV32IA-NEXT: sll a4, a3, a0 5743; RV32IA-NEXT: and a1, a1, a3 5744; RV32IA-NEXT: sll a1, a1, a0 5745; RV32IA-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 5746; RV32IA-NEXT: lr.w.aqrl a3, (a2) 5747; RV32IA-NEXT: sub a5, a3, a1 5748; RV32IA-NEXT: xor a5, a3, a5 5749; RV32IA-NEXT: and a5, a5, a4 5750; RV32IA-NEXT: xor a5, a3, a5 5751; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 5752; RV32IA-NEXT: bnez a5, .LBB69_1 5753; RV32IA-NEXT: # %bb.2: 5754; RV32IA-NEXT: srl a0, a3, a0 5755; RV32IA-NEXT: ret 5756; 5757; RV64I-LABEL: atomicrmw_sub_i16_seq_cst: 5758; RV64I: # %bb.0: 5759; RV64I-NEXT: addi sp, sp, -16 5760; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5761; RV64I-NEXT: li a2, 5 5762; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5763; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5764; RV64I-NEXT: addi sp, sp, 16 5765; RV64I-NEXT: ret 5766; 5767; RV64IA-LABEL: atomicrmw_sub_i16_seq_cst: 5768; RV64IA: # %bb.0: 5769; RV64IA-NEXT: andi a2, a0, -4 5770; RV64IA-NEXT: slliw a0, a0, 3 5771; RV64IA-NEXT: lui a3, 16 5772; RV64IA-NEXT: addiw a3, a3, -1 5773; RV64IA-NEXT: sllw a4, a3, a0 5774; RV64IA-NEXT: and a1, a1, a3 5775; RV64IA-NEXT: sllw a1, a1, a0 5776; RV64IA-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 5777; RV64IA-NEXT: lr.w.aqrl a3, (a2) 5778; RV64IA-NEXT: sub a5, a3, a1 5779; RV64IA-NEXT: xor a5, a3, a5 5780; RV64IA-NEXT: and a5, a5, a4 5781; RV64IA-NEXT: xor a5, a3, a5 5782; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 5783; RV64IA-NEXT: bnez a5, .LBB69_1 5784; RV64IA-NEXT: # %bb.2: 5785; RV64IA-NEXT: srlw a0, a3, a0 5786; RV64IA-NEXT: ret 5787 %1 = atomicrmw sub i16* %a, i16 %b seq_cst 5788 ret i16 %1 5789} 5790 5791define i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind { 5792; RV32I-LABEL: atomicrmw_and_i16_monotonic: 5793; RV32I: # %bb.0: 5794; RV32I-NEXT: addi sp, sp, -16 5795; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5796; RV32I-NEXT: li a2, 0 5797; RV32I-NEXT: call __atomic_fetch_and_2@plt 5798; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5799; RV32I-NEXT: addi sp, sp, 16 5800; RV32I-NEXT: ret 5801; 5802; RV32IA-LABEL: atomicrmw_and_i16_monotonic: 5803; RV32IA: # %bb.0: 5804; RV32IA-NEXT: andi a2, a0, -4 5805; RV32IA-NEXT: slli a0, a0, 3 5806; RV32IA-NEXT: lui a3, 16 5807; RV32IA-NEXT: addi a3, a3, -1 5808; RV32IA-NEXT: sll a4, a3, a0 5809; RV32IA-NEXT: not a4, a4 5810; RV32IA-NEXT: and a1, a1, a3 5811; RV32IA-NEXT: sll a1, a1, a0 5812; RV32IA-NEXT: or a1, a4, a1 5813; RV32IA-NEXT: amoand.w a1, a1, (a2) 5814; RV32IA-NEXT: srl a0, a1, a0 5815; RV32IA-NEXT: ret 5816; 5817; RV64I-LABEL: atomicrmw_and_i16_monotonic: 5818; RV64I: # %bb.0: 5819; RV64I-NEXT: addi sp, sp, -16 5820; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5821; RV64I-NEXT: li a2, 0 5822; RV64I-NEXT: call __atomic_fetch_and_2@plt 5823; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5824; RV64I-NEXT: addi sp, sp, 16 5825; RV64I-NEXT: ret 5826; 5827; RV64IA-LABEL: atomicrmw_and_i16_monotonic: 5828; RV64IA: # %bb.0: 5829; RV64IA-NEXT: andi a2, a0, -4 5830; RV64IA-NEXT: slliw a0, a0, 3 5831; RV64IA-NEXT: lui a3, 16 5832; RV64IA-NEXT: addiw a3, a3, -1 5833; RV64IA-NEXT: sllw a4, a3, a0 5834; RV64IA-NEXT: not a4, a4 5835; RV64IA-NEXT: and a1, a1, a3 5836; RV64IA-NEXT: sllw a1, a1, a0 5837; RV64IA-NEXT: or a1, a4, a1 5838; RV64IA-NEXT: amoand.w a1, a1, (a2) 5839; RV64IA-NEXT: srlw a0, a1, a0 5840; RV64IA-NEXT: ret 5841 %1 = atomicrmw and i16* %a, i16 %b monotonic 5842 ret i16 %1 5843} 5844 5845define i16 @atomicrmw_and_i16_acquire(i16 *%a, i16 %b) nounwind { 5846; RV32I-LABEL: atomicrmw_and_i16_acquire: 5847; RV32I: # %bb.0: 5848; RV32I-NEXT: addi sp, sp, -16 5849; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5850; RV32I-NEXT: li a2, 2 5851; RV32I-NEXT: call __atomic_fetch_and_2@plt 5852; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5853; RV32I-NEXT: addi sp, sp, 16 5854; RV32I-NEXT: ret 5855; 5856; RV32IA-LABEL: atomicrmw_and_i16_acquire: 5857; RV32IA: # %bb.0: 5858; RV32IA-NEXT: andi a2, a0, -4 5859; RV32IA-NEXT: slli a0, a0, 3 5860; RV32IA-NEXT: lui a3, 16 5861; RV32IA-NEXT: addi a3, a3, -1 5862; RV32IA-NEXT: sll a4, a3, a0 5863; RV32IA-NEXT: not a4, a4 5864; RV32IA-NEXT: and a1, a1, a3 5865; RV32IA-NEXT: sll a1, a1, a0 5866; RV32IA-NEXT: or a1, a4, a1 5867; RV32IA-NEXT: amoand.w.aq a1, a1, (a2) 5868; RV32IA-NEXT: srl a0, a1, a0 5869; RV32IA-NEXT: ret 5870; 5871; RV64I-LABEL: atomicrmw_and_i16_acquire: 5872; RV64I: # %bb.0: 5873; RV64I-NEXT: addi sp, sp, -16 5874; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5875; RV64I-NEXT: li a2, 2 5876; RV64I-NEXT: call __atomic_fetch_and_2@plt 5877; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5878; RV64I-NEXT: addi sp, sp, 16 5879; RV64I-NEXT: ret 5880; 5881; RV64IA-LABEL: atomicrmw_and_i16_acquire: 5882; RV64IA: # %bb.0: 5883; RV64IA-NEXT: andi a2, a0, -4 5884; RV64IA-NEXT: slliw a0, a0, 3 5885; RV64IA-NEXT: lui a3, 16 5886; RV64IA-NEXT: addiw a3, a3, -1 5887; RV64IA-NEXT: sllw a4, a3, a0 5888; RV64IA-NEXT: not a4, a4 5889; RV64IA-NEXT: and a1, a1, a3 5890; RV64IA-NEXT: sllw a1, a1, a0 5891; RV64IA-NEXT: or a1, a4, a1 5892; RV64IA-NEXT: amoand.w.aq a1, a1, (a2) 5893; RV64IA-NEXT: srlw a0, a1, a0 5894; RV64IA-NEXT: ret 5895 %1 = atomicrmw and i16* %a, i16 %b acquire 5896 ret i16 %1 5897} 5898 5899define i16 @atomicrmw_and_i16_release(i16 *%a, i16 %b) nounwind { 5900; RV32I-LABEL: atomicrmw_and_i16_release: 5901; RV32I: # %bb.0: 5902; RV32I-NEXT: addi sp, sp, -16 5903; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5904; RV32I-NEXT: li a2, 3 5905; RV32I-NEXT: call __atomic_fetch_and_2@plt 5906; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5907; RV32I-NEXT: addi sp, sp, 16 5908; RV32I-NEXT: ret 5909; 5910; RV32IA-LABEL: atomicrmw_and_i16_release: 5911; RV32IA: # %bb.0: 5912; RV32IA-NEXT: andi a2, a0, -4 5913; RV32IA-NEXT: slli a0, a0, 3 5914; RV32IA-NEXT: lui a3, 16 5915; RV32IA-NEXT: addi a3, a3, -1 5916; RV32IA-NEXT: sll a4, a3, a0 5917; RV32IA-NEXT: not a4, a4 5918; RV32IA-NEXT: and a1, a1, a3 5919; RV32IA-NEXT: sll a1, a1, a0 5920; RV32IA-NEXT: or a1, a4, a1 5921; RV32IA-NEXT: amoand.w.rl a1, a1, (a2) 5922; RV32IA-NEXT: srl a0, a1, a0 5923; RV32IA-NEXT: ret 5924; 5925; RV64I-LABEL: atomicrmw_and_i16_release: 5926; RV64I: # %bb.0: 5927; RV64I-NEXT: addi sp, sp, -16 5928; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5929; RV64I-NEXT: li a2, 3 5930; RV64I-NEXT: call __atomic_fetch_and_2@plt 5931; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5932; RV64I-NEXT: addi sp, sp, 16 5933; RV64I-NEXT: ret 5934; 5935; RV64IA-LABEL: atomicrmw_and_i16_release: 5936; RV64IA: # %bb.0: 5937; RV64IA-NEXT: andi a2, a0, -4 5938; RV64IA-NEXT: slliw a0, a0, 3 5939; RV64IA-NEXT: lui a3, 16 5940; RV64IA-NEXT: addiw a3, a3, -1 5941; RV64IA-NEXT: sllw a4, a3, a0 5942; RV64IA-NEXT: not a4, a4 5943; RV64IA-NEXT: and a1, a1, a3 5944; RV64IA-NEXT: sllw a1, a1, a0 5945; RV64IA-NEXT: or a1, a4, a1 5946; RV64IA-NEXT: amoand.w.rl a1, a1, (a2) 5947; RV64IA-NEXT: srlw a0, a1, a0 5948; RV64IA-NEXT: ret 5949 %1 = atomicrmw and i16* %a, i16 %b release 5950 ret i16 %1 5951} 5952 5953define i16 @atomicrmw_and_i16_acq_rel(i16 *%a, i16 %b) nounwind { 5954; RV32I-LABEL: atomicrmw_and_i16_acq_rel: 5955; RV32I: # %bb.0: 5956; RV32I-NEXT: addi sp, sp, -16 5957; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5958; RV32I-NEXT: li a2, 4 5959; RV32I-NEXT: call __atomic_fetch_and_2@plt 5960; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5961; RV32I-NEXT: addi sp, sp, 16 5962; RV32I-NEXT: ret 5963; 5964; RV32IA-LABEL: atomicrmw_and_i16_acq_rel: 5965; RV32IA: # %bb.0: 5966; RV32IA-NEXT: andi a2, a0, -4 5967; RV32IA-NEXT: slli a0, a0, 3 5968; RV32IA-NEXT: lui a3, 16 5969; RV32IA-NEXT: addi a3, a3, -1 5970; RV32IA-NEXT: sll a4, a3, a0 5971; RV32IA-NEXT: not a4, a4 5972; RV32IA-NEXT: and a1, a1, a3 5973; RV32IA-NEXT: sll a1, a1, a0 5974; RV32IA-NEXT: or a1, a4, a1 5975; RV32IA-NEXT: amoand.w.aqrl a1, a1, (a2) 5976; RV32IA-NEXT: srl a0, a1, a0 5977; RV32IA-NEXT: ret 5978; 5979; RV64I-LABEL: atomicrmw_and_i16_acq_rel: 5980; RV64I: # %bb.0: 5981; RV64I-NEXT: addi sp, sp, -16 5982; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5983; RV64I-NEXT: li a2, 4 5984; RV64I-NEXT: call __atomic_fetch_and_2@plt 5985; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5986; RV64I-NEXT: addi sp, sp, 16 5987; RV64I-NEXT: ret 5988; 5989; RV64IA-LABEL: atomicrmw_and_i16_acq_rel: 5990; RV64IA: # %bb.0: 5991; RV64IA-NEXT: andi a2, a0, -4 5992; RV64IA-NEXT: slliw a0, a0, 3 5993; RV64IA-NEXT: lui a3, 16 5994; RV64IA-NEXT: addiw a3, a3, -1 5995; RV64IA-NEXT: sllw a4, a3, a0 5996; RV64IA-NEXT: not a4, a4 5997; RV64IA-NEXT: and a1, a1, a3 5998; RV64IA-NEXT: sllw a1, a1, a0 5999; RV64IA-NEXT: or a1, a4, a1 6000; RV64IA-NEXT: amoand.w.aqrl a1, a1, (a2) 6001; RV64IA-NEXT: srlw a0, a1, a0 6002; RV64IA-NEXT: ret 6003 %1 = atomicrmw and i16* %a, i16 %b acq_rel 6004 ret i16 %1 6005} 6006 6007define i16 @atomicrmw_and_i16_seq_cst(i16 *%a, i16 %b) nounwind { 6008; RV32I-LABEL: atomicrmw_and_i16_seq_cst: 6009; RV32I: # %bb.0: 6010; RV32I-NEXT: addi sp, sp, -16 6011; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6012; RV32I-NEXT: li a2, 5 6013; RV32I-NEXT: call __atomic_fetch_and_2@plt 6014; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6015; RV32I-NEXT: addi sp, sp, 16 6016; RV32I-NEXT: ret 6017; 6018; RV32IA-LABEL: atomicrmw_and_i16_seq_cst: 6019; RV32IA: # %bb.0: 6020; RV32IA-NEXT: andi a2, a0, -4 6021; RV32IA-NEXT: slli a0, a0, 3 6022; RV32IA-NEXT: lui a3, 16 6023; RV32IA-NEXT: addi a3, a3, -1 6024; RV32IA-NEXT: sll a4, a3, a0 6025; RV32IA-NEXT: not a4, a4 6026; RV32IA-NEXT: and a1, a1, a3 6027; RV32IA-NEXT: sll a1, a1, a0 6028; RV32IA-NEXT: or a1, a4, a1 6029; RV32IA-NEXT: amoand.w.aqrl a1, a1, (a2) 6030; RV32IA-NEXT: srl a0, a1, a0 6031; RV32IA-NEXT: ret 6032; 6033; RV64I-LABEL: atomicrmw_and_i16_seq_cst: 6034; RV64I: # %bb.0: 6035; RV64I-NEXT: addi sp, sp, -16 6036; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6037; RV64I-NEXT: li a2, 5 6038; RV64I-NEXT: call __atomic_fetch_and_2@plt 6039; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6040; RV64I-NEXT: addi sp, sp, 16 6041; RV64I-NEXT: ret 6042; 6043; RV64IA-LABEL: atomicrmw_and_i16_seq_cst: 6044; RV64IA: # %bb.0: 6045; RV64IA-NEXT: andi a2, a0, -4 6046; RV64IA-NEXT: slliw a0, a0, 3 6047; RV64IA-NEXT: lui a3, 16 6048; RV64IA-NEXT: addiw a3, a3, -1 6049; RV64IA-NEXT: sllw a4, a3, a0 6050; RV64IA-NEXT: not a4, a4 6051; RV64IA-NEXT: and a1, a1, a3 6052; RV64IA-NEXT: sllw a1, a1, a0 6053; RV64IA-NEXT: or a1, a4, a1 6054; RV64IA-NEXT: amoand.w.aqrl a1, a1, (a2) 6055; RV64IA-NEXT: srlw a0, a1, a0 6056; RV64IA-NEXT: ret 6057 %1 = atomicrmw and i16* %a, i16 %b seq_cst 6058 ret i16 %1 6059} 6060 6061define i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind { 6062; RV32I-LABEL: atomicrmw_nand_i16_monotonic: 6063; RV32I: # %bb.0: 6064; RV32I-NEXT: addi sp, sp, -16 6065; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6066; RV32I-NEXT: li a2, 0 6067; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6068; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6069; RV32I-NEXT: addi sp, sp, 16 6070; RV32I-NEXT: ret 6071; 6072; RV32IA-LABEL: atomicrmw_nand_i16_monotonic: 6073; RV32IA: # %bb.0: 6074; RV32IA-NEXT: andi a2, a0, -4 6075; RV32IA-NEXT: slli a0, a0, 3 6076; RV32IA-NEXT: lui a3, 16 6077; RV32IA-NEXT: addi a3, a3, -1 6078; RV32IA-NEXT: sll a4, a3, a0 6079; RV32IA-NEXT: and a1, a1, a3 6080; RV32IA-NEXT: sll a1, a1, a0 6081; RV32IA-NEXT: .LBB75_1: # =>This Inner Loop Header: Depth=1 6082; RV32IA-NEXT: lr.w a3, (a2) 6083; RV32IA-NEXT: and a5, a3, a1 6084; RV32IA-NEXT: not a5, a5 6085; RV32IA-NEXT: xor a5, a3, a5 6086; RV32IA-NEXT: and a5, a5, a4 6087; RV32IA-NEXT: xor a5, a3, a5 6088; RV32IA-NEXT: sc.w a5, a5, (a2) 6089; RV32IA-NEXT: bnez a5, .LBB75_1 6090; RV32IA-NEXT: # %bb.2: 6091; RV32IA-NEXT: srl a0, a3, a0 6092; RV32IA-NEXT: ret 6093; 6094; RV64I-LABEL: atomicrmw_nand_i16_monotonic: 6095; RV64I: # %bb.0: 6096; RV64I-NEXT: addi sp, sp, -16 6097; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6098; RV64I-NEXT: li a2, 0 6099; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6100; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6101; RV64I-NEXT: addi sp, sp, 16 6102; RV64I-NEXT: ret 6103; 6104; RV64IA-LABEL: atomicrmw_nand_i16_monotonic: 6105; RV64IA: # %bb.0: 6106; RV64IA-NEXT: andi a2, a0, -4 6107; RV64IA-NEXT: slliw a0, a0, 3 6108; RV64IA-NEXT: lui a3, 16 6109; RV64IA-NEXT: addiw a3, a3, -1 6110; RV64IA-NEXT: sllw a4, a3, a0 6111; RV64IA-NEXT: and a1, a1, a3 6112; RV64IA-NEXT: sllw a1, a1, a0 6113; RV64IA-NEXT: .LBB75_1: # =>This Inner Loop Header: Depth=1 6114; RV64IA-NEXT: lr.w a3, (a2) 6115; RV64IA-NEXT: and a5, a3, a1 6116; RV64IA-NEXT: not a5, a5 6117; RV64IA-NEXT: xor a5, a3, a5 6118; RV64IA-NEXT: and a5, a5, a4 6119; RV64IA-NEXT: xor a5, a3, a5 6120; RV64IA-NEXT: sc.w a5, a5, (a2) 6121; RV64IA-NEXT: bnez a5, .LBB75_1 6122; RV64IA-NEXT: # %bb.2: 6123; RV64IA-NEXT: srlw a0, a3, a0 6124; RV64IA-NEXT: ret 6125 %1 = atomicrmw nand i16* %a, i16 %b monotonic 6126 ret i16 %1 6127} 6128 6129define i16 @atomicrmw_nand_i16_acquire(i16* %a, i16 %b) nounwind { 6130; RV32I-LABEL: atomicrmw_nand_i16_acquire: 6131; RV32I: # %bb.0: 6132; RV32I-NEXT: addi sp, sp, -16 6133; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6134; RV32I-NEXT: li a2, 2 6135; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6136; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6137; RV32I-NEXT: addi sp, sp, 16 6138; RV32I-NEXT: ret 6139; 6140; RV32IA-LABEL: atomicrmw_nand_i16_acquire: 6141; RV32IA: # %bb.0: 6142; RV32IA-NEXT: andi a2, a0, -4 6143; RV32IA-NEXT: slli a0, a0, 3 6144; RV32IA-NEXT: lui a3, 16 6145; RV32IA-NEXT: addi a3, a3, -1 6146; RV32IA-NEXT: sll a4, a3, a0 6147; RV32IA-NEXT: and a1, a1, a3 6148; RV32IA-NEXT: sll a1, a1, a0 6149; RV32IA-NEXT: .LBB76_1: # =>This Inner Loop Header: Depth=1 6150; RV32IA-NEXT: lr.w.aq a3, (a2) 6151; RV32IA-NEXT: and a5, a3, a1 6152; RV32IA-NEXT: not a5, a5 6153; RV32IA-NEXT: xor a5, a3, a5 6154; RV32IA-NEXT: and a5, a5, a4 6155; RV32IA-NEXT: xor a5, a3, a5 6156; RV32IA-NEXT: sc.w a5, a5, (a2) 6157; RV32IA-NEXT: bnez a5, .LBB76_1 6158; RV32IA-NEXT: # %bb.2: 6159; RV32IA-NEXT: srl a0, a3, a0 6160; RV32IA-NEXT: ret 6161; 6162; RV64I-LABEL: atomicrmw_nand_i16_acquire: 6163; RV64I: # %bb.0: 6164; RV64I-NEXT: addi sp, sp, -16 6165; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6166; RV64I-NEXT: li a2, 2 6167; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6168; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6169; RV64I-NEXT: addi sp, sp, 16 6170; RV64I-NEXT: ret 6171; 6172; RV64IA-LABEL: atomicrmw_nand_i16_acquire: 6173; RV64IA: # %bb.0: 6174; RV64IA-NEXT: andi a2, a0, -4 6175; RV64IA-NEXT: slliw a0, a0, 3 6176; RV64IA-NEXT: lui a3, 16 6177; RV64IA-NEXT: addiw a3, a3, -1 6178; RV64IA-NEXT: sllw a4, a3, a0 6179; RV64IA-NEXT: and a1, a1, a3 6180; RV64IA-NEXT: sllw a1, a1, a0 6181; RV64IA-NEXT: .LBB76_1: # =>This Inner Loop Header: Depth=1 6182; RV64IA-NEXT: lr.w.aq a3, (a2) 6183; RV64IA-NEXT: and a5, a3, a1 6184; RV64IA-NEXT: not a5, a5 6185; RV64IA-NEXT: xor a5, a3, a5 6186; RV64IA-NEXT: and a5, a5, a4 6187; RV64IA-NEXT: xor a5, a3, a5 6188; RV64IA-NEXT: sc.w a5, a5, (a2) 6189; RV64IA-NEXT: bnez a5, .LBB76_1 6190; RV64IA-NEXT: # %bb.2: 6191; RV64IA-NEXT: srlw a0, a3, a0 6192; RV64IA-NEXT: ret 6193 %1 = atomicrmw nand i16* %a, i16 %b acquire 6194 ret i16 %1 6195} 6196 6197define i16 @atomicrmw_nand_i16_release(i16* %a, i16 %b) nounwind { 6198; RV32I-LABEL: atomicrmw_nand_i16_release: 6199; RV32I: # %bb.0: 6200; RV32I-NEXT: addi sp, sp, -16 6201; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6202; RV32I-NEXT: li a2, 3 6203; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6204; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6205; RV32I-NEXT: addi sp, sp, 16 6206; RV32I-NEXT: ret 6207; 6208; RV32IA-LABEL: atomicrmw_nand_i16_release: 6209; RV32IA: # %bb.0: 6210; RV32IA-NEXT: andi a2, a0, -4 6211; RV32IA-NEXT: slli a0, a0, 3 6212; RV32IA-NEXT: lui a3, 16 6213; RV32IA-NEXT: addi a3, a3, -1 6214; RV32IA-NEXT: sll a4, a3, a0 6215; RV32IA-NEXT: and a1, a1, a3 6216; RV32IA-NEXT: sll a1, a1, a0 6217; RV32IA-NEXT: .LBB77_1: # =>This Inner Loop Header: Depth=1 6218; RV32IA-NEXT: lr.w a3, (a2) 6219; RV32IA-NEXT: and a5, a3, a1 6220; RV32IA-NEXT: not a5, a5 6221; RV32IA-NEXT: xor a5, a3, a5 6222; RV32IA-NEXT: and a5, a5, a4 6223; RV32IA-NEXT: xor a5, a3, a5 6224; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 6225; RV32IA-NEXT: bnez a5, .LBB77_1 6226; RV32IA-NEXT: # %bb.2: 6227; RV32IA-NEXT: srl a0, a3, a0 6228; RV32IA-NEXT: ret 6229; 6230; RV64I-LABEL: atomicrmw_nand_i16_release: 6231; RV64I: # %bb.0: 6232; RV64I-NEXT: addi sp, sp, -16 6233; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6234; RV64I-NEXT: li a2, 3 6235; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6236; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6237; RV64I-NEXT: addi sp, sp, 16 6238; RV64I-NEXT: ret 6239; 6240; RV64IA-LABEL: atomicrmw_nand_i16_release: 6241; RV64IA: # %bb.0: 6242; RV64IA-NEXT: andi a2, a0, -4 6243; RV64IA-NEXT: slliw a0, a0, 3 6244; RV64IA-NEXT: lui a3, 16 6245; RV64IA-NEXT: addiw a3, a3, -1 6246; RV64IA-NEXT: sllw a4, a3, a0 6247; RV64IA-NEXT: and a1, a1, a3 6248; RV64IA-NEXT: sllw a1, a1, a0 6249; RV64IA-NEXT: .LBB77_1: # =>This Inner Loop Header: Depth=1 6250; RV64IA-NEXT: lr.w a3, (a2) 6251; RV64IA-NEXT: and a5, a3, a1 6252; RV64IA-NEXT: not a5, a5 6253; RV64IA-NEXT: xor a5, a3, a5 6254; RV64IA-NEXT: and a5, a5, a4 6255; RV64IA-NEXT: xor a5, a3, a5 6256; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 6257; RV64IA-NEXT: bnez a5, .LBB77_1 6258; RV64IA-NEXT: # %bb.2: 6259; RV64IA-NEXT: srlw a0, a3, a0 6260; RV64IA-NEXT: ret 6261 %1 = atomicrmw nand i16* %a, i16 %b release 6262 ret i16 %1 6263} 6264 6265define i16 @atomicrmw_nand_i16_acq_rel(i16* %a, i16 %b) nounwind { 6266; RV32I-LABEL: atomicrmw_nand_i16_acq_rel: 6267; RV32I: # %bb.0: 6268; RV32I-NEXT: addi sp, sp, -16 6269; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6270; RV32I-NEXT: li a2, 4 6271; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6272; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6273; RV32I-NEXT: addi sp, sp, 16 6274; RV32I-NEXT: ret 6275; 6276; RV32IA-LABEL: atomicrmw_nand_i16_acq_rel: 6277; RV32IA: # %bb.0: 6278; RV32IA-NEXT: andi a2, a0, -4 6279; RV32IA-NEXT: slli a0, a0, 3 6280; RV32IA-NEXT: lui a3, 16 6281; RV32IA-NEXT: addi a3, a3, -1 6282; RV32IA-NEXT: sll a4, a3, a0 6283; RV32IA-NEXT: and a1, a1, a3 6284; RV32IA-NEXT: sll a1, a1, a0 6285; RV32IA-NEXT: .LBB78_1: # =>This Inner Loop Header: Depth=1 6286; RV32IA-NEXT: lr.w.aq a3, (a2) 6287; RV32IA-NEXT: and a5, a3, a1 6288; RV32IA-NEXT: not a5, a5 6289; RV32IA-NEXT: xor a5, a3, a5 6290; RV32IA-NEXT: and a5, a5, a4 6291; RV32IA-NEXT: xor a5, a3, a5 6292; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 6293; RV32IA-NEXT: bnez a5, .LBB78_1 6294; RV32IA-NEXT: # %bb.2: 6295; RV32IA-NEXT: srl a0, a3, a0 6296; RV32IA-NEXT: ret 6297; 6298; RV64I-LABEL: atomicrmw_nand_i16_acq_rel: 6299; RV64I: # %bb.0: 6300; RV64I-NEXT: addi sp, sp, -16 6301; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6302; RV64I-NEXT: li a2, 4 6303; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6304; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6305; RV64I-NEXT: addi sp, sp, 16 6306; RV64I-NEXT: ret 6307; 6308; RV64IA-LABEL: atomicrmw_nand_i16_acq_rel: 6309; RV64IA: # %bb.0: 6310; RV64IA-NEXT: andi a2, a0, -4 6311; RV64IA-NEXT: slliw a0, a0, 3 6312; RV64IA-NEXT: lui a3, 16 6313; RV64IA-NEXT: addiw a3, a3, -1 6314; RV64IA-NEXT: sllw a4, a3, a0 6315; RV64IA-NEXT: and a1, a1, a3 6316; RV64IA-NEXT: sllw a1, a1, a0 6317; RV64IA-NEXT: .LBB78_1: # =>This Inner Loop Header: Depth=1 6318; RV64IA-NEXT: lr.w.aq a3, (a2) 6319; RV64IA-NEXT: and a5, a3, a1 6320; RV64IA-NEXT: not a5, a5 6321; RV64IA-NEXT: xor a5, a3, a5 6322; RV64IA-NEXT: and a5, a5, a4 6323; RV64IA-NEXT: xor a5, a3, a5 6324; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 6325; RV64IA-NEXT: bnez a5, .LBB78_1 6326; RV64IA-NEXT: # %bb.2: 6327; RV64IA-NEXT: srlw a0, a3, a0 6328; RV64IA-NEXT: ret 6329 %1 = atomicrmw nand i16* %a, i16 %b acq_rel 6330 ret i16 %1 6331} 6332 6333define i16 @atomicrmw_nand_i16_seq_cst(i16* %a, i16 %b) nounwind { 6334; RV32I-LABEL: atomicrmw_nand_i16_seq_cst: 6335; RV32I: # %bb.0: 6336; RV32I-NEXT: addi sp, sp, -16 6337; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6338; RV32I-NEXT: li a2, 5 6339; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6340; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6341; RV32I-NEXT: addi sp, sp, 16 6342; RV32I-NEXT: ret 6343; 6344; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst: 6345; RV32IA: # %bb.0: 6346; RV32IA-NEXT: andi a2, a0, -4 6347; RV32IA-NEXT: slli a0, a0, 3 6348; RV32IA-NEXT: lui a3, 16 6349; RV32IA-NEXT: addi a3, a3, -1 6350; RV32IA-NEXT: sll a4, a3, a0 6351; RV32IA-NEXT: and a1, a1, a3 6352; RV32IA-NEXT: sll a1, a1, a0 6353; RV32IA-NEXT: .LBB79_1: # =>This Inner Loop Header: Depth=1 6354; RV32IA-NEXT: lr.w.aqrl a3, (a2) 6355; RV32IA-NEXT: and a5, a3, a1 6356; RV32IA-NEXT: not a5, a5 6357; RV32IA-NEXT: xor a5, a3, a5 6358; RV32IA-NEXT: and a5, a5, a4 6359; RV32IA-NEXT: xor a5, a3, a5 6360; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 6361; RV32IA-NEXT: bnez a5, .LBB79_1 6362; RV32IA-NEXT: # %bb.2: 6363; RV32IA-NEXT: srl a0, a3, a0 6364; RV32IA-NEXT: ret 6365; 6366; RV64I-LABEL: atomicrmw_nand_i16_seq_cst: 6367; RV64I: # %bb.0: 6368; RV64I-NEXT: addi sp, sp, -16 6369; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6370; RV64I-NEXT: li a2, 5 6371; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6372; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6373; RV64I-NEXT: addi sp, sp, 16 6374; RV64I-NEXT: ret 6375; 6376; RV64IA-LABEL: atomicrmw_nand_i16_seq_cst: 6377; RV64IA: # %bb.0: 6378; RV64IA-NEXT: andi a2, a0, -4 6379; RV64IA-NEXT: slliw a0, a0, 3 6380; RV64IA-NEXT: lui a3, 16 6381; RV64IA-NEXT: addiw a3, a3, -1 6382; RV64IA-NEXT: sllw a4, a3, a0 6383; RV64IA-NEXT: and a1, a1, a3 6384; RV64IA-NEXT: sllw a1, a1, a0 6385; RV64IA-NEXT: .LBB79_1: # =>This Inner Loop Header: Depth=1 6386; RV64IA-NEXT: lr.w.aqrl a3, (a2) 6387; RV64IA-NEXT: and a5, a3, a1 6388; RV64IA-NEXT: not a5, a5 6389; RV64IA-NEXT: xor a5, a3, a5 6390; RV64IA-NEXT: and a5, a5, a4 6391; RV64IA-NEXT: xor a5, a3, a5 6392; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 6393; RV64IA-NEXT: bnez a5, .LBB79_1 6394; RV64IA-NEXT: # %bb.2: 6395; RV64IA-NEXT: srlw a0, a3, a0 6396; RV64IA-NEXT: ret 6397 %1 = atomicrmw nand i16* %a, i16 %b seq_cst 6398 ret i16 %1 6399} 6400 6401define i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind { 6402; RV32I-LABEL: atomicrmw_or_i16_monotonic: 6403; RV32I: # %bb.0: 6404; RV32I-NEXT: addi sp, sp, -16 6405; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6406; RV32I-NEXT: li a2, 0 6407; RV32I-NEXT: call __atomic_fetch_or_2@plt 6408; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6409; RV32I-NEXT: addi sp, sp, 16 6410; RV32I-NEXT: ret 6411; 6412; RV32IA-LABEL: atomicrmw_or_i16_monotonic: 6413; RV32IA: # %bb.0: 6414; RV32IA-NEXT: andi a2, a0, -4 6415; RV32IA-NEXT: slli a0, a0, 3 6416; RV32IA-NEXT: slli a1, a1, 16 6417; RV32IA-NEXT: srli a1, a1, 16 6418; RV32IA-NEXT: sll a1, a1, a0 6419; RV32IA-NEXT: amoor.w a1, a1, (a2) 6420; RV32IA-NEXT: srl a0, a1, a0 6421; RV32IA-NEXT: ret 6422; 6423; RV64I-LABEL: atomicrmw_or_i16_monotonic: 6424; RV64I: # %bb.0: 6425; RV64I-NEXT: addi sp, sp, -16 6426; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6427; RV64I-NEXT: li a2, 0 6428; RV64I-NEXT: call __atomic_fetch_or_2@plt 6429; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6430; RV64I-NEXT: addi sp, sp, 16 6431; RV64I-NEXT: ret 6432; 6433; RV64IA-LABEL: atomicrmw_or_i16_monotonic: 6434; RV64IA: # %bb.0: 6435; RV64IA-NEXT: andi a2, a0, -4 6436; RV64IA-NEXT: slliw a0, a0, 3 6437; RV64IA-NEXT: slli a1, a1, 48 6438; RV64IA-NEXT: srli a1, a1, 48 6439; RV64IA-NEXT: sllw a1, a1, a0 6440; RV64IA-NEXT: amoor.w a1, a1, (a2) 6441; RV64IA-NEXT: srlw a0, a1, a0 6442; RV64IA-NEXT: ret 6443 %1 = atomicrmw or i16* %a, i16 %b monotonic 6444 ret i16 %1 6445} 6446 6447define i16 @atomicrmw_or_i16_acquire(i16 *%a, i16 %b) nounwind { 6448; RV32I-LABEL: atomicrmw_or_i16_acquire: 6449; RV32I: # %bb.0: 6450; RV32I-NEXT: addi sp, sp, -16 6451; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6452; RV32I-NEXT: li a2, 2 6453; RV32I-NEXT: call __atomic_fetch_or_2@plt 6454; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6455; RV32I-NEXT: addi sp, sp, 16 6456; RV32I-NEXT: ret 6457; 6458; RV32IA-LABEL: atomicrmw_or_i16_acquire: 6459; RV32IA: # %bb.0: 6460; RV32IA-NEXT: andi a2, a0, -4 6461; RV32IA-NEXT: slli a0, a0, 3 6462; RV32IA-NEXT: slli a1, a1, 16 6463; RV32IA-NEXT: srli a1, a1, 16 6464; RV32IA-NEXT: sll a1, a1, a0 6465; RV32IA-NEXT: amoor.w.aq a1, a1, (a2) 6466; RV32IA-NEXT: srl a0, a1, a0 6467; RV32IA-NEXT: ret 6468; 6469; RV64I-LABEL: atomicrmw_or_i16_acquire: 6470; RV64I: # %bb.0: 6471; RV64I-NEXT: addi sp, sp, -16 6472; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6473; RV64I-NEXT: li a2, 2 6474; RV64I-NEXT: call __atomic_fetch_or_2@plt 6475; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6476; RV64I-NEXT: addi sp, sp, 16 6477; RV64I-NEXT: ret 6478; 6479; RV64IA-LABEL: atomicrmw_or_i16_acquire: 6480; RV64IA: # %bb.0: 6481; RV64IA-NEXT: andi a2, a0, -4 6482; RV64IA-NEXT: slliw a0, a0, 3 6483; RV64IA-NEXT: slli a1, a1, 48 6484; RV64IA-NEXT: srli a1, a1, 48 6485; RV64IA-NEXT: sllw a1, a1, a0 6486; RV64IA-NEXT: amoor.w.aq a1, a1, (a2) 6487; RV64IA-NEXT: srlw a0, a1, a0 6488; RV64IA-NEXT: ret 6489 %1 = atomicrmw or i16* %a, i16 %b acquire 6490 ret i16 %1 6491} 6492 6493define i16 @atomicrmw_or_i16_release(i16 *%a, i16 %b) nounwind { 6494; RV32I-LABEL: atomicrmw_or_i16_release: 6495; RV32I: # %bb.0: 6496; RV32I-NEXT: addi sp, sp, -16 6497; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6498; RV32I-NEXT: li a2, 3 6499; RV32I-NEXT: call __atomic_fetch_or_2@plt 6500; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6501; RV32I-NEXT: addi sp, sp, 16 6502; RV32I-NEXT: ret 6503; 6504; RV32IA-LABEL: atomicrmw_or_i16_release: 6505; RV32IA: # %bb.0: 6506; RV32IA-NEXT: andi a2, a0, -4 6507; RV32IA-NEXT: slli a0, a0, 3 6508; RV32IA-NEXT: slli a1, a1, 16 6509; RV32IA-NEXT: srli a1, a1, 16 6510; RV32IA-NEXT: sll a1, a1, a0 6511; RV32IA-NEXT: amoor.w.rl a1, a1, (a2) 6512; RV32IA-NEXT: srl a0, a1, a0 6513; RV32IA-NEXT: ret 6514; 6515; RV64I-LABEL: atomicrmw_or_i16_release: 6516; RV64I: # %bb.0: 6517; RV64I-NEXT: addi sp, sp, -16 6518; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6519; RV64I-NEXT: li a2, 3 6520; RV64I-NEXT: call __atomic_fetch_or_2@plt 6521; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6522; RV64I-NEXT: addi sp, sp, 16 6523; RV64I-NEXT: ret 6524; 6525; RV64IA-LABEL: atomicrmw_or_i16_release: 6526; RV64IA: # %bb.0: 6527; RV64IA-NEXT: andi a2, a0, -4 6528; RV64IA-NEXT: slliw a0, a0, 3 6529; RV64IA-NEXT: slli a1, a1, 48 6530; RV64IA-NEXT: srli a1, a1, 48 6531; RV64IA-NEXT: sllw a1, a1, a0 6532; RV64IA-NEXT: amoor.w.rl a1, a1, (a2) 6533; RV64IA-NEXT: srlw a0, a1, a0 6534; RV64IA-NEXT: ret 6535 %1 = atomicrmw or i16* %a, i16 %b release 6536 ret i16 %1 6537} 6538 6539define i16 @atomicrmw_or_i16_acq_rel(i16 *%a, i16 %b) nounwind { 6540; RV32I-LABEL: atomicrmw_or_i16_acq_rel: 6541; RV32I: # %bb.0: 6542; RV32I-NEXT: addi sp, sp, -16 6543; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6544; RV32I-NEXT: li a2, 4 6545; RV32I-NEXT: call __atomic_fetch_or_2@plt 6546; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6547; RV32I-NEXT: addi sp, sp, 16 6548; RV32I-NEXT: ret 6549; 6550; RV32IA-LABEL: atomicrmw_or_i16_acq_rel: 6551; RV32IA: # %bb.0: 6552; RV32IA-NEXT: andi a2, a0, -4 6553; RV32IA-NEXT: slli a0, a0, 3 6554; RV32IA-NEXT: slli a1, a1, 16 6555; RV32IA-NEXT: srli a1, a1, 16 6556; RV32IA-NEXT: sll a1, a1, a0 6557; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6558; RV32IA-NEXT: srl a0, a1, a0 6559; RV32IA-NEXT: ret 6560; 6561; RV64I-LABEL: atomicrmw_or_i16_acq_rel: 6562; RV64I: # %bb.0: 6563; RV64I-NEXT: addi sp, sp, -16 6564; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6565; RV64I-NEXT: li a2, 4 6566; RV64I-NEXT: call __atomic_fetch_or_2@plt 6567; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6568; RV64I-NEXT: addi sp, sp, 16 6569; RV64I-NEXT: ret 6570; 6571; RV64IA-LABEL: atomicrmw_or_i16_acq_rel: 6572; RV64IA: # %bb.0: 6573; RV64IA-NEXT: andi a2, a0, -4 6574; RV64IA-NEXT: slliw a0, a0, 3 6575; RV64IA-NEXT: slli a1, a1, 48 6576; RV64IA-NEXT: srli a1, a1, 48 6577; RV64IA-NEXT: sllw a1, a1, a0 6578; RV64IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6579; RV64IA-NEXT: srlw a0, a1, a0 6580; RV64IA-NEXT: ret 6581 %1 = atomicrmw or i16* %a, i16 %b acq_rel 6582 ret i16 %1 6583} 6584 6585define i16 @atomicrmw_or_i16_seq_cst(i16 *%a, i16 %b) nounwind { 6586; RV32I-LABEL: atomicrmw_or_i16_seq_cst: 6587; RV32I: # %bb.0: 6588; RV32I-NEXT: addi sp, sp, -16 6589; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6590; RV32I-NEXT: li a2, 5 6591; RV32I-NEXT: call __atomic_fetch_or_2@plt 6592; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6593; RV32I-NEXT: addi sp, sp, 16 6594; RV32I-NEXT: ret 6595; 6596; RV32IA-LABEL: atomicrmw_or_i16_seq_cst: 6597; RV32IA: # %bb.0: 6598; RV32IA-NEXT: andi a2, a0, -4 6599; RV32IA-NEXT: slli a0, a0, 3 6600; RV32IA-NEXT: slli a1, a1, 16 6601; RV32IA-NEXT: srli a1, a1, 16 6602; RV32IA-NEXT: sll a1, a1, a0 6603; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6604; RV32IA-NEXT: srl a0, a1, a0 6605; RV32IA-NEXT: ret 6606; 6607; RV64I-LABEL: atomicrmw_or_i16_seq_cst: 6608; RV64I: # %bb.0: 6609; RV64I-NEXT: addi sp, sp, -16 6610; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6611; RV64I-NEXT: li a2, 5 6612; RV64I-NEXT: call __atomic_fetch_or_2@plt 6613; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6614; RV64I-NEXT: addi sp, sp, 16 6615; RV64I-NEXT: ret 6616; 6617; RV64IA-LABEL: atomicrmw_or_i16_seq_cst: 6618; RV64IA: # %bb.0: 6619; RV64IA-NEXT: andi a2, a0, -4 6620; RV64IA-NEXT: slliw a0, a0, 3 6621; RV64IA-NEXT: slli a1, a1, 48 6622; RV64IA-NEXT: srli a1, a1, 48 6623; RV64IA-NEXT: sllw a1, a1, a0 6624; RV64IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6625; RV64IA-NEXT: srlw a0, a1, a0 6626; RV64IA-NEXT: ret 6627 %1 = atomicrmw or i16* %a, i16 %b seq_cst 6628 ret i16 %1 6629} 6630 6631define i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind { 6632; RV32I-LABEL: atomicrmw_xor_i16_monotonic: 6633; RV32I: # %bb.0: 6634; RV32I-NEXT: addi sp, sp, -16 6635; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6636; RV32I-NEXT: li a2, 0 6637; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6638; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6639; RV32I-NEXT: addi sp, sp, 16 6640; RV32I-NEXT: ret 6641; 6642; RV32IA-LABEL: atomicrmw_xor_i16_monotonic: 6643; RV32IA: # %bb.0: 6644; RV32IA-NEXT: andi a2, a0, -4 6645; RV32IA-NEXT: slli a0, a0, 3 6646; RV32IA-NEXT: slli a1, a1, 16 6647; RV32IA-NEXT: srli a1, a1, 16 6648; RV32IA-NEXT: sll a1, a1, a0 6649; RV32IA-NEXT: amoxor.w a1, a1, (a2) 6650; RV32IA-NEXT: srl a0, a1, a0 6651; RV32IA-NEXT: ret 6652; 6653; RV64I-LABEL: atomicrmw_xor_i16_monotonic: 6654; RV64I: # %bb.0: 6655; RV64I-NEXT: addi sp, sp, -16 6656; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6657; RV64I-NEXT: li a2, 0 6658; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6659; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6660; RV64I-NEXT: addi sp, sp, 16 6661; RV64I-NEXT: ret 6662; 6663; RV64IA-LABEL: atomicrmw_xor_i16_monotonic: 6664; RV64IA: # %bb.0: 6665; RV64IA-NEXT: andi a2, a0, -4 6666; RV64IA-NEXT: slliw a0, a0, 3 6667; RV64IA-NEXT: slli a1, a1, 48 6668; RV64IA-NEXT: srli a1, a1, 48 6669; RV64IA-NEXT: sllw a1, a1, a0 6670; RV64IA-NEXT: amoxor.w a1, a1, (a2) 6671; RV64IA-NEXT: srlw a0, a1, a0 6672; RV64IA-NEXT: ret 6673 %1 = atomicrmw xor i16* %a, i16 %b monotonic 6674 ret i16 %1 6675} 6676 6677define i16 @atomicrmw_xor_i16_acquire(i16 *%a, i16 %b) nounwind { 6678; RV32I-LABEL: atomicrmw_xor_i16_acquire: 6679; RV32I: # %bb.0: 6680; RV32I-NEXT: addi sp, sp, -16 6681; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6682; RV32I-NEXT: li a2, 2 6683; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6684; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6685; RV32I-NEXT: addi sp, sp, 16 6686; RV32I-NEXT: ret 6687; 6688; RV32IA-LABEL: atomicrmw_xor_i16_acquire: 6689; RV32IA: # %bb.0: 6690; RV32IA-NEXT: andi a2, a0, -4 6691; RV32IA-NEXT: slli a0, a0, 3 6692; RV32IA-NEXT: slli a1, a1, 16 6693; RV32IA-NEXT: srli a1, a1, 16 6694; RV32IA-NEXT: sll a1, a1, a0 6695; RV32IA-NEXT: amoxor.w.aq a1, a1, (a2) 6696; RV32IA-NEXT: srl a0, a1, a0 6697; RV32IA-NEXT: ret 6698; 6699; RV64I-LABEL: atomicrmw_xor_i16_acquire: 6700; RV64I: # %bb.0: 6701; RV64I-NEXT: addi sp, sp, -16 6702; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6703; RV64I-NEXT: li a2, 2 6704; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6705; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6706; RV64I-NEXT: addi sp, sp, 16 6707; RV64I-NEXT: ret 6708; 6709; RV64IA-LABEL: atomicrmw_xor_i16_acquire: 6710; RV64IA: # %bb.0: 6711; RV64IA-NEXT: andi a2, a0, -4 6712; RV64IA-NEXT: slliw a0, a0, 3 6713; RV64IA-NEXT: slli a1, a1, 48 6714; RV64IA-NEXT: srli a1, a1, 48 6715; RV64IA-NEXT: sllw a1, a1, a0 6716; RV64IA-NEXT: amoxor.w.aq a1, a1, (a2) 6717; RV64IA-NEXT: srlw a0, a1, a0 6718; RV64IA-NEXT: ret 6719 %1 = atomicrmw xor i16* %a, i16 %b acquire 6720 ret i16 %1 6721} 6722 6723define i16 @atomicrmw_xor_i16_release(i16 *%a, i16 %b) nounwind { 6724; RV32I-LABEL: atomicrmw_xor_i16_release: 6725; RV32I: # %bb.0: 6726; RV32I-NEXT: addi sp, sp, -16 6727; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6728; RV32I-NEXT: li a2, 3 6729; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6730; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6731; RV32I-NEXT: addi sp, sp, 16 6732; RV32I-NEXT: ret 6733; 6734; RV32IA-LABEL: atomicrmw_xor_i16_release: 6735; RV32IA: # %bb.0: 6736; RV32IA-NEXT: andi a2, a0, -4 6737; RV32IA-NEXT: slli a0, a0, 3 6738; RV32IA-NEXT: slli a1, a1, 16 6739; RV32IA-NEXT: srli a1, a1, 16 6740; RV32IA-NEXT: sll a1, a1, a0 6741; RV32IA-NEXT: amoxor.w.rl a1, a1, (a2) 6742; RV32IA-NEXT: srl a0, a1, a0 6743; RV32IA-NEXT: ret 6744; 6745; RV64I-LABEL: atomicrmw_xor_i16_release: 6746; RV64I: # %bb.0: 6747; RV64I-NEXT: addi sp, sp, -16 6748; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6749; RV64I-NEXT: li a2, 3 6750; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6751; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6752; RV64I-NEXT: addi sp, sp, 16 6753; RV64I-NEXT: ret 6754; 6755; RV64IA-LABEL: atomicrmw_xor_i16_release: 6756; RV64IA: # %bb.0: 6757; RV64IA-NEXT: andi a2, a0, -4 6758; RV64IA-NEXT: slliw a0, a0, 3 6759; RV64IA-NEXT: slli a1, a1, 48 6760; RV64IA-NEXT: srli a1, a1, 48 6761; RV64IA-NEXT: sllw a1, a1, a0 6762; RV64IA-NEXT: amoxor.w.rl a1, a1, (a2) 6763; RV64IA-NEXT: srlw a0, a1, a0 6764; RV64IA-NEXT: ret 6765 %1 = atomicrmw xor i16* %a, i16 %b release 6766 ret i16 %1 6767} 6768 6769define i16 @atomicrmw_xor_i16_acq_rel(i16 *%a, i16 %b) nounwind { 6770; RV32I-LABEL: atomicrmw_xor_i16_acq_rel: 6771; RV32I: # %bb.0: 6772; RV32I-NEXT: addi sp, sp, -16 6773; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6774; RV32I-NEXT: li a2, 4 6775; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6776; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6777; RV32I-NEXT: addi sp, sp, 16 6778; RV32I-NEXT: ret 6779; 6780; RV32IA-LABEL: atomicrmw_xor_i16_acq_rel: 6781; RV32IA: # %bb.0: 6782; RV32IA-NEXT: andi a2, a0, -4 6783; RV32IA-NEXT: slli a0, a0, 3 6784; RV32IA-NEXT: slli a1, a1, 16 6785; RV32IA-NEXT: srli a1, a1, 16 6786; RV32IA-NEXT: sll a1, a1, a0 6787; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6788; RV32IA-NEXT: srl a0, a1, a0 6789; RV32IA-NEXT: ret 6790; 6791; RV64I-LABEL: atomicrmw_xor_i16_acq_rel: 6792; RV64I: # %bb.0: 6793; RV64I-NEXT: addi sp, sp, -16 6794; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6795; RV64I-NEXT: li a2, 4 6796; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6797; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6798; RV64I-NEXT: addi sp, sp, 16 6799; RV64I-NEXT: ret 6800; 6801; RV64IA-LABEL: atomicrmw_xor_i16_acq_rel: 6802; RV64IA: # %bb.0: 6803; RV64IA-NEXT: andi a2, a0, -4 6804; RV64IA-NEXT: slliw a0, a0, 3 6805; RV64IA-NEXT: slli a1, a1, 48 6806; RV64IA-NEXT: srli a1, a1, 48 6807; RV64IA-NEXT: sllw a1, a1, a0 6808; RV64IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6809; RV64IA-NEXT: srlw a0, a1, a0 6810; RV64IA-NEXT: ret 6811 %1 = atomicrmw xor i16* %a, i16 %b acq_rel 6812 ret i16 %1 6813} 6814 6815define i16 @atomicrmw_xor_i16_seq_cst(i16 *%a, i16 %b) nounwind { 6816; RV32I-LABEL: atomicrmw_xor_i16_seq_cst: 6817; RV32I: # %bb.0: 6818; RV32I-NEXT: addi sp, sp, -16 6819; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6820; RV32I-NEXT: li a2, 5 6821; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6822; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6823; RV32I-NEXT: addi sp, sp, 16 6824; RV32I-NEXT: ret 6825; 6826; RV32IA-LABEL: atomicrmw_xor_i16_seq_cst: 6827; RV32IA: # %bb.0: 6828; RV32IA-NEXT: andi a2, a0, -4 6829; RV32IA-NEXT: slli a0, a0, 3 6830; RV32IA-NEXT: slli a1, a1, 16 6831; RV32IA-NEXT: srli a1, a1, 16 6832; RV32IA-NEXT: sll a1, a1, a0 6833; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6834; RV32IA-NEXT: srl a0, a1, a0 6835; RV32IA-NEXT: ret 6836; 6837; RV64I-LABEL: atomicrmw_xor_i16_seq_cst: 6838; RV64I: # %bb.0: 6839; RV64I-NEXT: addi sp, sp, -16 6840; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6841; RV64I-NEXT: li a2, 5 6842; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6843; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6844; RV64I-NEXT: addi sp, sp, 16 6845; RV64I-NEXT: ret 6846; 6847; RV64IA-LABEL: atomicrmw_xor_i16_seq_cst: 6848; RV64IA: # %bb.0: 6849; RV64IA-NEXT: andi a2, a0, -4 6850; RV64IA-NEXT: slliw a0, a0, 3 6851; RV64IA-NEXT: slli a1, a1, 48 6852; RV64IA-NEXT: srli a1, a1, 48 6853; RV64IA-NEXT: sllw a1, a1, a0 6854; RV64IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6855; RV64IA-NEXT: srlw a0, a1, a0 6856; RV64IA-NEXT: ret 6857 %1 = atomicrmw xor i16* %a, i16 %b seq_cst 6858 ret i16 %1 6859} 6860 6861define i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind { 6862; RV32I-LABEL: atomicrmw_max_i16_monotonic: 6863; RV32I: # %bb.0: 6864; RV32I-NEXT: addi sp, sp, -32 6865; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6866; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6867; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6868; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6869; RV32I-NEXT: mv s0, a0 6870; RV32I-NEXT: lhu a3, 0(a0) 6871; RV32I-NEXT: mv s2, a1 6872; RV32I-NEXT: slli a0, a1, 16 6873; RV32I-NEXT: srai s1, a0, 16 6874; RV32I-NEXT: j .LBB90_2 6875; RV32I-NEXT: .LBB90_1: # %atomicrmw.start 6876; RV32I-NEXT: # in Loop: Header=BB90_2 Depth=1 6877; RV32I-NEXT: sh a3, 14(sp) 6878; RV32I-NEXT: addi a1, sp, 14 6879; RV32I-NEXT: mv a0, s0 6880; RV32I-NEXT: li a3, 0 6881; RV32I-NEXT: li a4, 0 6882; RV32I-NEXT: call __atomic_compare_exchange_2@plt 6883; RV32I-NEXT: lh a3, 14(sp) 6884; RV32I-NEXT: bnez a0, .LBB90_4 6885; RV32I-NEXT: .LBB90_2: # %atomicrmw.start 6886; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 6887; RV32I-NEXT: slli a0, a3, 16 6888; RV32I-NEXT: srai a0, a0, 16 6889; RV32I-NEXT: mv a2, a3 6890; RV32I-NEXT: blt s1, a0, .LBB90_1 6891; RV32I-NEXT: # %bb.3: # %atomicrmw.start 6892; RV32I-NEXT: # in Loop: Header=BB90_2 Depth=1 6893; RV32I-NEXT: mv a2, s2 6894; RV32I-NEXT: j .LBB90_1 6895; RV32I-NEXT: .LBB90_4: # %atomicrmw.end 6896; RV32I-NEXT: mv a0, a3 6897; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6898; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6899; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6900; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6901; RV32I-NEXT: addi sp, sp, 32 6902; RV32I-NEXT: ret 6903; 6904; RV32IA-LABEL: atomicrmw_max_i16_monotonic: 6905; RV32IA: # %bb.0: 6906; RV32IA-NEXT: andi a6, a0, -4 6907; RV32IA-NEXT: slli a0, a0, 3 6908; RV32IA-NEXT: andi a3, a0, 24 6909; RV32IA-NEXT: lui a4, 16 6910; RV32IA-NEXT: addi a4, a4, -1 6911; RV32IA-NEXT: sll a7, a4, a0 6912; RV32IA-NEXT: slli a1, a1, 16 6913; RV32IA-NEXT: srai a1, a1, 16 6914; RV32IA-NEXT: sll a1, a1, a0 6915; RV32IA-NEXT: li a5, 16 6916; RV32IA-NEXT: sub a3, a5, a3 6917; RV32IA-NEXT: .LBB90_1: # =>This Inner Loop Header: Depth=1 6918; RV32IA-NEXT: lr.w a5, (a6) 6919; RV32IA-NEXT: and a4, a5, a7 6920; RV32IA-NEXT: mv a2, a5 6921; RV32IA-NEXT: sll a4, a4, a3 6922; RV32IA-NEXT: sra a4, a4, a3 6923; RV32IA-NEXT: bge a4, a1, .LBB90_3 6924; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB90_1 Depth=1 6925; RV32IA-NEXT: xor a2, a5, a1 6926; RV32IA-NEXT: and a2, a2, a7 6927; RV32IA-NEXT: xor a2, a5, a2 6928; RV32IA-NEXT: .LBB90_3: # in Loop: Header=BB90_1 Depth=1 6929; RV32IA-NEXT: sc.w a2, a2, (a6) 6930; RV32IA-NEXT: bnez a2, .LBB90_1 6931; RV32IA-NEXT: # %bb.4: 6932; RV32IA-NEXT: srl a0, a5, a0 6933; RV32IA-NEXT: ret 6934; 6935; RV64I-LABEL: atomicrmw_max_i16_monotonic: 6936; RV64I: # %bb.0: 6937; RV64I-NEXT: addi sp, sp, -48 6938; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6939; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6940; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6941; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6942; RV64I-NEXT: mv s0, a0 6943; RV64I-NEXT: lhu a3, 0(a0) 6944; RV64I-NEXT: mv s2, a1 6945; RV64I-NEXT: slli a0, a1, 48 6946; RV64I-NEXT: srai s1, a0, 48 6947; RV64I-NEXT: j .LBB90_2 6948; RV64I-NEXT: .LBB90_1: # %atomicrmw.start 6949; RV64I-NEXT: # in Loop: Header=BB90_2 Depth=1 6950; RV64I-NEXT: sh a3, 14(sp) 6951; RV64I-NEXT: addi a1, sp, 14 6952; RV64I-NEXT: mv a0, s0 6953; RV64I-NEXT: li a3, 0 6954; RV64I-NEXT: li a4, 0 6955; RV64I-NEXT: call __atomic_compare_exchange_2@plt 6956; RV64I-NEXT: lh a3, 14(sp) 6957; RV64I-NEXT: bnez a0, .LBB90_4 6958; RV64I-NEXT: .LBB90_2: # %atomicrmw.start 6959; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6960; RV64I-NEXT: slli a0, a3, 48 6961; RV64I-NEXT: srai a0, a0, 48 6962; RV64I-NEXT: mv a2, a3 6963; RV64I-NEXT: blt s1, a0, .LBB90_1 6964; RV64I-NEXT: # %bb.3: # %atomicrmw.start 6965; RV64I-NEXT: # in Loop: Header=BB90_2 Depth=1 6966; RV64I-NEXT: mv a2, s2 6967; RV64I-NEXT: j .LBB90_1 6968; RV64I-NEXT: .LBB90_4: # %atomicrmw.end 6969; RV64I-NEXT: mv a0, a3 6970; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6971; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6972; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6973; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6974; RV64I-NEXT: addi sp, sp, 48 6975; RV64I-NEXT: ret 6976; 6977; RV64IA-LABEL: atomicrmw_max_i16_monotonic: 6978; RV64IA: # %bb.0: 6979; RV64IA-NEXT: andi a6, a0, -4 6980; RV64IA-NEXT: slliw a0, a0, 3 6981; RV64IA-NEXT: andi a3, a0, 24 6982; RV64IA-NEXT: lui a4, 16 6983; RV64IA-NEXT: addiw a4, a4, -1 6984; RV64IA-NEXT: sllw a7, a4, a0 6985; RV64IA-NEXT: slli a1, a1, 48 6986; RV64IA-NEXT: srai a1, a1, 48 6987; RV64IA-NEXT: sllw a1, a1, a0 6988; RV64IA-NEXT: li a5, 48 6989; RV64IA-NEXT: sub a3, a5, a3 6990; RV64IA-NEXT: .LBB90_1: # =>This Inner Loop Header: Depth=1 6991; RV64IA-NEXT: lr.w a5, (a6) 6992; RV64IA-NEXT: and a4, a5, a7 6993; RV64IA-NEXT: mv a2, a5 6994; RV64IA-NEXT: sll a4, a4, a3 6995; RV64IA-NEXT: sra a4, a4, a3 6996; RV64IA-NEXT: bge a4, a1, .LBB90_3 6997; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB90_1 Depth=1 6998; RV64IA-NEXT: xor a2, a5, a1 6999; RV64IA-NEXT: and a2, a2, a7 7000; RV64IA-NEXT: xor a2, a5, a2 7001; RV64IA-NEXT: .LBB90_3: # in Loop: Header=BB90_1 Depth=1 7002; RV64IA-NEXT: sc.w a2, a2, (a6) 7003; RV64IA-NEXT: bnez a2, .LBB90_1 7004; RV64IA-NEXT: # %bb.4: 7005; RV64IA-NEXT: srlw a0, a5, a0 7006; RV64IA-NEXT: ret 7007 %1 = atomicrmw max i16* %a, i16 %b monotonic 7008 ret i16 %1 7009} 7010 7011define i16 @atomicrmw_max_i16_acquire(i16 *%a, i16 %b) nounwind { 7012; RV32I-LABEL: atomicrmw_max_i16_acquire: 7013; RV32I: # %bb.0: 7014; RV32I-NEXT: addi sp, sp, -32 7015; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7016; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7017; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7018; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7019; RV32I-NEXT: mv s0, a0 7020; RV32I-NEXT: lhu a3, 0(a0) 7021; RV32I-NEXT: mv s2, a1 7022; RV32I-NEXT: slli a0, a1, 16 7023; RV32I-NEXT: srai s1, a0, 16 7024; RV32I-NEXT: j .LBB91_2 7025; RV32I-NEXT: .LBB91_1: # %atomicrmw.start 7026; RV32I-NEXT: # in Loop: Header=BB91_2 Depth=1 7027; RV32I-NEXT: sh a3, 14(sp) 7028; RV32I-NEXT: addi a1, sp, 14 7029; RV32I-NEXT: li a3, 2 7030; RV32I-NEXT: li a4, 2 7031; RV32I-NEXT: mv a0, s0 7032; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7033; RV32I-NEXT: lh a3, 14(sp) 7034; RV32I-NEXT: bnez a0, .LBB91_4 7035; RV32I-NEXT: .LBB91_2: # %atomicrmw.start 7036; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7037; RV32I-NEXT: slli a0, a3, 16 7038; RV32I-NEXT: srai a0, a0, 16 7039; RV32I-NEXT: mv a2, a3 7040; RV32I-NEXT: blt s1, a0, .LBB91_1 7041; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7042; RV32I-NEXT: # in Loop: Header=BB91_2 Depth=1 7043; RV32I-NEXT: mv a2, s2 7044; RV32I-NEXT: j .LBB91_1 7045; RV32I-NEXT: .LBB91_4: # %atomicrmw.end 7046; RV32I-NEXT: mv a0, a3 7047; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7048; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7049; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7050; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7051; RV32I-NEXT: addi sp, sp, 32 7052; RV32I-NEXT: ret 7053; 7054; RV32IA-LABEL: atomicrmw_max_i16_acquire: 7055; RV32IA: # %bb.0: 7056; RV32IA-NEXT: andi a6, a0, -4 7057; RV32IA-NEXT: slli a0, a0, 3 7058; RV32IA-NEXT: andi a3, a0, 24 7059; RV32IA-NEXT: lui a4, 16 7060; RV32IA-NEXT: addi a4, a4, -1 7061; RV32IA-NEXT: sll a7, a4, a0 7062; RV32IA-NEXT: slli a1, a1, 16 7063; RV32IA-NEXT: srai a1, a1, 16 7064; RV32IA-NEXT: sll a1, a1, a0 7065; RV32IA-NEXT: li a5, 16 7066; RV32IA-NEXT: sub a3, a5, a3 7067; RV32IA-NEXT: .LBB91_1: # =>This Inner Loop Header: Depth=1 7068; RV32IA-NEXT: lr.w.aq a5, (a6) 7069; RV32IA-NEXT: and a4, a5, a7 7070; RV32IA-NEXT: mv a2, a5 7071; RV32IA-NEXT: sll a4, a4, a3 7072; RV32IA-NEXT: sra a4, a4, a3 7073; RV32IA-NEXT: bge a4, a1, .LBB91_3 7074; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB91_1 Depth=1 7075; RV32IA-NEXT: xor a2, a5, a1 7076; RV32IA-NEXT: and a2, a2, a7 7077; RV32IA-NEXT: xor a2, a5, a2 7078; RV32IA-NEXT: .LBB91_3: # in Loop: Header=BB91_1 Depth=1 7079; RV32IA-NEXT: sc.w a2, a2, (a6) 7080; RV32IA-NEXT: bnez a2, .LBB91_1 7081; RV32IA-NEXT: # %bb.4: 7082; RV32IA-NEXT: srl a0, a5, a0 7083; RV32IA-NEXT: ret 7084; 7085; RV64I-LABEL: atomicrmw_max_i16_acquire: 7086; RV64I: # %bb.0: 7087; RV64I-NEXT: addi sp, sp, -48 7088; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7089; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7090; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7091; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7092; RV64I-NEXT: mv s0, a0 7093; RV64I-NEXT: lhu a3, 0(a0) 7094; RV64I-NEXT: mv s2, a1 7095; RV64I-NEXT: slli a0, a1, 48 7096; RV64I-NEXT: srai s1, a0, 48 7097; RV64I-NEXT: j .LBB91_2 7098; RV64I-NEXT: .LBB91_1: # %atomicrmw.start 7099; RV64I-NEXT: # in Loop: Header=BB91_2 Depth=1 7100; RV64I-NEXT: sh a3, 14(sp) 7101; RV64I-NEXT: addi a1, sp, 14 7102; RV64I-NEXT: li a3, 2 7103; RV64I-NEXT: li a4, 2 7104; RV64I-NEXT: mv a0, s0 7105; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7106; RV64I-NEXT: lh a3, 14(sp) 7107; RV64I-NEXT: bnez a0, .LBB91_4 7108; RV64I-NEXT: .LBB91_2: # %atomicrmw.start 7109; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7110; RV64I-NEXT: slli a0, a3, 48 7111; RV64I-NEXT: srai a0, a0, 48 7112; RV64I-NEXT: mv a2, a3 7113; RV64I-NEXT: blt s1, a0, .LBB91_1 7114; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7115; RV64I-NEXT: # in Loop: Header=BB91_2 Depth=1 7116; RV64I-NEXT: mv a2, s2 7117; RV64I-NEXT: j .LBB91_1 7118; RV64I-NEXT: .LBB91_4: # %atomicrmw.end 7119; RV64I-NEXT: mv a0, a3 7120; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7121; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7122; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7123; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7124; RV64I-NEXT: addi sp, sp, 48 7125; RV64I-NEXT: ret 7126; 7127; RV64IA-LABEL: atomicrmw_max_i16_acquire: 7128; RV64IA: # %bb.0: 7129; RV64IA-NEXT: andi a6, a0, -4 7130; RV64IA-NEXT: slliw a0, a0, 3 7131; RV64IA-NEXT: andi a3, a0, 24 7132; RV64IA-NEXT: lui a4, 16 7133; RV64IA-NEXT: addiw a4, a4, -1 7134; RV64IA-NEXT: sllw a7, a4, a0 7135; RV64IA-NEXT: slli a1, a1, 48 7136; RV64IA-NEXT: srai a1, a1, 48 7137; RV64IA-NEXT: sllw a1, a1, a0 7138; RV64IA-NEXT: li a5, 48 7139; RV64IA-NEXT: sub a3, a5, a3 7140; RV64IA-NEXT: .LBB91_1: # =>This Inner Loop Header: Depth=1 7141; RV64IA-NEXT: lr.w.aq a5, (a6) 7142; RV64IA-NEXT: and a4, a5, a7 7143; RV64IA-NEXT: mv a2, a5 7144; RV64IA-NEXT: sll a4, a4, a3 7145; RV64IA-NEXT: sra a4, a4, a3 7146; RV64IA-NEXT: bge a4, a1, .LBB91_3 7147; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB91_1 Depth=1 7148; RV64IA-NEXT: xor a2, a5, a1 7149; RV64IA-NEXT: and a2, a2, a7 7150; RV64IA-NEXT: xor a2, a5, a2 7151; RV64IA-NEXT: .LBB91_3: # in Loop: Header=BB91_1 Depth=1 7152; RV64IA-NEXT: sc.w a2, a2, (a6) 7153; RV64IA-NEXT: bnez a2, .LBB91_1 7154; RV64IA-NEXT: # %bb.4: 7155; RV64IA-NEXT: srlw a0, a5, a0 7156; RV64IA-NEXT: ret 7157 %1 = atomicrmw max i16* %a, i16 %b acquire 7158 ret i16 %1 7159} 7160 7161define i16 @atomicrmw_max_i16_release(i16 *%a, i16 %b) nounwind { 7162; RV32I-LABEL: atomicrmw_max_i16_release: 7163; RV32I: # %bb.0: 7164; RV32I-NEXT: addi sp, sp, -32 7165; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7166; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7167; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7168; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7169; RV32I-NEXT: mv s0, a0 7170; RV32I-NEXT: lhu a3, 0(a0) 7171; RV32I-NEXT: mv s2, a1 7172; RV32I-NEXT: slli a0, a1, 16 7173; RV32I-NEXT: srai s1, a0, 16 7174; RV32I-NEXT: j .LBB92_2 7175; RV32I-NEXT: .LBB92_1: # %atomicrmw.start 7176; RV32I-NEXT: # in Loop: Header=BB92_2 Depth=1 7177; RV32I-NEXT: sh a3, 14(sp) 7178; RV32I-NEXT: addi a1, sp, 14 7179; RV32I-NEXT: li a3, 3 7180; RV32I-NEXT: mv a0, s0 7181; RV32I-NEXT: li a4, 0 7182; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7183; RV32I-NEXT: lh a3, 14(sp) 7184; RV32I-NEXT: bnez a0, .LBB92_4 7185; RV32I-NEXT: .LBB92_2: # %atomicrmw.start 7186; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7187; RV32I-NEXT: slli a0, a3, 16 7188; RV32I-NEXT: srai a0, a0, 16 7189; RV32I-NEXT: mv a2, a3 7190; RV32I-NEXT: blt s1, a0, .LBB92_1 7191; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7192; RV32I-NEXT: # in Loop: Header=BB92_2 Depth=1 7193; RV32I-NEXT: mv a2, s2 7194; RV32I-NEXT: j .LBB92_1 7195; RV32I-NEXT: .LBB92_4: # %atomicrmw.end 7196; RV32I-NEXT: mv a0, a3 7197; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7198; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7199; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7200; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7201; RV32I-NEXT: addi sp, sp, 32 7202; RV32I-NEXT: ret 7203; 7204; RV32IA-LABEL: atomicrmw_max_i16_release: 7205; RV32IA: # %bb.0: 7206; RV32IA-NEXT: andi a6, a0, -4 7207; RV32IA-NEXT: slli a0, a0, 3 7208; RV32IA-NEXT: andi a3, a0, 24 7209; RV32IA-NEXT: lui a4, 16 7210; RV32IA-NEXT: addi a4, a4, -1 7211; RV32IA-NEXT: sll a7, a4, a0 7212; RV32IA-NEXT: slli a1, a1, 16 7213; RV32IA-NEXT: srai a1, a1, 16 7214; RV32IA-NEXT: sll a1, a1, a0 7215; RV32IA-NEXT: li a5, 16 7216; RV32IA-NEXT: sub a3, a5, a3 7217; RV32IA-NEXT: .LBB92_1: # =>This Inner Loop Header: Depth=1 7218; RV32IA-NEXT: lr.w a5, (a6) 7219; RV32IA-NEXT: and a4, a5, a7 7220; RV32IA-NEXT: mv a2, a5 7221; RV32IA-NEXT: sll a4, a4, a3 7222; RV32IA-NEXT: sra a4, a4, a3 7223; RV32IA-NEXT: bge a4, a1, .LBB92_3 7224; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB92_1 Depth=1 7225; RV32IA-NEXT: xor a2, a5, a1 7226; RV32IA-NEXT: and a2, a2, a7 7227; RV32IA-NEXT: xor a2, a5, a2 7228; RV32IA-NEXT: .LBB92_3: # in Loop: Header=BB92_1 Depth=1 7229; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 7230; RV32IA-NEXT: bnez a2, .LBB92_1 7231; RV32IA-NEXT: # %bb.4: 7232; RV32IA-NEXT: srl a0, a5, a0 7233; RV32IA-NEXT: ret 7234; 7235; RV64I-LABEL: atomicrmw_max_i16_release: 7236; RV64I: # %bb.0: 7237; RV64I-NEXT: addi sp, sp, -48 7238; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7239; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7240; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7241; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7242; RV64I-NEXT: mv s0, a0 7243; RV64I-NEXT: lhu a3, 0(a0) 7244; RV64I-NEXT: mv s2, a1 7245; RV64I-NEXT: slli a0, a1, 48 7246; RV64I-NEXT: srai s1, a0, 48 7247; RV64I-NEXT: j .LBB92_2 7248; RV64I-NEXT: .LBB92_1: # %atomicrmw.start 7249; RV64I-NEXT: # in Loop: Header=BB92_2 Depth=1 7250; RV64I-NEXT: sh a3, 14(sp) 7251; RV64I-NEXT: addi a1, sp, 14 7252; RV64I-NEXT: li a3, 3 7253; RV64I-NEXT: mv a0, s0 7254; RV64I-NEXT: li a4, 0 7255; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7256; RV64I-NEXT: lh a3, 14(sp) 7257; RV64I-NEXT: bnez a0, .LBB92_4 7258; RV64I-NEXT: .LBB92_2: # %atomicrmw.start 7259; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7260; RV64I-NEXT: slli a0, a3, 48 7261; RV64I-NEXT: srai a0, a0, 48 7262; RV64I-NEXT: mv a2, a3 7263; RV64I-NEXT: blt s1, a0, .LBB92_1 7264; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7265; RV64I-NEXT: # in Loop: Header=BB92_2 Depth=1 7266; RV64I-NEXT: mv a2, s2 7267; RV64I-NEXT: j .LBB92_1 7268; RV64I-NEXT: .LBB92_4: # %atomicrmw.end 7269; RV64I-NEXT: mv a0, a3 7270; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7271; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7272; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7273; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7274; RV64I-NEXT: addi sp, sp, 48 7275; RV64I-NEXT: ret 7276; 7277; RV64IA-LABEL: atomicrmw_max_i16_release: 7278; RV64IA: # %bb.0: 7279; RV64IA-NEXT: andi a6, a0, -4 7280; RV64IA-NEXT: slliw a0, a0, 3 7281; RV64IA-NEXT: andi a3, a0, 24 7282; RV64IA-NEXT: lui a4, 16 7283; RV64IA-NEXT: addiw a4, a4, -1 7284; RV64IA-NEXT: sllw a7, a4, a0 7285; RV64IA-NEXT: slli a1, a1, 48 7286; RV64IA-NEXT: srai a1, a1, 48 7287; RV64IA-NEXT: sllw a1, a1, a0 7288; RV64IA-NEXT: li a5, 48 7289; RV64IA-NEXT: sub a3, a5, a3 7290; RV64IA-NEXT: .LBB92_1: # =>This Inner Loop Header: Depth=1 7291; RV64IA-NEXT: lr.w a5, (a6) 7292; RV64IA-NEXT: and a4, a5, a7 7293; RV64IA-NEXT: mv a2, a5 7294; RV64IA-NEXT: sll a4, a4, a3 7295; RV64IA-NEXT: sra a4, a4, a3 7296; RV64IA-NEXT: bge a4, a1, .LBB92_3 7297; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB92_1 Depth=1 7298; RV64IA-NEXT: xor a2, a5, a1 7299; RV64IA-NEXT: and a2, a2, a7 7300; RV64IA-NEXT: xor a2, a5, a2 7301; RV64IA-NEXT: .LBB92_3: # in Loop: Header=BB92_1 Depth=1 7302; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 7303; RV64IA-NEXT: bnez a2, .LBB92_1 7304; RV64IA-NEXT: # %bb.4: 7305; RV64IA-NEXT: srlw a0, a5, a0 7306; RV64IA-NEXT: ret 7307 %1 = atomicrmw max i16* %a, i16 %b release 7308 ret i16 %1 7309} 7310 7311define i16 @atomicrmw_max_i16_acq_rel(i16 *%a, i16 %b) nounwind { 7312; RV32I-LABEL: atomicrmw_max_i16_acq_rel: 7313; RV32I: # %bb.0: 7314; RV32I-NEXT: addi sp, sp, -32 7315; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7316; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7317; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7318; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7319; RV32I-NEXT: mv s0, a0 7320; RV32I-NEXT: lhu a3, 0(a0) 7321; RV32I-NEXT: mv s2, a1 7322; RV32I-NEXT: slli a0, a1, 16 7323; RV32I-NEXT: srai s1, a0, 16 7324; RV32I-NEXT: j .LBB93_2 7325; RV32I-NEXT: .LBB93_1: # %atomicrmw.start 7326; RV32I-NEXT: # in Loop: Header=BB93_2 Depth=1 7327; RV32I-NEXT: sh a3, 14(sp) 7328; RV32I-NEXT: addi a1, sp, 14 7329; RV32I-NEXT: li a3, 4 7330; RV32I-NEXT: li a4, 2 7331; RV32I-NEXT: mv a0, s0 7332; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7333; RV32I-NEXT: lh a3, 14(sp) 7334; RV32I-NEXT: bnez a0, .LBB93_4 7335; RV32I-NEXT: .LBB93_2: # %atomicrmw.start 7336; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7337; RV32I-NEXT: slli a0, a3, 16 7338; RV32I-NEXT: srai a0, a0, 16 7339; RV32I-NEXT: mv a2, a3 7340; RV32I-NEXT: blt s1, a0, .LBB93_1 7341; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7342; RV32I-NEXT: # in Loop: Header=BB93_2 Depth=1 7343; RV32I-NEXT: mv a2, s2 7344; RV32I-NEXT: j .LBB93_1 7345; RV32I-NEXT: .LBB93_4: # %atomicrmw.end 7346; RV32I-NEXT: mv a0, a3 7347; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7348; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7349; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7350; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7351; RV32I-NEXT: addi sp, sp, 32 7352; RV32I-NEXT: ret 7353; 7354; RV32IA-LABEL: atomicrmw_max_i16_acq_rel: 7355; RV32IA: # %bb.0: 7356; RV32IA-NEXT: andi a6, a0, -4 7357; RV32IA-NEXT: slli a0, a0, 3 7358; RV32IA-NEXT: andi a3, a0, 24 7359; RV32IA-NEXT: lui a4, 16 7360; RV32IA-NEXT: addi a4, a4, -1 7361; RV32IA-NEXT: sll a7, a4, a0 7362; RV32IA-NEXT: slli a1, a1, 16 7363; RV32IA-NEXT: srai a1, a1, 16 7364; RV32IA-NEXT: sll a1, a1, a0 7365; RV32IA-NEXT: li a5, 16 7366; RV32IA-NEXT: sub a3, a5, a3 7367; RV32IA-NEXT: .LBB93_1: # =>This Inner Loop Header: Depth=1 7368; RV32IA-NEXT: lr.w.aq a5, (a6) 7369; RV32IA-NEXT: and a4, a5, a7 7370; RV32IA-NEXT: mv a2, a5 7371; RV32IA-NEXT: sll a4, a4, a3 7372; RV32IA-NEXT: sra a4, a4, a3 7373; RV32IA-NEXT: bge a4, a1, .LBB93_3 7374; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB93_1 Depth=1 7375; RV32IA-NEXT: xor a2, a5, a1 7376; RV32IA-NEXT: and a2, a2, a7 7377; RV32IA-NEXT: xor a2, a5, a2 7378; RV32IA-NEXT: .LBB93_3: # in Loop: Header=BB93_1 Depth=1 7379; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 7380; RV32IA-NEXT: bnez a2, .LBB93_1 7381; RV32IA-NEXT: # %bb.4: 7382; RV32IA-NEXT: srl a0, a5, a0 7383; RV32IA-NEXT: ret 7384; 7385; RV64I-LABEL: atomicrmw_max_i16_acq_rel: 7386; RV64I: # %bb.0: 7387; RV64I-NEXT: addi sp, sp, -48 7388; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7389; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7390; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7391; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7392; RV64I-NEXT: mv s0, a0 7393; RV64I-NEXT: lhu a3, 0(a0) 7394; RV64I-NEXT: mv s2, a1 7395; RV64I-NEXT: slli a0, a1, 48 7396; RV64I-NEXT: srai s1, a0, 48 7397; RV64I-NEXT: j .LBB93_2 7398; RV64I-NEXT: .LBB93_1: # %atomicrmw.start 7399; RV64I-NEXT: # in Loop: Header=BB93_2 Depth=1 7400; RV64I-NEXT: sh a3, 14(sp) 7401; RV64I-NEXT: addi a1, sp, 14 7402; RV64I-NEXT: li a3, 4 7403; RV64I-NEXT: li a4, 2 7404; RV64I-NEXT: mv a0, s0 7405; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7406; RV64I-NEXT: lh a3, 14(sp) 7407; RV64I-NEXT: bnez a0, .LBB93_4 7408; RV64I-NEXT: .LBB93_2: # %atomicrmw.start 7409; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7410; RV64I-NEXT: slli a0, a3, 48 7411; RV64I-NEXT: srai a0, a0, 48 7412; RV64I-NEXT: mv a2, a3 7413; RV64I-NEXT: blt s1, a0, .LBB93_1 7414; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7415; RV64I-NEXT: # in Loop: Header=BB93_2 Depth=1 7416; RV64I-NEXT: mv a2, s2 7417; RV64I-NEXT: j .LBB93_1 7418; RV64I-NEXT: .LBB93_4: # %atomicrmw.end 7419; RV64I-NEXT: mv a0, a3 7420; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7421; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7422; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7423; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7424; RV64I-NEXT: addi sp, sp, 48 7425; RV64I-NEXT: ret 7426; 7427; RV64IA-LABEL: atomicrmw_max_i16_acq_rel: 7428; RV64IA: # %bb.0: 7429; RV64IA-NEXT: andi a6, a0, -4 7430; RV64IA-NEXT: slliw a0, a0, 3 7431; RV64IA-NEXT: andi a3, a0, 24 7432; RV64IA-NEXT: lui a4, 16 7433; RV64IA-NEXT: addiw a4, a4, -1 7434; RV64IA-NEXT: sllw a7, a4, a0 7435; RV64IA-NEXT: slli a1, a1, 48 7436; RV64IA-NEXT: srai a1, a1, 48 7437; RV64IA-NEXT: sllw a1, a1, a0 7438; RV64IA-NEXT: li a5, 48 7439; RV64IA-NEXT: sub a3, a5, a3 7440; RV64IA-NEXT: .LBB93_1: # =>This Inner Loop Header: Depth=1 7441; RV64IA-NEXT: lr.w.aq a5, (a6) 7442; RV64IA-NEXT: and a4, a5, a7 7443; RV64IA-NEXT: mv a2, a5 7444; RV64IA-NEXT: sll a4, a4, a3 7445; RV64IA-NEXT: sra a4, a4, a3 7446; RV64IA-NEXT: bge a4, a1, .LBB93_3 7447; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB93_1 Depth=1 7448; RV64IA-NEXT: xor a2, a5, a1 7449; RV64IA-NEXT: and a2, a2, a7 7450; RV64IA-NEXT: xor a2, a5, a2 7451; RV64IA-NEXT: .LBB93_3: # in Loop: Header=BB93_1 Depth=1 7452; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 7453; RV64IA-NEXT: bnez a2, .LBB93_1 7454; RV64IA-NEXT: # %bb.4: 7455; RV64IA-NEXT: srlw a0, a5, a0 7456; RV64IA-NEXT: ret 7457 %1 = atomicrmw max i16* %a, i16 %b acq_rel 7458 ret i16 %1 7459} 7460 7461define i16 @atomicrmw_max_i16_seq_cst(i16 *%a, i16 %b) nounwind { 7462; RV32I-LABEL: atomicrmw_max_i16_seq_cst: 7463; RV32I: # %bb.0: 7464; RV32I-NEXT: addi sp, sp, -32 7465; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7466; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7467; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7468; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7469; RV32I-NEXT: mv s0, a0 7470; RV32I-NEXT: lhu a3, 0(a0) 7471; RV32I-NEXT: mv s2, a1 7472; RV32I-NEXT: slli a0, a1, 16 7473; RV32I-NEXT: srai s1, a0, 16 7474; RV32I-NEXT: j .LBB94_2 7475; RV32I-NEXT: .LBB94_1: # %atomicrmw.start 7476; RV32I-NEXT: # in Loop: Header=BB94_2 Depth=1 7477; RV32I-NEXT: sh a3, 14(sp) 7478; RV32I-NEXT: addi a1, sp, 14 7479; RV32I-NEXT: li a3, 5 7480; RV32I-NEXT: li a4, 5 7481; RV32I-NEXT: mv a0, s0 7482; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7483; RV32I-NEXT: lh a3, 14(sp) 7484; RV32I-NEXT: bnez a0, .LBB94_4 7485; RV32I-NEXT: .LBB94_2: # %atomicrmw.start 7486; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7487; RV32I-NEXT: slli a0, a3, 16 7488; RV32I-NEXT: srai a0, a0, 16 7489; RV32I-NEXT: mv a2, a3 7490; RV32I-NEXT: blt s1, a0, .LBB94_1 7491; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7492; RV32I-NEXT: # in Loop: Header=BB94_2 Depth=1 7493; RV32I-NEXT: mv a2, s2 7494; RV32I-NEXT: j .LBB94_1 7495; RV32I-NEXT: .LBB94_4: # %atomicrmw.end 7496; RV32I-NEXT: mv a0, a3 7497; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7498; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7499; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7500; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7501; RV32I-NEXT: addi sp, sp, 32 7502; RV32I-NEXT: ret 7503; 7504; RV32IA-LABEL: atomicrmw_max_i16_seq_cst: 7505; RV32IA: # %bb.0: 7506; RV32IA-NEXT: andi a6, a0, -4 7507; RV32IA-NEXT: slli a0, a0, 3 7508; RV32IA-NEXT: andi a3, a0, 24 7509; RV32IA-NEXT: lui a4, 16 7510; RV32IA-NEXT: addi a4, a4, -1 7511; RV32IA-NEXT: sll a7, a4, a0 7512; RV32IA-NEXT: slli a1, a1, 16 7513; RV32IA-NEXT: srai a1, a1, 16 7514; RV32IA-NEXT: sll a1, a1, a0 7515; RV32IA-NEXT: li a5, 16 7516; RV32IA-NEXT: sub a3, a5, a3 7517; RV32IA-NEXT: .LBB94_1: # =>This Inner Loop Header: Depth=1 7518; RV32IA-NEXT: lr.w.aqrl a5, (a6) 7519; RV32IA-NEXT: and a4, a5, a7 7520; RV32IA-NEXT: mv a2, a5 7521; RV32IA-NEXT: sll a4, a4, a3 7522; RV32IA-NEXT: sra a4, a4, a3 7523; RV32IA-NEXT: bge a4, a1, .LBB94_3 7524; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB94_1 Depth=1 7525; RV32IA-NEXT: xor a2, a5, a1 7526; RV32IA-NEXT: and a2, a2, a7 7527; RV32IA-NEXT: xor a2, a5, a2 7528; RV32IA-NEXT: .LBB94_3: # in Loop: Header=BB94_1 Depth=1 7529; RV32IA-NEXT: sc.w.aqrl a2, a2, (a6) 7530; RV32IA-NEXT: bnez a2, .LBB94_1 7531; RV32IA-NEXT: # %bb.4: 7532; RV32IA-NEXT: srl a0, a5, a0 7533; RV32IA-NEXT: ret 7534; 7535; RV64I-LABEL: atomicrmw_max_i16_seq_cst: 7536; RV64I: # %bb.0: 7537; RV64I-NEXT: addi sp, sp, -48 7538; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7539; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7540; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7541; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7542; RV64I-NEXT: mv s0, a0 7543; RV64I-NEXT: lhu a3, 0(a0) 7544; RV64I-NEXT: mv s2, a1 7545; RV64I-NEXT: slli a0, a1, 48 7546; RV64I-NEXT: srai s1, a0, 48 7547; RV64I-NEXT: j .LBB94_2 7548; RV64I-NEXT: .LBB94_1: # %atomicrmw.start 7549; RV64I-NEXT: # in Loop: Header=BB94_2 Depth=1 7550; RV64I-NEXT: sh a3, 14(sp) 7551; RV64I-NEXT: addi a1, sp, 14 7552; RV64I-NEXT: li a3, 5 7553; RV64I-NEXT: li a4, 5 7554; RV64I-NEXT: mv a0, s0 7555; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7556; RV64I-NEXT: lh a3, 14(sp) 7557; RV64I-NEXT: bnez a0, .LBB94_4 7558; RV64I-NEXT: .LBB94_2: # %atomicrmw.start 7559; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7560; RV64I-NEXT: slli a0, a3, 48 7561; RV64I-NEXT: srai a0, a0, 48 7562; RV64I-NEXT: mv a2, a3 7563; RV64I-NEXT: blt s1, a0, .LBB94_1 7564; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7565; RV64I-NEXT: # in Loop: Header=BB94_2 Depth=1 7566; RV64I-NEXT: mv a2, s2 7567; RV64I-NEXT: j .LBB94_1 7568; RV64I-NEXT: .LBB94_4: # %atomicrmw.end 7569; RV64I-NEXT: mv a0, a3 7570; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7571; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7572; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7573; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7574; RV64I-NEXT: addi sp, sp, 48 7575; RV64I-NEXT: ret 7576; 7577; RV64IA-LABEL: atomicrmw_max_i16_seq_cst: 7578; RV64IA: # %bb.0: 7579; RV64IA-NEXT: andi a6, a0, -4 7580; RV64IA-NEXT: slliw a0, a0, 3 7581; RV64IA-NEXT: andi a3, a0, 24 7582; RV64IA-NEXT: lui a4, 16 7583; RV64IA-NEXT: addiw a4, a4, -1 7584; RV64IA-NEXT: sllw a7, a4, a0 7585; RV64IA-NEXT: slli a1, a1, 48 7586; RV64IA-NEXT: srai a1, a1, 48 7587; RV64IA-NEXT: sllw a1, a1, a0 7588; RV64IA-NEXT: li a5, 48 7589; RV64IA-NEXT: sub a3, a5, a3 7590; RV64IA-NEXT: .LBB94_1: # =>This Inner Loop Header: Depth=1 7591; RV64IA-NEXT: lr.w.aqrl a5, (a6) 7592; RV64IA-NEXT: and a4, a5, a7 7593; RV64IA-NEXT: mv a2, a5 7594; RV64IA-NEXT: sll a4, a4, a3 7595; RV64IA-NEXT: sra a4, a4, a3 7596; RV64IA-NEXT: bge a4, a1, .LBB94_3 7597; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB94_1 Depth=1 7598; RV64IA-NEXT: xor a2, a5, a1 7599; RV64IA-NEXT: and a2, a2, a7 7600; RV64IA-NEXT: xor a2, a5, a2 7601; RV64IA-NEXT: .LBB94_3: # in Loop: Header=BB94_1 Depth=1 7602; RV64IA-NEXT: sc.w.aqrl a2, a2, (a6) 7603; RV64IA-NEXT: bnez a2, .LBB94_1 7604; RV64IA-NEXT: # %bb.4: 7605; RV64IA-NEXT: srlw a0, a5, a0 7606; RV64IA-NEXT: ret 7607 %1 = atomicrmw max i16* %a, i16 %b seq_cst 7608 ret i16 %1 7609} 7610 7611define i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind { 7612; RV32I-LABEL: atomicrmw_min_i16_monotonic: 7613; RV32I: # %bb.0: 7614; RV32I-NEXT: addi sp, sp, -32 7615; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7616; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7617; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7618; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7619; RV32I-NEXT: mv s0, a0 7620; RV32I-NEXT: lhu a3, 0(a0) 7621; RV32I-NEXT: mv s2, a1 7622; RV32I-NEXT: slli a0, a1, 16 7623; RV32I-NEXT: srai s1, a0, 16 7624; RV32I-NEXT: j .LBB95_2 7625; RV32I-NEXT: .LBB95_1: # %atomicrmw.start 7626; RV32I-NEXT: # in Loop: Header=BB95_2 Depth=1 7627; RV32I-NEXT: sh a3, 14(sp) 7628; RV32I-NEXT: addi a1, sp, 14 7629; RV32I-NEXT: mv a0, s0 7630; RV32I-NEXT: li a3, 0 7631; RV32I-NEXT: li a4, 0 7632; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7633; RV32I-NEXT: lh a3, 14(sp) 7634; RV32I-NEXT: bnez a0, .LBB95_4 7635; RV32I-NEXT: .LBB95_2: # %atomicrmw.start 7636; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7637; RV32I-NEXT: slli a0, a3, 16 7638; RV32I-NEXT: srai a0, a0, 16 7639; RV32I-NEXT: mv a2, a3 7640; RV32I-NEXT: bge s1, a0, .LBB95_1 7641; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7642; RV32I-NEXT: # in Loop: Header=BB95_2 Depth=1 7643; RV32I-NEXT: mv a2, s2 7644; RV32I-NEXT: j .LBB95_1 7645; RV32I-NEXT: .LBB95_4: # %atomicrmw.end 7646; RV32I-NEXT: mv a0, a3 7647; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7648; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7649; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7650; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7651; RV32I-NEXT: addi sp, sp, 32 7652; RV32I-NEXT: ret 7653; 7654; RV32IA-LABEL: atomicrmw_min_i16_monotonic: 7655; RV32IA: # %bb.0: 7656; RV32IA-NEXT: andi a6, a0, -4 7657; RV32IA-NEXT: slli a0, a0, 3 7658; RV32IA-NEXT: andi a3, a0, 24 7659; RV32IA-NEXT: lui a4, 16 7660; RV32IA-NEXT: addi a4, a4, -1 7661; RV32IA-NEXT: sll a7, a4, a0 7662; RV32IA-NEXT: slli a1, a1, 16 7663; RV32IA-NEXT: srai a1, a1, 16 7664; RV32IA-NEXT: sll a1, a1, a0 7665; RV32IA-NEXT: li a5, 16 7666; RV32IA-NEXT: sub a3, a5, a3 7667; RV32IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 7668; RV32IA-NEXT: lr.w a5, (a6) 7669; RV32IA-NEXT: and a4, a5, a7 7670; RV32IA-NEXT: mv a2, a5 7671; RV32IA-NEXT: sll a4, a4, a3 7672; RV32IA-NEXT: sra a4, a4, a3 7673; RV32IA-NEXT: bge a1, a4, .LBB95_3 7674; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB95_1 Depth=1 7675; RV32IA-NEXT: xor a2, a5, a1 7676; RV32IA-NEXT: and a2, a2, a7 7677; RV32IA-NEXT: xor a2, a5, a2 7678; RV32IA-NEXT: .LBB95_3: # in Loop: Header=BB95_1 Depth=1 7679; RV32IA-NEXT: sc.w a2, a2, (a6) 7680; RV32IA-NEXT: bnez a2, .LBB95_1 7681; RV32IA-NEXT: # %bb.4: 7682; RV32IA-NEXT: srl a0, a5, a0 7683; RV32IA-NEXT: ret 7684; 7685; RV64I-LABEL: atomicrmw_min_i16_monotonic: 7686; RV64I: # %bb.0: 7687; RV64I-NEXT: addi sp, sp, -48 7688; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7689; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7690; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7691; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7692; RV64I-NEXT: mv s0, a0 7693; RV64I-NEXT: lhu a3, 0(a0) 7694; RV64I-NEXT: mv s2, a1 7695; RV64I-NEXT: slli a0, a1, 48 7696; RV64I-NEXT: srai s1, a0, 48 7697; RV64I-NEXT: j .LBB95_2 7698; RV64I-NEXT: .LBB95_1: # %atomicrmw.start 7699; RV64I-NEXT: # in Loop: Header=BB95_2 Depth=1 7700; RV64I-NEXT: sh a3, 14(sp) 7701; RV64I-NEXT: addi a1, sp, 14 7702; RV64I-NEXT: mv a0, s0 7703; RV64I-NEXT: li a3, 0 7704; RV64I-NEXT: li a4, 0 7705; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7706; RV64I-NEXT: lh a3, 14(sp) 7707; RV64I-NEXT: bnez a0, .LBB95_4 7708; RV64I-NEXT: .LBB95_2: # %atomicrmw.start 7709; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7710; RV64I-NEXT: slli a0, a3, 48 7711; RV64I-NEXT: srai a0, a0, 48 7712; RV64I-NEXT: mv a2, a3 7713; RV64I-NEXT: bge s1, a0, .LBB95_1 7714; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7715; RV64I-NEXT: # in Loop: Header=BB95_2 Depth=1 7716; RV64I-NEXT: mv a2, s2 7717; RV64I-NEXT: j .LBB95_1 7718; RV64I-NEXT: .LBB95_4: # %atomicrmw.end 7719; RV64I-NEXT: mv a0, a3 7720; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7721; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7722; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7723; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7724; RV64I-NEXT: addi sp, sp, 48 7725; RV64I-NEXT: ret 7726; 7727; RV64IA-LABEL: atomicrmw_min_i16_monotonic: 7728; RV64IA: # %bb.0: 7729; RV64IA-NEXT: andi a6, a0, -4 7730; RV64IA-NEXT: slliw a0, a0, 3 7731; RV64IA-NEXT: andi a3, a0, 24 7732; RV64IA-NEXT: lui a4, 16 7733; RV64IA-NEXT: addiw a4, a4, -1 7734; RV64IA-NEXT: sllw a7, a4, a0 7735; RV64IA-NEXT: slli a1, a1, 48 7736; RV64IA-NEXT: srai a1, a1, 48 7737; RV64IA-NEXT: sllw a1, a1, a0 7738; RV64IA-NEXT: li a5, 48 7739; RV64IA-NEXT: sub a3, a5, a3 7740; RV64IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 7741; RV64IA-NEXT: lr.w a5, (a6) 7742; RV64IA-NEXT: and a4, a5, a7 7743; RV64IA-NEXT: mv a2, a5 7744; RV64IA-NEXT: sll a4, a4, a3 7745; RV64IA-NEXT: sra a4, a4, a3 7746; RV64IA-NEXT: bge a1, a4, .LBB95_3 7747; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB95_1 Depth=1 7748; RV64IA-NEXT: xor a2, a5, a1 7749; RV64IA-NEXT: and a2, a2, a7 7750; RV64IA-NEXT: xor a2, a5, a2 7751; RV64IA-NEXT: .LBB95_3: # in Loop: Header=BB95_1 Depth=1 7752; RV64IA-NEXT: sc.w a2, a2, (a6) 7753; RV64IA-NEXT: bnez a2, .LBB95_1 7754; RV64IA-NEXT: # %bb.4: 7755; RV64IA-NEXT: srlw a0, a5, a0 7756; RV64IA-NEXT: ret 7757 %1 = atomicrmw min i16* %a, i16 %b monotonic 7758 ret i16 %1 7759} 7760 7761define i16 @atomicrmw_min_i16_acquire(i16 *%a, i16 %b) nounwind { 7762; RV32I-LABEL: atomicrmw_min_i16_acquire: 7763; RV32I: # %bb.0: 7764; RV32I-NEXT: addi sp, sp, -32 7765; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7766; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7767; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7768; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7769; RV32I-NEXT: mv s0, a0 7770; RV32I-NEXT: lhu a3, 0(a0) 7771; RV32I-NEXT: mv s2, a1 7772; RV32I-NEXT: slli a0, a1, 16 7773; RV32I-NEXT: srai s1, a0, 16 7774; RV32I-NEXT: j .LBB96_2 7775; RV32I-NEXT: .LBB96_1: # %atomicrmw.start 7776; RV32I-NEXT: # in Loop: Header=BB96_2 Depth=1 7777; RV32I-NEXT: sh a3, 14(sp) 7778; RV32I-NEXT: addi a1, sp, 14 7779; RV32I-NEXT: li a3, 2 7780; RV32I-NEXT: li a4, 2 7781; RV32I-NEXT: mv a0, s0 7782; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7783; RV32I-NEXT: lh a3, 14(sp) 7784; RV32I-NEXT: bnez a0, .LBB96_4 7785; RV32I-NEXT: .LBB96_2: # %atomicrmw.start 7786; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7787; RV32I-NEXT: slli a0, a3, 16 7788; RV32I-NEXT: srai a0, a0, 16 7789; RV32I-NEXT: mv a2, a3 7790; RV32I-NEXT: bge s1, a0, .LBB96_1 7791; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7792; RV32I-NEXT: # in Loop: Header=BB96_2 Depth=1 7793; RV32I-NEXT: mv a2, s2 7794; RV32I-NEXT: j .LBB96_1 7795; RV32I-NEXT: .LBB96_4: # %atomicrmw.end 7796; RV32I-NEXT: mv a0, a3 7797; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7798; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7799; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7800; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7801; RV32I-NEXT: addi sp, sp, 32 7802; RV32I-NEXT: ret 7803; 7804; RV32IA-LABEL: atomicrmw_min_i16_acquire: 7805; RV32IA: # %bb.0: 7806; RV32IA-NEXT: andi a6, a0, -4 7807; RV32IA-NEXT: slli a0, a0, 3 7808; RV32IA-NEXT: andi a3, a0, 24 7809; RV32IA-NEXT: lui a4, 16 7810; RV32IA-NEXT: addi a4, a4, -1 7811; RV32IA-NEXT: sll a7, a4, a0 7812; RV32IA-NEXT: slli a1, a1, 16 7813; RV32IA-NEXT: srai a1, a1, 16 7814; RV32IA-NEXT: sll a1, a1, a0 7815; RV32IA-NEXT: li a5, 16 7816; RV32IA-NEXT: sub a3, a5, a3 7817; RV32IA-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 7818; RV32IA-NEXT: lr.w.aq a5, (a6) 7819; RV32IA-NEXT: and a4, a5, a7 7820; RV32IA-NEXT: mv a2, a5 7821; RV32IA-NEXT: sll a4, a4, a3 7822; RV32IA-NEXT: sra a4, a4, a3 7823; RV32IA-NEXT: bge a1, a4, .LBB96_3 7824; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB96_1 Depth=1 7825; RV32IA-NEXT: xor a2, a5, a1 7826; RV32IA-NEXT: and a2, a2, a7 7827; RV32IA-NEXT: xor a2, a5, a2 7828; RV32IA-NEXT: .LBB96_3: # in Loop: Header=BB96_1 Depth=1 7829; RV32IA-NEXT: sc.w a2, a2, (a6) 7830; RV32IA-NEXT: bnez a2, .LBB96_1 7831; RV32IA-NEXT: # %bb.4: 7832; RV32IA-NEXT: srl a0, a5, a0 7833; RV32IA-NEXT: ret 7834; 7835; RV64I-LABEL: atomicrmw_min_i16_acquire: 7836; RV64I: # %bb.0: 7837; RV64I-NEXT: addi sp, sp, -48 7838; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7839; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7840; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7841; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7842; RV64I-NEXT: mv s0, a0 7843; RV64I-NEXT: lhu a3, 0(a0) 7844; RV64I-NEXT: mv s2, a1 7845; RV64I-NEXT: slli a0, a1, 48 7846; RV64I-NEXT: srai s1, a0, 48 7847; RV64I-NEXT: j .LBB96_2 7848; RV64I-NEXT: .LBB96_1: # %atomicrmw.start 7849; RV64I-NEXT: # in Loop: Header=BB96_2 Depth=1 7850; RV64I-NEXT: sh a3, 14(sp) 7851; RV64I-NEXT: addi a1, sp, 14 7852; RV64I-NEXT: li a3, 2 7853; RV64I-NEXT: li a4, 2 7854; RV64I-NEXT: mv a0, s0 7855; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7856; RV64I-NEXT: lh a3, 14(sp) 7857; RV64I-NEXT: bnez a0, .LBB96_4 7858; RV64I-NEXT: .LBB96_2: # %atomicrmw.start 7859; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7860; RV64I-NEXT: slli a0, a3, 48 7861; RV64I-NEXT: srai a0, a0, 48 7862; RV64I-NEXT: mv a2, a3 7863; RV64I-NEXT: bge s1, a0, .LBB96_1 7864; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7865; RV64I-NEXT: # in Loop: Header=BB96_2 Depth=1 7866; RV64I-NEXT: mv a2, s2 7867; RV64I-NEXT: j .LBB96_1 7868; RV64I-NEXT: .LBB96_4: # %atomicrmw.end 7869; RV64I-NEXT: mv a0, a3 7870; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7871; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7872; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7873; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7874; RV64I-NEXT: addi sp, sp, 48 7875; RV64I-NEXT: ret 7876; 7877; RV64IA-LABEL: atomicrmw_min_i16_acquire: 7878; RV64IA: # %bb.0: 7879; RV64IA-NEXT: andi a6, a0, -4 7880; RV64IA-NEXT: slliw a0, a0, 3 7881; RV64IA-NEXT: andi a3, a0, 24 7882; RV64IA-NEXT: lui a4, 16 7883; RV64IA-NEXT: addiw a4, a4, -1 7884; RV64IA-NEXT: sllw a7, a4, a0 7885; RV64IA-NEXT: slli a1, a1, 48 7886; RV64IA-NEXT: srai a1, a1, 48 7887; RV64IA-NEXT: sllw a1, a1, a0 7888; RV64IA-NEXT: li a5, 48 7889; RV64IA-NEXT: sub a3, a5, a3 7890; RV64IA-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 7891; RV64IA-NEXT: lr.w.aq a5, (a6) 7892; RV64IA-NEXT: and a4, a5, a7 7893; RV64IA-NEXT: mv a2, a5 7894; RV64IA-NEXT: sll a4, a4, a3 7895; RV64IA-NEXT: sra a4, a4, a3 7896; RV64IA-NEXT: bge a1, a4, .LBB96_3 7897; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB96_1 Depth=1 7898; RV64IA-NEXT: xor a2, a5, a1 7899; RV64IA-NEXT: and a2, a2, a7 7900; RV64IA-NEXT: xor a2, a5, a2 7901; RV64IA-NEXT: .LBB96_3: # in Loop: Header=BB96_1 Depth=1 7902; RV64IA-NEXT: sc.w a2, a2, (a6) 7903; RV64IA-NEXT: bnez a2, .LBB96_1 7904; RV64IA-NEXT: # %bb.4: 7905; RV64IA-NEXT: srlw a0, a5, a0 7906; RV64IA-NEXT: ret 7907 %1 = atomicrmw min i16* %a, i16 %b acquire 7908 ret i16 %1 7909} 7910 7911define i16 @atomicrmw_min_i16_release(i16 *%a, i16 %b) nounwind { 7912; RV32I-LABEL: atomicrmw_min_i16_release: 7913; RV32I: # %bb.0: 7914; RV32I-NEXT: addi sp, sp, -32 7915; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7916; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7917; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7918; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7919; RV32I-NEXT: mv s0, a0 7920; RV32I-NEXT: lhu a3, 0(a0) 7921; RV32I-NEXT: mv s2, a1 7922; RV32I-NEXT: slli a0, a1, 16 7923; RV32I-NEXT: srai s1, a0, 16 7924; RV32I-NEXT: j .LBB97_2 7925; RV32I-NEXT: .LBB97_1: # %atomicrmw.start 7926; RV32I-NEXT: # in Loop: Header=BB97_2 Depth=1 7927; RV32I-NEXT: sh a3, 14(sp) 7928; RV32I-NEXT: addi a1, sp, 14 7929; RV32I-NEXT: li a3, 3 7930; RV32I-NEXT: mv a0, s0 7931; RV32I-NEXT: li a4, 0 7932; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7933; RV32I-NEXT: lh a3, 14(sp) 7934; RV32I-NEXT: bnez a0, .LBB97_4 7935; RV32I-NEXT: .LBB97_2: # %atomicrmw.start 7936; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7937; RV32I-NEXT: slli a0, a3, 16 7938; RV32I-NEXT: srai a0, a0, 16 7939; RV32I-NEXT: mv a2, a3 7940; RV32I-NEXT: bge s1, a0, .LBB97_1 7941; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7942; RV32I-NEXT: # in Loop: Header=BB97_2 Depth=1 7943; RV32I-NEXT: mv a2, s2 7944; RV32I-NEXT: j .LBB97_1 7945; RV32I-NEXT: .LBB97_4: # %atomicrmw.end 7946; RV32I-NEXT: mv a0, a3 7947; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7948; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7949; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7950; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7951; RV32I-NEXT: addi sp, sp, 32 7952; RV32I-NEXT: ret 7953; 7954; RV32IA-LABEL: atomicrmw_min_i16_release: 7955; RV32IA: # %bb.0: 7956; RV32IA-NEXT: andi a6, a0, -4 7957; RV32IA-NEXT: slli a0, a0, 3 7958; RV32IA-NEXT: andi a3, a0, 24 7959; RV32IA-NEXT: lui a4, 16 7960; RV32IA-NEXT: addi a4, a4, -1 7961; RV32IA-NEXT: sll a7, a4, a0 7962; RV32IA-NEXT: slli a1, a1, 16 7963; RV32IA-NEXT: srai a1, a1, 16 7964; RV32IA-NEXT: sll a1, a1, a0 7965; RV32IA-NEXT: li a5, 16 7966; RV32IA-NEXT: sub a3, a5, a3 7967; RV32IA-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 7968; RV32IA-NEXT: lr.w a5, (a6) 7969; RV32IA-NEXT: and a4, a5, a7 7970; RV32IA-NEXT: mv a2, a5 7971; RV32IA-NEXT: sll a4, a4, a3 7972; RV32IA-NEXT: sra a4, a4, a3 7973; RV32IA-NEXT: bge a1, a4, .LBB97_3 7974; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB97_1 Depth=1 7975; RV32IA-NEXT: xor a2, a5, a1 7976; RV32IA-NEXT: and a2, a2, a7 7977; RV32IA-NEXT: xor a2, a5, a2 7978; RV32IA-NEXT: .LBB97_3: # in Loop: Header=BB97_1 Depth=1 7979; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 7980; RV32IA-NEXT: bnez a2, .LBB97_1 7981; RV32IA-NEXT: # %bb.4: 7982; RV32IA-NEXT: srl a0, a5, a0 7983; RV32IA-NEXT: ret 7984; 7985; RV64I-LABEL: atomicrmw_min_i16_release: 7986; RV64I: # %bb.0: 7987; RV64I-NEXT: addi sp, sp, -48 7988; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7989; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7990; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7991; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7992; RV64I-NEXT: mv s0, a0 7993; RV64I-NEXT: lhu a3, 0(a0) 7994; RV64I-NEXT: mv s2, a1 7995; RV64I-NEXT: slli a0, a1, 48 7996; RV64I-NEXT: srai s1, a0, 48 7997; RV64I-NEXT: j .LBB97_2 7998; RV64I-NEXT: .LBB97_1: # %atomicrmw.start 7999; RV64I-NEXT: # in Loop: Header=BB97_2 Depth=1 8000; RV64I-NEXT: sh a3, 14(sp) 8001; RV64I-NEXT: addi a1, sp, 14 8002; RV64I-NEXT: li a3, 3 8003; RV64I-NEXT: mv a0, s0 8004; RV64I-NEXT: li a4, 0 8005; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8006; RV64I-NEXT: lh a3, 14(sp) 8007; RV64I-NEXT: bnez a0, .LBB97_4 8008; RV64I-NEXT: .LBB97_2: # %atomicrmw.start 8009; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8010; RV64I-NEXT: slli a0, a3, 48 8011; RV64I-NEXT: srai a0, a0, 48 8012; RV64I-NEXT: mv a2, a3 8013; RV64I-NEXT: bge s1, a0, .LBB97_1 8014; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8015; RV64I-NEXT: # in Loop: Header=BB97_2 Depth=1 8016; RV64I-NEXT: mv a2, s2 8017; RV64I-NEXT: j .LBB97_1 8018; RV64I-NEXT: .LBB97_4: # %atomicrmw.end 8019; RV64I-NEXT: mv a0, a3 8020; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8021; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8022; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8023; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8024; RV64I-NEXT: addi sp, sp, 48 8025; RV64I-NEXT: ret 8026; 8027; RV64IA-LABEL: atomicrmw_min_i16_release: 8028; RV64IA: # %bb.0: 8029; RV64IA-NEXT: andi a6, a0, -4 8030; RV64IA-NEXT: slliw a0, a0, 3 8031; RV64IA-NEXT: andi a3, a0, 24 8032; RV64IA-NEXT: lui a4, 16 8033; RV64IA-NEXT: addiw a4, a4, -1 8034; RV64IA-NEXT: sllw a7, a4, a0 8035; RV64IA-NEXT: slli a1, a1, 48 8036; RV64IA-NEXT: srai a1, a1, 48 8037; RV64IA-NEXT: sllw a1, a1, a0 8038; RV64IA-NEXT: li a5, 48 8039; RV64IA-NEXT: sub a3, a5, a3 8040; RV64IA-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 8041; RV64IA-NEXT: lr.w a5, (a6) 8042; RV64IA-NEXT: and a4, a5, a7 8043; RV64IA-NEXT: mv a2, a5 8044; RV64IA-NEXT: sll a4, a4, a3 8045; RV64IA-NEXT: sra a4, a4, a3 8046; RV64IA-NEXT: bge a1, a4, .LBB97_3 8047; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB97_1 Depth=1 8048; RV64IA-NEXT: xor a2, a5, a1 8049; RV64IA-NEXT: and a2, a2, a7 8050; RV64IA-NEXT: xor a2, a5, a2 8051; RV64IA-NEXT: .LBB97_3: # in Loop: Header=BB97_1 Depth=1 8052; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 8053; RV64IA-NEXT: bnez a2, .LBB97_1 8054; RV64IA-NEXT: # %bb.4: 8055; RV64IA-NEXT: srlw a0, a5, a0 8056; RV64IA-NEXT: ret 8057 %1 = atomicrmw min i16* %a, i16 %b release 8058 ret i16 %1 8059} 8060 8061define i16 @atomicrmw_min_i16_acq_rel(i16 *%a, i16 %b) nounwind { 8062; RV32I-LABEL: atomicrmw_min_i16_acq_rel: 8063; RV32I: # %bb.0: 8064; RV32I-NEXT: addi sp, sp, -32 8065; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8066; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8067; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8068; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8069; RV32I-NEXT: mv s0, a0 8070; RV32I-NEXT: lhu a3, 0(a0) 8071; RV32I-NEXT: mv s2, a1 8072; RV32I-NEXT: slli a0, a1, 16 8073; RV32I-NEXT: srai s1, a0, 16 8074; RV32I-NEXT: j .LBB98_2 8075; RV32I-NEXT: .LBB98_1: # %atomicrmw.start 8076; RV32I-NEXT: # in Loop: Header=BB98_2 Depth=1 8077; RV32I-NEXT: sh a3, 14(sp) 8078; RV32I-NEXT: addi a1, sp, 14 8079; RV32I-NEXT: li a3, 4 8080; RV32I-NEXT: li a4, 2 8081; RV32I-NEXT: mv a0, s0 8082; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8083; RV32I-NEXT: lh a3, 14(sp) 8084; RV32I-NEXT: bnez a0, .LBB98_4 8085; RV32I-NEXT: .LBB98_2: # %atomicrmw.start 8086; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8087; RV32I-NEXT: slli a0, a3, 16 8088; RV32I-NEXT: srai a0, a0, 16 8089; RV32I-NEXT: mv a2, a3 8090; RV32I-NEXT: bge s1, a0, .LBB98_1 8091; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8092; RV32I-NEXT: # in Loop: Header=BB98_2 Depth=1 8093; RV32I-NEXT: mv a2, s2 8094; RV32I-NEXT: j .LBB98_1 8095; RV32I-NEXT: .LBB98_4: # %atomicrmw.end 8096; RV32I-NEXT: mv a0, a3 8097; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8098; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8099; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8100; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8101; RV32I-NEXT: addi sp, sp, 32 8102; RV32I-NEXT: ret 8103; 8104; RV32IA-LABEL: atomicrmw_min_i16_acq_rel: 8105; RV32IA: # %bb.0: 8106; RV32IA-NEXT: andi a6, a0, -4 8107; RV32IA-NEXT: slli a0, a0, 3 8108; RV32IA-NEXT: andi a3, a0, 24 8109; RV32IA-NEXT: lui a4, 16 8110; RV32IA-NEXT: addi a4, a4, -1 8111; RV32IA-NEXT: sll a7, a4, a0 8112; RV32IA-NEXT: slli a1, a1, 16 8113; RV32IA-NEXT: srai a1, a1, 16 8114; RV32IA-NEXT: sll a1, a1, a0 8115; RV32IA-NEXT: li a5, 16 8116; RV32IA-NEXT: sub a3, a5, a3 8117; RV32IA-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 8118; RV32IA-NEXT: lr.w.aq a5, (a6) 8119; RV32IA-NEXT: and a4, a5, a7 8120; RV32IA-NEXT: mv a2, a5 8121; RV32IA-NEXT: sll a4, a4, a3 8122; RV32IA-NEXT: sra a4, a4, a3 8123; RV32IA-NEXT: bge a1, a4, .LBB98_3 8124; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB98_1 Depth=1 8125; RV32IA-NEXT: xor a2, a5, a1 8126; RV32IA-NEXT: and a2, a2, a7 8127; RV32IA-NEXT: xor a2, a5, a2 8128; RV32IA-NEXT: .LBB98_3: # in Loop: Header=BB98_1 Depth=1 8129; RV32IA-NEXT: sc.w.rl a2, a2, (a6) 8130; RV32IA-NEXT: bnez a2, .LBB98_1 8131; RV32IA-NEXT: # %bb.4: 8132; RV32IA-NEXT: srl a0, a5, a0 8133; RV32IA-NEXT: ret 8134; 8135; RV64I-LABEL: atomicrmw_min_i16_acq_rel: 8136; RV64I: # %bb.0: 8137; RV64I-NEXT: addi sp, sp, -48 8138; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8139; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8140; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8141; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8142; RV64I-NEXT: mv s0, a0 8143; RV64I-NEXT: lhu a3, 0(a0) 8144; RV64I-NEXT: mv s2, a1 8145; RV64I-NEXT: slli a0, a1, 48 8146; RV64I-NEXT: srai s1, a0, 48 8147; RV64I-NEXT: j .LBB98_2 8148; RV64I-NEXT: .LBB98_1: # %atomicrmw.start 8149; RV64I-NEXT: # in Loop: Header=BB98_2 Depth=1 8150; RV64I-NEXT: sh a3, 14(sp) 8151; RV64I-NEXT: addi a1, sp, 14 8152; RV64I-NEXT: li a3, 4 8153; RV64I-NEXT: li a4, 2 8154; RV64I-NEXT: mv a0, s0 8155; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8156; RV64I-NEXT: lh a3, 14(sp) 8157; RV64I-NEXT: bnez a0, .LBB98_4 8158; RV64I-NEXT: .LBB98_2: # %atomicrmw.start 8159; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8160; RV64I-NEXT: slli a0, a3, 48 8161; RV64I-NEXT: srai a0, a0, 48 8162; RV64I-NEXT: mv a2, a3 8163; RV64I-NEXT: bge s1, a0, .LBB98_1 8164; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8165; RV64I-NEXT: # in Loop: Header=BB98_2 Depth=1 8166; RV64I-NEXT: mv a2, s2 8167; RV64I-NEXT: j .LBB98_1 8168; RV64I-NEXT: .LBB98_4: # %atomicrmw.end 8169; RV64I-NEXT: mv a0, a3 8170; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8171; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8172; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8173; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8174; RV64I-NEXT: addi sp, sp, 48 8175; RV64I-NEXT: ret 8176; 8177; RV64IA-LABEL: atomicrmw_min_i16_acq_rel: 8178; RV64IA: # %bb.0: 8179; RV64IA-NEXT: andi a6, a0, -4 8180; RV64IA-NEXT: slliw a0, a0, 3 8181; RV64IA-NEXT: andi a3, a0, 24 8182; RV64IA-NEXT: lui a4, 16 8183; RV64IA-NEXT: addiw a4, a4, -1 8184; RV64IA-NEXT: sllw a7, a4, a0 8185; RV64IA-NEXT: slli a1, a1, 48 8186; RV64IA-NEXT: srai a1, a1, 48 8187; RV64IA-NEXT: sllw a1, a1, a0 8188; RV64IA-NEXT: li a5, 48 8189; RV64IA-NEXT: sub a3, a5, a3 8190; RV64IA-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 8191; RV64IA-NEXT: lr.w.aq a5, (a6) 8192; RV64IA-NEXT: and a4, a5, a7 8193; RV64IA-NEXT: mv a2, a5 8194; RV64IA-NEXT: sll a4, a4, a3 8195; RV64IA-NEXT: sra a4, a4, a3 8196; RV64IA-NEXT: bge a1, a4, .LBB98_3 8197; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB98_1 Depth=1 8198; RV64IA-NEXT: xor a2, a5, a1 8199; RV64IA-NEXT: and a2, a2, a7 8200; RV64IA-NEXT: xor a2, a5, a2 8201; RV64IA-NEXT: .LBB98_3: # in Loop: Header=BB98_1 Depth=1 8202; RV64IA-NEXT: sc.w.rl a2, a2, (a6) 8203; RV64IA-NEXT: bnez a2, .LBB98_1 8204; RV64IA-NEXT: # %bb.4: 8205; RV64IA-NEXT: srlw a0, a5, a0 8206; RV64IA-NEXT: ret 8207 %1 = atomicrmw min i16* %a, i16 %b acq_rel 8208 ret i16 %1 8209} 8210 8211define i16 @atomicrmw_min_i16_seq_cst(i16 *%a, i16 %b) nounwind { 8212; RV32I-LABEL: atomicrmw_min_i16_seq_cst: 8213; RV32I: # %bb.0: 8214; RV32I-NEXT: addi sp, sp, -32 8215; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8216; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8217; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8218; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8219; RV32I-NEXT: mv s0, a0 8220; RV32I-NEXT: lhu a3, 0(a0) 8221; RV32I-NEXT: mv s2, a1 8222; RV32I-NEXT: slli a0, a1, 16 8223; RV32I-NEXT: srai s1, a0, 16 8224; RV32I-NEXT: j .LBB99_2 8225; RV32I-NEXT: .LBB99_1: # %atomicrmw.start 8226; RV32I-NEXT: # in Loop: Header=BB99_2 Depth=1 8227; RV32I-NEXT: sh a3, 14(sp) 8228; RV32I-NEXT: addi a1, sp, 14 8229; RV32I-NEXT: li a3, 5 8230; RV32I-NEXT: li a4, 5 8231; RV32I-NEXT: mv a0, s0 8232; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8233; RV32I-NEXT: lh a3, 14(sp) 8234; RV32I-NEXT: bnez a0, .LBB99_4 8235; RV32I-NEXT: .LBB99_2: # %atomicrmw.start 8236; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8237; RV32I-NEXT: slli a0, a3, 16 8238; RV32I-NEXT: srai a0, a0, 16 8239; RV32I-NEXT: mv a2, a3 8240; RV32I-NEXT: bge s1, a0, .LBB99_1 8241; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8242; RV32I-NEXT: # in Loop: Header=BB99_2 Depth=1 8243; RV32I-NEXT: mv a2, s2 8244; RV32I-NEXT: j .LBB99_1 8245; RV32I-NEXT: .LBB99_4: # %atomicrmw.end 8246; RV32I-NEXT: mv a0, a3 8247; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8248; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8249; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8250; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8251; RV32I-NEXT: addi sp, sp, 32 8252; RV32I-NEXT: ret 8253; 8254; RV32IA-LABEL: atomicrmw_min_i16_seq_cst: 8255; RV32IA: # %bb.0: 8256; RV32IA-NEXT: andi a6, a0, -4 8257; RV32IA-NEXT: slli a0, a0, 3 8258; RV32IA-NEXT: andi a3, a0, 24 8259; RV32IA-NEXT: lui a4, 16 8260; RV32IA-NEXT: addi a4, a4, -1 8261; RV32IA-NEXT: sll a7, a4, a0 8262; RV32IA-NEXT: slli a1, a1, 16 8263; RV32IA-NEXT: srai a1, a1, 16 8264; RV32IA-NEXT: sll a1, a1, a0 8265; RV32IA-NEXT: li a5, 16 8266; RV32IA-NEXT: sub a3, a5, a3 8267; RV32IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 8268; RV32IA-NEXT: lr.w.aqrl a5, (a6) 8269; RV32IA-NEXT: and a4, a5, a7 8270; RV32IA-NEXT: mv a2, a5 8271; RV32IA-NEXT: sll a4, a4, a3 8272; RV32IA-NEXT: sra a4, a4, a3 8273; RV32IA-NEXT: bge a1, a4, .LBB99_3 8274; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB99_1 Depth=1 8275; RV32IA-NEXT: xor a2, a5, a1 8276; RV32IA-NEXT: and a2, a2, a7 8277; RV32IA-NEXT: xor a2, a5, a2 8278; RV32IA-NEXT: .LBB99_3: # in Loop: Header=BB99_1 Depth=1 8279; RV32IA-NEXT: sc.w.aqrl a2, a2, (a6) 8280; RV32IA-NEXT: bnez a2, .LBB99_1 8281; RV32IA-NEXT: # %bb.4: 8282; RV32IA-NEXT: srl a0, a5, a0 8283; RV32IA-NEXT: ret 8284; 8285; RV64I-LABEL: atomicrmw_min_i16_seq_cst: 8286; RV64I: # %bb.0: 8287; RV64I-NEXT: addi sp, sp, -48 8288; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8289; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8290; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8291; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8292; RV64I-NEXT: mv s0, a0 8293; RV64I-NEXT: lhu a3, 0(a0) 8294; RV64I-NEXT: mv s2, a1 8295; RV64I-NEXT: slli a0, a1, 48 8296; RV64I-NEXT: srai s1, a0, 48 8297; RV64I-NEXT: j .LBB99_2 8298; RV64I-NEXT: .LBB99_1: # %atomicrmw.start 8299; RV64I-NEXT: # in Loop: Header=BB99_2 Depth=1 8300; RV64I-NEXT: sh a3, 14(sp) 8301; RV64I-NEXT: addi a1, sp, 14 8302; RV64I-NEXT: li a3, 5 8303; RV64I-NEXT: li a4, 5 8304; RV64I-NEXT: mv a0, s0 8305; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8306; RV64I-NEXT: lh a3, 14(sp) 8307; RV64I-NEXT: bnez a0, .LBB99_4 8308; RV64I-NEXT: .LBB99_2: # %atomicrmw.start 8309; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8310; RV64I-NEXT: slli a0, a3, 48 8311; RV64I-NEXT: srai a0, a0, 48 8312; RV64I-NEXT: mv a2, a3 8313; RV64I-NEXT: bge s1, a0, .LBB99_1 8314; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8315; RV64I-NEXT: # in Loop: Header=BB99_2 Depth=1 8316; RV64I-NEXT: mv a2, s2 8317; RV64I-NEXT: j .LBB99_1 8318; RV64I-NEXT: .LBB99_4: # %atomicrmw.end 8319; RV64I-NEXT: mv a0, a3 8320; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8321; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8322; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8323; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8324; RV64I-NEXT: addi sp, sp, 48 8325; RV64I-NEXT: ret 8326; 8327; RV64IA-LABEL: atomicrmw_min_i16_seq_cst: 8328; RV64IA: # %bb.0: 8329; RV64IA-NEXT: andi a6, a0, -4 8330; RV64IA-NEXT: slliw a0, a0, 3 8331; RV64IA-NEXT: andi a3, a0, 24 8332; RV64IA-NEXT: lui a4, 16 8333; RV64IA-NEXT: addiw a4, a4, -1 8334; RV64IA-NEXT: sllw a7, a4, a0 8335; RV64IA-NEXT: slli a1, a1, 48 8336; RV64IA-NEXT: srai a1, a1, 48 8337; RV64IA-NEXT: sllw a1, a1, a0 8338; RV64IA-NEXT: li a5, 48 8339; RV64IA-NEXT: sub a3, a5, a3 8340; RV64IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 8341; RV64IA-NEXT: lr.w.aqrl a5, (a6) 8342; RV64IA-NEXT: and a4, a5, a7 8343; RV64IA-NEXT: mv a2, a5 8344; RV64IA-NEXT: sll a4, a4, a3 8345; RV64IA-NEXT: sra a4, a4, a3 8346; RV64IA-NEXT: bge a1, a4, .LBB99_3 8347; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB99_1 Depth=1 8348; RV64IA-NEXT: xor a2, a5, a1 8349; RV64IA-NEXT: and a2, a2, a7 8350; RV64IA-NEXT: xor a2, a5, a2 8351; RV64IA-NEXT: .LBB99_3: # in Loop: Header=BB99_1 Depth=1 8352; RV64IA-NEXT: sc.w.aqrl a2, a2, (a6) 8353; RV64IA-NEXT: bnez a2, .LBB99_1 8354; RV64IA-NEXT: # %bb.4: 8355; RV64IA-NEXT: srlw a0, a5, a0 8356; RV64IA-NEXT: ret 8357 %1 = atomicrmw min i16* %a, i16 %b seq_cst 8358 ret i16 %1 8359} 8360 8361define i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind { 8362; RV32I-LABEL: atomicrmw_umax_i16_monotonic: 8363; RV32I: # %bb.0: 8364; RV32I-NEXT: addi sp, sp, -32 8365; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8366; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8367; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8368; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8369; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8370; RV32I-NEXT: mv s2, a1 8371; RV32I-NEXT: mv s3, a0 8372; RV32I-NEXT: lhu a1, 0(a0) 8373; RV32I-NEXT: lui a0, 16 8374; RV32I-NEXT: addi s0, a0, -1 8375; RV32I-NEXT: and s1, s2, s0 8376; RV32I-NEXT: j .LBB100_2 8377; RV32I-NEXT: .LBB100_1: # %atomicrmw.start 8378; RV32I-NEXT: # in Loop: Header=BB100_2 Depth=1 8379; RV32I-NEXT: sh a1, 10(sp) 8380; RV32I-NEXT: addi a1, sp, 10 8381; RV32I-NEXT: mv a0, s3 8382; RV32I-NEXT: li a3, 0 8383; RV32I-NEXT: li a4, 0 8384; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8385; RV32I-NEXT: lh a1, 10(sp) 8386; RV32I-NEXT: bnez a0, .LBB100_4 8387; RV32I-NEXT: .LBB100_2: # %atomicrmw.start 8388; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8389; RV32I-NEXT: and a0, a1, s0 8390; RV32I-NEXT: mv a2, a1 8391; RV32I-NEXT: bltu s1, a0, .LBB100_1 8392; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8393; RV32I-NEXT: # in Loop: Header=BB100_2 Depth=1 8394; RV32I-NEXT: mv a2, s2 8395; RV32I-NEXT: j .LBB100_1 8396; RV32I-NEXT: .LBB100_4: # %atomicrmw.end 8397; RV32I-NEXT: mv a0, a1 8398; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8399; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8400; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8401; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8402; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8403; RV32I-NEXT: addi sp, sp, 32 8404; RV32I-NEXT: ret 8405; 8406; RV32IA-LABEL: atomicrmw_umax_i16_monotonic: 8407; RV32IA: # %bb.0: 8408; RV32IA-NEXT: andi a6, a0, -4 8409; RV32IA-NEXT: slli a0, a0, 3 8410; RV32IA-NEXT: lui a3, 16 8411; RV32IA-NEXT: addi a3, a3, -1 8412; RV32IA-NEXT: sll a4, a3, a0 8413; RV32IA-NEXT: and a1, a1, a3 8414; RV32IA-NEXT: sll a1, a1, a0 8415; RV32IA-NEXT: .LBB100_1: # =>This Inner Loop Header: Depth=1 8416; RV32IA-NEXT: lr.w a3, (a6) 8417; RV32IA-NEXT: and a2, a3, a4 8418; RV32IA-NEXT: mv a5, a3 8419; RV32IA-NEXT: bgeu a2, a1, .LBB100_3 8420; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB100_1 Depth=1 8421; RV32IA-NEXT: xor a5, a3, a1 8422; RV32IA-NEXT: and a5, a5, a4 8423; RV32IA-NEXT: xor a5, a3, a5 8424; RV32IA-NEXT: .LBB100_3: # in Loop: Header=BB100_1 Depth=1 8425; RV32IA-NEXT: sc.w a5, a5, (a6) 8426; RV32IA-NEXT: bnez a5, .LBB100_1 8427; RV32IA-NEXT: # %bb.4: 8428; RV32IA-NEXT: srl a0, a3, a0 8429; RV32IA-NEXT: ret 8430; 8431; RV64I-LABEL: atomicrmw_umax_i16_monotonic: 8432; RV64I: # %bb.0: 8433; RV64I-NEXT: addi sp, sp, -48 8434; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8435; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8436; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8437; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8438; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8439; RV64I-NEXT: mv s2, a1 8440; RV64I-NEXT: mv s3, a0 8441; RV64I-NEXT: lhu a1, 0(a0) 8442; RV64I-NEXT: lui a0, 16 8443; RV64I-NEXT: addiw s0, a0, -1 8444; RV64I-NEXT: and s1, s2, s0 8445; RV64I-NEXT: j .LBB100_2 8446; RV64I-NEXT: .LBB100_1: # %atomicrmw.start 8447; RV64I-NEXT: # in Loop: Header=BB100_2 Depth=1 8448; RV64I-NEXT: sh a1, 6(sp) 8449; RV64I-NEXT: addi a1, sp, 6 8450; RV64I-NEXT: mv a0, s3 8451; RV64I-NEXT: li a3, 0 8452; RV64I-NEXT: li a4, 0 8453; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8454; RV64I-NEXT: lh a1, 6(sp) 8455; RV64I-NEXT: bnez a0, .LBB100_4 8456; RV64I-NEXT: .LBB100_2: # %atomicrmw.start 8457; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8458; RV64I-NEXT: and a0, a1, s0 8459; RV64I-NEXT: mv a2, a1 8460; RV64I-NEXT: bltu s1, a0, .LBB100_1 8461; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8462; RV64I-NEXT: # in Loop: Header=BB100_2 Depth=1 8463; RV64I-NEXT: mv a2, s2 8464; RV64I-NEXT: j .LBB100_1 8465; RV64I-NEXT: .LBB100_4: # %atomicrmw.end 8466; RV64I-NEXT: mv a0, a1 8467; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8468; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8469; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8470; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8471; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8472; RV64I-NEXT: addi sp, sp, 48 8473; RV64I-NEXT: ret 8474; 8475; RV64IA-LABEL: atomicrmw_umax_i16_monotonic: 8476; RV64IA: # %bb.0: 8477; RV64IA-NEXT: andi a6, a0, -4 8478; RV64IA-NEXT: slliw a0, a0, 3 8479; RV64IA-NEXT: lui a3, 16 8480; RV64IA-NEXT: addiw a3, a3, -1 8481; RV64IA-NEXT: sllw a4, a3, a0 8482; RV64IA-NEXT: and a1, a1, a3 8483; RV64IA-NEXT: sllw a1, a1, a0 8484; RV64IA-NEXT: .LBB100_1: # =>This Inner Loop Header: Depth=1 8485; RV64IA-NEXT: lr.w a3, (a6) 8486; RV64IA-NEXT: and a2, a3, a4 8487; RV64IA-NEXT: mv a5, a3 8488; RV64IA-NEXT: bgeu a2, a1, .LBB100_3 8489; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB100_1 Depth=1 8490; RV64IA-NEXT: xor a5, a3, a1 8491; RV64IA-NEXT: and a5, a5, a4 8492; RV64IA-NEXT: xor a5, a3, a5 8493; RV64IA-NEXT: .LBB100_3: # in Loop: Header=BB100_1 Depth=1 8494; RV64IA-NEXT: sc.w a5, a5, (a6) 8495; RV64IA-NEXT: bnez a5, .LBB100_1 8496; RV64IA-NEXT: # %bb.4: 8497; RV64IA-NEXT: srlw a0, a3, a0 8498; RV64IA-NEXT: ret 8499 %1 = atomicrmw umax i16* %a, i16 %b monotonic 8500 ret i16 %1 8501} 8502 8503define i16 @atomicrmw_umax_i16_acquire(i16 *%a, i16 %b) nounwind { 8504; RV32I-LABEL: atomicrmw_umax_i16_acquire: 8505; RV32I: # %bb.0: 8506; RV32I-NEXT: addi sp, sp, -32 8507; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8508; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8509; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8510; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8511; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8512; RV32I-NEXT: mv s2, a1 8513; RV32I-NEXT: mv s3, a0 8514; RV32I-NEXT: lhu a1, 0(a0) 8515; RV32I-NEXT: lui a0, 16 8516; RV32I-NEXT: addi s0, a0, -1 8517; RV32I-NEXT: and s1, s2, s0 8518; RV32I-NEXT: j .LBB101_2 8519; RV32I-NEXT: .LBB101_1: # %atomicrmw.start 8520; RV32I-NEXT: # in Loop: Header=BB101_2 Depth=1 8521; RV32I-NEXT: sh a1, 10(sp) 8522; RV32I-NEXT: addi a1, sp, 10 8523; RV32I-NEXT: li a3, 2 8524; RV32I-NEXT: li a4, 2 8525; RV32I-NEXT: mv a0, s3 8526; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8527; RV32I-NEXT: lh a1, 10(sp) 8528; RV32I-NEXT: bnez a0, .LBB101_4 8529; RV32I-NEXT: .LBB101_2: # %atomicrmw.start 8530; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8531; RV32I-NEXT: and a0, a1, s0 8532; RV32I-NEXT: mv a2, a1 8533; RV32I-NEXT: bltu s1, a0, .LBB101_1 8534; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8535; RV32I-NEXT: # in Loop: Header=BB101_2 Depth=1 8536; RV32I-NEXT: mv a2, s2 8537; RV32I-NEXT: j .LBB101_1 8538; RV32I-NEXT: .LBB101_4: # %atomicrmw.end 8539; RV32I-NEXT: mv a0, a1 8540; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8541; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8542; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8543; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8544; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8545; RV32I-NEXT: addi sp, sp, 32 8546; RV32I-NEXT: ret 8547; 8548; RV32IA-LABEL: atomicrmw_umax_i16_acquire: 8549; RV32IA: # %bb.0: 8550; RV32IA-NEXT: andi a6, a0, -4 8551; RV32IA-NEXT: slli a0, a0, 3 8552; RV32IA-NEXT: lui a3, 16 8553; RV32IA-NEXT: addi a3, a3, -1 8554; RV32IA-NEXT: sll a4, a3, a0 8555; RV32IA-NEXT: and a1, a1, a3 8556; RV32IA-NEXT: sll a1, a1, a0 8557; RV32IA-NEXT: .LBB101_1: # =>This Inner Loop Header: Depth=1 8558; RV32IA-NEXT: lr.w.aq a3, (a6) 8559; RV32IA-NEXT: and a2, a3, a4 8560; RV32IA-NEXT: mv a5, a3 8561; RV32IA-NEXT: bgeu a2, a1, .LBB101_3 8562; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB101_1 Depth=1 8563; RV32IA-NEXT: xor a5, a3, a1 8564; RV32IA-NEXT: and a5, a5, a4 8565; RV32IA-NEXT: xor a5, a3, a5 8566; RV32IA-NEXT: .LBB101_3: # in Loop: Header=BB101_1 Depth=1 8567; RV32IA-NEXT: sc.w a5, a5, (a6) 8568; RV32IA-NEXT: bnez a5, .LBB101_1 8569; RV32IA-NEXT: # %bb.4: 8570; RV32IA-NEXT: srl a0, a3, a0 8571; RV32IA-NEXT: ret 8572; 8573; RV64I-LABEL: atomicrmw_umax_i16_acquire: 8574; RV64I: # %bb.0: 8575; RV64I-NEXT: addi sp, sp, -48 8576; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8577; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8578; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8579; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8580; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8581; RV64I-NEXT: mv s2, a1 8582; RV64I-NEXT: mv s3, a0 8583; RV64I-NEXT: lhu a1, 0(a0) 8584; RV64I-NEXT: lui a0, 16 8585; RV64I-NEXT: addiw s0, a0, -1 8586; RV64I-NEXT: and s1, s2, s0 8587; RV64I-NEXT: j .LBB101_2 8588; RV64I-NEXT: .LBB101_1: # %atomicrmw.start 8589; RV64I-NEXT: # in Loop: Header=BB101_2 Depth=1 8590; RV64I-NEXT: sh a1, 6(sp) 8591; RV64I-NEXT: addi a1, sp, 6 8592; RV64I-NEXT: li a3, 2 8593; RV64I-NEXT: li a4, 2 8594; RV64I-NEXT: mv a0, s3 8595; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8596; RV64I-NEXT: lh a1, 6(sp) 8597; RV64I-NEXT: bnez a0, .LBB101_4 8598; RV64I-NEXT: .LBB101_2: # %atomicrmw.start 8599; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8600; RV64I-NEXT: and a0, a1, s0 8601; RV64I-NEXT: mv a2, a1 8602; RV64I-NEXT: bltu s1, a0, .LBB101_1 8603; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8604; RV64I-NEXT: # in Loop: Header=BB101_2 Depth=1 8605; RV64I-NEXT: mv a2, s2 8606; RV64I-NEXT: j .LBB101_1 8607; RV64I-NEXT: .LBB101_4: # %atomicrmw.end 8608; RV64I-NEXT: mv a0, a1 8609; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8610; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8611; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8612; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8613; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8614; RV64I-NEXT: addi sp, sp, 48 8615; RV64I-NEXT: ret 8616; 8617; RV64IA-LABEL: atomicrmw_umax_i16_acquire: 8618; RV64IA: # %bb.0: 8619; RV64IA-NEXT: andi a6, a0, -4 8620; RV64IA-NEXT: slliw a0, a0, 3 8621; RV64IA-NEXT: lui a3, 16 8622; RV64IA-NEXT: addiw a3, a3, -1 8623; RV64IA-NEXT: sllw a4, a3, a0 8624; RV64IA-NEXT: and a1, a1, a3 8625; RV64IA-NEXT: sllw a1, a1, a0 8626; RV64IA-NEXT: .LBB101_1: # =>This Inner Loop Header: Depth=1 8627; RV64IA-NEXT: lr.w.aq a3, (a6) 8628; RV64IA-NEXT: and a2, a3, a4 8629; RV64IA-NEXT: mv a5, a3 8630; RV64IA-NEXT: bgeu a2, a1, .LBB101_3 8631; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB101_1 Depth=1 8632; RV64IA-NEXT: xor a5, a3, a1 8633; RV64IA-NEXT: and a5, a5, a4 8634; RV64IA-NEXT: xor a5, a3, a5 8635; RV64IA-NEXT: .LBB101_3: # in Loop: Header=BB101_1 Depth=1 8636; RV64IA-NEXT: sc.w a5, a5, (a6) 8637; RV64IA-NEXT: bnez a5, .LBB101_1 8638; RV64IA-NEXT: # %bb.4: 8639; RV64IA-NEXT: srlw a0, a3, a0 8640; RV64IA-NEXT: ret 8641 %1 = atomicrmw umax i16* %a, i16 %b acquire 8642 ret i16 %1 8643} 8644 8645define i16 @atomicrmw_umax_i16_release(i16 *%a, i16 %b) nounwind { 8646; RV32I-LABEL: atomicrmw_umax_i16_release: 8647; RV32I: # %bb.0: 8648; RV32I-NEXT: addi sp, sp, -32 8649; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8650; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8651; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8652; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8653; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8654; RV32I-NEXT: mv s2, a1 8655; RV32I-NEXT: mv s3, a0 8656; RV32I-NEXT: lhu a1, 0(a0) 8657; RV32I-NEXT: lui a0, 16 8658; RV32I-NEXT: addi s0, a0, -1 8659; RV32I-NEXT: and s1, s2, s0 8660; RV32I-NEXT: j .LBB102_2 8661; RV32I-NEXT: .LBB102_1: # %atomicrmw.start 8662; RV32I-NEXT: # in Loop: Header=BB102_2 Depth=1 8663; RV32I-NEXT: sh a1, 10(sp) 8664; RV32I-NEXT: addi a1, sp, 10 8665; RV32I-NEXT: li a3, 3 8666; RV32I-NEXT: mv a0, s3 8667; RV32I-NEXT: li a4, 0 8668; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8669; RV32I-NEXT: lh a1, 10(sp) 8670; RV32I-NEXT: bnez a0, .LBB102_4 8671; RV32I-NEXT: .LBB102_2: # %atomicrmw.start 8672; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8673; RV32I-NEXT: and a0, a1, s0 8674; RV32I-NEXT: mv a2, a1 8675; RV32I-NEXT: bltu s1, a0, .LBB102_1 8676; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8677; RV32I-NEXT: # in Loop: Header=BB102_2 Depth=1 8678; RV32I-NEXT: mv a2, s2 8679; RV32I-NEXT: j .LBB102_1 8680; RV32I-NEXT: .LBB102_4: # %atomicrmw.end 8681; RV32I-NEXT: mv a0, a1 8682; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8683; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8684; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8685; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8686; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8687; RV32I-NEXT: addi sp, sp, 32 8688; RV32I-NEXT: ret 8689; 8690; RV32IA-LABEL: atomicrmw_umax_i16_release: 8691; RV32IA: # %bb.0: 8692; RV32IA-NEXT: andi a6, a0, -4 8693; RV32IA-NEXT: slli a0, a0, 3 8694; RV32IA-NEXT: lui a3, 16 8695; RV32IA-NEXT: addi a3, a3, -1 8696; RV32IA-NEXT: sll a4, a3, a0 8697; RV32IA-NEXT: and a1, a1, a3 8698; RV32IA-NEXT: sll a1, a1, a0 8699; RV32IA-NEXT: .LBB102_1: # =>This Inner Loop Header: Depth=1 8700; RV32IA-NEXT: lr.w a3, (a6) 8701; RV32IA-NEXT: and a2, a3, a4 8702; RV32IA-NEXT: mv a5, a3 8703; RV32IA-NEXT: bgeu a2, a1, .LBB102_3 8704; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB102_1 Depth=1 8705; RV32IA-NEXT: xor a5, a3, a1 8706; RV32IA-NEXT: and a5, a5, a4 8707; RV32IA-NEXT: xor a5, a3, a5 8708; RV32IA-NEXT: .LBB102_3: # in Loop: Header=BB102_1 Depth=1 8709; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 8710; RV32IA-NEXT: bnez a5, .LBB102_1 8711; RV32IA-NEXT: # %bb.4: 8712; RV32IA-NEXT: srl a0, a3, a0 8713; RV32IA-NEXT: ret 8714; 8715; RV64I-LABEL: atomicrmw_umax_i16_release: 8716; RV64I: # %bb.0: 8717; RV64I-NEXT: addi sp, sp, -48 8718; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8719; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8720; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8721; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8722; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8723; RV64I-NEXT: mv s2, a1 8724; RV64I-NEXT: mv s3, a0 8725; RV64I-NEXT: lhu a1, 0(a0) 8726; RV64I-NEXT: lui a0, 16 8727; RV64I-NEXT: addiw s0, a0, -1 8728; RV64I-NEXT: and s1, s2, s0 8729; RV64I-NEXT: j .LBB102_2 8730; RV64I-NEXT: .LBB102_1: # %atomicrmw.start 8731; RV64I-NEXT: # in Loop: Header=BB102_2 Depth=1 8732; RV64I-NEXT: sh a1, 6(sp) 8733; RV64I-NEXT: addi a1, sp, 6 8734; RV64I-NEXT: li a3, 3 8735; RV64I-NEXT: mv a0, s3 8736; RV64I-NEXT: li a4, 0 8737; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8738; RV64I-NEXT: lh a1, 6(sp) 8739; RV64I-NEXT: bnez a0, .LBB102_4 8740; RV64I-NEXT: .LBB102_2: # %atomicrmw.start 8741; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8742; RV64I-NEXT: and a0, a1, s0 8743; RV64I-NEXT: mv a2, a1 8744; RV64I-NEXT: bltu s1, a0, .LBB102_1 8745; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8746; RV64I-NEXT: # in Loop: Header=BB102_2 Depth=1 8747; RV64I-NEXT: mv a2, s2 8748; RV64I-NEXT: j .LBB102_1 8749; RV64I-NEXT: .LBB102_4: # %atomicrmw.end 8750; RV64I-NEXT: mv a0, a1 8751; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8752; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8753; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8754; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8755; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8756; RV64I-NEXT: addi sp, sp, 48 8757; RV64I-NEXT: ret 8758; 8759; RV64IA-LABEL: atomicrmw_umax_i16_release: 8760; RV64IA: # %bb.0: 8761; RV64IA-NEXT: andi a6, a0, -4 8762; RV64IA-NEXT: slliw a0, a0, 3 8763; RV64IA-NEXT: lui a3, 16 8764; RV64IA-NEXT: addiw a3, a3, -1 8765; RV64IA-NEXT: sllw a4, a3, a0 8766; RV64IA-NEXT: and a1, a1, a3 8767; RV64IA-NEXT: sllw a1, a1, a0 8768; RV64IA-NEXT: .LBB102_1: # =>This Inner Loop Header: Depth=1 8769; RV64IA-NEXT: lr.w a3, (a6) 8770; RV64IA-NEXT: and a2, a3, a4 8771; RV64IA-NEXT: mv a5, a3 8772; RV64IA-NEXT: bgeu a2, a1, .LBB102_3 8773; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB102_1 Depth=1 8774; RV64IA-NEXT: xor a5, a3, a1 8775; RV64IA-NEXT: and a5, a5, a4 8776; RV64IA-NEXT: xor a5, a3, a5 8777; RV64IA-NEXT: .LBB102_3: # in Loop: Header=BB102_1 Depth=1 8778; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 8779; RV64IA-NEXT: bnez a5, .LBB102_1 8780; RV64IA-NEXT: # %bb.4: 8781; RV64IA-NEXT: srlw a0, a3, a0 8782; RV64IA-NEXT: ret 8783 %1 = atomicrmw umax i16* %a, i16 %b release 8784 ret i16 %1 8785} 8786 8787define i16 @atomicrmw_umax_i16_acq_rel(i16 *%a, i16 %b) nounwind { 8788; RV32I-LABEL: atomicrmw_umax_i16_acq_rel: 8789; RV32I: # %bb.0: 8790; RV32I-NEXT: addi sp, sp, -32 8791; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8792; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8793; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8794; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8795; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8796; RV32I-NEXT: mv s2, a1 8797; RV32I-NEXT: mv s3, a0 8798; RV32I-NEXT: lhu a1, 0(a0) 8799; RV32I-NEXT: lui a0, 16 8800; RV32I-NEXT: addi s0, a0, -1 8801; RV32I-NEXT: and s1, s2, s0 8802; RV32I-NEXT: j .LBB103_2 8803; RV32I-NEXT: .LBB103_1: # %atomicrmw.start 8804; RV32I-NEXT: # in Loop: Header=BB103_2 Depth=1 8805; RV32I-NEXT: sh a1, 10(sp) 8806; RV32I-NEXT: addi a1, sp, 10 8807; RV32I-NEXT: li a3, 4 8808; RV32I-NEXT: li a4, 2 8809; RV32I-NEXT: mv a0, s3 8810; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8811; RV32I-NEXT: lh a1, 10(sp) 8812; RV32I-NEXT: bnez a0, .LBB103_4 8813; RV32I-NEXT: .LBB103_2: # %atomicrmw.start 8814; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8815; RV32I-NEXT: and a0, a1, s0 8816; RV32I-NEXT: mv a2, a1 8817; RV32I-NEXT: bltu s1, a0, .LBB103_1 8818; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8819; RV32I-NEXT: # in Loop: Header=BB103_2 Depth=1 8820; RV32I-NEXT: mv a2, s2 8821; RV32I-NEXT: j .LBB103_1 8822; RV32I-NEXT: .LBB103_4: # %atomicrmw.end 8823; RV32I-NEXT: mv a0, a1 8824; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8825; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8826; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8827; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8828; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8829; RV32I-NEXT: addi sp, sp, 32 8830; RV32I-NEXT: ret 8831; 8832; RV32IA-LABEL: atomicrmw_umax_i16_acq_rel: 8833; RV32IA: # %bb.0: 8834; RV32IA-NEXT: andi a6, a0, -4 8835; RV32IA-NEXT: slli a0, a0, 3 8836; RV32IA-NEXT: lui a3, 16 8837; RV32IA-NEXT: addi a3, a3, -1 8838; RV32IA-NEXT: sll a4, a3, a0 8839; RV32IA-NEXT: and a1, a1, a3 8840; RV32IA-NEXT: sll a1, a1, a0 8841; RV32IA-NEXT: .LBB103_1: # =>This Inner Loop Header: Depth=1 8842; RV32IA-NEXT: lr.w.aq a3, (a6) 8843; RV32IA-NEXT: and a2, a3, a4 8844; RV32IA-NEXT: mv a5, a3 8845; RV32IA-NEXT: bgeu a2, a1, .LBB103_3 8846; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB103_1 Depth=1 8847; RV32IA-NEXT: xor a5, a3, a1 8848; RV32IA-NEXT: and a5, a5, a4 8849; RV32IA-NEXT: xor a5, a3, a5 8850; RV32IA-NEXT: .LBB103_3: # in Loop: Header=BB103_1 Depth=1 8851; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 8852; RV32IA-NEXT: bnez a5, .LBB103_1 8853; RV32IA-NEXT: # %bb.4: 8854; RV32IA-NEXT: srl a0, a3, a0 8855; RV32IA-NEXT: ret 8856; 8857; RV64I-LABEL: atomicrmw_umax_i16_acq_rel: 8858; RV64I: # %bb.0: 8859; RV64I-NEXT: addi sp, sp, -48 8860; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8861; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8862; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8863; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8864; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8865; RV64I-NEXT: mv s2, a1 8866; RV64I-NEXT: mv s3, a0 8867; RV64I-NEXT: lhu a1, 0(a0) 8868; RV64I-NEXT: lui a0, 16 8869; RV64I-NEXT: addiw s0, a0, -1 8870; RV64I-NEXT: and s1, s2, s0 8871; RV64I-NEXT: j .LBB103_2 8872; RV64I-NEXT: .LBB103_1: # %atomicrmw.start 8873; RV64I-NEXT: # in Loop: Header=BB103_2 Depth=1 8874; RV64I-NEXT: sh a1, 6(sp) 8875; RV64I-NEXT: addi a1, sp, 6 8876; RV64I-NEXT: li a3, 4 8877; RV64I-NEXT: li a4, 2 8878; RV64I-NEXT: mv a0, s3 8879; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8880; RV64I-NEXT: lh a1, 6(sp) 8881; RV64I-NEXT: bnez a0, .LBB103_4 8882; RV64I-NEXT: .LBB103_2: # %atomicrmw.start 8883; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8884; RV64I-NEXT: and a0, a1, s0 8885; RV64I-NEXT: mv a2, a1 8886; RV64I-NEXT: bltu s1, a0, .LBB103_1 8887; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8888; RV64I-NEXT: # in Loop: Header=BB103_2 Depth=1 8889; RV64I-NEXT: mv a2, s2 8890; RV64I-NEXT: j .LBB103_1 8891; RV64I-NEXT: .LBB103_4: # %atomicrmw.end 8892; RV64I-NEXT: mv a0, a1 8893; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8894; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8895; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8896; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8897; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8898; RV64I-NEXT: addi sp, sp, 48 8899; RV64I-NEXT: ret 8900; 8901; RV64IA-LABEL: atomicrmw_umax_i16_acq_rel: 8902; RV64IA: # %bb.0: 8903; RV64IA-NEXT: andi a6, a0, -4 8904; RV64IA-NEXT: slliw a0, a0, 3 8905; RV64IA-NEXT: lui a3, 16 8906; RV64IA-NEXT: addiw a3, a3, -1 8907; RV64IA-NEXT: sllw a4, a3, a0 8908; RV64IA-NEXT: and a1, a1, a3 8909; RV64IA-NEXT: sllw a1, a1, a0 8910; RV64IA-NEXT: .LBB103_1: # =>This Inner Loop Header: Depth=1 8911; RV64IA-NEXT: lr.w.aq a3, (a6) 8912; RV64IA-NEXT: and a2, a3, a4 8913; RV64IA-NEXT: mv a5, a3 8914; RV64IA-NEXT: bgeu a2, a1, .LBB103_3 8915; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB103_1 Depth=1 8916; RV64IA-NEXT: xor a5, a3, a1 8917; RV64IA-NEXT: and a5, a5, a4 8918; RV64IA-NEXT: xor a5, a3, a5 8919; RV64IA-NEXT: .LBB103_3: # in Loop: Header=BB103_1 Depth=1 8920; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 8921; RV64IA-NEXT: bnez a5, .LBB103_1 8922; RV64IA-NEXT: # %bb.4: 8923; RV64IA-NEXT: srlw a0, a3, a0 8924; RV64IA-NEXT: ret 8925 %1 = atomicrmw umax i16* %a, i16 %b acq_rel 8926 ret i16 %1 8927} 8928 8929define i16 @atomicrmw_umax_i16_seq_cst(i16 *%a, i16 %b) nounwind { 8930; RV32I-LABEL: atomicrmw_umax_i16_seq_cst: 8931; RV32I: # %bb.0: 8932; RV32I-NEXT: addi sp, sp, -32 8933; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8934; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8935; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8936; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8937; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8938; RV32I-NEXT: mv s2, a1 8939; RV32I-NEXT: mv s3, a0 8940; RV32I-NEXT: lhu a1, 0(a0) 8941; RV32I-NEXT: lui a0, 16 8942; RV32I-NEXT: addi s0, a0, -1 8943; RV32I-NEXT: and s1, s2, s0 8944; RV32I-NEXT: j .LBB104_2 8945; RV32I-NEXT: .LBB104_1: # %atomicrmw.start 8946; RV32I-NEXT: # in Loop: Header=BB104_2 Depth=1 8947; RV32I-NEXT: sh a1, 10(sp) 8948; RV32I-NEXT: addi a1, sp, 10 8949; RV32I-NEXT: li a3, 5 8950; RV32I-NEXT: li a4, 5 8951; RV32I-NEXT: mv a0, s3 8952; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8953; RV32I-NEXT: lh a1, 10(sp) 8954; RV32I-NEXT: bnez a0, .LBB104_4 8955; RV32I-NEXT: .LBB104_2: # %atomicrmw.start 8956; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8957; RV32I-NEXT: and a0, a1, s0 8958; RV32I-NEXT: mv a2, a1 8959; RV32I-NEXT: bltu s1, a0, .LBB104_1 8960; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8961; RV32I-NEXT: # in Loop: Header=BB104_2 Depth=1 8962; RV32I-NEXT: mv a2, s2 8963; RV32I-NEXT: j .LBB104_1 8964; RV32I-NEXT: .LBB104_4: # %atomicrmw.end 8965; RV32I-NEXT: mv a0, a1 8966; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8967; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8968; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8969; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8970; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8971; RV32I-NEXT: addi sp, sp, 32 8972; RV32I-NEXT: ret 8973; 8974; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst: 8975; RV32IA: # %bb.0: 8976; RV32IA-NEXT: andi a6, a0, -4 8977; RV32IA-NEXT: slli a0, a0, 3 8978; RV32IA-NEXT: lui a3, 16 8979; RV32IA-NEXT: addi a3, a3, -1 8980; RV32IA-NEXT: sll a4, a3, a0 8981; RV32IA-NEXT: and a1, a1, a3 8982; RV32IA-NEXT: sll a1, a1, a0 8983; RV32IA-NEXT: .LBB104_1: # =>This Inner Loop Header: Depth=1 8984; RV32IA-NEXT: lr.w.aqrl a3, (a6) 8985; RV32IA-NEXT: and a2, a3, a4 8986; RV32IA-NEXT: mv a5, a3 8987; RV32IA-NEXT: bgeu a2, a1, .LBB104_3 8988; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB104_1 Depth=1 8989; RV32IA-NEXT: xor a5, a3, a1 8990; RV32IA-NEXT: and a5, a5, a4 8991; RV32IA-NEXT: xor a5, a3, a5 8992; RV32IA-NEXT: .LBB104_3: # in Loop: Header=BB104_1 Depth=1 8993; RV32IA-NEXT: sc.w.aqrl a5, a5, (a6) 8994; RV32IA-NEXT: bnez a5, .LBB104_1 8995; RV32IA-NEXT: # %bb.4: 8996; RV32IA-NEXT: srl a0, a3, a0 8997; RV32IA-NEXT: ret 8998; 8999; RV64I-LABEL: atomicrmw_umax_i16_seq_cst: 9000; RV64I: # %bb.0: 9001; RV64I-NEXT: addi sp, sp, -48 9002; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9003; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9004; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9005; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9006; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9007; RV64I-NEXT: mv s2, a1 9008; RV64I-NEXT: mv s3, a0 9009; RV64I-NEXT: lhu a1, 0(a0) 9010; RV64I-NEXT: lui a0, 16 9011; RV64I-NEXT: addiw s0, a0, -1 9012; RV64I-NEXT: and s1, s2, s0 9013; RV64I-NEXT: j .LBB104_2 9014; RV64I-NEXT: .LBB104_1: # %atomicrmw.start 9015; RV64I-NEXT: # in Loop: Header=BB104_2 Depth=1 9016; RV64I-NEXT: sh a1, 6(sp) 9017; RV64I-NEXT: addi a1, sp, 6 9018; RV64I-NEXT: li a3, 5 9019; RV64I-NEXT: li a4, 5 9020; RV64I-NEXT: mv a0, s3 9021; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9022; RV64I-NEXT: lh a1, 6(sp) 9023; RV64I-NEXT: bnez a0, .LBB104_4 9024; RV64I-NEXT: .LBB104_2: # %atomicrmw.start 9025; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9026; RV64I-NEXT: and a0, a1, s0 9027; RV64I-NEXT: mv a2, a1 9028; RV64I-NEXT: bltu s1, a0, .LBB104_1 9029; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9030; RV64I-NEXT: # in Loop: Header=BB104_2 Depth=1 9031; RV64I-NEXT: mv a2, s2 9032; RV64I-NEXT: j .LBB104_1 9033; RV64I-NEXT: .LBB104_4: # %atomicrmw.end 9034; RV64I-NEXT: mv a0, a1 9035; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9036; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9037; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9038; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9039; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9040; RV64I-NEXT: addi sp, sp, 48 9041; RV64I-NEXT: ret 9042; 9043; RV64IA-LABEL: atomicrmw_umax_i16_seq_cst: 9044; RV64IA: # %bb.0: 9045; RV64IA-NEXT: andi a6, a0, -4 9046; RV64IA-NEXT: slliw a0, a0, 3 9047; RV64IA-NEXT: lui a3, 16 9048; RV64IA-NEXT: addiw a3, a3, -1 9049; RV64IA-NEXT: sllw a4, a3, a0 9050; RV64IA-NEXT: and a1, a1, a3 9051; RV64IA-NEXT: sllw a1, a1, a0 9052; RV64IA-NEXT: .LBB104_1: # =>This Inner Loop Header: Depth=1 9053; RV64IA-NEXT: lr.w.aqrl a3, (a6) 9054; RV64IA-NEXT: and a2, a3, a4 9055; RV64IA-NEXT: mv a5, a3 9056; RV64IA-NEXT: bgeu a2, a1, .LBB104_3 9057; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB104_1 Depth=1 9058; RV64IA-NEXT: xor a5, a3, a1 9059; RV64IA-NEXT: and a5, a5, a4 9060; RV64IA-NEXT: xor a5, a3, a5 9061; RV64IA-NEXT: .LBB104_3: # in Loop: Header=BB104_1 Depth=1 9062; RV64IA-NEXT: sc.w.aqrl a5, a5, (a6) 9063; RV64IA-NEXT: bnez a5, .LBB104_1 9064; RV64IA-NEXT: # %bb.4: 9065; RV64IA-NEXT: srlw a0, a3, a0 9066; RV64IA-NEXT: ret 9067 %1 = atomicrmw umax i16* %a, i16 %b seq_cst 9068 ret i16 %1 9069} 9070 9071define i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind { 9072; RV32I-LABEL: atomicrmw_umin_i16_monotonic: 9073; RV32I: # %bb.0: 9074; RV32I-NEXT: addi sp, sp, -32 9075; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9076; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9077; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9078; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9079; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9080; RV32I-NEXT: mv s2, a1 9081; RV32I-NEXT: mv s3, a0 9082; RV32I-NEXT: lhu a1, 0(a0) 9083; RV32I-NEXT: lui a0, 16 9084; RV32I-NEXT: addi s0, a0, -1 9085; RV32I-NEXT: and s1, s2, s0 9086; RV32I-NEXT: j .LBB105_2 9087; RV32I-NEXT: .LBB105_1: # %atomicrmw.start 9088; RV32I-NEXT: # in Loop: Header=BB105_2 Depth=1 9089; RV32I-NEXT: sh a1, 10(sp) 9090; RV32I-NEXT: addi a1, sp, 10 9091; RV32I-NEXT: mv a0, s3 9092; RV32I-NEXT: li a3, 0 9093; RV32I-NEXT: li a4, 0 9094; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9095; RV32I-NEXT: lh a1, 10(sp) 9096; RV32I-NEXT: bnez a0, .LBB105_4 9097; RV32I-NEXT: .LBB105_2: # %atomicrmw.start 9098; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9099; RV32I-NEXT: and a0, a1, s0 9100; RV32I-NEXT: mv a2, a1 9101; RV32I-NEXT: bgeu s1, a0, .LBB105_1 9102; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9103; RV32I-NEXT: # in Loop: Header=BB105_2 Depth=1 9104; RV32I-NEXT: mv a2, s2 9105; RV32I-NEXT: j .LBB105_1 9106; RV32I-NEXT: .LBB105_4: # %atomicrmw.end 9107; RV32I-NEXT: mv a0, a1 9108; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9109; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9110; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9111; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9112; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9113; RV32I-NEXT: addi sp, sp, 32 9114; RV32I-NEXT: ret 9115; 9116; RV32IA-LABEL: atomicrmw_umin_i16_monotonic: 9117; RV32IA: # %bb.0: 9118; RV32IA-NEXT: andi a6, a0, -4 9119; RV32IA-NEXT: slli a0, a0, 3 9120; RV32IA-NEXT: lui a3, 16 9121; RV32IA-NEXT: addi a3, a3, -1 9122; RV32IA-NEXT: sll a4, a3, a0 9123; RV32IA-NEXT: and a1, a1, a3 9124; RV32IA-NEXT: sll a1, a1, a0 9125; RV32IA-NEXT: .LBB105_1: # =>This Inner Loop Header: Depth=1 9126; RV32IA-NEXT: lr.w a3, (a6) 9127; RV32IA-NEXT: and a2, a3, a4 9128; RV32IA-NEXT: mv a5, a3 9129; RV32IA-NEXT: bgeu a1, a2, .LBB105_3 9130; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB105_1 Depth=1 9131; RV32IA-NEXT: xor a5, a3, a1 9132; RV32IA-NEXT: and a5, a5, a4 9133; RV32IA-NEXT: xor a5, a3, a5 9134; RV32IA-NEXT: .LBB105_3: # in Loop: Header=BB105_1 Depth=1 9135; RV32IA-NEXT: sc.w a5, a5, (a6) 9136; RV32IA-NEXT: bnez a5, .LBB105_1 9137; RV32IA-NEXT: # %bb.4: 9138; RV32IA-NEXT: srl a0, a3, a0 9139; RV32IA-NEXT: ret 9140; 9141; RV64I-LABEL: atomicrmw_umin_i16_monotonic: 9142; RV64I: # %bb.0: 9143; RV64I-NEXT: addi sp, sp, -48 9144; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9145; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9146; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9147; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9148; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9149; RV64I-NEXT: mv s2, a1 9150; RV64I-NEXT: mv s3, a0 9151; RV64I-NEXT: lhu a1, 0(a0) 9152; RV64I-NEXT: lui a0, 16 9153; RV64I-NEXT: addiw s0, a0, -1 9154; RV64I-NEXT: and s1, s2, s0 9155; RV64I-NEXT: j .LBB105_2 9156; RV64I-NEXT: .LBB105_1: # %atomicrmw.start 9157; RV64I-NEXT: # in Loop: Header=BB105_2 Depth=1 9158; RV64I-NEXT: sh a1, 6(sp) 9159; RV64I-NEXT: addi a1, sp, 6 9160; RV64I-NEXT: mv a0, s3 9161; RV64I-NEXT: li a3, 0 9162; RV64I-NEXT: li a4, 0 9163; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9164; RV64I-NEXT: lh a1, 6(sp) 9165; RV64I-NEXT: bnez a0, .LBB105_4 9166; RV64I-NEXT: .LBB105_2: # %atomicrmw.start 9167; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9168; RV64I-NEXT: and a0, a1, s0 9169; RV64I-NEXT: mv a2, a1 9170; RV64I-NEXT: bgeu s1, a0, .LBB105_1 9171; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9172; RV64I-NEXT: # in Loop: Header=BB105_2 Depth=1 9173; RV64I-NEXT: mv a2, s2 9174; RV64I-NEXT: j .LBB105_1 9175; RV64I-NEXT: .LBB105_4: # %atomicrmw.end 9176; RV64I-NEXT: mv a0, a1 9177; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9178; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9179; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9180; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9181; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9182; RV64I-NEXT: addi sp, sp, 48 9183; RV64I-NEXT: ret 9184; 9185; RV64IA-LABEL: atomicrmw_umin_i16_monotonic: 9186; RV64IA: # %bb.0: 9187; RV64IA-NEXT: andi a6, a0, -4 9188; RV64IA-NEXT: slliw a0, a0, 3 9189; RV64IA-NEXT: lui a3, 16 9190; RV64IA-NEXT: addiw a3, a3, -1 9191; RV64IA-NEXT: sllw a4, a3, a0 9192; RV64IA-NEXT: and a1, a1, a3 9193; RV64IA-NEXT: sllw a1, a1, a0 9194; RV64IA-NEXT: .LBB105_1: # =>This Inner Loop Header: Depth=1 9195; RV64IA-NEXT: lr.w a3, (a6) 9196; RV64IA-NEXT: and a2, a3, a4 9197; RV64IA-NEXT: mv a5, a3 9198; RV64IA-NEXT: bgeu a1, a2, .LBB105_3 9199; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB105_1 Depth=1 9200; RV64IA-NEXT: xor a5, a3, a1 9201; RV64IA-NEXT: and a5, a5, a4 9202; RV64IA-NEXT: xor a5, a3, a5 9203; RV64IA-NEXT: .LBB105_3: # in Loop: Header=BB105_1 Depth=1 9204; RV64IA-NEXT: sc.w a5, a5, (a6) 9205; RV64IA-NEXT: bnez a5, .LBB105_1 9206; RV64IA-NEXT: # %bb.4: 9207; RV64IA-NEXT: srlw a0, a3, a0 9208; RV64IA-NEXT: ret 9209 %1 = atomicrmw umin i16* %a, i16 %b monotonic 9210 ret i16 %1 9211} 9212 9213define i16 @atomicrmw_umin_i16_acquire(i16 *%a, i16 %b) nounwind { 9214; RV32I-LABEL: atomicrmw_umin_i16_acquire: 9215; RV32I: # %bb.0: 9216; RV32I-NEXT: addi sp, sp, -32 9217; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9218; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9219; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9220; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9221; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9222; RV32I-NEXT: mv s2, a1 9223; RV32I-NEXT: mv s3, a0 9224; RV32I-NEXT: lhu a1, 0(a0) 9225; RV32I-NEXT: lui a0, 16 9226; RV32I-NEXT: addi s0, a0, -1 9227; RV32I-NEXT: and s1, s2, s0 9228; RV32I-NEXT: j .LBB106_2 9229; RV32I-NEXT: .LBB106_1: # %atomicrmw.start 9230; RV32I-NEXT: # in Loop: Header=BB106_2 Depth=1 9231; RV32I-NEXT: sh a1, 10(sp) 9232; RV32I-NEXT: addi a1, sp, 10 9233; RV32I-NEXT: li a3, 2 9234; RV32I-NEXT: li a4, 2 9235; RV32I-NEXT: mv a0, s3 9236; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9237; RV32I-NEXT: lh a1, 10(sp) 9238; RV32I-NEXT: bnez a0, .LBB106_4 9239; RV32I-NEXT: .LBB106_2: # %atomicrmw.start 9240; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9241; RV32I-NEXT: and a0, a1, s0 9242; RV32I-NEXT: mv a2, a1 9243; RV32I-NEXT: bgeu s1, a0, .LBB106_1 9244; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9245; RV32I-NEXT: # in Loop: Header=BB106_2 Depth=1 9246; RV32I-NEXT: mv a2, s2 9247; RV32I-NEXT: j .LBB106_1 9248; RV32I-NEXT: .LBB106_4: # %atomicrmw.end 9249; RV32I-NEXT: mv a0, a1 9250; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9251; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9252; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9253; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9254; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9255; RV32I-NEXT: addi sp, sp, 32 9256; RV32I-NEXT: ret 9257; 9258; RV32IA-LABEL: atomicrmw_umin_i16_acquire: 9259; RV32IA: # %bb.0: 9260; RV32IA-NEXT: andi a6, a0, -4 9261; RV32IA-NEXT: slli a0, a0, 3 9262; RV32IA-NEXT: lui a3, 16 9263; RV32IA-NEXT: addi a3, a3, -1 9264; RV32IA-NEXT: sll a4, a3, a0 9265; RV32IA-NEXT: and a1, a1, a3 9266; RV32IA-NEXT: sll a1, a1, a0 9267; RV32IA-NEXT: .LBB106_1: # =>This Inner Loop Header: Depth=1 9268; RV32IA-NEXT: lr.w.aq a3, (a6) 9269; RV32IA-NEXT: and a2, a3, a4 9270; RV32IA-NEXT: mv a5, a3 9271; RV32IA-NEXT: bgeu a1, a2, .LBB106_3 9272; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB106_1 Depth=1 9273; RV32IA-NEXT: xor a5, a3, a1 9274; RV32IA-NEXT: and a5, a5, a4 9275; RV32IA-NEXT: xor a5, a3, a5 9276; RV32IA-NEXT: .LBB106_3: # in Loop: Header=BB106_1 Depth=1 9277; RV32IA-NEXT: sc.w a5, a5, (a6) 9278; RV32IA-NEXT: bnez a5, .LBB106_1 9279; RV32IA-NEXT: # %bb.4: 9280; RV32IA-NEXT: srl a0, a3, a0 9281; RV32IA-NEXT: ret 9282; 9283; RV64I-LABEL: atomicrmw_umin_i16_acquire: 9284; RV64I: # %bb.0: 9285; RV64I-NEXT: addi sp, sp, -48 9286; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9287; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9288; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9289; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9290; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9291; RV64I-NEXT: mv s2, a1 9292; RV64I-NEXT: mv s3, a0 9293; RV64I-NEXT: lhu a1, 0(a0) 9294; RV64I-NEXT: lui a0, 16 9295; RV64I-NEXT: addiw s0, a0, -1 9296; RV64I-NEXT: and s1, s2, s0 9297; RV64I-NEXT: j .LBB106_2 9298; RV64I-NEXT: .LBB106_1: # %atomicrmw.start 9299; RV64I-NEXT: # in Loop: Header=BB106_2 Depth=1 9300; RV64I-NEXT: sh a1, 6(sp) 9301; RV64I-NEXT: addi a1, sp, 6 9302; RV64I-NEXT: li a3, 2 9303; RV64I-NEXT: li a4, 2 9304; RV64I-NEXT: mv a0, s3 9305; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9306; RV64I-NEXT: lh a1, 6(sp) 9307; RV64I-NEXT: bnez a0, .LBB106_4 9308; RV64I-NEXT: .LBB106_2: # %atomicrmw.start 9309; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9310; RV64I-NEXT: and a0, a1, s0 9311; RV64I-NEXT: mv a2, a1 9312; RV64I-NEXT: bgeu s1, a0, .LBB106_1 9313; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9314; RV64I-NEXT: # in Loop: Header=BB106_2 Depth=1 9315; RV64I-NEXT: mv a2, s2 9316; RV64I-NEXT: j .LBB106_1 9317; RV64I-NEXT: .LBB106_4: # %atomicrmw.end 9318; RV64I-NEXT: mv a0, a1 9319; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9320; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9321; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9322; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9323; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9324; RV64I-NEXT: addi sp, sp, 48 9325; RV64I-NEXT: ret 9326; 9327; RV64IA-LABEL: atomicrmw_umin_i16_acquire: 9328; RV64IA: # %bb.0: 9329; RV64IA-NEXT: andi a6, a0, -4 9330; RV64IA-NEXT: slliw a0, a0, 3 9331; RV64IA-NEXT: lui a3, 16 9332; RV64IA-NEXT: addiw a3, a3, -1 9333; RV64IA-NEXT: sllw a4, a3, a0 9334; RV64IA-NEXT: and a1, a1, a3 9335; RV64IA-NEXT: sllw a1, a1, a0 9336; RV64IA-NEXT: .LBB106_1: # =>This Inner Loop Header: Depth=1 9337; RV64IA-NEXT: lr.w.aq a3, (a6) 9338; RV64IA-NEXT: and a2, a3, a4 9339; RV64IA-NEXT: mv a5, a3 9340; RV64IA-NEXT: bgeu a1, a2, .LBB106_3 9341; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB106_1 Depth=1 9342; RV64IA-NEXT: xor a5, a3, a1 9343; RV64IA-NEXT: and a5, a5, a4 9344; RV64IA-NEXT: xor a5, a3, a5 9345; RV64IA-NEXT: .LBB106_3: # in Loop: Header=BB106_1 Depth=1 9346; RV64IA-NEXT: sc.w a5, a5, (a6) 9347; RV64IA-NEXT: bnez a5, .LBB106_1 9348; RV64IA-NEXT: # %bb.4: 9349; RV64IA-NEXT: srlw a0, a3, a0 9350; RV64IA-NEXT: ret 9351 %1 = atomicrmw umin i16* %a, i16 %b acquire 9352 ret i16 %1 9353} 9354 9355define i16 @atomicrmw_umin_i16_release(i16 *%a, i16 %b) nounwind { 9356; RV32I-LABEL: atomicrmw_umin_i16_release: 9357; RV32I: # %bb.0: 9358; RV32I-NEXT: addi sp, sp, -32 9359; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9360; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9361; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9362; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9363; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9364; RV32I-NEXT: mv s2, a1 9365; RV32I-NEXT: mv s3, a0 9366; RV32I-NEXT: lhu a1, 0(a0) 9367; RV32I-NEXT: lui a0, 16 9368; RV32I-NEXT: addi s0, a0, -1 9369; RV32I-NEXT: and s1, s2, s0 9370; RV32I-NEXT: j .LBB107_2 9371; RV32I-NEXT: .LBB107_1: # %atomicrmw.start 9372; RV32I-NEXT: # in Loop: Header=BB107_2 Depth=1 9373; RV32I-NEXT: sh a1, 10(sp) 9374; RV32I-NEXT: addi a1, sp, 10 9375; RV32I-NEXT: li a3, 3 9376; RV32I-NEXT: mv a0, s3 9377; RV32I-NEXT: li a4, 0 9378; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9379; RV32I-NEXT: lh a1, 10(sp) 9380; RV32I-NEXT: bnez a0, .LBB107_4 9381; RV32I-NEXT: .LBB107_2: # %atomicrmw.start 9382; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9383; RV32I-NEXT: and a0, a1, s0 9384; RV32I-NEXT: mv a2, a1 9385; RV32I-NEXT: bgeu s1, a0, .LBB107_1 9386; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9387; RV32I-NEXT: # in Loop: Header=BB107_2 Depth=1 9388; RV32I-NEXT: mv a2, s2 9389; RV32I-NEXT: j .LBB107_1 9390; RV32I-NEXT: .LBB107_4: # %atomicrmw.end 9391; RV32I-NEXT: mv a0, a1 9392; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9393; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9394; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9395; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9396; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9397; RV32I-NEXT: addi sp, sp, 32 9398; RV32I-NEXT: ret 9399; 9400; RV32IA-LABEL: atomicrmw_umin_i16_release: 9401; RV32IA: # %bb.0: 9402; RV32IA-NEXT: andi a6, a0, -4 9403; RV32IA-NEXT: slli a0, a0, 3 9404; RV32IA-NEXT: lui a3, 16 9405; RV32IA-NEXT: addi a3, a3, -1 9406; RV32IA-NEXT: sll a4, a3, a0 9407; RV32IA-NEXT: and a1, a1, a3 9408; RV32IA-NEXT: sll a1, a1, a0 9409; RV32IA-NEXT: .LBB107_1: # =>This Inner Loop Header: Depth=1 9410; RV32IA-NEXT: lr.w a3, (a6) 9411; RV32IA-NEXT: and a2, a3, a4 9412; RV32IA-NEXT: mv a5, a3 9413; RV32IA-NEXT: bgeu a1, a2, .LBB107_3 9414; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB107_1 Depth=1 9415; RV32IA-NEXT: xor a5, a3, a1 9416; RV32IA-NEXT: and a5, a5, a4 9417; RV32IA-NEXT: xor a5, a3, a5 9418; RV32IA-NEXT: .LBB107_3: # in Loop: Header=BB107_1 Depth=1 9419; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 9420; RV32IA-NEXT: bnez a5, .LBB107_1 9421; RV32IA-NEXT: # %bb.4: 9422; RV32IA-NEXT: srl a0, a3, a0 9423; RV32IA-NEXT: ret 9424; 9425; RV64I-LABEL: atomicrmw_umin_i16_release: 9426; RV64I: # %bb.0: 9427; RV64I-NEXT: addi sp, sp, -48 9428; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9429; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9430; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9431; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9432; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9433; RV64I-NEXT: mv s2, a1 9434; RV64I-NEXT: mv s3, a0 9435; RV64I-NEXT: lhu a1, 0(a0) 9436; RV64I-NEXT: lui a0, 16 9437; RV64I-NEXT: addiw s0, a0, -1 9438; RV64I-NEXT: and s1, s2, s0 9439; RV64I-NEXT: j .LBB107_2 9440; RV64I-NEXT: .LBB107_1: # %atomicrmw.start 9441; RV64I-NEXT: # in Loop: Header=BB107_2 Depth=1 9442; RV64I-NEXT: sh a1, 6(sp) 9443; RV64I-NEXT: addi a1, sp, 6 9444; RV64I-NEXT: li a3, 3 9445; RV64I-NEXT: mv a0, s3 9446; RV64I-NEXT: li a4, 0 9447; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9448; RV64I-NEXT: lh a1, 6(sp) 9449; RV64I-NEXT: bnez a0, .LBB107_4 9450; RV64I-NEXT: .LBB107_2: # %atomicrmw.start 9451; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9452; RV64I-NEXT: and a0, a1, s0 9453; RV64I-NEXT: mv a2, a1 9454; RV64I-NEXT: bgeu s1, a0, .LBB107_1 9455; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9456; RV64I-NEXT: # in Loop: Header=BB107_2 Depth=1 9457; RV64I-NEXT: mv a2, s2 9458; RV64I-NEXT: j .LBB107_1 9459; RV64I-NEXT: .LBB107_4: # %atomicrmw.end 9460; RV64I-NEXT: mv a0, a1 9461; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9462; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9463; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9464; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9465; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9466; RV64I-NEXT: addi sp, sp, 48 9467; RV64I-NEXT: ret 9468; 9469; RV64IA-LABEL: atomicrmw_umin_i16_release: 9470; RV64IA: # %bb.0: 9471; RV64IA-NEXT: andi a6, a0, -4 9472; RV64IA-NEXT: slliw a0, a0, 3 9473; RV64IA-NEXT: lui a3, 16 9474; RV64IA-NEXT: addiw a3, a3, -1 9475; RV64IA-NEXT: sllw a4, a3, a0 9476; RV64IA-NEXT: and a1, a1, a3 9477; RV64IA-NEXT: sllw a1, a1, a0 9478; RV64IA-NEXT: .LBB107_1: # =>This Inner Loop Header: Depth=1 9479; RV64IA-NEXT: lr.w a3, (a6) 9480; RV64IA-NEXT: and a2, a3, a4 9481; RV64IA-NEXT: mv a5, a3 9482; RV64IA-NEXT: bgeu a1, a2, .LBB107_3 9483; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB107_1 Depth=1 9484; RV64IA-NEXT: xor a5, a3, a1 9485; RV64IA-NEXT: and a5, a5, a4 9486; RV64IA-NEXT: xor a5, a3, a5 9487; RV64IA-NEXT: .LBB107_3: # in Loop: Header=BB107_1 Depth=1 9488; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 9489; RV64IA-NEXT: bnez a5, .LBB107_1 9490; RV64IA-NEXT: # %bb.4: 9491; RV64IA-NEXT: srlw a0, a3, a0 9492; RV64IA-NEXT: ret 9493 %1 = atomicrmw umin i16* %a, i16 %b release 9494 ret i16 %1 9495} 9496 9497define i16 @atomicrmw_umin_i16_acq_rel(i16 *%a, i16 %b) nounwind { 9498; RV32I-LABEL: atomicrmw_umin_i16_acq_rel: 9499; RV32I: # %bb.0: 9500; RV32I-NEXT: addi sp, sp, -32 9501; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9502; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9503; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9504; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9505; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9506; RV32I-NEXT: mv s2, a1 9507; RV32I-NEXT: mv s3, a0 9508; RV32I-NEXT: lhu a1, 0(a0) 9509; RV32I-NEXT: lui a0, 16 9510; RV32I-NEXT: addi s0, a0, -1 9511; RV32I-NEXT: and s1, s2, s0 9512; RV32I-NEXT: j .LBB108_2 9513; RV32I-NEXT: .LBB108_1: # %atomicrmw.start 9514; RV32I-NEXT: # in Loop: Header=BB108_2 Depth=1 9515; RV32I-NEXT: sh a1, 10(sp) 9516; RV32I-NEXT: addi a1, sp, 10 9517; RV32I-NEXT: li a3, 4 9518; RV32I-NEXT: li a4, 2 9519; RV32I-NEXT: mv a0, s3 9520; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9521; RV32I-NEXT: lh a1, 10(sp) 9522; RV32I-NEXT: bnez a0, .LBB108_4 9523; RV32I-NEXT: .LBB108_2: # %atomicrmw.start 9524; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9525; RV32I-NEXT: and a0, a1, s0 9526; RV32I-NEXT: mv a2, a1 9527; RV32I-NEXT: bgeu s1, a0, .LBB108_1 9528; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9529; RV32I-NEXT: # in Loop: Header=BB108_2 Depth=1 9530; RV32I-NEXT: mv a2, s2 9531; RV32I-NEXT: j .LBB108_1 9532; RV32I-NEXT: .LBB108_4: # %atomicrmw.end 9533; RV32I-NEXT: mv a0, a1 9534; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9535; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9536; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9537; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9538; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9539; RV32I-NEXT: addi sp, sp, 32 9540; RV32I-NEXT: ret 9541; 9542; RV32IA-LABEL: atomicrmw_umin_i16_acq_rel: 9543; RV32IA: # %bb.0: 9544; RV32IA-NEXT: andi a6, a0, -4 9545; RV32IA-NEXT: slli a0, a0, 3 9546; RV32IA-NEXT: lui a3, 16 9547; RV32IA-NEXT: addi a3, a3, -1 9548; RV32IA-NEXT: sll a4, a3, a0 9549; RV32IA-NEXT: and a1, a1, a3 9550; RV32IA-NEXT: sll a1, a1, a0 9551; RV32IA-NEXT: .LBB108_1: # =>This Inner Loop Header: Depth=1 9552; RV32IA-NEXT: lr.w.aq a3, (a6) 9553; RV32IA-NEXT: and a2, a3, a4 9554; RV32IA-NEXT: mv a5, a3 9555; RV32IA-NEXT: bgeu a1, a2, .LBB108_3 9556; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB108_1 Depth=1 9557; RV32IA-NEXT: xor a5, a3, a1 9558; RV32IA-NEXT: and a5, a5, a4 9559; RV32IA-NEXT: xor a5, a3, a5 9560; RV32IA-NEXT: .LBB108_3: # in Loop: Header=BB108_1 Depth=1 9561; RV32IA-NEXT: sc.w.rl a5, a5, (a6) 9562; RV32IA-NEXT: bnez a5, .LBB108_1 9563; RV32IA-NEXT: # %bb.4: 9564; RV32IA-NEXT: srl a0, a3, a0 9565; RV32IA-NEXT: ret 9566; 9567; RV64I-LABEL: atomicrmw_umin_i16_acq_rel: 9568; RV64I: # %bb.0: 9569; RV64I-NEXT: addi sp, sp, -48 9570; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9571; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9572; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9573; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9574; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9575; RV64I-NEXT: mv s2, a1 9576; RV64I-NEXT: mv s3, a0 9577; RV64I-NEXT: lhu a1, 0(a0) 9578; RV64I-NEXT: lui a0, 16 9579; RV64I-NEXT: addiw s0, a0, -1 9580; RV64I-NEXT: and s1, s2, s0 9581; RV64I-NEXT: j .LBB108_2 9582; RV64I-NEXT: .LBB108_1: # %atomicrmw.start 9583; RV64I-NEXT: # in Loop: Header=BB108_2 Depth=1 9584; RV64I-NEXT: sh a1, 6(sp) 9585; RV64I-NEXT: addi a1, sp, 6 9586; RV64I-NEXT: li a3, 4 9587; RV64I-NEXT: li a4, 2 9588; RV64I-NEXT: mv a0, s3 9589; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9590; RV64I-NEXT: lh a1, 6(sp) 9591; RV64I-NEXT: bnez a0, .LBB108_4 9592; RV64I-NEXT: .LBB108_2: # %atomicrmw.start 9593; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9594; RV64I-NEXT: and a0, a1, s0 9595; RV64I-NEXT: mv a2, a1 9596; RV64I-NEXT: bgeu s1, a0, .LBB108_1 9597; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9598; RV64I-NEXT: # in Loop: Header=BB108_2 Depth=1 9599; RV64I-NEXT: mv a2, s2 9600; RV64I-NEXT: j .LBB108_1 9601; RV64I-NEXT: .LBB108_4: # %atomicrmw.end 9602; RV64I-NEXT: mv a0, a1 9603; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9604; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9605; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9606; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9607; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9608; RV64I-NEXT: addi sp, sp, 48 9609; RV64I-NEXT: ret 9610; 9611; RV64IA-LABEL: atomicrmw_umin_i16_acq_rel: 9612; RV64IA: # %bb.0: 9613; RV64IA-NEXT: andi a6, a0, -4 9614; RV64IA-NEXT: slliw a0, a0, 3 9615; RV64IA-NEXT: lui a3, 16 9616; RV64IA-NEXT: addiw a3, a3, -1 9617; RV64IA-NEXT: sllw a4, a3, a0 9618; RV64IA-NEXT: and a1, a1, a3 9619; RV64IA-NEXT: sllw a1, a1, a0 9620; RV64IA-NEXT: .LBB108_1: # =>This Inner Loop Header: Depth=1 9621; RV64IA-NEXT: lr.w.aq a3, (a6) 9622; RV64IA-NEXT: and a2, a3, a4 9623; RV64IA-NEXT: mv a5, a3 9624; RV64IA-NEXT: bgeu a1, a2, .LBB108_3 9625; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB108_1 Depth=1 9626; RV64IA-NEXT: xor a5, a3, a1 9627; RV64IA-NEXT: and a5, a5, a4 9628; RV64IA-NEXT: xor a5, a3, a5 9629; RV64IA-NEXT: .LBB108_3: # in Loop: Header=BB108_1 Depth=1 9630; RV64IA-NEXT: sc.w.rl a5, a5, (a6) 9631; RV64IA-NEXT: bnez a5, .LBB108_1 9632; RV64IA-NEXT: # %bb.4: 9633; RV64IA-NEXT: srlw a0, a3, a0 9634; RV64IA-NEXT: ret 9635 %1 = atomicrmw umin i16* %a, i16 %b acq_rel 9636 ret i16 %1 9637} 9638 9639define i16 @atomicrmw_umin_i16_seq_cst(i16 *%a, i16 %b) nounwind { 9640; RV32I-LABEL: atomicrmw_umin_i16_seq_cst: 9641; RV32I: # %bb.0: 9642; RV32I-NEXT: addi sp, sp, -32 9643; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9644; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9645; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9646; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9647; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9648; RV32I-NEXT: mv s2, a1 9649; RV32I-NEXT: mv s3, a0 9650; RV32I-NEXT: lhu a1, 0(a0) 9651; RV32I-NEXT: lui a0, 16 9652; RV32I-NEXT: addi s0, a0, -1 9653; RV32I-NEXT: and s1, s2, s0 9654; RV32I-NEXT: j .LBB109_2 9655; RV32I-NEXT: .LBB109_1: # %atomicrmw.start 9656; RV32I-NEXT: # in Loop: Header=BB109_2 Depth=1 9657; RV32I-NEXT: sh a1, 10(sp) 9658; RV32I-NEXT: addi a1, sp, 10 9659; RV32I-NEXT: li a3, 5 9660; RV32I-NEXT: li a4, 5 9661; RV32I-NEXT: mv a0, s3 9662; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9663; RV32I-NEXT: lh a1, 10(sp) 9664; RV32I-NEXT: bnez a0, .LBB109_4 9665; RV32I-NEXT: .LBB109_2: # %atomicrmw.start 9666; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9667; RV32I-NEXT: and a0, a1, s0 9668; RV32I-NEXT: mv a2, a1 9669; RV32I-NEXT: bgeu s1, a0, .LBB109_1 9670; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9671; RV32I-NEXT: # in Loop: Header=BB109_2 Depth=1 9672; RV32I-NEXT: mv a2, s2 9673; RV32I-NEXT: j .LBB109_1 9674; RV32I-NEXT: .LBB109_4: # %atomicrmw.end 9675; RV32I-NEXT: mv a0, a1 9676; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9677; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9678; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9679; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9680; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9681; RV32I-NEXT: addi sp, sp, 32 9682; RV32I-NEXT: ret 9683; 9684; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst: 9685; RV32IA: # %bb.0: 9686; RV32IA-NEXT: andi a6, a0, -4 9687; RV32IA-NEXT: slli a0, a0, 3 9688; RV32IA-NEXT: lui a3, 16 9689; RV32IA-NEXT: addi a3, a3, -1 9690; RV32IA-NEXT: sll a4, a3, a0 9691; RV32IA-NEXT: and a1, a1, a3 9692; RV32IA-NEXT: sll a1, a1, a0 9693; RV32IA-NEXT: .LBB109_1: # =>This Inner Loop Header: Depth=1 9694; RV32IA-NEXT: lr.w.aqrl a3, (a6) 9695; RV32IA-NEXT: and a2, a3, a4 9696; RV32IA-NEXT: mv a5, a3 9697; RV32IA-NEXT: bgeu a1, a2, .LBB109_3 9698; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB109_1 Depth=1 9699; RV32IA-NEXT: xor a5, a3, a1 9700; RV32IA-NEXT: and a5, a5, a4 9701; RV32IA-NEXT: xor a5, a3, a5 9702; RV32IA-NEXT: .LBB109_3: # in Loop: Header=BB109_1 Depth=1 9703; RV32IA-NEXT: sc.w.aqrl a5, a5, (a6) 9704; RV32IA-NEXT: bnez a5, .LBB109_1 9705; RV32IA-NEXT: # %bb.4: 9706; RV32IA-NEXT: srl a0, a3, a0 9707; RV32IA-NEXT: ret 9708; 9709; RV64I-LABEL: atomicrmw_umin_i16_seq_cst: 9710; RV64I: # %bb.0: 9711; RV64I-NEXT: addi sp, sp, -48 9712; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9713; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9714; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9715; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9716; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9717; RV64I-NEXT: mv s2, a1 9718; RV64I-NEXT: mv s3, a0 9719; RV64I-NEXT: lhu a1, 0(a0) 9720; RV64I-NEXT: lui a0, 16 9721; RV64I-NEXT: addiw s0, a0, -1 9722; RV64I-NEXT: and s1, s2, s0 9723; RV64I-NEXT: j .LBB109_2 9724; RV64I-NEXT: .LBB109_1: # %atomicrmw.start 9725; RV64I-NEXT: # in Loop: Header=BB109_2 Depth=1 9726; RV64I-NEXT: sh a1, 6(sp) 9727; RV64I-NEXT: addi a1, sp, 6 9728; RV64I-NEXT: li a3, 5 9729; RV64I-NEXT: li a4, 5 9730; RV64I-NEXT: mv a0, s3 9731; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9732; RV64I-NEXT: lh a1, 6(sp) 9733; RV64I-NEXT: bnez a0, .LBB109_4 9734; RV64I-NEXT: .LBB109_2: # %atomicrmw.start 9735; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9736; RV64I-NEXT: and a0, a1, s0 9737; RV64I-NEXT: mv a2, a1 9738; RV64I-NEXT: bgeu s1, a0, .LBB109_1 9739; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9740; RV64I-NEXT: # in Loop: Header=BB109_2 Depth=1 9741; RV64I-NEXT: mv a2, s2 9742; RV64I-NEXT: j .LBB109_1 9743; RV64I-NEXT: .LBB109_4: # %atomicrmw.end 9744; RV64I-NEXT: mv a0, a1 9745; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9746; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9747; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9748; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9749; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9750; RV64I-NEXT: addi sp, sp, 48 9751; RV64I-NEXT: ret 9752; 9753; RV64IA-LABEL: atomicrmw_umin_i16_seq_cst: 9754; RV64IA: # %bb.0: 9755; RV64IA-NEXT: andi a6, a0, -4 9756; RV64IA-NEXT: slliw a0, a0, 3 9757; RV64IA-NEXT: lui a3, 16 9758; RV64IA-NEXT: addiw a3, a3, -1 9759; RV64IA-NEXT: sllw a4, a3, a0 9760; RV64IA-NEXT: and a1, a1, a3 9761; RV64IA-NEXT: sllw a1, a1, a0 9762; RV64IA-NEXT: .LBB109_1: # =>This Inner Loop Header: Depth=1 9763; RV64IA-NEXT: lr.w.aqrl a3, (a6) 9764; RV64IA-NEXT: and a2, a3, a4 9765; RV64IA-NEXT: mv a5, a3 9766; RV64IA-NEXT: bgeu a1, a2, .LBB109_3 9767; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB109_1 Depth=1 9768; RV64IA-NEXT: xor a5, a3, a1 9769; RV64IA-NEXT: and a5, a5, a4 9770; RV64IA-NEXT: xor a5, a3, a5 9771; RV64IA-NEXT: .LBB109_3: # in Loop: Header=BB109_1 Depth=1 9772; RV64IA-NEXT: sc.w.aqrl a5, a5, (a6) 9773; RV64IA-NEXT: bnez a5, .LBB109_1 9774; RV64IA-NEXT: # %bb.4: 9775; RV64IA-NEXT: srlw a0, a3, a0 9776; RV64IA-NEXT: ret 9777 %1 = atomicrmw umin i16* %a, i16 %b seq_cst 9778 ret i16 %1 9779} 9780 9781define i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind { 9782; RV32I-LABEL: atomicrmw_xchg_i32_monotonic: 9783; RV32I: # %bb.0: 9784; RV32I-NEXT: addi sp, sp, -16 9785; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9786; RV32I-NEXT: li a2, 0 9787; RV32I-NEXT: call __atomic_exchange_4@plt 9788; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9789; RV32I-NEXT: addi sp, sp, 16 9790; RV32I-NEXT: ret 9791; 9792; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic: 9793; RV32IA: # %bb.0: 9794; RV32IA-NEXT: amoswap.w a0, a1, (a0) 9795; RV32IA-NEXT: ret 9796; 9797; RV64I-LABEL: atomicrmw_xchg_i32_monotonic: 9798; RV64I: # %bb.0: 9799; RV64I-NEXT: addi sp, sp, -16 9800; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9801; RV64I-NEXT: li a2, 0 9802; RV64I-NEXT: call __atomic_exchange_4@plt 9803; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9804; RV64I-NEXT: addi sp, sp, 16 9805; RV64I-NEXT: ret 9806; 9807; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic: 9808; RV64IA: # %bb.0: 9809; RV64IA-NEXT: amoswap.w a0, a1, (a0) 9810; RV64IA-NEXT: ret 9811 %1 = atomicrmw xchg i32* %a, i32 %b monotonic 9812 ret i32 %1 9813} 9814 9815define i32 @atomicrmw_xchg_i32_acquire(i32* %a, i32 %b) nounwind { 9816; RV32I-LABEL: atomicrmw_xchg_i32_acquire: 9817; RV32I: # %bb.0: 9818; RV32I-NEXT: addi sp, sp, -16 9819; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9820; RV32I-NEXT: li a2, 2 9821; RV32I-NEXT: call __atomic_exchange_4@plt 9822; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9823; RV32I-NEXT: addi sp, sp, 16 9824; RV32I-NEXT: ret 9825; 9826; RV32IA-LABEL: atomicrmw_xchg_i32_acquire: 9827; RV32IA: # %bb.0: 9828; RV32IA-NEXT: amoswap.w.aq a0, a1, (a0) 9829; RV32IA-NEXT: ret 9830; 9831; RV64I-LABEL: atomicrmw_xchg_i32_acquire: 9832; RV64I: # %bb.0: 9833; RV64I-NEXT: addi sp, sp, -16 9834; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9835; RV64I-NEXT: li a2, 2 9836; RV64I-NEXT: call __atomic_exchange_4@plt 9837; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9838; RV64I-NEXT: addi sp, sp, 16 9839; RV64I-NEXT: ret 9840; 9841; RV64IA-LABEL: atomicrmw_xchg_i32_acquire: 9842; RV64IA: # %bb.0: 9843; RV64IA-NEXT: amoswap.w.aq a0, a1, (a0) 9844; RV64IA-NEXT: ret 9845 %1 = atomicrmw xchg i32* %a, i32 %b acquire 9846 ret i32 %1 9847} 9848 9849define i32 @atomicrmw_xchg_i32_release(i32* %a, i32 %b) nounwind { 9850; RV32I-LABEL: atomicrmw_xchg_i32_release: 9851; RV32I: # %bb.0: 9852; RV32I-NEXT: addi sp, sp, -16 9853; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9854; RV32I-NEXT: li a2, 3 9855; RV32I-NEXT: call __atomic_exchange_4@plt 9856; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9857; RV32I-NEXT: addi sp, sp, 16 9858; RV32I-NEXT: ret 9859; 9860; RV32IA-LABEL: atomicrmw_xchg_i32_release: 9861; RV32IA: # %bb.0: 9862; RV32IA-NEXT: amoswap.w.rl a0, a1, (a0) 9863; RV32IA-NEXT: ret 9864; 9865; RV64I-LABEL: atomicrmw_xchg_i32_release: 9866; RV64I: # %bb.0: 9867; RV64I-NEXT: addi sp, sp, -16 9868; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9869; RV64I-NEXT: li a2, 3 9870; RV64I-NEXT: call __atomic_exchange_4@plt 9871; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9872; RV64I-NEXT: addi sp, sp, 16 9873; RV64I-NEXT: ret 9874; 9875; RV64IA-LABEL: atomicrmw_xchg_i32_release: 9876; RV64IA: # %bb.0: 9877; RV64IA-NEXT: amoswap.w.rl a0, a1, (a0) 9878; RV64IA-NEXT: ret 9879 %1 = atomicrmw xchg i32* %a, i32 %b release 9880 ret i32 %1 9881} 9882 9883define i32 @atomicrmw_xchg_i32_acq_rel(i32* %a, i32 %b) nounwind { 9884; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel: 9885; RV32I: # %bb.0: 9886; RV32I-NEXT: addi sp, sp, -16 9887; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9888; RV32I-NEXT: li a2, 4 9889; RV32I-NEXT: call __atomic_exchange_4@plt 9890; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9891; RV32I-NEXT: addi sp, sp, 16 9892; RV32I-NEXT: ret 9893; 9894; RV32IA-LABEL: atomicrmw_xchg_i32_acq_rel: 9895; RV32IA: # %bb.0: 9896; RV32IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9897; RV32IA-NEXT: ret 9898; 9899; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel: 9900; RV64I: # %bb.0: 9901; RV64I-NEXT: addi sp, sp, -16 9902; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9903; RV64I-NEXT: li a2, 4 9904; RV64I-NEXT: call __atomic_exchange_4@plt 9905; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9906; RV64I-NEXT: addi sp, sp, 16 9907; RV64I-NEXT: ret 9908; 9909; RV64IA-LABEL: atomicrmw_xchg_i32_acq_rel: 9910; RV64IA: # %bb.0: 9911; RV64IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9912; RV64IA-NEXT: ret 9913 %1 = atomicrmw xchg i32* %a, i32 %b acq_rel 9914 ret i32 %1 9915} 9916 9917define i32 @atomicrmw_xchg_i32_seq_cst(i32* %a, i32 %b) nounwind { 9918; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst: 9919; RV32I: # %bb.0: 9920; RV32I-NEXT: addi sp, sp, -16 9921; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9922; RV32I-NEXT: li a2, 5 9923; RV32I-NEXT: call __atomic_exchange_4@plt 9924; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9925; RV32I-NEXT: addi sp, sp, 16 9926; RV32I-NEXT: ret 9927; 9928; RV32IA-LABEL: atomicrmw_xchg_i32_seq_cst: 9929; RV32IA: # %bb.0: 9930; RV32IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9931; RV32IA-NEXT: ret 9932; 9933; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst: 9934; RV64I: # %bb.0: 9935; RV64I-NEXT: addi sp, sp, -16 9936; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9937; RV64I-NEXT: li a2, 5 9938; RV64I-NEXT: call __atomic_exchange_4@plt 9939; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9940; RV64I-NEXT: addi sp, sp, 16 9941; RV64I-NEXT: ret 9942; 9943; RV64IA-LABEL: atomicrmw_xchg_i32_seq_cst: 9944; RV64IA: # %bb.0: 9945; RV64IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9946; RV64IA-NEXT: ret 9947 %1 = atomicrmw xchg i32* %a, i32 %b seq_cst 9948 ret i32 %1 9949} 9950 9951define i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind { 9952; RV32I-LABEL: atomicrmw_add_i32_monotonic: 9953; RV32I: # %bb.0: 9954; RV32I-NEXT: addi sp, sp, -16 9955; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9956; RV32I-NEXT: li a2, 0 9957; RV32I-NEXT: call __atomic_fetch_add_4@plt 9958; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9959; RV32I-NEXT: addi sp, sp, 16 9960; RV32I-NEXT: ret 9961; 9962; RV32IA-LABEL: atomicrmw_add_i32_monotonic: 9963; RV32IA: # %bb.0: 9964; RV32IA-NEXT: amoadd.w a0, a1, (a0) 9965; RV32IA-NEXT: ret 9966; 9967; RV64I-LABEL: atomicrmw_add_i32_monotonic: 9968; RV64I: # %bb.0: 9969; RV64I-NEXT: addi sp, sp, -16 9970; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9971; RV64I-NEXT: li a2, 0 9972; RV64I-NEXT: call __atomic_fetch_add_4@plt 9973; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9974; RV64I-NEXT: addi sp, sp, 16 9975; RV64I-NEXT: ret 9976; 9977; RV64IA-LABEL: atomicrmw_add_i32_monotonic: 9978; RV64IA: # %bb.0: 9979; RV64IA-NEXT: amoadd.w a0, a1, (a0) 9980; RV64IA-NEXT: ret 9981 %1 = atomicrmw add i32* %a, i32 %b monotonic 9982 ret i32 %1 9983} 9984 9985define i32 @atomicrmw_add_i32_acquire(i32 *%a, i32 %b) nounwind { 9986; RV32I-LABEL: atomicrmw_add_i32_acquire: 9987; RV32I: # %bb.0: 9988; RV32I-NEXT: addi sp, sp, -16 9989; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9990; RV32I-NEXT: li a2, 2 9991; RV32I-NEXT: call __atomic_fetch_add_4@plt 9992; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9993; RV32I-NEXT: addi sp, sp, 16 9994; RV32I-NEXT: ret 9995; 9996; RV32IA-LABEL: atomicrmw_add_i32_acquire: 9997; RV32IA: # %bb.0: 9998; RV32IA-NEXT: amoadd.w.aq a0, a1, (a0) 9999; RV32IA-NEXT: ret 10000; 10001; RV64I-LABEL: atomicrmw_add_i32_acquire: 10002; RV64I: # %bb.0: 10003; RV64I-NEXT: addi sp, sp, -16 10004; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10005; RV64I-NEXT: li a2, 2 10006; RV64I-NEXT: call __atomic_fetch_add_4@plt 10007; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10008; RV64I-NEXT: addi sp, sp, 16 10009; RV64I-NEXT: ret 10010; 10011; RV64IA-LABEL: atomicrmw_add_i32_acquire: 10012; RV64IA: # %bb.0: 10013; RV64IA-NEXT: amoadd.w.aq a0, a1, (a0) 10014; RV64IA-NEXT: ret 10015 %1 = atomicrmw add i32* %a, i32 %b acquire 10016 ret i32 %1 10017} 10018 10019define i32 @atomicrmw_add_i32_release(i32 *%a, i32 %b) nounwind { 10020; RV32I-LABEL: atomicrmw_add_i32_release: 10021; RV32I: # %bb.0: 10022; RV32I-NEXT: addi sp, sp, -16 10023; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10024; RV32I-NEXT: li a2, 3 10025; RV32I-NEXT: call __atomic_fetch_add_4@plt 10026; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10027; RV32I-NEXT: addi sp, sp, 16 10028; RV32I-NEXT: ret 10029; 10030; RV32IA-LABEL: atomicrmw_add_i32_release: 10031; RV32IA: # %bb.0: 10032; RV32IA-NEXT: amoadd.w.rl a0, a1, (a0) 10033; RV32IA-NEXT: ret 10034; 10035; RV64I-LABEL: atomicrmw_add_i32_release: 10036; RV64I: # %bb.0: 10037; RV64I-NEXT: addi sp, sp, -16 10038; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10039; RV64I-NEXT: li a2, 3 10040; RV64I-NEXT: call __atomic_fetch_add_4@plt 10041; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10042; RV64I-NEXT: addi sp, sp, 16 10043; RV64I-NEXT: ret 10044; 10045; RV64IA-LABEL: atomicrmw_add_i32_release: 10046; RV64IA: # %bb.0: 10047; RV64IA-NEXT: amoadd.w.rl a0, a1, (a0) 10048; RV64IA-NEXT: ret 10049 %1 = atomicrmw add i32* %a, i32 %b release 10050 ret i32 %1 10051} 10052 10053define i32 @atomicrmw_add_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10054; RV32I-LABEL: atomicrmw_add_i32_acq_rel: 10055; RV32I: # %bb.0: 10056; RV32I-NEXT: addi sp, sp, -16 10057; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10058; RV32I-NEXT: li a2, 4 10059; RV32I-NEXT: call __atomic_fetch_add_4@plt 10060; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10061; RV32I-NEXT: addi sp, sp, 16 10062; RV32I-NEXT: ret 10063; 10064; RV32IA-LABEL: atomicrmw_add_i32_acq_rel: 10065; RV32IA: # %bb.0: 10066; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10067; RV32IA-NEXT: ret 10068; 10069; RV64I-LABEL: atomicrmw_add_i32_acq_rel: 10070; RV64I: # %bb.0: 10071; RV64I-NEXT: addi sp, sp, -16 10072; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10073; RV64I-NEXT: li a2, 4 10074; RV64I-NEXT: call __atomic_fetch_add_4@plt 10075; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10076; RV64I-NEXT: addi sp, sp, 16 10077; RV64I-NEXT: ret 10078; 10079; RV64IA-LABEL: atomicrmw_add_i32_acq_rel: 10080; RV64IA: # %bb.0: 10081; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10082; RV64IA-NEXT: ret 10083 %1 = atomicrmw add i32* %a, i32 %b acq_rel 10084 ret i32 %1 10085} 10086 10087define i32 @atomicrmw_add_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10088; RV32I-LABEL: atomicrmw_add_i32_seq_cst: 10089; RV32I: # %bb.0: 10090; RV32I-NEXT: addi sp, sp, -16 10091; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10092; RV32I-NEXT: li a2, 5 10093; RV32I-NEXT: call __atomic_fetch_add_4@plt 10094; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10095; RV32I-NEXT: addi sp, sp, 16 10096; RV32I-NEXT: ret 10097; 10098; RV32IA-LABEL: atomicrmw_add_i32_seq_cst: 10099; RV32IA: # %bb.0: 10100; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10101; RV32IA-NEXT: ret 10102; 10103; RV64I-LABEL: atomicrmw_add_i32_seq_cst: 10104; RV64I: # %bb.0: 10105; RV64I-NEXT: addi sp, sp, -16 10106; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10107; RV64I-NEXT: li a2, 5 10108; RV64I-NEXT: call __atomic_fetch_add_4@plt 10109; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10110; RV64I-NEXT: addi sp, sp, 16 10111; RV64I-NEXT: ret 10112; 10113; RV64IA-LABEL: atomicrmw_add_i32_seq_cst: 10114; RV64IA: # %bb.0: 10115; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10116; RV64IA-NEXT: ret 10117 %1 = atomicrmw add i32* %a, i32 %b seq_cst 10118 ret i32 %1 10119} 10120 10121define i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind { 10122; RV32I-LABEL: atomicrmw_sub_i32_monotonic: 10123; RV32I: # %bb.0: 10124; RV32I-NEXT: addi sp, sp, -16 10125; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10126; RV32I-NEXT: li a2, 0 10127; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10128; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10129; RV32I-NEXT: addi sp, sp, 16 10130; RV32I-NEXT: ret 10131; 10132; RV32IA-LABEL: atomicrmw_sub_i32_monotonic: 10133; RV32IA: # %bb.0: 10134; RV32IA-NEXT: neg a1, a1 10135; RV32IA-NEXT: amoadd.w a0, a1, (a0) 10136; RV32IA-NEXT: ret 10137; 10138; RV64I-LABEL: atomicrmw_sub_i32_monotonic: 10139; RV64I: # %bb.0: 10140; RV64I-NEXT: addi sp, sp, -16 10141; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10142; RV64I-NEXT: li a2, 0 10143; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10144; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10145; RV64I-NEXT: addi sp, sp, 16 10146; RV64I-NEXT: ret 10147; 10148; RV64IA-LABEL: atomicrmw_sub_i32_monotonic: 10149; RV64IA: # %bb.0: 10150; RV64IA-NEXT: neg a1, a1 10151; RV64IA-NEXT: amoadd.w a0, a1, (a0) 10152; RV64IA-NEXT: ret 10153 %1 = atomicrmw sub i32* %a, i32 %b monotonic 10154 ret i32 %1 10155} 10156 10157define i32 @atomicrmw_sub_i32_acquire(i32* %a, i32 %b) nounwind { 10158; RV32I-LABEL: atomicrmw_sub_i32_acquire: 10159; RV32I: # %bb.0: 10160; RV32I-NEXT: addi sp, sp, -16 10161; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10162; RV32I-NEXT: li a2, 2 10163; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10164; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10165; RV32I-NEXT: addi sp, sp, 16 10166; RV32I-NEXT: ret 10167; 10168; RV32IA-LABEL: atomicrmw_sub_i32_acquire: 10169; RV32IA: # %bb.0: 10170; RV32IA-NEXT: neg a1, a1 10171; RV32IA-NEXT: amoadd.w.aq a0, a1, (a0) 10172; RV32IA-NEXT: ret 10173; 10174; RV64I-LABEL: atomicrmw_sub_i32_acquire: 10175; RV64I: # %bb.0: 10176; RV64I-NEXT: addi sp, sp, -16 10177; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10178; RV64I-NEXT: li a2, 2 10179; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10180; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10181; RV64I-NEXT: addi sp, sp, 16 10182; RV64I-NEXT: ret 10183; 10184; RV64IA-LABEL: atomicrmw_sub_i32_acquire: 10185; RV64IA: # %bb.0: 10186; RV64IA-NEXT: neg a1, a1 10187; RV64IA-NEXT: amoadd.w.aq a0, a1, (a0) 10188; RV64IA-NEXT: ret 10189 %1 = atomicrmw sub i32* %a, i32 %b acquire 10190 ret i32 %1 10191} 10192 10193define i32 @atomicrmw_sub_i32_release(i32* %a, i32 %b) nounwind { 10194; RV32I-LABEL: atomicrmw_sub_i32_release: 10195; RV32I: # %bb.0: 10196; RV32I-NEXT: addi sp, sp, -16 10197; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10198; RV32I-NEXT: li a2, 3 10199; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10200; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10201; RV32I-NEXT: addi sp, sp, 16 10202; RV32I-NEXT: ret 10203; 10204; RV32IA-LABEL: atomicrmw_sub_i32_release: 10205; RV32IA: # %bb.0: 10206; RV32IA-NEXT: neg a1, a1 10207; RV32IA-NEXT: amoadd.w.rl a0, a1, (a0) 10208; RV32IA-NEXT: ret 10209; 10210; RV64I-LABEL: atomicrmw_sub_i32_release: 10211; RV64I: # %bb.0: 10212; RV64I-NEXT: addi sp, sp, -16 10213; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10214; RV64I-NEXT: li a2, 3 10215; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10216; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10217; RV64I-NEXT: addi sp, sp, 16 10218; RV64I-NEXT: ret 10219; 10220; RV64IA-LABEL: atomicrmw_sub_i32_release: 10221; RV64IA: # %bb.0: 10222; RV64IA-NEXT: neg a1, a1 10223; RV64IA-NEXT: amoadd.w.rl a0, a1, (a0) 10224; RV64IA-NEXT: ret 10225 %1 = atomicrmw sub i32* %a, i32 %b release 10226 ret i32 %1 10227} 10228 10229define i32 @atomicrmw_sub_i32_acq_rel(i32* %a, i32 %b) nounwind { 10230; RV32I-LABEL: atomicrmw_sub_i32_acq_rel: 10231; RV32I: # %bb.0: 10232; RV32I-NEXT: addi sp, sp, -16 10233; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10234; RV32I-NEXT: li a2, 4 10235; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10236; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10237; RV32I-NEXT: addi sp, sp, 16 10238; RV32I-NEXT: ret 10239; 10240; RV32IA-LABEL: atomicrmw_sub_i32_acq_rel: 10241; RV32IA: # %bb.0: 10242; RV32IA-NEXT: neg a1, a1 10243; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10244; RV32IA-NEXT: ret 10245; 10246; RV64I-LABEL: atomicrmw_sub_i32_acq_rel: 10247; RV64I: # %bb.0: 10248; RV64I-NEXT: addi sp, sp, -16 10249; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10250; RV64I-NEXT: li a2, 4 10251; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10252; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10253; RV64I-NEXT: addi sp, sp, 16 10254; RV64I-NEXT: ret 10255; 10256; RV64IA-LABEL: atomicrmw_sub_i32_acq_rel: 10257; RV64IA: # %bb.0: 10258; RV64IA-NEXT: neg a1, a1 10259; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10260; RV64IA-NEXT: ret 10261 %1 = atomicrmw sub i32* %a, i32 %b acq_rel 10262 ret i32 %1 10263} 10264 10265define i32 @atomicrmw_sub_i32_seq_cst(i32* %a, i32 %b) nounwind { 10266; RV32I-LABEL: atomicrmw_sub_i32_seq_cst: 10267; RV32I: # %bb.0: 10268; RV32I-NEXT: addi sp, sp, -16 10269; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10270; RV32I-NEXT: li a2, 5 10271; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10272; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10273; RV32I-NEXT: addi sp, sp, 16 10274; RV32I-NEXT: ret 10275; 10276; RV32IA-LABEL: atomicrmw_sub_i32_seq_cst: 10277; RV32IA: # %bb.0: 10278; RV32IA-NEXT: neg a1, a1 10279; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10280; RV32IA-NEXT: ret 10281; 10282; RV64I-LABEL: atomicrmw_sub_i32_seq_cst: 10283; RV64I: # %bb.0: 10284; RV64I-NEXT: addi sp, sp, -16 10285; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10286; RV64I-NEXT: li a2, 5 10287; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10288; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10289; RV64I-NEXT: addi sp, sp, 16 10290; RV64I-NEXT: ret 10291; 10292; RV64IA-LABEL: atomicrmw_sub_i32_seq_cst: 10293; RV64IA: # %bb.0: 10294; RV64IA-NEXT: neg a1, a1 10295; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10296; RV64IA-NEXT: ret 10297 %1 = atomicrmw sub i32* %a, i32 %b seq_cst 10298 ret i32 %1 10299} 10300 10301define i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind { 10302; RV32I-LABEL: atomicrmw_and_i32_monotonic: 10303; RV32I: # %bb.0: 10304; RV32I-NEXT: addi sp, sp, -16 10305; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10306; RV32I-NEXT: li a2, 0 10307; RV32I-NEXT: call __atomic_fetch_and_4@plt 10308; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10309; RV32I-NEXT: addi sp, sp, 16 10310; RV32I-NEXT: ret 10311; 10312; RV32IA-LABEL: atomicrmw_and_i32_monotonic: 10313; RV32IA: # %bb.0: 10314; RV32IA-NEXT: amoand.w a0, a1, (a0) 10315; RV32IA-NEXT: ret 10316; 10317; RV64I-LABEL: atomicrmw_and_i32_monotonic: 10318; RV64I: # %bb.0: 10319; RV64I-NEXT: addi sp, sp, -16 10320; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10321; RV64I-NEXT: li a2, 0 10322; RV64I-NEXT: call __atomic_fetch_and_4@plt 10323; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10324; RV64I-NEXT: addi sp, sp, 16 10325; RV64I-NEXT: ret 10326; 10327; RV64IA-LABEL: atomicrmw_and_i32_monotonic: 10328; RV64IA: # %bb.0: 10329; RV64IA-NEXT: amoand.w a0, a1, (a0) 10330; RV64IA-NEXT: ret 10331 %1 = atomicrmw and i32* %a, i32 %b monotonic 10332 ret i32 %1 10333} 10334 10335define i32 @atomicrmw_and_i32_acquire(i32 *%a, i32 %b) nounwind { 10336; RV32I-LABEL: atomicrmw_and_i32_acquire: 10337; RV32I: # %bb.0: 10338; RV32I-NEXT: addi sp, sp, -16 10339; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10340; RV32I-NEXT: li a2, 2 10341; RV32I-NEXT: call __atomic_fetch_and_4@plt 10342; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10343; RV32I-NEXT: addi sp, sp, 16 10344; RV32I-NEXT: ret 10345; 10346; RV32IA-LABEL: atomicrmw_and_i32_acquire: 10347; RV32IA: # %bb.0: 10348; RV32IA-NEXT: amoand.w.aq a0, a1, (a0) 10349; RV32IA-NEXT: ret 10350; 10351; RV64I-LABEL: atomicrmw_and_i32_acquire: 10352; RV64I: # %bb.0: 10353; RV64I-NEXT: addi sp, sp, -16 10354; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10355; RV64I-NEXT: li a2, 2 10356; RV64I-NEXT: call __atomic_fetch_and_4@plt 10357; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10358; RV64I-NEXT: addi sp, sp, 16 10359; RV64I-NEXT: ret 10360; 10361; RV64IA-LABEL: atomicrmw_and_i32_acquire: 10362; RV64IA: # %bb.0: 10363; RV64IA-NEXT: amoand.w.aq a0, a1, (a0) 10364; RV64IA-NEXT: ret 10365 %1 = atomicrmw and i32* %a, i32 %b acquire 10366 ret i32 %1 10367} 10368 10369define i32 @atomicrmw_and_i32_release(i32 *%a, i32 %b) nounwind { 10370; RV32I-LABEL: atomicrmw_and_i32_release: 10371; RV32I: # %bb.0: 10372; RV32I-NEXT: addi sp, sp, -16 10373; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10374; RV32I-NEXT: li a2, 3 10375; RV32I-NEXT: call __atomic_fetch_and_4@plt 10376; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10377; RV32I-NEXT: addi sp, sp, 16 10378; RV32I-NEXT: ret 10379; 10380; RV32IA-LABEL: atomicrmw_and_i32_release: 10381; RV32IA: # %bb.0: 10382; RV32IA-NEXT: amoand.w.rl a0, a1, (a0) 10383; RV32IA-NEXT: ret 10384; 10385; RV64I-LABEL: atomicrmw_and_i32_release: 10386; RV64I: # %bb.0: 10387; RV64I-NEXT: addi sp, sp, -16 10388; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10389; RV64I-NEXT: li a2, 3 10390; RV64I-NEXT: call __atomic_fetch_and_4@plt 10391; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10392; RV64I-NEXT: addi sp, sp, 16 10393; RV64I-NEXT: ret 10394; 10395; RV64IA-LABEL: atomicrmw_and_i32_release: 10396; RV64IA: # %bb.0: 10397; RV64IA-NEXT: amoand.w.rl a0, a1, (a0) 10398; RV64IA-NEXT: ret 10399 %1 = atomicrmw and i32* %a, i32 %b release 10400 ret i32 %1 10401} 10402 10403define i32 @atomicrmw_and_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10404; RV32I-LABEL: atomicrmw_and_i32_acq_rel: 10405; RV32I: # %bb.0: 10406; RV32I-NEXT: addi sp, sp, -16 10407; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10408; RV32I-NEXT: li a2, 4 10409; RV32I-NEXT: call __atomic_fetch_and_4@plt 10410; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10411; RV32I-NEXT: addi sp, sp, 16 10412; RV32I-NEXT: ret 10413; 10414; RV32IA-LABEL: atomicrmw_and_i32_acq_rel: 10415; RV32IA: # %bb.0: 10416; RV32IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10417; RV32IA-NEXT: ret 10418; 10419; RV64I-LABEL: atomicrmw_and_i32_acq_rel: 10420; RV64I: # %bb.0: 10421; RV64I-NEXT: addi sp, sp, -16 10422; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10423; RV64I-NEXT: li a2, 4 10424; RV64I-NEXT: call __atomic_fetch_and_4@plt 10425; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10426; RV64I-NEXT: addi sp, sp, 16 10427; RV64I-NEXT: ret 10428; 10429; RV64IA-LABEL: atomicrmw_and_i32_acq_rel: 10430; RV64IA: # %bb.0: 10431; RV64IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10432; RV64IA-NEXT: ret 10433 %1 = atomicrmw and i32* %a, i32 %b acq_rel 10434 ret i32 %1 10435} 10436 10437define i32 @atomicrmw_and_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10438; RV32I-LABEL: atomicrmw_and_i32_seq_cst: 10439; RV32I: # %bb.0: 10440; RV32I-NEXT: addi sp, sp, -16 10441; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10442; RV32I-NEXT: li a2, 5 10443; RV32I-NEXT: call __atomic_fetch_and_4@plt 10444; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10445; RV32I-NEXT: addi sp, sp, 16 10446; RV32I-NEXT: ret 10447; 10448; RV32IA-LABEL: atomicrmw_and_i32_seq_cst: 10449; RV32IA: # %bb.0: 10450; RV32IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10451; RV32IA-NEXT: ret 10452; 10453; RV64I-LABEL: atomicrmw_and_i32_seq_cst: 10454; RV64I: # %bb.0: 10455; RV64I-NEXT: addi sp, sp, -16 10456; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10457; RV64I-NEXT: li a2, 5 10458; RV64I-NEXT: call __atomic_fetch_and_4@plt 10459; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10460; RV64I-NEXT: addi sp, sp, 16 10461; RV64I-NEXT: ret 10462; 10463; RV64IA-LABEL: atomicrmw_and_i32_seq_cst: 10464; RV64IA: # %bb.0: 10465; RV64IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10466; RV64IA-NEXT: ret 10467 %1 = atomicrmw and i32* %a, i32 %b seq_cst 10468 ret i32 %1 10469} 10470 10471define i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind { 10472; RV32I-LABEL: atomicrmw_nand_i32_monotonic: 10473; RV32I: # %bb.0: 10474; RV32I-NEXT: addi sp, sp, -16 10475; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10476; RV32I-NEXT: li a2, 0 10477; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10478; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10479; RV32I-NEXT: addi sp, sp, 16 10480; RV32I-NEXT: ret 10481; 10482; RV32IA-LABEL: atomicrmw_nand_i32_monotonic: 10483; RV32IA: # %bb.0: 10484; RV32IA-NEXT: .LBB130_1: # =>This Inner Loop Header: Depth=1 10485; RV32IA-NEXT: lr.w a2, (a0) 10486; RV32IA-NEXT: and a3, a2, a1 10487; RV32IA-NEXT: not a3, a3 10488; RV32IA-NEXT: sc.w a3, a3, (a0) 10489; RV32IA-NEXT: bnez a3, .LBB130_1 10490; RV32IA-NEXT: # %bb.2: 10491; RV32IA-NEXT: mv a0, a2 10492; RV32IA-NEXT: ret 10493; 10494; RV64I-LABEL: atomicrmw_nand_i32_monotonic: 10495; RV64I: # %bb.0: 10496; RV64I-NEXT: addi sp, sp, -16 10497; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10498; RV64I-NEXT: li a2, 0 10499; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10500; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10501; RV64I-NEXT: addi sp, sp, 16 10502; RV64I-NEXT: ret 10503; 10504; RV64IA-LABEL: atomicrmw_nand_i32_monotonic: 10505; RV64IA: # %bb.0: 10506; RV64IA-NEXT: .LBB130_1: # =>This Inner Loop Header: Depth=1 10507; RV64IA-NEXT: lr.w a2, (a0) 10508; RV64IA-NEXT: and a3, a2, a1 10509; RV64IA-NEXT: not a3, a3 10510; RV64IA-NEXT: sc.w a3, a3, (a0) 10511; RV64IA-NEXT: bnez a3, .LBB130_1 10512; RV64IA-NEXT: # %bb.2: 10513; RV64IA-NEXT: mv a0, a2 10514; RV64IA-NEXT: ret 10515 %1 = atomicrmw nand i32* %a, i32 %b monotonic 10516 ret i32 %1 10517} 10518 10519define i32 @atomicrmw_nand_i32_acquire(i32* %a, i32 %b) nounwind { 10520; RV32I-LABEL: atomicrmw_nand_i32_acquire: 10521; RV32I: # %bb.0: 10522; RV32I-NEXT: addi sp, sp, -16 10523; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10524; RV32I-NEXT: li a2, 2 10525; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10526; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10527; RV32I-NEXT: addi sp, sp, 16 10528; RV32I-NEXT: ret 10529; 10530; RV32IA-LABEL: atomicrmw_nand_i32_acquire: 10531; RV32IA: # %bb.0: 10532; RV32IA-NEXT: .LBB131_1: # =>This Inner Loop Header: Depth=1 10533; RV32IA-NEXT: lr.w.aq a2, (a0) 10534; RV32IA-NEXT: and a3, a2, a1 10535; RV32IA-NEXT: not a3, a3 10536; RV32IA-NEXT: sc.w a3, a3, (a0) 10537; RV32IA-NEXT: bnez a3, .LBB131_1 10538; RV32IA-NEXT: # %bb.2: 10539; RV32IA-NEXT: mv a0, a2 10540; RV32IA-NEXT: ret 10541; 10542; RV64I-LABEL: atomicrmw_nand_i32_acquire: 10543; RV64I: # %bb.0: 10544; RV64I-NEXT: addi sp, sp, -16 10545; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10546; RV64I-NEXT: li a2, 2 10547; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10548; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10549; RV64I-NEXT: addi sp, sp, 16 10550; RV64I-NEXT: ret 10551; 10552; RV64IA-LABEL: atomicrmw_nand_i32_acquire: 10553; RV64IA: # %bb.0: 10554; RV64IA-NEXT: .LBB131_1: # =>This Inner Loop Header: Depth=1 10555; RV64IA-NEXT: lr.w.aq a2, (a0) 10556; RV64IA-NEXT: and a3, a2, a1 10557; RV64IA-NEXT: not a3, a3 10558; RV64IA-NEXT: sc.w a3, a3, (a0) 10559; RV64IA-NEXT: bnez a3, .LBB131_1 10560; RV64IA-NEXT: # %bb.2: 10561; RV64IA-NEXT: mv a0, a2 10562; RV64IA-NEXT: ret 10563 %1 = atomicrmw nand i32* %a, i32 %b acquire 10564 ret i32 %1 10565} 10566 10567define i32 @atomicrmw_nand_i32_release(i32* %a, i32 %b) nounwind { 10568; RV32I-LABEL: atomicrmw_nand_i32_release: 10569; RV32I: # %bb.0: 10570; RV32I-NEXT: addi sp, sp, -16 10571; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10572; RV32I-NEXT: li a2, 3 10573; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10574; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10575; RV32I-NEXT: addi sp, sp, 16 10576; RV32I-NEXT: ret 10577; 10578; RV32IA-LABEL: atomicrmw_nand_i32_release: 10579; RV32IA: # %bb.0: 10580; RV32IA-NEXT: .LBB132_1: # =>This Inner Loop Header: Depth=1 10581; RV32IA-NEXT: lr.w a2, (a0) 10582; RV32IA-NEXT: and a3, a2, a1 10583; RV32IA-NEXT: not a3, a3 10584; RV32IA-NEXT: sc.w.rl a3, a3, (a0) 10585; RV32IA-NEXT: bnez a3, .LBB132_1 10586; RV32IA-NEXT: # %bb.2: 10587; RV32IA-NEXT: mv a0, a2 10588; RV32IA-NEXT: ret 10589; 10590; RV64I-LABEL: atomicrmw_nand_i32_release: 10591; RV64I: # %bb.0: 10592; RV64I-NEXT: addi sp, sp, -16 10593; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10594; RV64I-NEXT: li a2, 3 10595; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10596; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10597; RV64I-NEXT: addi sp, sp, 16 10598; RV64I-NEXT: ret 10599; 10600; RV64IA-LABEL: atomicrmw_nand_i32_release: 10601; RV64IA: # %bb.0: 10602; RV64IA-NEXT: .LBB132_1: # =>This Inner Loop Header: Depth=1 10603; RV64IA-NEXT: lr.w a2, (a0) 10604; RV64IA-NEXT: and a3, a2, a1 10605; RV64IA-NEXT: not a3, a3 10606; RV64IA-NEXT: sc.w.rl a3, a3, (a0) 10607; RV64IA-NEXT: bnez a3, .LBB132_1 10608; RV64IA-NEXT: # %bb.2: 10609; RV64IA-NEXT: mv a0, a2 10610; RV64IA-NEXT: ret 10611 %1 = atomicrmw nand i32* %a, i32 %b release 10612 ret i32 %1 10613} 10614 10615define i32 @atomicrmw_nand_i32_acq_rel(i32* %a, i32 %b) nounwind { 10616; RV32I-LABEL: atomicrmw_nand_i32_acq_rel: 10617; RV32I: # %bb.0: 10618; RV32I-NEXT: addi sp, sp, -16 10619; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10620; RV32I-NEXT: li a2, 4 10621; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10622; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10623; RV32I-NEXT: addi sp, sp, 16 10624; RV32I-NEXT: ret 10625; 10626; RV32IA-LABEL: atomicrmw_nand_i32_acq_rel: 10627; RV32IA: # %bb.0: 10628; RV32IA-NEXT: .LBB133_1: # =>This Inner Loop Header: Depth=1 10629; RV32IA-NEXT: lr.w.aq a2, (a0) 10630; RV32IA-NEXT: and a3, a2, a1 10631; RV32IA-NEXT: not a3, a3 10632; RV32IA-NEXT: sc.w.rl a3, a3, (a0) 10633; RV32IA-NEXT: bnez a3, .LBB133_1 10634; RV32IA-NEXT: # %bb.2: 10635; RV32IA-NEXT: mv a0, a2 10636; RV32IA-NEXT: ret 10637; 10638; RV64I-LABEL: atomicrmw_nand_i32_acq_rel: 10639; RV64I: # %bb.0: 10640; RV64I-NEXT: addi sp, sp, -16 10641; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10642; RV64I-NEXT: li a2, 4 10643; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10644; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10645; RV64I-NEXT: addi sp, sp, 16 10646; RV64I-NEXT: ret 10647; 10648; RV64IA-LABEL: atomicrmw_nand_i32_acq_rel: 10649; RV64IA: # %bb.0: 10650; RV64IA-NEXT: .LBB133_1: # =>This Inner Loop Header: Depth=1 10651; RV64IA-NEXT: lr.w.aq a2, (a0) 10652; RV64IA-NEXT: and a3, a2, a1 10653; RV64IA-NEXT: not a3, a3 10654; RV64IA-NEXT: sc.w.rl a3, a3, (a0) 10655; RV64IA-NEXT: bnez a3, .LBB133_1 10656; RV64IA-NEXT: # %bb.2: 10657; RV64IA-NEXT: mv a0, a2 10658; RV64IA-NEXT: ret 10659 %1 = atomicrmw nand i32* %a, i32 %b acq_rel 10660 ret i32 %1 10661} 10662 10663define i32 @atomicrmw_nand_i32_seq_cst(i32* %a, i32 %b) nounwind { 10664; RV32I-LABEL: atomicrmw_nand_i32_seq_cst: 10665; RV32I: # %bb.0: 10666; RV32I-NEXT: addi sp, sp, -16 10667; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10668; RV32I-NEXT: li a2, 5 10669; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10670; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10671; RV32I-NEXT: addi sp, sp, 16 10672; RV32I-NEXT: ret 10673; 10674; RV32IA-LABEL: atomicrmw_nand_i32_seq_cst: 10675; RV32IA: # %bb.0: 10676; RV32IA-NEXT: .LBB134_1: # =>This Inner Loop Header: Depth=1 10677; RV32IA-NEXT: lr.w.aqrl a2, (a0) 10678; RV32IA-NEXT: and a3, a2, a1 10679; RV32IA-NEXT: not a3, a3 10680; RV32IA-NEXT: sc.w.aqrl a3, a3, (a0) 10681; RV32IA-NEXT: bnez a3, .LBB134_1 10682; RV32IA-NEXT: # %bb.2: 10683; RV32IA-NEXT: mv a0, a2 10684; RV32IA-NEXT: ret 10685; 10686; RV64I-LABEL: atomicrmw_nand_i32_seq_cst: 10687; RV64I: # %bb.0: 10688; RV64I-NEXT: addi sp, sp, -16 10689; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10690; RV64I-NEXT: li a2, 5 10691; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10692; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10693; RV64I-NEXT: addi sp, sp, 16 10694; RV64I-NEXT: ret 10695; 10696; RV64IA-LABEL: atomicrmw_nand_i32_seq_cst: 10697; RV64IA: # %bb.0: 10698; RV64IA-NEXT: .LBB134_1: # =>This Inner Loop Header: Depth=1 10699; RV64IA-NEXT: lr.w.aqrl a2, (a0) 10700; RV64IA-NEXT: and a3, a2, a1 10701; RV64IA-NEXT: not a3, a3 10702; RV64IA-NEXT: sc.w.aqrl a3, a3, (a0) 10703; RV64IA-NEXT: bnez a3, .LBB134_1 10704; RV64IA-NEXT: # %bb.2: 10705; RV64IA-NEXT: mv a0, a2 10706; RV64IA-NEXT: ret 10707 %1 = atomicrmw nand i32* %a, i32 %b seq_cst 10708 ret i32 %1 10709} 10710 10711define i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind { 10712; RV32I-LABEL: atomicrmw_or_i32_monotonic: 10713; RV32I: # %bb.0: 10714; RV32I-NEXT: addi sp, sp, -16 10715; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10716; RV32I-NEXT: li a2, 0 10717; RV32I-NEXT: call __atomic_fetch_or_4@plt 10718; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10719; RV32I-NEXT: addi sp, sp, 16 10720; RV32I-NEXT: ret 10721; 10722; RV32IA-LABEL: atomicrmw_or_i32_monotonic: 10723; RV32IA: # %bb.0: 10724; RV32IA-NEXT: amoor.w a0, a1, (a0) 10725; RV32IA-NEXT: ret 10726; 10727; RV64I-LABEL: atomicrmw_or_i32_monotonic: 10728; RV64I: # %bb.0: 10729; RV64I-NEXT: addi sp, sp, -16 10730; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10731; RV64I-NEXT: li a2, 0 10732; RV64I-NEXT: call __atomic_fetch_or_4@plt 10733; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10734; RV64I-NEXT: addi sp, sp, 16 10735; RV64I-NEXT: ret 10736; 10737; RV64IA-LABEL: atomicrmw_or_i32_monotonic: 10738; RV64IA: # %bb.0: 10739; RV64IA-NEXT: amoor.w a0, a1, (a0) 10740; RV64IA-NEXT: ret 10741 %1 = atomicrmw or i32* %a, i32 %b monotonic 10742 ret i32 %1 10743} 10744 10745define i32 @atomicrmw_or_i32_acquire(i32 *%a, i32 %b) nounwind { 10746; RV32I-LABEL: atomicrmw_or_i32_acquire: 10747; RV32I: # %bb.0: 10748; RV32I-NEXT: addi sp, sp, -16 10749; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10750; RV32I-NEXT: li a2, 2 10751; RV32I-NEXT: call __atomic_fetch_or_4@plt 10752; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10753; RV32I-NEXT: addi sp, sp, 16 10754; RV32I-NEXT: ret 10755; 10756; RV32IA-LABEL: atomicrmw_or_i32_acquire: 10757; RV32IA: # %bb.0: 10758; RV32IA-NEXT: amoor.w.aq a0, a1, (a0) 10759; RV32IA-NEXT: ret 10760; 10761; RV64I-LABEL: atomicrmw_or_i32_acquire: 10762; RV64I: # %bb.0: 10763; RV64I-NEXT: addi sp, sp, -16 10764; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10765; RV64I-NEXT: li a2, 2 10766; RV64I-NEXT: call __atomic_fetch_or_4@plt 10767; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10768; RV64I-NEXT: addi sp, sp, 16 10769; RV64I-NEXT: ret 10770; 10771; RV64IA-LABEL: atomicrmw_or_i32_acquire: 10772; RV64IA: # %bb.0: 10773; RV64IA-NEXT: amoor.w.aq a0, a1, (a0) 10774; RV64IA-NEXT: ret 10775 %1 = atomicrmw or i32* %a, i32 %b acquire 10776 ret i32 %1 10777} 10778 10779define i32 @atomicrmw_or_i32_release(i32 *%a, i32 %b) nounwind { 10780; RV32I-LABEL: atomicrmw_or_i32_release: 10781; RV32I: # %bb.0: 10782; RV32I-NEXT: addi sp, sp, -16 10783; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10784; RV32I-NEXT: li a2, 3 10785; RV32I-NEXT: call __atomic_fetch_or_4@plt 10786; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10787; RV32I-NEXT: addi sp, sp, 16 10788; RV32I-NEXT: ret 10789; 10790; RV32IA-LABEL: atomicrmw_or_i32_release: 10791; RV32IA: # %bb.0: 10792; RV32IA-NEXT: amoor.w.rl a0, a1, (a0) 10793; RV32IA-NEXT: ret 10794; 10795; RV64I-LABEL: atomicrmw_or_i32_release: 10796; RV64I: # %bb.0: 10797; RV64I-NEXT: addi sp, sp, -16 10798; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10799; RV64I-NEXT: li a2, 3 10800; RV64I-NEXT: call __atomic_fetch_or_4@plt 10801; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10802; RV64I-NEXT: addi sp, sp, 16 10803; RV64I-NEXT: ret 10804; 10805; RV64IA-LABEL: atomicrmw_or_i32_release: 10806; RV64IA: # %bb.0: 10807; RV64IA-NEXT: amoor.w.rl a0, a1, (a0) 10808; RV64IA-NEXT: ret 10809 %1 = atomicrmw or i32* %a, i32 %b release 10810 ret i32 %1 10811} 10812 10813define i32 @atomicrmw_or_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10814; RV32I-LABEL: atomicrmw_or_i32_acq_rel: 10815; RV32I: # %bb.0: 10816; RV32I-NEXT: addi sp, sp, -16 10817; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10818; RV32I-NEXT: li a2, 4 10819; RV32I-NEXT: call __atomic_fetch_or_4@plt 10820; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10821; RV32I-NEXT: addi sp, sp, 16 10822; RV32I-NEXT: ret 10823; 10824; RV32IA-LABEL: atomicrmw_or_i32_acq_rel: 10825; RV32IA: # %bb.0: 10826; RV32IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10827; RV32IA-NEXT: ret 10828; 10829; RV64I-LABEL: atomicrmw_or_i32_acq_rel: 10830; RV64I: # %bb.0: 10831; RV64I-NEXT: addi sp, sp, -16 10832; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10833; RV64I-NEXT: li a2, 4 10834; RV64I-NEXT: call __atomic_fetch_or_4@plt 10835; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10836; RV64I-NEXT: addi sp, sp, 16 10837; RV64I-NEXT: ret 10838; 10839; RV64IA-LABEL: atomicrmw_or_i32_acq_rel: 10840; RV64IA: # %bb.0: 10841; RV64IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10842; RV64IA-NEXT: ret 10843 %1 = atomicrmw or i32* %a, i32 %b acq_rel 10844 ret i32 %1 10845} 10846 10847define i32 @atomicrmw_or_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10848; RV32I-LABEL: atomicrmw_or_i32_seq_cst: 10849; RV32I: # %bb.0: 10850; RV32I-NEXT: addi sp, sp, -16 10851; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10852; RV32I-NEXT: li a2, 5 10853; RV32I-NEXT: call __atomic_fetch_or_4@plt 10854; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10855; RV32I-NEXT: addi sp, sp, 16 10856; RV32I-NEXT: ret 10857; 10858; RV32IA-LABEL: atomicrmw_or_i32_seq_cst: 10859; RV32IA: # %bb.0: 10860; RV32IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10861; RV32IA-NEXT: ret 10862; 10863; RV64I-LABEL: atomicrmw_or_i32_seq_cst: 10864; RV64I: # %bb.0: 10865; RV64I-NEXT: addi sp, sp, -16 10866; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10867; RV64I-NEXT: li a2, 5 10868; RV64I-NEXT: call __atomic_fetch_or_4@plt 10869; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10870; RV64I-NEXT: addi sp, sp, 16 10871; RV64I-NEXT: ret 10872; 10873; RV64IA-LABEL: atomicrmw_or_i32_seq_cst: 10874; RV64IA: # %bb.0: 10875; RV64IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10876; RV64IA-NEXT: ret 10877 %1 = atomicrmw or i32* %a, i32 %b seq_cst 10878 ret i32 %1 10879} 10880 10881define i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind { 10882; RV32I-LABEL: atomicrmw_xor_i32_monotonic: 10883; RV32I: # %bb.0: 10884; RV32I-NEXT: addi sp, sp, -16 10885; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10886; RV32I-NEXT: li a2, 0 10887; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10888; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10889; RV32I-NEXT: addi sp, sp, 16 10890; RV32I-NEXT: ret 10891; 10892; RV32IA-LABEL: atomicrmw_xor_i32_monotonic: 10893; RV32IA: # %bb.0: 10894; RV32IA-NEXT: amoxor.w a0, a1, (a0) 10895; RV32IA-NEXT: ret 10896; 10897; RV64I-LABEL: atomicrmw_xor_i32_monotonic: 10898; RV64I: # %bb.0: 10899; RV64I-NEXT: addi sp, sp, -16 10900; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10901; RV64I-NEXT: li a2, 0 10902; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10903; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10904; RV64I-NEXT: addi sp, sp, 16 10905; RV64I-NEXT: ret 10906; 10907; RV64IA-LABEL: atomicrmw_xor_i32_monotonic: 10908; RV64IA: # %bb.0: 10909; RV64IA-NEXT: amoxor.w a0, a1, (a0) 10910; RV64IA-NEXT: ret 10911 %1 = atomicrmw xor i32* %a, i32 %b monotonic 10912 ret i32 %1 10913} 10914 10915define i32 @atomicrmw_xor_i32_acquire(i32 *%a, i32 %b) nounwind { 10916; RV32I-LABEL: atomicrmw_xor_i32_acquire: 10917; RV32I: # %bb.0: 10918; RV32I-NEXT: addi sp, sp, -16 10919; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10920; RV32I-NEXT: li a2, 2 10921; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10922; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10923; RV32I-NEXT: addi sp, sp, 16 10924; RV32I-NEXT: ret 10925; 10926; RV32IA-LABEL: atomicrmw_xor_i32_acquire: 10927; RV32IA: # %bb.0: 10928; RV32IA-NEXT: amoxor.w.aq a0, a1, (a0) 10929; RV32IA-NEXT: ret 10930; 10931; RV64I-LABEL: atomicrmw_xor_i32_acquire: 10932; RV64I: # %bb.0: 10933; RV64I-NEXT: addi sp, sp, -16 10934; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10935; RV64I-NEXT: li a2, 2 10936; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10937; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10938; RV64I-NEXT: addi sp, sp, 16 10939; RV64I-NEXT: ret 10940; 10941; RV64IA-LABEL: atomicrmw_xor_i32_acquire: 10942; RV64IA: # %bb.0: 10943; RV64IA-NEXT: amoxor.w.aq a0, a1, (a0) 10944; RV64IA-NEXT: ret 10945 %1 = atomicrmw xor i32* %a, i32 %b acquire 10946 ret i32 %1 10947} 10948 10949define i32 @atomicrmw_xor_i32_release(i32 *%a, i32 %b) nounwind { 10950; RV32I-LABEL: atomicrmw_xor_i32_release: 10951; RV32I: # %bb.0: 10952; RV32I-NEXT: addi sp, sp, -16 10953; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10954; RV32I-NEXT: li a2, 3 10955; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10956; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10957; RV32I-NEXT: addi sp, sp, 16 10958; RV32I-NEXT: ret 10959; 10960; RV32IA-LABEL: atomicrmw_xor_i32_release: 10961; RV32IA: # %bb.0: 10962; RV32IA-NEXT: amoxor.w.rl a0, a1, (a0) 10963; RV32IA-NEXT: ret 10964; 10965; RV64I-LABEL: atomicrmw_xor_i32_release: 10966; RV64I: # %bb.0: 10967; RV64I-NEXT: addi sp, sp, -16 10968; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10969; RV64I-NEXT: li a2, 3 10970; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10971; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10972; RV64I-NEXT: addi sp, sp, 16 10973; RV64I-NEXT: ret 10974; 10975; RV64IA-LABEL: atomicrmw_xor_i32_release: 10976; RV64IA: # %bb.0: 10977; RV64IA-NEXT: amoxor.w.rl a0, a1, (a0) 10978; RV64IA-NEXT: ret 10979 %1 = atomicrmw xor i32* %a, i32 %b release 10980 ret i32 %1 10981} 10982 10983define i32 @atomicrmw_xor_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10984; RV32I-LABEL: atomicrmw_xor_i32_acq_rel: 10985; RV32I: # %bb.0: 10986; RV32I-NEXT: addi sp, sp, -16 10987; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10988; RV32I-NEXT: li a2, 4 10989; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10990; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10991; RV32I-NEXT: addi sp, sp, 16 10992; RV32I-NEXT: ret 10993; 10994; RV32IA-LABEL: atomicrmw_xor_i32_acq_rel: 10995; RV32IA: # %bb.0: 10996; RV32IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 10997; RV32IA-NEXT: ret 10998; 10999; RV64I-LABEL: atomicrmw_xor_i32_acq_rel: 11000; RV64I: # %bb.0: 11001; RV64I-NEXT: addi sp, sp, -16 11002; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11003; RV64I-NEXT: li a2, 4 11004; RV64I-NEXT: call __atomic_fetch_xor_4@plt 11005; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11006; RV64I-NEXT: addi sp, sp, 16 11007; RV64I-NEXT: ret 11008; 11009; RV64IA-LABEL: atomicrmw_xor_i32_acq_rel: 11010; RV64IA: # %bb.0: 11011; RV64IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 11012; RV64IA-NEXT: ret 11013 %1 = atomicrmw xor i32* %a, i32 %b acq_rel 11014 ret i32 %1 11015} 11016 11017define i32 @atomicrmw_xor_i32_seq_cst(i32 *%a, i32 %b) nounwind { 11018; RV32I-LABEL: atomicrmw_xor_i32_seq_cst: 11019; RV32I: # %bb.0: 11020; RV32I-NEXT: addi sp, sp, -16 11021; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11022; RV32I-NEXT: li a2, 5 11023; RV32I-NEXT: call __atomic_fetch_xor_4@plt 11024; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11025; RV32I-NEXT: addi sp, sp, 16 11026; RV32I-NEXT: ret 11027; 11028; RV32IA-LABEL: atomicrmw_xor_i32_seq_cst: 11029; RV32IA: # %bb.0: 11030; RV32IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 11031; RV32IA-NEXT: ret 11032; 11033; RV64I-LABEL: atomicrmw_xor_i32_seq_cst: 11034; RV64I: # %bb.0: 11035; RV64I-NEXT: addi sp, sp, -16 11036; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11037; RV64I-NEXT: li a2, 5 11038; RV64I-NEXT: call __atomic_fetch_xor_4@plt 11039; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11040; RV64I-NEXT: addi sp, sp, 16 11041; RV64I-NEXT: ret 11042; 11043; RV64IA-LABEL: atomicrmw_xor_i32_seq_cst: 11044; RV64IA: # %bb.0: 11045; RV64IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 11046; RV64IA-NEXT: ret 11047 %1 = atomicrmw xor i32* %a, i32 %b seq_cst 11048 ret i32 %1 11049} 11050 11051define i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind { 11052; RV32I-LABEL: atomicrmw_max_i32_monotonic: 11053; RV32I: # %bb.0: 11054; RV32I-NEXT: addi sp, sp, -16 11055; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11056; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11057; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11058; RV32I-NEXT: mv s0, a0 11059; RV32I-NEXT: lw a3, 0(a0) 11060; RV32I-NEXT: mv s1, a1 11061; RV32I-NEXT: j .LBB145_2 11062; RV32I-NEXT: .LBB145_1: # %atomicrmw.start 11063; RV32I-NEXT: # in Loop: Header=BB145_2 Depth=1 11064; RV32I-NEXT: sw a3, 0(sp) 11065; RV32I-NEXT: mv a1, sp 11066; RV32I-NEXT: mv a0, s0 11067; RV32I-NEXT: li a3, 0 11068; RV32I-NEXT: li a4, 0 11069; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11070; RV32I-NEXT: lw a3, 0(sp) 11071; RV32I-NEXT: bnez a0, .LBB145_4 11072; RV32I-NEXT: .LBB145_2: # %atomicrmw.start 11073; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11074; RV32I-NEXT: mv a2, a3 11075; RV32I-NEXT: blt s1, a3, .LBB145_1 11076; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11077; RV32I-NEXT: # in Loop: Header=BB145_2 Depth=1 11078; RV32I-NEXT: mv a2, s1 11079; RV32I-NEXT: j .LBB145_1 11080; RV32I-NEXT: .LBB145_4: # %atomicrmw.end 11081; RV32I-NEXT: mv a0, a3 11082; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11083; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11084; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11085; RV32I-NEXT: addi sp, sp, 16 11086; RV32I-NEXT: ret 11087; 11088; RV32IA-LABEL: atomicrmw_max_i32_monotonic: 11089; RV32IA: # %bb.0: 11090; RV32IA-NEXT: amomax.w a0, a1, (a0) 11091; RV32IA-NEXT: ret 11092; 11093; RV64I-LABEL: atomicrmw_max_i32_monotonic: 11094; RV64I: # %bb.0: 11095; RV64I-NEXT: addi sp, sp, -48 11096; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11097; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11098; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11099; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11100; RV64I-NEXT: mv s0, a0 11101; RV64I-NEXT: lw a3, 0(a0) 11102; RV64I-NEXT: mv s2, a1 11103; RV64I-NEXT: sext.w s1, a1 11104; RV64I-NEXT: j .LBB145_2 11105; RV64I-NEXT: .LBB145_1: # %atomicrmw.start 11106; RV64I-NEXT: # in Loop: Header=BB145_2 Depth=1 11107; RV64I-NEXT: sw a3, 12(sp) 11108; RV64I-NEXT: addi a1, sp, 12 11109; RV64I-NEXT: mv a0, s0 11110; RV64I-NEXT: li a3, 0 11111; RV64I-NEXT: li a4, 0 11112; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11113; RV64I-NEXT: lw a3, 12(sp) 11114; RV64I-NEXT: bnez a0, .LBB145_4 11115; RV64I-NEXT: .LBB145_2: # %atomicrmw.start 11116; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11117; RV64I-NEXT: mv a2, a3 11118; RV64I-NEXT: blt s1, a3, .LBB145_1 11119; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11120; RV64I-NEXT: # in Loop: Header=BB145_2 Depth=1 11121; RV64I-NEXT: mv a2, s2 11122; RV64I-NEXT: j .LBB145_1 11123; RV64I-NEXT: .LBB145_4: # %atomicrmw.end 11124; RV64I-NEXT: mv a0, a3 11125; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11126; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11127; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11128; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11129; RV64I-NEXT: addi sp, sp, 48 11130; RV64I-NEXT: ret 11131; 11132; RV64IA-LABEL: atomicrmw_max_i32_monotonic: 11133; RV64IA: # %bb.0: 11134; RV64IA-NEXT: amomax.w a0, a1, (a0) 11135; RV64IA-NEXT: ret 11136 %1 = atomicrmw max i32* %a, i32 %b monotonic 11137 ret i32 %1 11138} 11139 11140define i32 @atomicrmw_max_i32_acquire(i32 *%a, i32 %b) nounwind { 11141; RV32I-LABEL: atomicrmw_max_i32_acquire: 11142; RV32I: # %bb.0: 11143; RV32I-NEXT: addi sp, sp, -16 11144; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11145; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11146; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11147; RV32I-NEXT: mv s0, a0 11148; RV32I-NEXT: lw a3, 0(a0) 11149; RV32I-NEXT: mv s1, a1 11150; RV32I-NEXT: j .LBB146_2 11151; RV32I-NEXT: .LBB146_1: # %atomicrmw.start 11152; RV32I-NEXT: # in Loop: Header=BB146_2 Depth=1 11153; RV32I-NEXT: sw a3, 0(sp) 11154; RV32I-NEXT: mv a1, sp 11155; RV32I-NEXT: li a3, 2 11156; RV32I-NEXT: li a4, 2 11157; RV32I-NEXT: mv a0, s0 11158; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11159; RV32I-NEXT: lw a3, 0(sp) 11160; RV32I-NEXT: bnez a0, .LBB146_4 11161; RV32I-NEXT: .LBB146_2: # %atomicrmw.start 11162; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11163; RV32I-NEXT: mv a2, a3 11164; RV32I-NEXT: blt s1, a3, .LBB146_1 11165; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11166; RV32I-NEXT: # in Loop: Header=BB146_2 Depth=1 11167; RV32I-NEXT: mv a2, s1 11168; RV32I-NEXT: j .LBB146_1 11169; RV32I-NEXT: .LBB146_4: # %atomicrmw.end 11170; RV32I-NEXT: mv a0, a3 11171; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11172; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11173; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11174; RV32I-NEXT: addi sp, sp, 16 11175; RV32I-NEXT: ret 11176; 11177; RV32IA-LABEL: atomicrmw_max_i32_acquire: 11178; RV32IA: # %bb.0: 11179; RV32IA-NEXT: amomax.w.aq a0, a1, (a0) 11180; RV32IA-NEXT: ret 11181; 11182; RV64I-LABEL: atomicrmw_max_i32_acquire: 11183; RV64I: # %bb.0: 11184; RV64I-NEXT: addi sp, sp, -48 11185; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11186; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11187; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11188; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11189; RV64I-NEXT: mv s0, a0 11190; RV64I-NEXT: lw a3, 0(a0) 11191; RV64I-NEXT: mv s2, a1 11192; RV64I-NEXT: sext.w s1, a1 11193; RV64I-NEXT: j .LBB146_2 11194; RV64I-NEXT: .LBB146_1: # %atomicrmw.start 11195; RV64I-NEXT: # in Loop: Header=BB146_2 Depth=1 11196; RV64I-NEXT: sw a3, 12(sp) 11197; RV64I-NEXT: addi a1, sp, 12 11198; RV64I-NEXT: li a3, 2 11199; RV64I-NEXT: li a4, 2 11200; RV64I-NEXT: mv a0, s0 11201; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11202; RV64I-NEXT: lw a3, 12(sp) 11203; RV64I-NEXT: bnez a0, .LBB146_4 11204; RV64I-NEXT: .LBB146_2: # %atomicrmw.start 11205; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11206; RV64I-NEXT: mv a2, a3 11207; RV64I-NEXT: blt s1, a3, .LBB146_1 11208; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11209; RV64I-NEXT: # in Loop: Header=BB146_2 Depth=1 11210; RV64I-NEXT: mv a2, s2 11211; RV64I-NEXT: j .LBB146_1 11212; RV64I-NEXT: .LBB146_4: # %atomicrmw.end 11213; RV64I-NEXT: mv a0, a3 11214; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11215; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11216; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11217; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11218; RV64I-NEXT: addi sp, sp, 48 11219; RV64I-NEXT: ret 11220; 11221; RV64IA-LABEL: atomicrmw_max_i32_acquire: 11222; RV64IA: # %bb.0: 11223; RV64IA-NEXT: amomax.w.aq a0, a1, (a0) 11224; RV64IA-NEXT: ret 11225 %1 = atomicrmw max i32* %a, i32 %b acquire 11226 ret i32 %1 11227} 11228 11229define i32 @atomicrmw_max_i32_release(i32 *%a, i32 %b) nounwind { 11230; RV32I-LABEL: atomicrmw_max_i32_release: 11231; RV32I: # %bb.0: 11232; RV32I-NEXT: addi sp, sp, -16 11233; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11234; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11235; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11236; RV32I-NEXT: mv s0, a0 11237; RV32I-NEXT: lw a3, 0(a0) 11238; RV32I-NEXT: mv s1, a1 11239; RV32I-NEXT: j .LBB147_2 11240; RV32I-NEXT: .LBB147_1: # %atomicrmw.start 11241; RV32I-NEXT: # in Loop: Header=BB147_2 Depth=1 11242; RV32I-NEXT: sw a3, 0(sp) 11243; RV32I-NEXT: mv a1, sp 11244; RV32I-NEXT: li a3, 3 11245; RV32I-NEXT: mv a0, s0 11246; RV32I-NEXT: li a4, 0 11247; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11248; RV32I-NEXT: lw a3, 0(sp) 11249; RV32I-NEXT: bnez a0, .LBB147_4 11250; RV32I-NEXT: .LBB147_2: # %atomicrmw.start 11251; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11252; RV32I-NEXT: mv a2, a3 11253; RV32I-NEXT: blt s1, a3, .LBB147_1 11254; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11255; RV32I-NEXT: # in Loop: Header=BB147_2 Depth=1 11256; RV32I-NEXT: mv a2, s1 11257; RV32I-NEXT: j .LBB147_1 11258; RV32I-NEXT: .LBB147_4: # %atomicrmw.end 11259; RV32I-NEXT: mv a0, a3 11260; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11261; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11262; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11263; RV32I-NEXT: addi sp, sp, 16 11264; RV32I-NEXT: ret 11265; 11266; RV32IA-LABEL: atomicrmw_max_i32_release: 11267; RV32IA: # %bb.0: 11268; RV32IA-NEXT: amomax.w.rl a0, a1, (a0) 11269; RV32IA-NEXT: ret 11270; 11271; RV64I-LABEL: atomicrmw_max_i32_release: 11272; RV64I: # %bb.0: 11273; RV64I-NEXT: addi sp, sp, -48 11274; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11275; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11276; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11277; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11278; RV64I-NEXT: mv s0, a0 11279; RV64I-NEXT: lw a3, 0(a0) 11280; RV64I-NEXT: mv s2, a1 11281; RV64I-NEXT: sext.w s1, a1 11282; RV64I-NEXT: j .LBB147_2 11283; RV64I-NEXT: .LBB147_1: # %atomicrmw.start 11284; RV64I-NEXT: # in Loop: Header=BB147_2 Depth=1 11285; RV64I-NEXT: sw a3, 12(sp) 11286; RV64I-NEXT: addi a1, sp, 12 11287; RV64I-NEXT: li a3, 3 11288; RV64I-NEXT: mv a0, s0 11289; RV64I-NEXT: li a4, 0 11290; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11291; RV64I-NEXT: lw a3, 12(sp) 11292; RV64I-NEXT: bnez a0, .LBB147_4 11293; RV64I-NEXT: .LBB147_2: # %atomicrmw.start 11294; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11295; RV64I-NEXT: mv a2, a3 11296; RV64I-NEXT: blt s1, a3, .LBB147_1 11297; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11298; RV64I-NEXT: # in Loop: Header=BB147_2 Depth=1 11299; RV64I-NEXT: mv a2, s2 11300; RV64I-NEXT: j .LBB147_1 11301; RV64I-NEXT: .LBB147_4: # %atomicrmw.end 11302; RV64I-NEXT: mv a0, a3 11303; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11304; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11305; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11306; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11307; RV64I-NEXT: addi sp, sp, 48 11308; RV64I-NEXT: ret 11309; 11310; RV64IA-LABEL: atomicrmw_max_i32_release: 11311; RV64IA: # %bb.0: 11312; RV64IA-NEXT: amomax.w.rl a0, a1, (a0) 11313; RV64IA-NEXT: ret 11314 %1 = atomicrmw max i32* %a, i32 %b release 11315 ret i32 %1 11316} 11317 11318define i32 @atomicrmw_max_i32_acq_rel(i32 *%a, i32 %b) nounwind { 11319; RV32I-LABEL: atomicrmw_max_i32_acq_rel: 11320; RV32I: # %bb.0: 11321; RV32I-NEXT: addi sp, sp, -16 11322; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11323; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11324; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11325; RV32I-NEXT: mv s0, a0 11326; RV32I-NEXT: lw a3, 0(a0) 11327; RV32I-NEXT: mv s1, a1 11328; RV32I-NEXT: j .LBB148_2 11329; RV32I-NEXT: .LBB148_1: # %atomicrmw.start 11330; RV32I-NEXT: # in Loop: Header=BB148_2 Depth=1 11331; RV32I-NEXT: sw a3, 0(sp) 11332; RV32I-NEXT: mv a1, sp 11333; RV32I-NEXT: li a3, 4 11334; RV32I-NEXT: li a4, 2 11335; RV32I-NEXT: mv a0, s0 11336; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11337; RV32I-NEXT: lw a3, 0(sp) 11338; RV32I-NEXT: bnez a0, .LBB148_4 11339; RV32I-NEXT: .LBB148_2: # %atomicrmw.start 11340; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11341; RV32I-NEXT: mv a2, a3 11342; RV32I-NEXT: blt s1, a3, .LBB148_1 11343; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11344; RV32I-NEXT: # in Loop: Header=BB148_2 Depth=1 11345; RV32I-NEXT: mv a2, s1 11346; RV32I-NEXT: j .LBB148_1 11347; RV32I-NEXT: .LBB148_4: # %atomicrmw.end 11348; RV32I-NEXT: mv a0, a3 11349; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11350; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11351; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11352; RV32I-NEXT: addi sp, sp, 16 11353; RV32I-NEXT: ret 11354; 11355; RV32IA-LABEL: atomicrmw_max_i32_acq_rel: 11356; RV32IA: # %bb.0: 11357; RV32IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11358; RV32IA-NEXT: ret 11359; 11360; RV64I-LABEL: atomicrmw_max_i32_acq_rel: 11361; RV64I: # %bb.0: 11362; RV64I-NEXT: addi sp, sp, -48 11363; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11364; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11365; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11366; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11367; RV64I-NEXT: mv s0, a0 11368; RV64I-NEXT: lw a3, 0(a0) 11369; RV64I-NEXT: mv s2, a1 11370; RV64I-NEXT: sext.w s1, a1 11371; RV64I-NEXT: j .LBB148_2 11372; RV64I-NEXT: .LBB148_1: # %atomicrmw.start 11373; RV64I-NEXT: # in Loop: Header=BB148_2 Depth=1 11374; RV64I-NEXT: sw a3, 12(sp) 11375; RV64I-NEXT: addi a1, sp, 12 11376; RV64I-NEXT: li a3, 4 11377; RV64I-NEXT: li a4, 2 11378; RV64I-NEXT: mv a0, s0 11379; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11380; RV64I-NEXT: lw a3, 12(sp) 11381; RV64I-NEXT: bnez a0, .LBB148_4 11382; RV64I-NEXT: .LBB148_2: # %atomicrmw.start 11383; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11384; RV64I-NEXT: mv a2, a3 11385; RV64I-NEXT: blt s1, a3, .LBB148_1 11386; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11387; RV64I-NEXT: # in Loop: Header=BB148_2 Depth=1 11388; RV64I-NEXT: mv a2, s2 11389; RV64I-NEXT: j .LBB148_1 11390; RV64I-NEXT: .LBB148_4: # %atomicrmw.end 11391; RV64I-NEXT: mv a0, a3 11392; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11393; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11394; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11395; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11396; RV64I-NEXT: addi sp, sp, 48 11397; RV64I-NEXT: ret 11398; 11399; RV64IA-LABEL: atomicrmw_max_i32_acq_rel: 11400; RV64IA: # %bb.0: 11401; RV64IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11402; RV64IA-NEXT: ret 11403 %1 = atomicrmw max i32* %a, i32 %b acq_rel 11404 ret i32 %1 11405} 11406 11407define i32 @atomicrmw_max_i32_seq_cst(i32 *%a, i32 %b) nounwind { 11408; RV32I-LABEL: atomicrmw_max_i32_seq_cst: 11409; RV32I: # %bb.0: 11410; RV32I-NEXT: addi sp, sp, -16 11411; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11412; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11413; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11414; RV32I-NEXT: mv s0, a0 11415; RV32I-NEXT: lw a3, 0(a0) 11416; RV32I-NEXT: mv s1, a1 11417; RV32I-NEXT: j .LBB149_2 11418; RV32I-NEXT: .LBB149_1: # %atomicrmw.start 11419; RV32I-NEXT: # in Loop: Header=BB149_2 Depth=1 11420; RV32I-NEXT: sw a3, 0(sp) 11421; RV32I-NEXT: mv a1, sp 11422; RV32I-NEXT: li a3, 5 11423; RV32I-NEXT: li a4, 5 11424; RV32I-NEXT: mv a0, s0 11425; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11426; RV32I-NEXT: lw a3, 0(sp) 11427; RV32I-NEXT: bnez a0, .LBB149_4 11428; RV32I-NEXT: .LBB149_2: # %atomicrmw.start 11429; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11430; RV32I-NEXT: mv a2, a3 11431; RV32I-NEXT: blt s1, a3, .LBB149_1 11432; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11433; RV32I-NEXT: # in Loop: Header=BB149_2 Depth=1 11434; RV32I-NEXT: mv a2, s1 11435; RV32I-NEXT: j .LBB149_1 11436; RV32I-NEXT: .LBB149_4: # %atomicrmw.end 11437; RV32I-NEXT: mv a0, a3 11438; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11439; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11440; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11441; RV32I-NEXT: addi sp, sp, 16 11442; RV32I-NEXT: ret 11443; 11444; RV32IA-LABEL: atomicrmw_max_i32_seq_cst: 11445; RV32IA: # %bb.0: 11446; RV32IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11447; RV32IA-NEXT: ret 11448; 11449; RV64I-LABEL: atomicrmw_max_i32_seq_cst: 11450; RV64I: # %bb.0: 11451; RV64I-NEXT: addi sp, sp, -48 11452; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11453; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11454; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11455; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11456; RV64I-NEXT: mv s0, a0 11457; RV64I-NEXT: lw a3, 0(a0) 11458; RV64I-NEXT: mv s2, a1 11459; RV64I-NEXT: sext.w s1, a1 11460; RV64I-NEXT: j .LBB149_2 11461; RV64I-NEXT: .LBB149_1: # %atomicrmw.start 11462; RV64I-NEXT: # in Loop: Header=BB149_2 Depth=1 11463; RV64I-NEXT: sw a3, 12(sp) 11464; RV64I-NEXT: addi a1, sp, 12 11465; RV64I-NEXT: li a3, 5 11466; RV64I-NEXT: li a4, 5 11467; RV64I-NEXT: mv a0, s0 11468; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11469; RV64I-NEXT: lw a3, 12(sp) 11470; RV64I-NEXT: bnez a0, .LBB149_4 11471; RV64I-NEXT: .LBB149_2: # %atomicrmw.start 11472; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11473; RV64I-NEXT: mv a2, a3 11474; RV64I-NEXT: blt s1, a3, .LBB149_1 11475; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11476; RV64I-NEXT: # in Loop: Header=BB149_2 Depth=1 11477; RV64I-NEXT: mv a2, s2 11478; RV64I-NEXT: j .LBB149_1 11479; RV64I-NEXT: .LBB149_4: # %atomicrmw.end 11480; RV64I-NEXT: mv a0, a3 11481; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11482; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11483; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11484; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11485; RV64I-NEXT: addi sp, sp, 48 11486; RV64I-NEXT: ret 11487; 11488; RV64IA-LABEL: atomicrmw_max_i32_seq_cst: 11489; RV64IA: # %bb.0: 11490; RV64IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11491; RV64IA-NEXT: ret 11492 %1 = atomicrmw max i32* %a, i32 %b seq_cst 11493 ret i32 %1 11494} 11495 11496define i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind { 11497; RV32I-LABEL: atomicrmw_min_i32_monotonic: 11498; RV32I: # %bb.0: 11499; RV32I-NEXT: addi sp, sp, -16 11500; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11501; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11502; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11503; RV32I-NEXT: mv s0, a0 11504; RV32I-NEXT: lw a3, 0(a0) 11505; RV32I-NEXT: mv s1, a1 11506; RV32I-NEXT: j .LBB150_2 11507; RV32I-NEXT: .LBB150_1: # %atomicrmw.start 11508; RV32I-NEXT: # in Loop: Header=BB150_2 Depth=1 11509; RV32I-NEXT: sw a3, 0(sp) 11510; RV32I-NEXT: mv a1, sp 11511; RV32I-NEXT: mv a0, s0 11512; RV32I-NEXT: li a3, 0 11513; RV32I-NEXT: li a4, 0 11514; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11515; RV32I-NEXT: lw a3, 0(sp) 11516; RV32I-NEXT: bnez a0, .LBB150_4 11517; RV32I-NEXT: .LBB150_2: # %atomicrmw.start 11518; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11519; RV32I-NEXT: mv a2, a3 11520; RV32I-NEXT: bge s1, a3, .LBB150_1 11521; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11522; RV32I-NEXT: # in Loop: Header=BB150_2 Depth=1 11523; RV32I-NEXT: mv a2, s1 11524; RV32I-NEXT: j .LBB150_1 11525; RV32I-NEXT: .LBB150_4: # %atomicrmw.end 11526; RV32I-NEXT: mv a0, a3 11527; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11528; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11529; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11530; RV32I-NEXT: addi sp, sp, 16 11531; RV32I-NEXT: ret 11532; 11533; RV32IA-LABEL: atomicrmw_min_i32_monotonic: 11534; RV32IA: # %bb.0: 11535; RV32IA-NEXT: amomin.w a0, a1, (a0) 11536; RV32IA-NEXT: ret 11537; 11538; RV64I-LABEL: atomicrmw_min_i32_monotonic: 11539; RV64I: # %bb.0: 11540; RV64I-NEXT: addi sp, sp, -48 11541; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11542; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11543; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11544; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11545; RV64I-NEXT: mv s0, a0 11546; RV64I-NEXT: lw a3, 0(a0) 11547; RV64I-NEXT: mv s2, a1 11548; RV64I-NEXT: sext.w s1, a1 11549; RV64I-NEXT: j .LBB150_2 11550; RV64I-NEXT: .LBB150_1: # %atomicrmw.start 11551; RV64I-NEXT: # in Loop: Header=BB150_2 Depth=1 11552; RV64I-NEXT: sw a3, 12(sp) 11553; RV64I-NEXT: addi a1, sp, 12 11554; RV64I-NEXT: mv a0, s0 11555; RV64I-NEXT: li a3, 0 11556; RV64I-NEXT: li a4, 0 11557; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11558; RV64I-NEXT: lw a3, 12(sp) 11559; RV64I-NEXT: bnez a0, .LBB150_4 11560; RV64I-NEXT: .LBB150_2: # %atomicrmw.start 11561; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11562; RV64I-NEXT: mv a2, a3 11563; RV64I-NEXT: bge s1, a3, .LBB150_1 11564; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11565; RV64I-NEXT: # in Loop: Header=BB150_2 Depth=1 11566; RV64I-NEXT: mv a2, s2 11567; RV64I-NEXT: j .LBB150_1 11568; RV64I-NEXT: .LBB150_4: # %atomicrmw.end 11569; RV64I-NEXT: mv a0, a3 11570; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11571; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11572; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11573; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11574; RV64I-NEXT: addi sp, sp, 48 11575; RV64I-NEXT: ret 11576; 11577; RV64IA-LABEL: atomicrmw_min_i32_monotonic: 11578; RV64IA: # %bb.0: 11579; RV64IA-NEXT: amomin.w a0, a1, (a0) 11580; RV64IA-NEXT: ret 11581 %1 = atomicrmw min i32* %a, i32 %b monotonic 11582 ret i32 %1 11583} 11584 11585define i32 @atomicrmw_min_i32_acquire(i32 *%a, i32 %b) nounwind { 11586; RV32I-LABEL: atomicrmw_min_i32_acquire: 11587; RV32I: # %bb.0: 11588; RV32I-NEXT: addi sp, sp, -16 11589; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11590; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11591; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11592; RV32I-NEXT: mv s0, a0 11593; RV32I-NEXT: lw a3, 0(a0) 11594; RV32I-NEXT: mv s1, a1 11595; RV32I-NEXT: j .LBB151_2 11596; RV32I-NEXT: .LBB151_1: # %atomicrmw.start 11597; RV32I-NEXT: # in Loop: Header=BB151_2 Depth=1 11598; RV32I-NEXT: sw a3, 0(sp) 11599; RV32I-NEXT: mv a1, sp 11600; RV32I-NEXT: li a3, 2 11601; RV32I-NEXT: li a4, 2 11602; RV32I-NEXT: mv a0, s0 11603; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11604; RV32I-NEXT: lw a3, 0(sp) 11605; RV32I-NEXT: bnez a0, .LBB151_4 11606; RV32I-NEXT: .LBB151_2: # %atomicrmw.start 11607; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11608; RV32I-NEXT: mv a2, a3 11609; RV32I-NEXT: bge s1, a3, .LBB151_1 11610; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11611; RV32I-NEXT: # in Loop: Header=BB151_2 Depth=1 11612; RV32I-NEXT: mv a2, s1 11613; RV32I-NEXT: j .LBB151_1 11614; RV32I-NEXT: .LBB151_4: # %atomicrmw.end 11615; RV32I-NEXT: mv a0, a3 11616; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11617; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11618; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11619; RV32I-NEXT: addi sp, sp, 16 11620; RV32I-NEXT: ret 11621; 11622; RV32IA-LABEL: atomicrmw_min_i32_acquire: 11623; RV32IA: # %bb.0: 11624; RV32IA-NEXT: amomin.w.aq a0, a1, (a0) 11625; RV32IA-NEXT: ret 11626; 11627; RV64I-LABEL: atomicrmw_min_i32_acquire: 11628; RV64I: # %bb.0: 11629; RV64I-NEXT: addi sp, sp, -48 11630; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11631; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11632; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11633; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11634; RV64I-NEXT: mv s0, a0 11635; RV64I-NEXT: lw a3, 0(a0) 11636; RV64I-NEXT: mv s2, a1 11637; RV64I-NEXT: sext.w s1, a1 11638; RV64I-NEXT: j .LBB151_2 11639; RV64I-NEXT: .LBB151_1: # %atomicrmw.start 11640; RV64I-NEXT: # in Loop: Header=BB151_2 Depth=1 11641; RV64I-NEXT: sw a3, 12(sp) 11642; RV64I-NEXT: addi a1, sp, 12 11643; RV64I-NEXT: li a3, 2 11644; RV64I-NEXT: li a4, 2 11645; RV64I-NEXT: mv a0, s0 11646; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11647; RV64I-NEXT: lw a3, 12(sp) 11648; RV64I-NEXT: bnez a0, .LBB151_4 11649; RV64I-NEXT: .LBB151_2: # %atomicrmw.start 11650; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11651; RV64I-NEXT: mv a2, a3 11652; RV64I-NEXT: bge s1, a3, .LBB151_1 11653; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11654; RV64I-NEXT: # in Loop: Header=BB151_2 Depth=1 11655; RV64I-NEXT: mv a2, s2 11656; RV64I-NEXT: j .LBB151_1 11657; RV64I-NEXT: .LBB151_4: # %atomicrmw.end 11658; RV64I-NEXT: mv a0, a3 11659; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11660; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11661; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11662; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11663; RV64I-NEXT: addi sp, sp, 48 11664; RV64I-NEXT: ret 11665; 11666; RV64IA-LABEL: atomicrmw_min_i32_acquire: 11667; RV64IA: # %bb.0: 11668; RV64IA-NEXT: amomin.w.aq a0, a1, (a0) 11669; RV64IA-NEXT: ret 11670 %1 = atomicrmw min i32* %a, i32 %b acquire 11671 ret i32 %1 11672} 11673 11674define i32 @atomicrmw_min_i32_release(i32 *%a, i32 %b) nounwind { 11675; RV32I-LABEL: atomicrmw_min_i32_release: 11676; RV32I: # %bb.0: 11677; RV32I-NEXT: addi sp, sp, -16 11678; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11679; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11680; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11681; RV32I-NEXT: mv s0, a0 11682; RV32I-NEXT: lw a3, 0(a0) 11683; RV32I-NEXT: mv s1, a1 11684; RV32I-NEXT: j .LBB152_2 11685; RV32I-NEXT: .LBB152_1: # %atomicrmw.start 11686; RV32I-NEXT: # in Loop: Header=BB152_2 Depth=1 11687; RV32I-NEXT: sw a3, 0(sp) 11688; RV32I-NEXT: mv a1, sp 11689; RV32I-NEXT: li a3, 3 11690; RV32I-NEXT: mv a0, s0 11691; RV32I-NEXT: li a4, 0 11692; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11693; RV32I-NEXT: lw a3, 0(sp) 11694; RV32I-NEXT: bnez a0, .LBB152_4 11695; RV32I-NEXT: .LBB152_2: # %atomicrmw.start 11696; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11697; RV32I-NEXT: mv a2, a3 11698; RV32I-NEXT: bge s1, a3, .LBB152_1 11699; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11700; RV32I-NEXT: # in Loop: Header=BB152_2 Depth=1 11701; RV32I-NEXT: mv a2, s1 11702; RV32I-NEXT: j .LBB152_1 11703; RV32I-NEXT: .LBB152_4: # %atomicrmw.end 11704; RV32I-NEXT: mv a0, a3 11705; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11706; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11707; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11708; RV32I-NEXT: addi sp, sp, 16 11709; RV32I-NEXT: ret 11710; 11711; RV32IA-LABEL: atomicrmw_min_i32_release: 11712; RV32IA: # %bb.0: 11713; RV32IA-NEXT: amomin.w.rl a0, a1, (a0) 11714; RV32IA-NEXT: ret 11715; 11716; RV64I-LABEL: atomicrmw_min_i32_release: 11717; RV64I: # %bb.0: 11718; RV64I-NEXT: addi sp, sp, -48 11719; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11720; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11721; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11722; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11723; RV64I-NEXT: mv s0, a0 11724; RV64I-NEXT: lw a3, 0(a0) 11725; RV64I-NEXT: mv s2, a1 11726; RV64I-NEXT: sext.w s1, a1 11727; RV64I-NEXT: j .LBB152_2 11728; RV64I-NEXT: .LBB152_1: # %atomicrmw.start 11729; RV64I-NEXT: # in Loop: Header=BB152_2 Depth=1 11730; RV64I-NEXT: sw a3, 12(sp) 11731; RV64I-NEXT: addi a1, sp, 12 11732; RV64I-NEXT: li a3, 3 11733; RV64I-NEXT: mv a0, s0 11734; RV64I-NEXT: li a4, 0 11735; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11736; RV64I-NEXT: lw a3, 12(sp) 11737; RV64I-NEXT: bnez a0, .LBB152_4 11738; RV64I-NEXT: .LBB152_2: # %atomicrmw.start 11739; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11740; RV64I-NEXT: mv a2, a3 11741; RV64I-NEXT: bge s1, a3, .LBB152_1 11742; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11743; RV64I-NEXT: # in Loop: Header=BB152_2 Depth=1 11744; RV64I-NEXT: mv a2, s2 11745; RV64I-NEXT: j .LBB152_1 11746; RV64I-NEXT: .LBB152_4: # %atomicrmw.end 11747; RV64I-NEXT: mv a0, a3 11748; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11749; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11750; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11751; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11752; RV64I-NEXT: addi sp, sp, 48 11753; RV64I-NEXT: ret 11754; 11755; RV64IA-LABEL: atomicrmw_min_i32_release: 11756; RV64IA: # %bb.0: 11757; RV64IA-NEXT: amomin.w.rl a0, a1, (a0) 11758; RV64IA-NEXT: ret 11759 %1 = atomicrmw min i32* %a, i32 %b release 11760 ret i32 %1 11761} 11762 11763define i32 @atomicrmw_min_i32_acq_rel(i32 *%a, i32 %b) nounwind { 11764; RV32I-LABEL: atomicrmw_min_i32_acq_rel: 11765; RV32I: # %bb.0: 11766; RV32I-NEXT: addi sp, sp, -16 11767; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11768; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11769; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11770; RV32I-NEXT: mv s0, a0 11771; RV32I-NEXT: lw a3, 0(a0) 11772; RV32I-NEXT: mv s1, a1 11773; RV32I-NEXT: j .LBB153_2 11774; RV32I-NEXT: .LBB153_1: # %atomicrmw.start 11775; RV32I-NEXT: # in Loop: Header=BB153_2 Depth=1 11776; RV32I-NEXT: sw a3, 0(sp) 11777; RV32I-NEXT: mv a1, sp 11778; RV32I-NEXT: li a3, 4 11779; RV32I-NEXT: li a4, 2 11780; RV32I-NEXT: mv a0, s0 11781; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11782; RV32I-NEXT: lw a3, 0(sp) 11783; RV32I-NEXT: bnez a0, .LBB153_4 11784; RV32I-NEXT: .LBB153_2: # %atomicrmw.start 11785; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11786; RV32I-NEXT: mv a2, a3 11787; RV32I-NEXT: bge s1, a3, .LBB153_1 11788; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11789; RV32I-NEXT: # in Loop: Header=BB153_2 Depth=1 11790; RV32I-NEXT: mv a2, s1 11791; RV32I-NEXT: j .LBB153_1 11792; RV32I-NEXT: .LBB153_4: # %atomicrmw.end 11793; RV32I-NEXT: mv a0, a3 11794; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11795; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11796; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11797; RV32I-NEXT: addi sp, sp, 16 11798; RV32I-NEXT: ret 11799; 11800; RV32IA-LABEL: atomicrmw_min_i32_acq_rel: 11801; RV32IA: # %bb.0: 11802; RV32IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11803; RV32IA-NEXT: ret 11804; 11805; RV64I-LABEL: atomicrmw_min_i32_acq_rel: 11806; RV64I: # %bb.0: 11807; RV64I-NEXT: addi sp, sp, -48 11808; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11809; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11810; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11811; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11812; RV64I-NEXT: mv s0, a0 11813; RV64I-NEXT: lw a3, 0(a0) 11814; RV64I-NEXT: mv s2, a1 11815; RV64I-NEXT: sext.w s1, a1 11816; RV64I-NEXT: j .LBB153_2 11817; RV64I-NEXT: .LBB153_1: # %atomicrmw.start 11818; RV64I-NEXT: # in Loop: Header=BB153_2 Depth=1 11819; RV64I-NEXT: sw a3, 12(sp) 11820; RV64I-NEXT: addi a1, sp, 12 11821; RV64I-NEXT: li a3, 4 11822; RV64I-NEXT: li a4, 2 11823; RV64I-NEXT: mv a0, s0 11824; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11825; RV64I-NEXT: lw a3, 12(sp) 11826; RV64I-NEXT: bnez a0, .LBB153_4 11827; RV64I-NEXT: .LBB153_2: # %atomicrmw.start 11828; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11829; RV64I-NEXT: mv a2, a3 11830; RV64I-NEXT: bge s1, a3, .LBB153_1 11831; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11832; RV64I-NEXT: # in Loop: Header=BB153_2 Depth=1 11833; RV64I-NEXT: mv a2, s2 11834; RV64I-NEXT: j .LBB153_1 11835; RV64I-NEXT: .LBB153_4: # %atomicrmw.end 11836; RV64I-NEXT: mv a0, a3 11837; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11838; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11839; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11840; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11841; RV64I-NEXT: addi sp, sp, 48 11842; RV64I-NEXT: ret 11843; 11844; RV64IA-LABEL: atomicrmw_min_i32_acq_rel: 11845; RV64IA: # %bb.0: 11846; RV64IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11847; RV64IA-NEXT: ret 11848 %1 = atomicrmw min i32* %a, i32 %b acq_rel 11849 ret i32 %1 11850} 11851 11852define i32 @atomicrmw_min_i32_seq_cst(i32 *%a, i32 %b) nounwind { 11853; RV32I-LABEL: atomicrmw_min_i32_seq_cst: 11854; RV32I: # %bb.0: 11855; RV32I-NEXT: addi sp, sp, -16 11856; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11857; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11858; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11859; RV32I-NEXT: mv s0, a0 11860; RV32I-NEXT: lw a3, 0(a0) 11861; RV32I-NEXT: mv s1, a1 11862; RV32I-NEXT: j .LBB154_2 11863; RV32I-NEXT: .LBB154_1: # %atomicrmw.start 11864; RV32I-NEXT: # in Loop: Header=BB154_2 Depth=1 11865; RV32I-NEXT: sw a3, 0(sp) 11866; RV32I-NEXT: mv a1, sp 11867; RV32I-NEXT: li a3, 5 11868; RV32I-NEXT: li a4, 5 11869; RV32I-NEXT: mv a0, s0 11870; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11871; RV32I-NEXT: lw a3, 0(sp) 11872; RV32I-NEXT: bnez a0, .LBB154_4 11873; RV32I-NEXT: .LBB154_2: # %atomicrmw.start 11874; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11875; RV32I-NEXT: mv a2, a3 11876; RV32I-NEXT: bge s1, a3, .LBB154_1 11877; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11878; RV32I-NEXT: # in Loop: Header=BB154_2 Depth=1 11879; RV32I-NEXT: mv a2, s1 11880; RV32I-NEXT: j .LBB154_1 11881; RV32I-NEXT: .LBB154_4: # %atomicrmw.end 11882; RV32I-NEXT: mv a0, a3 11883; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11884; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11885; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11886; RV32I-NEXT: addi sp, sp, 16 11887; RV32I-NEXT: ret 11888; 11889; RV32IA-LABEL: atomicrmw_min_i32_seq_cst: 11890; RV32IA: # %bb.0: 11891; RV32IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11892; RV32IA-NEXT: ret 11893; 11894; RV64I-LABEL: atomicrmw_min_i32_seq_cst: 11895; RV64I: # %bb.0: 11896; RV64I-NEXT: addi sp, sp, -48 11897; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11898; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11899; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11900; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11901; RV64I-NEXT: mv s0, a0 11902; RV64I-NEXT: lw a3, 0(a0) 11903; RV64I-NEXT: mv s2, a1 11904; RV64I-NEXT: sext.w s1, a1 11905; RV64I-NEXT: j .LBB154_2 11906; RV64I-NEXT: .LBB154_1: # %atomicrmw.start 11907; RV64I-NEXT: # in Loop: Header=BB154_2 Depth=1 11908; RV64I-NEXT: sw a3, 12(sp) 11909; RV64I-NEXT: addi a1, sp, 12 11910; RV64I-NEXT: li a3, 5 11911; RV64I-NEXT: li a4, 5 11912; RV64I-NEXT: mv a0, s0 11913; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11914; RV64I-NEXT: lw a3, 12(sp) 11915; RV64I-NEXT: bnez a0, .LBB154_4 11916; RV64I-NEXT: .LBB154_2: # %atomicrmw.start 11917; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11918; RV64I-NEXT: mv a2, a3 11919; RV64I-NEXT: bge s1, a3, .LBB154_1 11920; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11921; RV64I-NEXT: # in Loop: Header=BB154_2 Depth=1 11922; RV64I-NEXT: mv a2, s2 11923; RV64I-NEXT: j .LBB154_1 11924; RV64I-NEXT: .LBB154_4: # %atomicrmw.end 11925; RV64I-NEXT: mv a0, a3 11926; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11927; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11928; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11929; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11930; RV64I-NEXT: addi sp, sp, 48 11931; RV64I-NEXT: ret 11932; 11933; RV64IA-LABEL: atomicrmw_min_i32_seq_cst: 11934; RV64IA: # %bb.0: 11935; RV64IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11936; RV64IA-NEXT: ret 11937 %1 = atomicrmw min i32* %a, i32 %b seq_cst 11938 ret i32 %1 11939} 11940 11941define i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind { 11942; RV32I-LABEL: atomicrmw_umax_i32_monotonic: 11943; RV32I: # %bb.0: 11944; RV32I-NEXT: addi sp, sp, -16 11945; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11946; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11947; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11948; RV32I-NEXT: mv s0, a0 11949; RV32I-NEXT: lw a3, 0(a0) 11950; RV32I-NEXT: mv s1, a1 11951; RV32I-NEXT: j .LBB155_2 11952; RV32I-NEXT: .LBB155_1: # %atomicrmw.start 11953; RV32I-NEXT: # in Loop: Header=BB155_2 Depth=1 11954; RV32I-NEXT: sw a3, 0(sp) 11955; RV32I-NEXT: mv a1, sp 11956; RV32I-NEXT: mv a0, s0 11957; RV32I-NEXT: li a3, 0 11958; RV32I-NEXT: li a4, 0 11959; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11960; RV32I-NEXT: lw a3, 0(sp) 11961; RV32I-NEXT: bnez a0, .LBB155_4 11962; RV32I-NEXT: .LBB155_2: # %atomicrmw.start 11963; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11964; RV32I-NEXT: mv a2, a3 11965; RV32I-NEXT: bltu s1, a3, .LBB155_1 11966; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11967; RV32I-NEXT: # in Loop: Header=BB155_2 Depth=1 11968; RV32I-NEXT: mv a2, s1 11969; RV32I-NEXT: j .LBB155_1 11970; RV32I-NEXT: .LBB155_4: # %atomicrmw.end 11971; RV32I-NEXT: mv a0, a3 11972; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11973; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11974; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11975; RV32I-NEXT: addi sp, sp, 16 11976; RV32I-NEXT: ret 11977; 11978; RV32IA-LABEL: atomicrmw_umax_i32_monotonic: 11979; RV32IA: # %bb.0: 11980; RV32IA-NEXT: amomaxu.w a0, a1, (a0) 11981; RV32IA-NEXT: ret 11982; 11983; RV64I-LABEL: atomicrmw_umax_i32_monotonic: 11984; RV64I: # %bb.0: 11985; RV64I-NEXT: addi sp, sp, -48 11986; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11987; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11988; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11989; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11990; RV64I-NEXT: mv s0, a0 11991; RV64I-NEXT: lw a3, 0(a0) 11992; RV64I-NEXT: mv s2, a1 11993; RV64I-NEXT: sext.w s1, a1 11994; RV64I-NEXT: j .LBB155_2 11995; RV64I-NEXT: .LBB155_1: # %atomicrmw.start 11996; RV64I-NEXT: # in Loop: Header=BB155_2 Depth=1 11997; RV64I-NEXT: sw a3, 12(sp) 11998; RV64I-NEXT: addi a1, sp, 12 11999; RV64I-NEXT: mv a0, s0 12000; RV64I-NEXT: li a3, 0 12001; RV64I-NEXT: li a4, 0 12002; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12003; RV64I-NEXT: lw a3, 12(sp) 12004; RV64I-NEXT: bnez a0, .LBB155_4 12005; RV64I-NEXT: .LBB155_2: # %atomicrmw.start 12006; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12007; RV64I-NEXT: mv a2, a3 12008; RV64I-NEXT: bltu s1, a3, .LBB155_1 12009; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12010; RV64I-NEXT: # in Loop: Header=BB155_2 Depth=1 12011; RV64I-NEXT: mv a2, s2 12012; RV64I-NEXT: j .LBB155_1 12013; RV64I-NEXT: .LBB155_4: # %atomicrmw.end 12014; RV64I-NEXT: mv a0, a3 12015; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12016; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12017; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12018; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12019; RV64I-NEXT: addi sp, sp, 48 12020; RV64I-NEXT: ret 12021; 12022; RV64IA-LABEL: atomicrmw_umax_i32_monotonic: 12023; RV64IA: # %bb.0: 12024; RV64IA-NEXT: amomaxu.w a0, a1, (a0) 12025; RV64IA-NEXT: ret 12026 %1 = atomicrmw umax i32* %a, i32 %b monotonic 12027 ret i32 %1 12028} 12029 12030define i32 @atomicrmw_umax_i32_acquire(i32 *%a, i32 %b) nounwind { 12031; RV32I-LABEL: atomicrmw_umax_i32_acquire: 12032; RV32I: # %bb.0: 12033; RV32I-NEXT: addi sp, sp, -16 12034; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12035; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12036; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12037; RV32I-NEXT: mv s0, a0 12038; RV32I-NEXT: lw a3, 0(a0) 12039; RV32I-NEXT: mv s1, a1 12040; RV32I-NEXT: j .LBB156_2 12041; RV32I-NEXT: .LBB156_1: # %atomicrmw.start 12042; RV32I-NEXT: # in Loop: Header=BB156_2 Depth=1 12043; RV32I-NEXT: sw a3, 0(sp) 12044; RV32I-NEXT: mv a1, sp 12045; RV32I-NEXT: li a3, 2 12046; RV32I-NEXT: li a4, 2 12047; RV32I-NEXT: mv a0, s0 12048; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12049; RV32I-NEXT: lw a3, 0(sp) 12050; RV32I-NEXT: bnez a0, .LBB156_4 12051; RV32I-NEXT: .LBB156_2: # %atomicrmw.start 12052; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12053; RV32I-NEXT: mv a2, a3 12054; RV32I-NEXT: bltu s1, a3, .LBB156_1 12055; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12056; RV32I-NEXT: # in Loop: Header=BB156_2 Depth=1 12057; RV32I-NEXT: mv a2, s1 12058; RV32I-NEXT: j .LBB156_1 12059; RV32I-NEXT: .LBB156_4: # %atomicrmw.end 12060; RV32I-NEXT: mv a0, a3 12061; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12062; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12063; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12064; RV32I-NEXT: addi sp, sp, 16 12065; RV32I-NEXT: ret 12066; 12067; RV32IA-LABEL: atomicrmw_umax_i32_acquire: 12068; RV32IA: # %bb.0: 12069; RV32IA-NEXT: amomaxu.w.aq a0, a1, (a0) 12070; RV32IA-NEXT: ret 12071; 12072; RV64I-LABEL: atomicrmw_umax_i32_acquire: 12073; RV64I: # %bb.0: 12074; RV64I-NEXT: addi sp, sp, -48 12075; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12076; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12077; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12078; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12079; RV64I-NEXT: mv s0, a0 12080; RV64I-NEXT: lw a3, 0(a0) 12081; RV64I-NEXT: mv s2, a1 12082; RV64I-NEXT: sext.w s1, a1 12083; RV64I-NEXT: j .LBB156_2 12084; RV64I-NEXT: .LBB156_1: # %atomicrmw.start 12085; RV64I-NEXT: # in Loop: Header=BB156_2 Depth=1 12086; RV64I-NEXT: sw a3, 12(sp) 12087; RV64I-NEXT: addi a1, sp, 12 12088; RV64I-NEXT: li a3, 2 12089; RV64I-NEXT: li a4, 2 12090; RV64I-NEXT: mv a0, s0 12091; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12092; RV64I-NEXT: lw a3, 12(sp) 12093; RV64I-NEXT: bnez a0, .LBB156_4 12094; RV64I-NEXT: .LBB156_2: # %atomicrmw.start 12095; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12096; RV64I-NEXT: mv a2, a3 12097; RV64I-NEXT: bltu s1, a3, .LBB156_1 12098; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12099; RV64I-NEXT: # in Loop: Header=BB156_2 Depth=1 12100; RV64I-NEXT: mv a2, s2 12101; RV64I-NEXT: j .LBB156_1 12102; RV64I-NEXT: .LBB156_4: # %atomicrmw.end 12103; RV64I-NEXT: mv a0, a3 12104; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12105; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12106; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12107; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12108; RV64I-NEXT: addi sp, sp, 48 12109; RV64I-NEXT: ret 12110; 12111; RV64IA-LABEL: atomicrmw_umax_i32_acquire: 12112; RV64IA: # %bb.0: 12113; RV64IA-NEXT: amomaxu.w.aq a0, a1, (a0) 12114; RV64IA-NEXT: ret 12115 %1 = atomicrmw umax i32* %a, i32 %b acquire 12116 ret i32 %1 12117} 12118 12119define i32 @atomicrmw_umax_i32_release(i32 *%a, i32 %b) nounwind { 12120; RV32I-LABEL: atomicrmw_umax_i32_release: 12121; RV32I: # %bb.0: 12122; RV32I-NEXT: addi sp, sp, -16 12123; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12124; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12125; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12126; RV32I-NEXT: mv s0, a0 12127; RV32I-NEXT: lw a3, 0(a0) 12128; RV32I-NEXT: mv s1, a1 12129; RV32I-NEXT: j .LBB157_2 12130; RV32I-NEXT: .LBB157_1: # %atomicrmw.start 12131; RV32I-NEXT: # in Loop: Header=BB157_2 Depth=1 12132; RV32I-NEXT: sw a3, 0(sp) 12133; RV32I-NEXT: mv a1, sp 12134; RV32I-NEXT: li a3, 3 12135; RV32I-NEXT: mv a0, s0 12136; RV32I-NEXT: li a4, 0 12137; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12138; RV32I-NEXT: lw a3, 0(sp) 12139; RV32I-NEXT: bnez a0, .LBB157_4 12140; RV32I-NEXT: .LBB157_2: # %atomicrmw.start 12141; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12142; RV32I-NEXT: mv a2, a3 12143; RV32I-NEXT: bltu s1, a3, .LBB157_1 12144; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12145; RV32I-NEXT: # in Loop: Header=BB157_2 Depth=1 12146; RV32I-NEXT: mv a2, s1 12147; RV32I-NEXT: j .LBB157_1 12148; RV32I-NEXT: .LBB157_4: # %atomicrmw.end 12149; RV32I-NEXT: mv a0, a3 12150; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12151; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12152; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12153; RV32I-NEXT: addi sp, sp, 16 12154; RV32I-NEXT: ret 12155; 12156; RV32IA-LABEL: atomicrmw_umax_i32_release: 12157; RV32IA: # %bb.0: 12158; RV32IA-NEXT: amomaxu.w.rl a0, a1, (a0) 12159; RV32IA-NEXT: ret 12160; 12161; RV64I-LABEL: atomicrmw_umax_i32_release: 12162; RV64I: # %bb.0: 12163; RV64I-NEXT: addi sp, sp, -48 12164; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12165; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12166; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12167; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12168; RV64I-NEXT: mv s0, a0 12169; RV64I-NEXT: lw a3, 0(a0) 12170; RV64I-NEXT: mv s2, a1 12171; RV64I-NEXT: sext.w s1, a1 12172; RV64I-NEXT: j .LBB157_2 12173; RV64I-NEXT: .LBB157_1: # %atomicrmw.start 12174; RV64I-NEXT: # in Loop: Header=BB157_2 Depth=1 12175; RV64I-NEXT: sw a3, 12(sp) 12176; RV64I-NEXT: addi a1, sp, 12 12177; RV64I-NEXT: li a3, 3 12178; RV64I-NEXT: mv a0, s0 12179; RV64I-NEXT: li a4, 0 12180; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12181; RV64I-NEXT: lw a3, 12(sp) 12182; RV64I-NEXT: bnez a0, .LBB157_4 12183; RV64I-NEXT: .LBB157_2: # %atomicrmw.start 12184; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12185; RV64I-NEXT: mv a2, a3 12186; RV64I-NEXT: bltu s1, a3, .LBB157_1 12187; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12188; RV64I-NEXT: # in Loop: Header=BB157_2 Depth=1 12189; RV64I-NEXT: mv a2, s2 12190; RV64I-NEXT: j .LBB157_1 12191; RV64I-NEXT: .LBB157_4: # %atomicrmw.end 12192; RV64I-NEXT: mv a0, a3 12193; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12194; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12195; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12196; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12197; RV64I-NEXT: addi sp, sp, 48 12198; RV64I-NEXT: ret 12199; 12200; RV64IA-LABEL: atomicrmw_umax_i32_release: 12201; RV64IA: # %bb.0: 12202; RV64IA-NEXT: amomaxu.w.rl a0, a1, (a0) 12203; RV64IA-NEXT: ret 12204 %1 = atomicrmw umax i32* %a, i32 %b release 12205 ret i32 %1 12206} 12207 12208define i32 @atomicrmw_umax_i32_acq_rel(i32 *%a, i32 %b) nounwind { 12209; RV32I-LABEL: atomicrmw_umax_i32_acq_rel: 12210; RV32I: # %bb.0: 12211; RV32I-NEXT: addi sp, sp, -16 12212; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12213; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12214; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12215; RV32I-NEXT: mv s0, a0 12216; RV32I-NEXT: lw a3, 0(a0) 12217; RV32I-NEXT: mv s1, a1 12218; RV32I-NEXT: j .LBB158_2 12219; RV32I-NEXT: .LBB158_1: # %atomicrmw.start 12220; RV32I-NEXT: # in Loop: Header=BB158_2 Depth=1 12221; RV32I-NEXT: sw a3, 0(sp) 12222; RV32I-NEXT: mv a1, sp 12223; RV32I-NEXT: li a3, 4 12224; RV32I-NEXT: li a4, 2 12225; RV32I-NEXT: mv a0, s0 12226; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12227; RV32I-NEXT: lw a3, 0(sp) 12228; RV32I-NEXT: bnez a0, .LBB158_4 12229; RV32I-NEXT: .LBB158_2: # %atomicrmw.start 12230; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12231; RV32I-NEXT: mv a2, a3 12232; RV32I-NEXT: bltu s1, a3, .LBB158_1 12233; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12234; RV32I-NEXT: # in Loop: Header=BB158_2 Depth=1 12235; RV32I-NEXT: mv a2, s1 12236; RV32I-NEXT: j .LBB158_1 12237; RV32I-NEXT: .LBB158_4: # %atomicrmw.end 12238; RV32I-NEXT: mv a0, a3 12239; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12240; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12241; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12242; RV32I-NEXT: addi sp, sp, 16 12243; RV32I-NEXT: ret 12244; 12245; RV32IA-LABEL: atomicrmw_umax_i32_acq_rel: 12246; RV32IA: # %bb.0: 12247; RV32IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12248; RV32IA-NEXT: ret 12249; 12250; RV64I-LABEL: atomicrmw_umax_i32_acq_rel: 12251; RV64I: # %bb.0: 12252; RV64I-NEXT: addi sp, sp, -48 12253; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12254; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12255; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12256; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12257; RV64I-NEXT: mv s0, a0 12258; RV64I-NEXT: lw a3, 0(a0) 12259; RV64I-NEXT: mv s2, a1 12260; RV64I-NEXT: sext.w s1, a1 12261; RV64I-NEXT: j .LBB158_2 12262; RV64I-NEXT: .LBB158_1: # %atomicrmw.start 12263; RV64I-NEXT: # in Loop: Header=BB158_2 Depth=1 12264; RV64I-NEXT: sw a3, 12(sp) 12265; RV64I-NEXT: addi a1, sp, 12 12266; RV64I-NEXT: li a3, 4 12267; RV64I-NEXT: li a4, 2 12268; RV64I-NEXT: mv a0, s0 12269; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12270; RV64I-NEXT: lw a3, 12(sp) 12271; RV64I-NEXT: bnez a0, .LBB158_4 12272; RV64I-NEXT: .LBB158_2: # %atomicrmw.start 12273; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12274; RV64I-NEXT: mv a2, a3 12275; RV64I-NEXT: bltu s1, a3, .LBB158_1 12276; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12277; RV64I-NEXT: # in Loop: Header=BB158_2 Depth=1 12278; RV64I-NEXT: mv a2, s2 12279; RV64I-NEXT: j .LBB158_1 12280; RV64I-NEXT: .LBB158_4: # %atomicrmw.end 12281; RV64I-NEXT: mv a0, a3 12282; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12283; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12284; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12285; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12286; RV64I-NEXT: addi sp, sp, 48 12287; RV64I-NEXT: ret 12288; 12289; RV64IA-LABEL: atomicrmw_umax_i32_acq_rel: 12290; RV64IA: # %bb.0: 12291; RV64IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12292; RV64IA-NEXT: ret 12293 %1 = atomicrmw umax i32* %a, i32 %b acq_rel 12294 ret i32 %1 12295} 12296 12297define i32 @atomicrmw_umax_i32_seq_cst(i32 *%a, i32 %b) nounwind { 12298; RV32I-LABEL: atomicrmw_umax_i32_seq_cst: 12299; RV32I: # %bb.0: 12300; RV32I-NEXT: addi sp, sp, -16 12301; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12302; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12303; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12304; RV32I-NEXT: mv s0, a0 12305; RV32I-NEXT: lw a3, 0(a0) 12306; RV32I-NEXT: mv s1, a1 12307; RV32I-NEXT: j .LBB159_2 12308; RV32I-NEXT: .LBB159_1: # %atomicrmw.start 12309; RV32I-NEXT: # in Loop: Header=BB159_2 Depth=1 12310; RV32I-NEXT: sw a3, 0(sp) 12311; RV32I-NEXT: mv a1, sp 12312; RV32I-NEXT: li a3, 5 12313; RV32I-NEXT: li a4, 5 12314; RV32I-NEXT: mv a0, s0 12315; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12316; RV32I-NEXT: lw a3, 0(sp) 12317; RV32I-NEXT: bnez a0, .LBB159_4 12318; RV32I-NEXT: .LBB159_2: # %atomicrmw.start 12319; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12320; RV32I-NEXT: mv a2, a3 12321; RV32I-NEXT: bltu s1, a3, .LBB159_1 12322; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12323; RV32I-NEXT: # in Loop: Header=BB159_2 Depth=1 12324; RV32I-NEXT: mv a2, s1 12325; RV32I-NEXT: j .LBB159_1 12326; RV32I-NEXT: .LBB159_4: # %atomicrmw.end 12327; RV32I-NEXT: mv a0, a3 12328; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12329; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12330; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12331; RV32I-NEXT: addi sp, sp, 16 12332; RV32I-NEXT: ret 12333; 12334; RV32IA-LABEL: atomicrmw_umax_i32_seq_cst: 12335; RV32IA: # %bb.0: 12336; RV32IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12337; RV32IA-NEXT: ret 12338; 12339; RV64I-LABEL: atomicrmw_umax_i32_seq_cst: 12340; RV64I: # %bb.0: 12341; RV64I-NEXT: addi sp, sp, -48 12342; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12343; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12344; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12345; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12346; RV64I-NEXT: mv s0, a0 12347; RV64I-NEXT: lw a3, 0(a0) 12348; RV64I-NEXT: mv s2, a1 12349; RV64I-NEXT: sext.w s1, a1 12350; RV64I-NEXT: j .LBB159_2 12351; RV64I-NEXT: .LBB159_1: # %atomicrmw.start 12352; RV64I-NEXT: # in Loop: Header=BB159_2 Depth=1 12353; RV64I-NEXT: sw a3, 12(sp) 12354; RV64I-NEXT: addi a1, sp, 12 12355; RV64I-NEXT: li a3, 5 12356; RV64I-NEXT: li a4, 5 12357; RV64I-NEXT: mv a0, s0 12358; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12359; RV64I-NEXT: lw a3, 12(sp) 12360; RV64I-NEXT: bnez a0, .LBB159_4 12361; RV64I-NEXT: .LBB159_2: # %atomicrmw.start 12362; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12363; RV64I-NEXT: mv a2, a3 12364; RV64I-NEXT: bltu s1, a3, .LBB159_1 12365; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12366; RV64I-NEXT: # in Loop: Header=BB159_2 Depth=1 12367; RV64I-NEXT: mv a2, s2 12368; RV64I-NEXT: j .LBB159_1 12369; RV64I-NEXT: .LBB159_4: # %atomicrmw.end 12370; RV64I-NEXT: mv a0, a3 12371; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12372; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12373; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12374; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12375; RV64I-NEXT: addi sp, sp, 48 12376; RV64I-NEXT: ret 12377; 12378; RV64IA-LABEL: atomicrmw_umax_i32_seq_cst: 12379; RV64IA: # %bb.0: 12380; RV64IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12381; RV64IA-NEXT: ret 12382 %1 = atomicrmw umax i32* %a, i32 %b seq_cst 12383 ret i32 %1 12384} 12385 12386define i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind { 12387; RV32I-LABEL: atomicrmw_umin_i32_monotonic: 12388; RV32I: # %bb.0: 12389; RV32I-NEXT: addi sp, sp, -16 12390; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12391; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12392; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12393; RV32I-NEXT: mv s0, a0 12394; RV32I-NEXT: lw a3, 0(a0) 12395; RV32I-NEXT: mv s1, a1 12396; RV32I-NEXT: j .LBB160_2 12397; RV32I-NEXT: .LBB160_1: # %atomicrmw.start 12398; RV32I-NEXT: # in Loop: Header=BB160_2 Depth=1 12399; RV32I-NEXT: sw a3, 0(sp) 12400; RV32I-NEXT: mv a1, sp 12401; RV32I-NEXT: mv a0, s0 12402; RV32I-NEXT: li a3, 0 12403; RV32I-NEXT: li a4, 0 12404; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12405; RV32I-NEXT: lw a3, 0(sp) 12406; RV32I-NEXT: bnez a0, .LBB160_4 12407; RV32I-NEXT: .LBB160_2: # %atomicrmw.start 12408; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12409; RV32I-NEXT: mv a2, a3 12410; RV32I-NEXT: bgeu s1, a3, .LBB160_1 12411; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12412; RV32I-NEXT: # in Loop: Header=BB160_2 Depth=1 12413; RV32I-NEXT: mv a2, s1 12414; RV32I-NEXT: j .LBB160_1 12415; RV32I-NEXT: .LBB160_4: # %atomicrmw.end 12416; RV32I-NEXT: mv a0, a3 12417; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12418; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12419; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12420; RV32I-NEXT: addi sp, sp, 16 12421; RV32I-NEXT: ret 12422; 12423; RV32IA-LABEL: atomicrmw_umin_i32_monotonic: 12424; RV32IA: # %bb.0: 12425; RV32IA-NEXT: amominu.w a0, a1, (a0) 12426; RV32IA-NEXT: ret 12427; 12428; RV64I-LABEL: atomicrmw_umin_i32_monotonic: 12429; RV64I: # %bb.0: 12430; RV64I-NEXT: addi sp, sp, -48 12431; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12432; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12433; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12434; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12435; RV64I-NEXT: mv s0, a0 12436; RV64I-NEXT: lw a3, 0(a0) 12437; RV64I-NEXT: mv s2, a1 12438; RV64I-NEXT: sext.w s1, a1 12439; RV64I-NEXT: j .LBB160_2 12440; RV64I-NEXT: .LBB160_1: # %atomicrmw.start 12441; RV64I-NEXT: # in Loop: Header=BB160_2 Depth=1 12442; RV64I-NEXT: sw a3, 12(sp) 12443; RV64I-NEXT: addi a1, sp, 12 12444; RV64I-NEXT: mv a0, s0 12445; RV64I-NEXT: li a3, 0 12446; RV64I-NEXT: li a4, 0 12447; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12448; RV64I-NEXT: lw a3, 12(sp) 12449; RV64I-NEXT: bnez a0, .LBB160_4 12450; RV64I-NEXT: .LBB160_2: # %atomicrmw.start 12451; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12452; RV64I-NEXT: mv a2, a3 12453; RV64I-NEXT: bgeu s1, a3, .LBB160_1 12454; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12455; RV64I-NEXT: # in Loop: Header=BB160_2 Depth=1 12456; RV64I-NEXT: mv a2, s2 12457; RV64I-NEXT: j .LBB160_1 12458; RV64I-NEXT: .LBB160_4: # %atomicrmw.end 12459; RV64I-NEXT: mv a0, a3 12460; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12461; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12462; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12463; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12464; RV64I-NEXT: addi sp, sp, 48 12465; RV64I-NEXT: ret 12466; 12467; RV64IA-LABEL: atomicrmw_umin_i32_monotonic: 12468; RV64IA: # %bb.0: 12469; RV64IA-NEXT: amominu.w a0, a1, (a0) 12470; RV64IA-NEXT: ret 12471 %1 = atomicrmw umin i32* %a, i32 %b monotonic 12472 ret i32 %1 12473} 12474 12475define i32 @atomicrmw_umin_i32_acquire(i32 *%a, i32 %b) nounwind { 12476; RV32I-LABEL: atomicrmw_umin_i32_acquire: 12477; RV32I: # %bb.0: 12478; RV32I-NEXT: addi sp, sp, -16 12479; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12480; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12481; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12482; RV32I-NEXT: mv s0, a0 12483; RV32I-NEXT: lw a3, 0(a0) 12484; RV32I-NEXT: mv s1, a1 12485; RV32I-NEXT: j .LBB161_2 12486; RV32I-NEXT: .LBB161_1: # %atomicrmw.start 12487; RV32I-NEXT: # in Loop: Header=BB161_2 Depth=1 12488; RV32I-NEXT: sw a3, 0(sp) 12489; RV32I-NEXT: mv a1, sp 12490; RV32I-NEXT: li a3, 2 12491; RV32I-NEXT: li a4, 2 12492; RV32I-NEXT: mv a0, s0 12493; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12494; RV32I-NEXT: lw a3, 0(sp) 12495; RV32I-NEXT: bnez a0, .LBB161_4 12496; RV32I-NEXT: .LBB161_2: # %atomicrmw.start 12497; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12498; RV32I-NEXT: mv a2, a3 12499; RV32I-NEXT: bgeu s1, a3, .LBB161_1 12500; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12501; RV32I-NEXT: # in Loop: Header=BB161_2 Depth=1 12502; RV32I-NEXT: mv a2, s1 12503; RV32I-NEXT: j .LBB161_1 12504; RV32I-NEXT: .LBB161_4: # %atomicrmw.end 12505; RV32I-NEXT: mv a0, a3 12506; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12507; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12508; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12509; RV32I-NEXT: addi sp, sp, 16 12510; RV32I-NEXT: ret 12511; 12512; RV32IA-LABEL: atomicrmw_umin_i32_acquire: 12513; RV32IA: # %bb.0: 12514; RV32IA-NEXT: amominu.w.aq a0, a1, (a0) 12515; RV32IA-NEXT: ret 12516; 12517; RV64I-LABEL: atomicrmw_umin_i32_acquire: 12518; RV64I: # %bb.0: 12519; RV64I-NEXT: addi sp, sp, -48 12520; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12521; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12522; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12523; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12524; RV64I-NEXT: mv s0, a0 12525; RV64I-NEXT: lw a3, 0(a0) 12526; RV64I-NEXT: mv s2, a1 12527; RV64I-NEXT: sext.w s1, a1 12528; RV64I-NEXT: j .LBB161_2 12529; RV64I-NEXT: .LBB161_1: # %atomicrmw.start 12530; RV64I-NEXT: # in Loop: Header=BB161_2 Depth=1 12531; RV64I-NEXT: sw a3, 12(sp) 12532; RV64I-NEXT: addi a1, sp, 12 12533; RV64I-NEXT: li a3, 2 12534; RV64I-NEXT: li a4, 2 12535; RV64I-NEXT: mv a0, s0 12536; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12537; RV64I-NEXT: lw a3, 12(sp) 12538; RV64I-NEXT: bnez a0, .LBB161_4 12539; RV64I-NEXT: .LBB161_2: # %atomicrmw.start 12540; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12541; RV64I-NEXT: mv a2, a3 12542; RV64I-NEXT: bgeu s1, a3, .LBB161_1 12543; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12544; RV64I-NEXT: # in Loop: Header=BB161_2 Depth=1 12545; RV64I-NEXT: mv a2, s2 12546; RV64I-NEXT: j .LBB161_1 12547; RV64I-NEXT: .LBB161_4: # %atomicrmw.end 12548; RV64I-NEXT: mv a0, a3 12549; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12550; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12551; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12552; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12553; RV64I-NEXT: addi sp, sp, 48 12554; RV64I-NEXT: ret 12555; 12556; RV64IA-LABEL: atomicrmw_umin_i32_acquire: 12557; RV64IA: # %bb.0: 12558; RV64IA-NEXT: amominu.w.aq a0, a1, (a0) 12559; RV64IA-NEXT: ret 12560 %1 = atomicrmw umin i32* %a, i32 %b acquire 12561 ret i32 %1 12562} 12563 12564define i32 @atomicrmw_umin_i32_release(i32 *%a, i32 %b) nounwind { 12565; RV32I-LABEL: atomicrmw_umin_i32_release: 12566; RV32I: # %bb.0: 12567; RV32I-NEXT: addi sp, sp, -16 12568; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12569; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12570; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12571; RV32I-NEXT: mv s0, a0 12572; RV32I-NEXT: lw a3, 0(a0) 12573; RV32I-NEXT: mv s1, a1 12574; RV32I-NEXT: j .LBB162_2 12575; RV32I-NEXT: .LBB162_1: # %atomicrmw.start 12576; RV32I-NEXT: # in Loop: Header=BB162_2 Depth=1 12577; RV32I-NEXT: sw a3, 0(sp) 12578; RV32I-NEXT: mv a1, sp 12579; RV32I-NEXT: li a3, 3 12580; RV32I-NEXT: mv a0, s0 12581; RV32I-NEXT: li a4, 0 12582; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12583; RV32I-NEXT: lw a3, 0(sp) 12584; RV32I-NEXT: bnez a0, .LBB162_4 12585; RV32I-NEXT: .LBB162_2: # %atomicrmw.start 12586; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12587; RV32I-NEXT: mv a2, a3 12588; RV32I-NEXT: bgeu s1, a3, .LBB162_1 12589; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12590; RV32I-NEXT: # in Loop: Header=BB162_2 Depth=1 12591; RV32I-NEXT: mv a2, s1 12592; RV32I-NEXT: j .LBB162_1 12593; RV32I-NEXT: .LBB162_4: # %atomicrmw.end 12594; RV32I-NEXT: mv a0, a3 12595; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12596; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12597; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12598; RV32I-NEXT: addi sp, sp, 16 12599; RV32I-NEXT: ret 12600; 12601; RV32IA-LABEL: atomicrmw_umin_i32_release: 12602; RV32IA: # %bb.0: 12603; RV32IA-NEXT: amominu.w.rl a0, a1, (a0) 12604; RV32IA-NEXT: ret 12605; 12606; RV64I-LABEL: atomicrmw_umin_i32_release: 12607; RV64I: # %bb.0: 12608; RV64I-NEXT: addi sp, sp, -48 12609; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12610; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12611; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12612; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12613; RV64I-NEXT: mv s0, a0 12614; RV64I-NEXT: lw a3, 0(a0) 12615; RV64I-NEXT: mv s2, a1 12616; RV64I-NEXT: sext.w s1, a1 12617; RV64I-NEXT: j .LBB162_2 12618; RV64I-NEXT: .LBB162_1: # %atomicrmw.start 12619; RV64I-NEXT: # in Loop: Header=BB162_2 Depth=1 12620; RV64I-NEXT: sw a3, 12(sp) 12621; RV64I-NEXT: addi a1, sp, 12 12622; RV64I-NEXT: li a3, 3 12623; RV64I-NEXT: mv a0, s0 12624; RV64I-NEXT: li a4, 0 12625; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12626; RV64I-NEXT: lw a3, 12(sp) 12627; RV64I-NEXT: bnez a0, .LBB162_4 12628; RV64I-NEXT: .LBB162_2: # %atomicrmw.start 12629; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12630; RV64I-NEXT: mv a2, a3 12631; RV64I-NEXT: bgeu s1, a3, .LBB162_1 12632; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12633; RV64I-NEXT: # in Loop: Header=BB162_2 Depth=1 12634; RV64I-NEXT: mv a2, s2 12635; RV64I-NEXT: j .LBB162_1 12636; RV64I-NEXT: .LBB162_4: # %atomicrmw.end 12637; RV64I-NEXT: mv a0, a3 12638; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12639; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12640; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12641; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12642; RV64I-NEXT: addi sp, sp, 48 12643; RV64I-NEXT: ret 12644; 12645; RV64IA-LABEL: atomicrmw_umin_i32_release: 12646; RV64IA: # %bb.0: 12647; RV64IA-NEXT: amominu.w.rl a0, a1, (a0) 12648; RV64IA-NEXT: ret 12649 %1 = atomicrmw umin i32* %a, i32 %b release 12650 ret i32 %1 12651} 12652 12653define i32 @atomicrmw_umin_i32_acq_rel(i32 *%a, i32 %b) nounwind { 12654; RV32I-LABEL: atomicrmw_umin_i32_acq_rel: 12655; RV32I: # %bb.0: 12656; RV32I-NEXT: addi sp, sp, -16 12657; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12658; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12659; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12660; RV32I-NEXT: mv s0, a0 12661; RV32I-NEXT: lw a3, 0(a0) 12662; RV32I-NEXT: mv s1, a1 12663; RV32I-NEXT: j .LBB163_2 12664; RV32I-NEXT: .LBB163_1: # %atomicrmw.start 12665; RV32I-NEXT: # in Loop: Header=BB163_2 Depth=1 12666; RV32I-NEXT: sw a3, 0(sp) 12667; RV32I-NEXT: mv a1, sp 12668; RV32I-NEXT: li a3, 4 12669; RV32I-NEXT: li a4, 2 12670; RV32I-NEXT: mv a0, s0 12671; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12672; RV32I-NEXT: lw a3, 0(sp) 12673; RV32I-NEXT: bnez a0, .LBB163_4 12674; RV32I-NEXT: .LBB163_2: # %atomicrmw.start 12675; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12676; RV32I-NEXT: mv a2, a3 12677; RV32I-NEXT: bgeu s1, a3, .LBB163_1 12678; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12679; RV32I-NEXT: # in Loop: Header=BB163_2 Depth=1 12680; RV32I-NEXT: mv a2, s1 12681; RV32I-NEXT: j .LBB163_1 12682; RV32I-NEXT: .LBB163_4: # %atomicrmw.end 12683; RV32I-NEXT: mv a0, a3 12684; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12685; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12686; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12687; RV32I-NEXT: addi sp, sp, 16 12688; RV32I-NEXT: ret 12689; 12690; RV32IA-LABEL: atomicrmw_umin_i32_acq_rel: 12691; RV32IA: # %bb.0: 12692; RV32IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12693; RV32IA-NEXT: ret 12694; 12695; RV64I-LABEL: atomicrmw_umin_i32_acq_rel: 12696; RV64I: # %bb.0: 12697; RV64I-NEXT: addi sp, sp, -48 12698; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12699; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12700; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12701; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12702; RV64I-NEXT: mv s0, a0 12703; RV64I-NEXT: lw a3, 0(a0) 12704; RV64I-NEXT: mv s2, a1 12705; RV64I-NEXT: sext.w s1, a1 12706; RV64I-NEXT: j .LBB163_2 12707; RV64I-NEXT: .LBB163_1: # %atomicrmw.start 12708; RV64I-NEXT: # in Loop: Header=BB163_2 Depth=1 12709; RV64I-NEXT: sw a3, 12(sp) 12710; RV64I-NEXT: addi a1, sp, 12 12711; RV64I-NEXT: li a3, 4 12712; RV64I-NEXT: li a4, 2 12713; RV64I-NEXT: mv a0, s0 12714; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12715; RV64I-NEXT: lw a3, 12(sp) 12716; RV64I-NEXT: bnez a0, .LBB163_4 12717; RV64I-NEXT: .LBB163_2: # %atomicrmw.start 12718; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12719; RV64I-NEXT: mv a2, a3 12720; RV64I-NEXT: bgeu s1, a3, .LBB163_1 12721; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12722; RV64I-NEXT: # in Loop: Header=BB163_2 Depth=1 12723; RV64I-NEXT: mv a2, s2 12724; RV64I-NEXT: j .LBB163_1 12725; RV64I-NEXT: .LBB163_4: # %atomicrmw.end 12726; RV64I-NEXT: mv a0, a3 12727; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12728; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12729; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12730; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12731; RV64I-NEXT: addi sp, sp, 48 12732; RV64I-NEXT: ret 12733; 12734; RV64IA-LABEL: atomicrmw_umin_i32_acq_rel: 12735; RV64IA: # %bb.0: 12736; RV64IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12737; RV64IA-NEXT: ret 12738 %1 = atomicrmw umin i32* %a, i32 %b acq_rel 12739 ret i32 %1 12740} 12741 12742define i32 @atomicrmw_umin_i32_seq_cst(i32 *%a, i32 %b) nounwind { 12743; RV32I-LABEL: atomicrmw_umin_i32_seq_cst: 12744; RV32I: # %bb.0: 12745; RV32I-NEXT: addi sp, sp, -16 12746; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12747; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12748; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12749; RV32I-NEXT: mv s0, a0 12750; RV32I-NEXT: lw a3, 0(a0) 12751; RV32I-NEXT: mv s1, a1 12752; RV32I-NEXT: j .LBB164_2 12753; RV32I-NEXT: .LBB164_1: # %atomicrmw.start 12754; RV32I-NEXT: # in Loop: Header=BB164_2 Depth=1 12755; RV32I-NEXT: sw a3, 0(sp) 12756; RV32I-NEXT: mv a1, sp 12757; RV32I-NEXT: li a3, 5 12758; RV32I-NEXT: li a4, 5 12759; RV32I-NEXT: mv a0, s0 12760; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12761; RV32I-NEXT: lw a3, 0(sp) 12762; RV32I-NEXT: bnez a0, .LBB164_4 12763; RV32I-NEXT: .LBB164_2: # %atomicrmw.start 12764; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12765; RV32I-NEXT: mv a2, a3 12766; RV32I-NEXT: bgeu s1, a3, .LBB164_1 12767; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12768; RV32I-NEXT: # in Loop: Header=BB164_2 Depth=1 12769; RV32I-NEXT: mv a2, s1 12770; RV32I-NEXT: j .LBB164_1 12771; RV32I-NEXT: .LBB164_4: # %atomicrmw.end 12772; RV32I-NEXT: mv a0, a3 12773; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12774; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12775; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12776; RV32I-NEXT: addi sp, sp, 16 12777; RV32I-NEXT: ret 12778; 12779; RV32IA-LABEL: atomicrmw_umin_i32_seq_cst: 12780; RV32IA: # %bb.0: 12781; RV32IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12782; RV32IA-NEXT: ret 12783; 12784; RV64I-LABEL: atomicrmw_umin_i32_seq_cst: 12785; RV64I: # %bb.0: 12786; RV64I-NEXT: addi sp, sp, -48 12787; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12788; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12789; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12790; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12791; RV64I-NEXT: mv s0, a0 12792; RV64I-NEXT: lw a3, 0(a0) 12793; RV64I-NEXT: mv s2, a1 12794; RV64I-NEXT: sext.w s1, a1 12795; RV64I-NEXT: j .LBB164_2 12796; RV64I-NEXT: .LBB164_1: # %atomicrmw.start 12797; RV64I-NEXT: # in Loop: Header=BB164_2 Depth=1 12798; RV64I-NEXT: sw a3, 12(sp) 12799; RV64I-NEXT: addi a1, sp, 12 12800; RV64I-NEXT: li a3, 5 12801; RV64I-NEXT: li a4, 5 12802; RV64I-NEXT: mv a0, s0 12803; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12804; RV64I-NEXT: lw a3, 12(sp) 12805; RV64I-NEXT: bnez a0, .LBB164_4 12806; RV64I-NEXT: .LBB164_2: # %atomicrmw.start 12807; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12808; RV64I-NEXT: mv a2, a3 12809; RV64I-NEXT: bgeu s1, a3, .LBB164_1 12810; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12811; RV64I-NEXT: # in Loop: Header=BB164_2 Depth=1 12812; RV64I-NEXT: mv a2, s2 12813; RV64I-NEXT: j .LBB164_1 12814; RV64I-NEXT: .LBB164_4: # %atomicrmw.end 12815; RV64I-NEXT: mv a0, a3 12816; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12817; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12818; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12819; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12820; RV64I-NEXT: addi sp, sp, 48 12821; RV64I-NEXT: ret 12822; 12823; RV64IA-LABEL: atomicrmw_umin_i32_seq_cst: 12824; RV64IA: # %bb.0: 12825; RV64IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12826; RV64IA-NEXT: ret 12827 %1 = atomicrmw umin i32* %a, i32 %b seq_cst 12828 ret i32 %1 12829} 12830 12831define i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind { 12832; RV32I-LABEL: atomicrmw_xchg_i64_monotonic: 12833; RV32I: # %bb.0: 12834; RV32I-NEXT: addi sp, sp, -16 12835; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12836; RV32I-NEXT: li a3, 0 12837; RV32I-NEXT: call __atomic_exchange_8@plt 12838; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12839; RV32I-NEXT: addi sp, sp, 16 12840; RV32I-NEXT: ret 12841; 12842; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic: 12843; RV32IA: # %bb.0: 12844; RV32IA-NEXT: addi sp, sp, -16 12845; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12846; RV32IA-NEXT: li a3, 0 12847; RV32IA-NEXT: call __atomic_exchange_8@plt 12848; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12849; RV32IA-NEXT: addi sp, sp, 16 12850; RV32IA-NEXT: ret 12851; 12852; RV64I-LABEL: atomicrmw_xchg_i64_monotonic: 12853; RV64I: # %bb.0: 12854; RV64I-NEXT: addi sp, sp, -16 12855; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12856; RV64I-NEXT: li a2, 0 12857; RV64I-NEXT: call __atomic_exchange_8@plt 12858; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12859; RV64I-NEXT: addi sp, sp, 16 12860; RV64I-NEXT: ret 12861; 12862; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic: 12863; RV64IA: # %bb.0: 12864; RV64IA-NEXT: amoswap.d a0, a1, (a0) 12865; RV64IA-NEXT: ret 12866 %1 = atomicrmw xchg i64* %a, i64 %b monotonic 12867 ret i64 %1 12868} 12869 12870define i64 @atomicrmw_xchg_i64_acquire(i64* %a, i64 %b) nounwind { 12871; RV32I-LABEL: atomicrmw_xchg_i64_acquire: 12872; RV32I: # %bb.0: 12873; RV32I-NEXT: addi sp, sp, -16 12874; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12875; RV32I-NEXT: li a3, 2 12876; RV32I-NEXT: call __atomic_exchange_8@plt 12877; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12878; RV32I-NEXT: addi sp, sp, 16 12879; RV32I-NEXT: ret 12880; 12881; RV32IA-LABEL: atomicrmw_xchg_i64_acquire: 12882; RV32IA: # %bb.0: 12883; RV32IA-NEXT: addi sp, sp, -16 12884; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12885; RV32IA-NEXT: li a3, 2 12886; RV32IA-NEXT: call __atomic_exchange_8@plt 12887; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12888; RV32IA-NEXT: addi sp, sp, 16 12889; RV32IA-NEXT: ret 12890; 12891; RV64I-LABEL: atomicrmw_xchg_i64_acquire: 12892; RV64I: # %bb.0: 12893; RV64I-NEXT: addi sp, sp, -16 12894; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12895; RV64I-NEXT: li a2, 2 12896; RV64I-NEXT: call __atomic_exchange_8@plt 12897; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12898; RV64I-NEXT: addi sp, sp, 16 12899; RV64I-NEXT: ret 12900; 12901; RV64IA-LABEL: atomicrmw_xchg_i64_acquire: 12902; RV64IA: # %bb.0: 12903; RV64IA-NEXT: amoswap.d.aq a0, a1, (a0) 12904; RV64IA-NEXT: ret 12905 %1 = atomicrmw xchg i64* %a, i64 %b acquire 12906 ret i64 %1 12907} 12908 12909define i64 @atomicrmw_xchg_i64_release(i64* %a, i64 %b) nounwind { 12910; RV32I-LABEL: atomicrmw_xchg_i64_release: 12911; RV32I: # %bb.0: 12912; RV32I-NEXT: addi sp, sp, -16 12913; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12914; RV32I-NEXT: li a3, 3 12915; RV32I-NEXT: call __atomic_exchange_8@plt 12916; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12917; RV32I-NEXT: addi sp, sp, 16 12918; RV32I-NEXT: ret 12919; 12920; RV32IA-LABEL: atomicrmw_xchg_i64_release: 12921; RV32IA: # %bb.0: 12922; RV32IA-NEXT: addi sp, sp, -16 12923; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12924; RV32IA-NEXT: li a3, 3 12925; RV32IA-NEXT: call __atomic_exchange_8@plt 12926; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12927; RV32IA-NEXT: addi sp, sp, 16 12928; RV32IA-NEXT: ret 12929; 12930; RV64I-LABEL: atomicrmw_xchg_i64_release: 12931; RV64I: # %bb.0: 12932; RV64I-NEXT: addi sp, sp, -16 12933; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12934; RV64I-NEXT: li a2, 3 12935; RV64I-NEXT: call __atomic_exchange_8@plt 12936; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12937; RV64I-NEXT: addi sp, sp, 16 12938; RV64I-NEXT: ret 12939; 12940; RV64IA-LABEL: atomicrmw_xchg_i64_release: 12941; RV64IA: # %bb.0: 12942; RV64IA-NEXT: amoswap.d.rl a0, a1, (a0) 12943; RV64IA-NEXT: ret 12944 %1 = atomicrmw xchg i64* %a, i64 %b release 12945 ret i64 %1 12946} 12947 12948define i64 @atomicrmw_xchg_i64_acq_rel(i64* %a, i64 %b) nounwind { 12949; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel: 12950; RV32I: # %bb.0: 12951; RV32I-NEXT: addi sp, sp, -16 12952; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12953; RV32I-NEXT: li a3, 4 12954; RV32I-NEXT: call __atomic_exchange_8@plt 12955; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12956; RV32I-NEXT: addi sp, sp, 16 12957; RV32I-NEXT: ret 12958; 12959; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel: 12960; RV32IA: # %bb.0: 12961; RV32IA-NEXT: addi sp, sp, -16 12962; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12963; RV32IA-NEXT: li a3, 4 12964; RV32IA-NEXT: call __atomic_exchange_8@plt 12965; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12966; RV32IA-NEXT: addi sp, sp, 16 12967; RV32IA-NEXT: ret 12968; 12969; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel: 12970; RV64I: # %bb.0: 12971; RV64I-NEXT: addi sp, sp, -16 12972; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12973; RV64I-NEXT: li a2, 4 12974; RV64I-NEXT: call __atomic_exchange_8@plt 12975; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12976; RV64I-NEXT: addi sp, sp, 16 12977; RV64I-NEXT: ret 12978; 12979; RV64IA-LABEL: atomicrmw_xchg_i64_acq_rel: 12980; RV64IA: # %bb.0: 12981; RV64IA-NEXT: amoswap.d.aqrl a0, a1, (a0) 12982; RV64IA-NEXT: ret 12983 %1 = atomicrmw xchg i64* %a, i64 %b acq_rel 12984 ret i64 %1 12985} 12986 12987define i64 @atomicrmw_xchg_i64_seq_cst(i64* %a, i64 %b) nounwind { 12988; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst: 12989; RV32I: # %bb.0: 12990; RV32I-NEXT: addi sp, sp, -16 12991; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12992; RV32I-NEXT: li a3, 5 12993; RV32I-NEXT: call __atomic_exchange_8@plt 12994; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12995; RV32I-NEXT: addi sp, sp, 16 12996; RV32I-NEXT: ret 12997; 12998; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst: 12999; RV32IA: # %bb.0: 13000; RV32IA-NEXT: addi sp, sp, -16 13001; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13002; RV32IA-NEXT: li a3, 5 13003; RV32IA-NEXT: call __atomic_exchange_8@plt 13004; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13005; RV32IA-NEXT: addi sp, sp, 16 13006; RV32IA-NEXT: ret 13007; 13008; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst: 13009; RV64I: # %bb.0: 13010; RV64I-NEXT: addi sp, sp, -16 13011; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13012; RV64I-NEXT: li a2, 5 13013; RV64I-NEXT: call __atomic_exchange_8@plt 13014; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13015; RV64I-NEXT: addi sp, sp, 16 13016; RV64I-NEXT: ret 13017; 13018; RV64IA-LABEL: atomicrmw_xchg_i64_seq_cst: 13019; RV64IA: # %bb.0: 13020; RV64IA-NEXT: amoswap.d.aqrl a0, a1, (a0) 13021; RV64IA-NEXT: ret 13022 %1 = atomicrmw xchg i64* %a, i64 %b seq_cst 13023 ret i64 %1 13024} 13025 13026define i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind { 13027; RV32I-LABEL: atomicrmw_add_i64_monotonic: 13028; RV32I: # %bb.0: 13029; RV32I-NEXT: addi sp, sp, -16 13030; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13031; RV32I-NEXT: li a3, 0 13032; RV32I-NEXT: call __atomic_fetch_add_8@plt 13033; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13034; RV32I-NEXT: addi sp, sp, 16 13035; RV32I-NEXT: ret 13036; 13037; RV32IA-LABEL: atomicrmw_add_i64_monotonic: 13038; RV32IA: # %bb.0: 13039; RV32IA-NEXT: addi sp, sp, -16 13040; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13041; RV32IA-NEXT: li a3, 0 13042; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13043; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13044; RV32IA-NEXT: addi sp, sp, 16 13045; RV32IA-NEXT: ret 13046; 13047; RV64I-LABEL: atomicrmw_add_i64_monotonic: 13048; RV64I: # %bb.0: 13049; RV64I-NEXT: addi sp, sp, -16 13050; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13051; RV64I-NEXT: li a2, 0 13052; RV64I-NEXT: call __atomic_fetch_add_8@plt 13053; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13054; RV64I-NEXT: addi sp, sp, 16 13055; RV64I-NEXT: ret 13056; 13057; RV64IA-LABEL: atomicrmw_add_i64_monotonic: 13058; RV64IA: # %bb.0: 13059; RV64IA-NEXT: amoadd.d a0, a1, (a0) 13060; RV64IA-NEXT: ret 13061 %1 = atomicrmw add i64* %a, i64 %b monotonic 13062 ret i64 %1 13063} 13064 13065define i64 @atomicrmw_add_i64_acquire(i64 *%a, i64 %b) nounwind { 13066; RV32I-LABEL: atomicrmw_add_i64_acquire: 13067; RV32I: # %bb.0: 13068; RV32I-NEXT: addi sp, sp, -16 13069; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13070; RV32I-NEXT: li a3, 2 13071; RV32I-NEXT: call __atomic_fetch_add_8@plt 13072; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13073; RV32I-NEXT: addi sp, sp, 16 13074; RV32I-NEXT: ret 13075; 13076; RV32IA-LABEL: atomicrmw_add_i64_acquire: 13077; RV32IA: # %bb.0: 13078; RV32IA-NEXT: addi sp, sp, -16 13079; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13080; RV32IA-NEXT: li a3, 2 13081; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13082; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13083; RV32IA-NEXT: addi sp, sp, 16 13084; RV32IA-NEXT: ret 13085; 13086; RV64I-LABEL: atomicrmw_add_i64_acquire: 13087; RV64I: # %bb.0: 13088; RV64I-NEXT: addi sp, sp, -16 13089; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13090; RV64I-NEXT: li a2, 2 13091; RV64I-NEXT: call __atomic_fetch_add_8@plt 13092; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13093; RV64I-NEXT: addi sp, sp, 16 13094; RV64I-NEXT: ret 13095; 13096; RV64IA-LABEL: atomicrmw_add_i64_acquire: 13097; RV64IA: # %bb.0: 13098; RV64IA-NEXT: amoadd.d.aq a0, a1, (a0) 13099; RV64IA-NEXT: ret 13100 %1 = atomicrmw add i64* %a, i64 %b acquire 13101 ret i64 %1 13102} 13103 13104define i64 @atomicrmw_add_i64_release(i64 *%a, i64 %b) nounwind { 13105; RV32I-LABEL: atomicrmw_add_i64_release: 13106; RV32I: # %bb.0: 13107; RV32I-NEXT: addi sp, sp, -16 13108; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13109; RV32I-NEXT: li a3, 3 13110; RV32I-NEXT: call __atomic_fetch_add_8@plt 13111; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13112; RV32I-NEXT: addi sp, sp, 16 13113; RV32I-NEXT: ret 13114; 13115; RV32IA-LABEL: atomicrmw_add_i64_release: 13116; RV32IA: # %bb.0: 13117; RV32IA-NEXT: addi sp, sp, -16 13118; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13119; RV32IA-NEXT: li a3, 3 13120; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13121; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13122; RV32IA-NEXT: addi sp, sp, 16 13123; RV32IA-NEXT: ret 13124; 13125; RV64I-LABEL: atomicrmw_add_i64_release: 13126; RV64I: # %bb.0: 13127; RV64I-NEXT: addi sp, sp, -16 13128; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13129; RV64I-NEXT: li a2, 3 13130; RV64I-NEXT: call __atomic_fetch_add_8@plt 13131; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13132; RV64I-NEXT: addi sp, sp, 16 13133; RV64I-NEXT: ret 13134; 13135; RV64IA-LABEL: atomicrmw_add_i64_release: 13136; RV64IA: # %bb.0: 13137; RV64IA-NEXT: amoadd.d.rl a0, a1, (a0) 13138; RV64IA-NEXT: ret 13139 %1 = atomicrmw add i64* %a, i64 %b release 13140 ret i64 %1 13141} 13142 13143define i64 @atomicrmw_add_i64_acq_rel(i64 *%a, i64 %b) nounwind { 13144; RV32I-LABEL: atomicrmw_add_i64_acq_rel: 13145; RV32I: # %bb.0: 13146; RV32I-NEXT: addi sp, sp, -16 13147; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13148; RV32I-NEXT: li a3, 4 13149; RV32I-NEXT: call __atomic_fetch_add_8@plt 13150; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13151; RV32I-NEXT: addi sp, sp, 16 13152; RV32I-NEXT: ret 13153; 13154; RV32IA-LABEL: atomicrmw_add_i64_acq_rel: 13155; RV32IA: # %bb.0: 13156; RV32IA-NEXT: addi sp, sp, -16 13157; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13158; RV32IA-NEXT: li a3, 4 13159; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13160; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13161; RV32IA-NEXT: addi sp, sp, 16 13162; RV32IA-NEXT: ret 13163; 13164; RV64I-LABEL: atomicrmw_add_i64_acq_rel: 13165; RV64I: # %bb.0: 13166; RV64I-NEXT: addi sp, sp, -16 13167; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13168; RV64I-NEXT: li a2, 4 13169; RV64I-NEXT: call __atomic_fetch_add_8@plt 13170; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13171; RV64I-NEXT: addi sp, sp, 16 13172; RV64I-NEXT: ret 13173; 13174; RV64IA-LABEL: atomicrmw_add_i64_acq_rel: 13175; RV64IA: # %bb.0: 13176; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13177; RV64IA-NEXT: ret 13178 %1 = atomicrmw add i64* %a, i64 %b acq_rel 13179 ret i64 %1 13180} 13181 13182define i64 @atomicrmw_add_i64_seq_cst(i64 *%a, i64 %b) nounwind { 13183; RV32I-LABEL: atomicrmw_add_i64_seq_cst: 13184; RV32I: # %bb.0: 13185; RV32I-NEXT: addi sp, sp, -16 13186; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13187; RV32I-NEXT: li a3, 5 13188; RV32I-NEXT: call __atomic_fetch_add_8@plt 13189; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13190; RV32I-NEXT: addi sp, sp, 16 13191; RV32I-NEXT: ret 13192; 13193; RV32IA-LABEL: atomicrmw_add_i64_seq_cst: 13194; RV32IA: # %bb.0: 13195; RV32IA-NEXT: addi sp, sp, -16 13196; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13197; RV32IA-NEXT: li a3, 5 13198; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13199; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13200; RV32IA-NEXT: addi sp, sp, 16 13201; RV32IA-NEXT: ret 13202; 13203; RV64I-LABEL: atomicrmw_add_i64_seq_cst: 13204; RV64I: # %bb.0: 13205; RV64I-NEXT: addi sp, sp, -16 13206; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13207; RV64I-NEXT: li a2, 5 13208; RV64I-NEXT: call __atomic_fetch_add_8@plt 13209; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13210; RV64I-NEXT: addi sp, sp, 16 13211; RV64I-NEXT: ret 13212; 13213; RV64IA-LABEL: atomicrmw_add_i64_seq_cst: 13214; RV64IA: # %bb.0: 13215; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13216; RV64IA-NEXT: ret 13217 %1 = atomicrmw add i64* %a, i64 %b seq_cst 13218 ret i64 %1 13219} 13220 13221define i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind { 13222; RV32I-LABEL: atomicrmw_sub_i64_monotonic: 13223; RV32I: # %bb.0: 13224; RV32I-NEXT: addi sp, sp, -16 13225; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13226; RV32I-NEXT: li a3, 0 13227; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13228; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13229; RV32I-NEXT: addi sp, sp, 16 13230; RV32I-NEXT: ret 13231; 13232; RV32IA-LABEL: atomicrmw_sub_i64_monotonic: 13233; RV32IA: # %bb.0: 13234; RV32IA-NEXT: addi sp, sp, -16 13235; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13236; RV32IA-NEXT: li a3, 0 13237; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13238; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13239; RV32IA-NEXT: addi sp, sp, 16 13240; RV32IA-NEXT: ret 13241; 13242; RV64I-LABEL: atomicrmw_sub_i64_monotonic: 13243; RV64I: # %bb.0: 13244; RV64I-NEXT: addi sp, sp, -16 13245; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13246; RV64I-NEXT: li a2, 0 13247; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13248; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13249; RV64I-NEXT: addi sp, sp, 16 13250; RV64I-NEXT: ret 13251; 13252; RV64IA-LABEL: atomicrmw_sub_i64_monotonic: 13253; RV64IA: # %bb.0: 13254; RV64IA-NEXT: neg a1, a1 13255; RV64IA-NEXT: amoadd.d a0, a1, (a0) 13256; RV64IA-NEXT: ret 13257 %1 = atomicrmw sub i64* %a, i64 %b monotonic 13258 ret i64 %1 13259} 13260 13261define i64 @atomicrmw_sub_i64_acquire(i64* %a, i64 %b) nounwind { 13262; RV32I-LABEL: atomicrmw_sub_i64_acquire: 13263; RV32I: # %bb.0: 13264; RV32I-NEXT: addi sp, sp, -16 13265; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13266; RV32I-NEXT: li a3, 2 13267; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13268; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13269; RV32I-NEXT: addi sp, sp, 16 13270; RV32I-NEXT: ret 13271; 13272; RV32IA-LABEL: atomicrmw_sub_i64_acquire: 13273; RV32IA: # %bb.0: 13274; RV32IA-NEXT: addi sp, sp, -16 13275; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13276; RV32IA-NEXT: li a3, 2 13277; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13278; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13279; RV32IA-NEXT: addi sp, sp, 16 13280; RV32IA-NEXT: ret 13281; 13282; RV64I-LABEL: atomicrmw_sub_i64_acquire: 13283; RV64I: # %bb.0: 13284; RV64I-NEXT: addi sp, sp, -16 13285; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13286; RV64I-NEXT: li a2, 2 13287; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13288; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13289; RV64I-NEXT: addi sp, sp, 16 13290; RV64I-NEXT: ret 13291; 13292; RV64IA-LABEL: atomicrmw_sub_i64_acquire: 13293; RV64IA: # %bb.0: 13294; RV64IA-NEXT: neg a1, a1 13295; RV64IA-NEXT: amoadd.d.aq a0, a1, (a0) 13296; RV64IA-NEXT: ret 13297 %1 = atomicrmw sub i64* %a, i64 %b acquire 13298 ret i64 %1 13299} 13300 13301define i64 @atomicrmw_sub_i64_release(i64* %a, i64 %b) nounwind { 13302; RV32I-LABEL: atomicrmw_sub_i64_release: 13303; RV32I: # %bb.0: 13304; RV32I-NEXT: addi sp, sp, -16 13305; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13306; RV32I-NEXT: li a3, 3 13307; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13308; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13309; RV32I-NEXT: addi sp, sp, 16 13310; RV32I-NEXT: ret 13311; 13312; RV32IA-LABEL: atomicrmw_sub_i64_release: 13313; RV32IA: # %bb.0: 13314; RV32IA-NEXT: addi sp, sp, -16 13315; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13316; RV32IA-NEXT: li a3, 3 13317; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13318; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13319; RV32IA-NEXT: addi sp, sp, 16 13320; RV32IA-NEXT: ret 13321; 13322; RV64I-LABEL: atomicrmw_sub_i64_release: 13323; RV64I: # %bb.0: 13324; RV64I-NEXT: addi sp, sp, -16 13325; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13326; RV64I-NEXT: li a2, 3 13327; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13328; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13329; RV64I-NEXT: addi sp, sp, 16 13330; RV64I-NEXT: ret 13331; 13332; RV64IA-LABEL: atomicrmw_sub_i64_release: 13333; RV64IA: # %bb.0: 13334; RV64IA-NEXT: neg a1, a1 13335; RV64IA-NEXT: amoadd.d.rl a0, a1, (a0) 13336; RV64IA-NEXT: ret 13337 %1 = atomicrmw sub i64* %a, i64 %b release 13338 ret i64 %1 13339} 13340 13341define i64 @atomicrmw_sub_i64_acq_rel(i64* %a, i64 %b) nounwind { 13342; RV32I-LABEL: atomicrmw_sub_i64_acq_rel: 13343; RV32I: # %bb.0: 13344; RV32I-NEXT: addi sp, sp, -16 13345; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13346; RV32I-NEXT: li a3, 4 13347; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13348; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13349; RV32I-NEXT: addi sp, sp, 16 13350; RV32I-NEXT: ret 13351; 13352; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel: 13353; RV32IA: # %bb.0: 13354; RV32IA-NEXT: addi sp, sp, -16 13355; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13356; RV32IA-NEXT: li a3, 4 13357; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13358; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13359; RV32IA-NEXT: addi sp, sp, 16 13360; RV32IA-NEXT: ret 13361; 13362; RV64I-LABEL: atomicrmw_sub_i64_acq_rel: 13363; RV64I: # %bb.0: 13364; RV64I-NEXT: addi sp, sp, -16 13365; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13366; RV64I-NEXT: li a2, 4 13367; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13368; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13369; RV64I-NEXT: addi sp, sp, 16 13370; RV64I-NEXT: ret 13371; 13372; RV64IA-LABEL: atomicrmw_sub_i64_acq_rel: 13373; RV64IA: # %bb.0: 13374; RV64IA-NEXT: neg a1, a1 13375; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13376; RV64IA-NEXT: ret 13377 %1 = atomicrmw sub i64* %a, i64 %b acq_rel 13378 ret i64 %1 13379} 13380 13381define i64 @atomicrmw_sub_i64_seq_cst(i64* %a, i64 %b) nounwind { 13382; RV32I-LABEL: atomicrmw_sub_i64_seq_cst: 13383; RV32I: # %bb.0: 13384; RV32I-NEXT: addi sp, sp, -16 13385; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13386; RV32I-NEXT: li a3, 5 13387; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13388; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13389; RV32I-NEXT: addi sp, sp, 16 13390; RV32I-NEXT: ret 13391; 13392; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst: 13393; RV32IA: # %bb.0: 13394; RV32IA-NEXT: addi sp, sp, -16 13395; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13396; RV32IA-NEXT: li a3, 5 13397; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13398; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13399; RV32IA-NEXT: addi sp, sp, 16 13400; RV32IA-NEXT: ret 13401; 13402; RV64I-LABEL: atomicrmw_sub_i64_seq_cst: 13403; RV64I: # %bb.0: 13404; RV64I-NEXT: addi sp, sp, -16 13405; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13406; RV64I-NEXT: li a2, 5 13407; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13408; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13409; RV64I-NEXT: addi sp, sp, 16 13410; RV64I-NEXT: ret 13411; 13412; RV64IA-LABEL: atomicrmw_sub_i64_seq_cst: 13413; RV64IA: # %bb.0: 13414; RV64IA-NEXT: neg a1, a1 13415; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13416; RV64IA-NEXT: ret 13417 %1 = atomicrmw sub i64* %a, i64 %b seq_cst 13418 ret i64 %1 13419} 13420 13421define i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind { 13422; RV32I-LABEL: atomicrmw_and_i64_monotonic: 13423; RV32I: # %bb.0: 13424; RV32I-NEXT: addi sp, sp, -16 13425; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13426; RV32I-NEXT: li a3, 0 13427; RV32I-NEXT: call __atomic_fetch_and_8@plt 13428; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13429; RV32I-NEXT: addi sp, sp, 16 13430; RV32I-NEXT: ret 13431; 13432; RV32IA-LABEL: atomicrmw_and_i64_monotonic: 13433; RV32IA: # %bb.0: 13434; RV32IA-NEXT: addi sp, sp, -16 13435; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13436; RV32IA-NEXT: li a3, 0 13437; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13438; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13439; RV32IA-NEXT: addi sp, sp, 16 13440; RV32IA-NEXT: ret 13441; 13442; RV64I-LABEL: atomicrmw_and_i64_monotonic: 13443; RV64I: # %bb.0: 13444; RV64I-NEXT: addi sp, sp, -16 13445; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13446; RV64I-NEXT: li a2, 0 13447; RV64I-NEXT: call __atomic_fetch_and_8@plt 13448; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13449; RV64I-NEXT: addi sp, sp, 16 13450; RV64I-NEXT: ret 13451; 13452; RV64IA-LABEL: atomicrmw_and_i64_monotonic: 13453; RV64IA: # %bb.0: 13454; RV64IA-NEXT: amoand.d a0, a1, (a0) 13455; RV64IA-NEXT: ret 13456 %1 = atomicrmw and i64* %a, i64 %b monotonic 13457 ret i64 %1 13458} 13459 13460define i64 @atomicrmw_and_i64_acquire(i64 *%a, i64 %b) nounwind { 13461; RV32I-LABEL: atomicrmw_and_i64_acquire: 13462; RV32I: # %bb.0: 13463; RV32I-NEXT: addi sp, sp, -16 13464; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13465; RV32I-NEXT: li a3, 2 13466; RV32I-NEXT: call __atomic_fetch_and_8@plt 13467; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13468; RV32I-NEXT: addi sp, sp, 16 13469; RV32I-NEXT: ret 13470; 13471; RV32IA-LABEL: atomicrmw_and_i64_acquire: 13472; RV32IA: # %bb.0: 13473; RV32IA-NEXT: addi sp, sp, -16 13474; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13475; RV32IA-NEXT: li a3, 2 13476; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13477; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13478; RV32IA-NEXT: addi sp, sp, 16 13479; RV32IA-NEXT: ret 13480; 13481; RV64I-LABEL: atomicrmw_and_i64_acquire: 13482; RV64I: # %bb.0: 13483; RV64I-NEXT: addi sp, sp, -16 13484; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13485; RV64I-NEXT: li a2, 2 13486; RV64I-NEXT: call __atomic_fetch_and_8@plt 13487; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13488; RV64I-NEXT: addi sp, sp, 16 13489; RV64I-NEXT: ret 13490; 13491; RV64IA-LABEL: atomicrmw_and_i64_acquire: 13492; RV64IA: # %bb.0: 13493; RV64IA-NEXT: amoand.d.aq a0, a1, (a0) 13494; RV64IA-NEXT: ret 13495 %1 = atomicrmw and i64* %a, i64 %b acquire 13496 ret i64 %1 13497} 13498 13499define i64 @atomicrmw_and_i64_release(i64 *%a, i64 %b) nounwind { 13500; RV32I-LABEL: atomicrmw_and_i64_release: 13501; RV32I: # %bb.0: 13502; RV32I-NEXT: addi sp, sp, -16 13503; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13504; RV32I-NEXT: li a3, 3 13505; RV32I-NEXT: call __atomic_fetch_and_8@plt 13506; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13507; RV32I-NEXT: addi sp, sp, 16 13508; RV32I-NEXT: ret 13509; 13510; RV32IA-LABEL: atomicrmw_and_i64_release: 13511; RV32IA: # %bb.0: 13512; RV32IA-NEXT: addi sp, sp, -16 13513; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13514; RV32IA-NEXT: li a3, 3 13515; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13516; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13517; RV32IA-NEXT: addi sp, sp, 16 13518; RV32IA-NEXT: ret 13519; 13520; RV64I-LABEL: atomicrmw_and_i64_release: 13521; RV64I: # %bb.0: 13522; RV64I-NEXT: addi sp, sp, -16 13523; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13524; RV64I-NEXT: li a2, 3 13525; RV64I-NEXT: call __atomic_fetch_and_8@plt 13526; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13527; RV64I-NEXT: addi sp, sp, 16 13528; RV64I-NEXT: ret 13529; 13530; RV64IA-LABEL: atomicrmw_and_i64_release: 13531; RV64IA: # %bb.0: 13532; RV64IA-NEXT: amoand.d.rl a0, a1, (a0) 13533; RV64IA-NEXT: ret 13534 %1 = atomicrmw and i64* %a, i64 %b release 13535 ret i64 %1 13536} 13537 13538define i64 @atomicrmw_and_i64_acq_rel(i64 *%a, i64 %b) nounwind { 13539; RV32I-LABEL: atomicrmw_and_i64_acq_rel: 13540; RV32I: # %bb.0: 13541; RV32I-NEXT: addi sp, sp, -16 13542; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13543; RV32I-NEXT: li a3, 4 13544; RV32I-NEXT: call __atomic_fetch_and_8@plt 13545; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13546; RV32I-NEXT: addi sp, sp, 16 13547; RV32I-NEXT: ret 13548; 13549; RV32IA-LABEL: atomicrmw_and_i64_acq_rel: 13550; RV32IA: # %bb.0: 13551; RV32IA-NEXT: addi sp, sp, -16 13552; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13553; RV32IA-NEXT: li a3, 4 13554; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13555; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13556; RV32IA-NEXT: addi sp, sp, 16 13557; RV32IA-NEXT: ret 13558; 13559; RV64I-LABEL: atomicrmw_and_i64_acq_rel: 13560; RV64I: # %bb.0: 13561; RV64I-NEXT: addi sp, sp, -16 13562; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13563; RV64I-NEXT: li a2, 4 13564; RV64I-NEXT: call __atomic_fetch_and_8@plt 13565; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13566; RV64I-NEXT: addi sp, sp, 16 13567; RV64I-NEXT: ret 13568; 13569; RV64IA-LABEL: atomicrmw_and_i64_acq_rel: 13570; RV64IA: # %bb.0: 13571; RV64IA-NEXT: amoand.d.aqrl a0, a1, (a0) 13572; RV64IA-NEXT: ret 13573 %1 = atomicrmw and i64* %a, i64 %b acq_rel 13574 ret i64 %1 13575} 13576 13577define i64 @atomicrmw_and_i64_seq_cst(i64 *%a, i64 %b) nounwind { 13578; RV32I-LABEL: atomicrmw_and_i64_seq_cst: 13579; RV32I: # %bb.0: 13580; RV32I-NEXT: addi sp, sp, -16 13581; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13582; RV32I-NEXT: li a3, 5 13583; RV32I-NEXT: call __atomic_fetch_and_8@plt 13584; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13585; RV32I-NEXT: addi sp, sp, 16 13586; RV32I-NEXT: ret 13587; 13588; RV32IA-LABEL: atomicrmw_and_i64_seq_cst: 13589; RV32IA: # %bb.0: 13590; RV32IA-NEXT: addi sp, sp, -16 13591; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13592; RV32IA-NEXT: li a3, 5 13593; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13594; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13595; RV32IA-NEXT: addi sp, sp, 16 13596; RV32IA-NEXT: ret 13597; 13598; RV64I-LABEL: atomicrmw_and_i64_seq_cst: 13599; RV64I: # %bb.0: 13600; RV64I-NEXT: addi sp, sp, -16 13601; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13602; RV64I-NEXT: li a2, 5 13603; RV64I-NEXT: call __atomic_fetch_and_8@plt 13604; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13605; RV64I-NEXT: addi sp, sp, 16 13606; RV64I-NEXT: ret 13607; 13608; RV64IA-LABEL: atomicrmw_and_i64_seq_cst: 13609; RV64IA: # %bb.0: 13610; RV64IA-NEXT: amoand.d.aqrl a0, a1, (a0) 13611; RV64IA-NEXT: ret 13612 %1 = atomicrmw and i64* %a, i64 %b seq_cst 13613 ret i64 %1 13614} 13615 13616define i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind { 13617; RV32I-LABEL: atomicrmw_nand_i64_monotonic: 13618; RV32I: # %bb.0: 13619; RV32I-NEXT: addi sp, sp, -16 13620; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13621; RV32I-NEXT: li a3, 0 13622; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13623; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13624; RV32I-NEXT: addi sp, sp, 16 13625; RV32I-NEXT: ret 13626; 13627; RV32IA-LABEL: atomicrmw_nand_i64_monotonic: 13628; RV32IA: # %bb.0: 13629; RV32IA-NEXT: addi sp, sp, -16 13630; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13631; RV32IA-NEXT: li a3, 0 13632; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13633; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13634; RV32IA-NEXT: addi sp, sp, 16 13635; RV32IA-NEXT: ret 13636; 13637; RV64I-LABEL: atomicrmw_nand_i64_monotonic: 13638; RV64I: # %bb.0: 13639; RV64I-NEXT: addi sp, sp, -16 13640; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13641; RV64I-NEXT: li a2, 0 13642; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13643; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13644; RV64I-NEXT: addi sp, sp, 16 13645; RV64I-NEXT: ret 13646; 13647; RV64IA-LABEL: atomicrmw_nand_i64_monotonic: 13648; RV64IA: # %bb.0: 13649; RV64IA-NEXT: .LBB185_1: # =>This Inner Loop Header: Depth=1 13650; RV64IA-NEXT: lr.d a2, (a0) 13651; RV64IA-NEXT: and a3, a2, a1 13652; RV64IA-NEXT: not a3, a3 13653; RV64IA-NEXT: sc.d a3, a3, (a0) 13654; RV64IA-NEXT: bnez a3, .LBB185_1 13655; RV64IA-NEXT: # %bb.2: 13656; RV64IA-NEXT: mv a0, a2 13657; RV64IA-NEXT: ret 13658 %1 = atomicrmw nand i64* %a, i64 %b monotonic 13659 ret i64 %1 13660} 13661 13662define i64 @atomicrmw_nand_i64_acquire(i64* %a, i64 %b) nounwind { 13663; RV32I-LABEL: atomicrmw_nand_i64_acquire: 13664; RV32I: # %bb.0: 13665; RV32I-NEXT: addi sp, sp, -16 13666; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13667; RV32I-NEXT: li a3, 2 13668; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13669; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13670; RV32I-NEXT: addi sp, sp, 16 13671; RV32I-NEXT: ret 13672; 13673; RV32IA-LABEL: atomicrmw_nand_i64_acquire: 13674; RV32IA: # %bb.0: 13675; RV32IA-NEXT: addi sp, sp, -16 13676; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13677; RV32IA-NEXT: li a3, 2 13678; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13679; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13680; RV32IA-NEXT: addi sp, sp, 16 13681; RV32IA-NEXT: ret 13682; 13683; RV64I-LABEL: atomicrmw_nand_i64_acquire: 13684; RV64I: # %bb.0: 13685; RV64I-NEXT: addi sp, sp, -16 13686; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13687; RV64I-NEXT: li a2, 2 13688; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13689; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13690; RV64I-NEXT: addi sp, sp, 16 13691; RV64I-NEXT: ret 13692; 13693; RV64IA-LABEL: atomicrmw_nand_i64_acquire: 13694; RV64IA: # %bb.0: 13695; RV64IA-NEXT: .LBB186_1: # =>This Inner Loop Header: Depth=1 13696; RV64IA-NEXT: lr.d.aq a2, (a0) 13697; RV64IA-NEXT: and a3, a2, a1 13698; RV64IA-NEXT: not a3, a3 13699; RV64IA-NEXT: sc.d a3, a3, (a0) 13700; RV64IA-NEXT: bnez a3, .LBB186_1 13701; RV64IA-NEXT: # %bb.2: 13702; RV64IA-NEXT: mv a0, a2 13703; RV64IA-NEXT: ret 13704 %1 = atomicrmw nand i64* %a, i64 %b acquire 13705 ret i64 %1 13706} 13707 13708define i64 @atomicrmw_nand_i64_release(i64* %a, i64 %b) nounwind { 13709; RV32I-LABEL: atomicrmw_nand_i64_release: 13710; RV32I: # %bb.0: 13711; RV32I-NEXT: addi sp, sp, -16 13712; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13713; RV32I-NEXT: li a3, 3 13714; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13715; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13716; RV32I-NEXT: addi sp, sp, 16 13717; RV32I-NEXT: ret 13718; 13719; RV32IA-LABEL: atomicrmw_nand_i64_release: 13720; RV32IA: # %bb.0: 13721; RV32IA-NEXT: addi sp, sp, -16 13722; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13723; RV32IA-NEXT: li a3, 3 13724; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13725; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13726; RV32IA-NEXT: addi sp, sp, 16 13727; RV32IA-NEXT: ret 13728; 13729; RV64I-LABEL: atomicrmw_nand_i64_release: 13730; RV64I: # %bb.0: 13731; RV64I-NEXT: addi sp, sp, -16 13732; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13733; RV64I-NEXT: li a2, 3 13734; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13735; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13736; RV64I-NEXT: addi sp, sp, 16 13737; RV64I-NEXT: ret 13738; 13739; RV64IA-LABEL: atomicrmw_nand_i64_release: 13740; RV64IA: # %bb.0: 13741; RV64IA-NEXT: .LBB187_1: # =>This Inner Loop Header: Depth=1 13742; RV64IA-NEXT: lr.d a2, (a0) 13743; RV64IA-NEXT: and a3, a2, a1 13744; RV64IA-NEXT: not a3, a3 13745; RV64IA-NEXT: sc.d.rl a3, a3, (a0) 13746; RV64IA-NEXT: bnez a3, .LBB187_1 13747; RV64IA-NEXT: # %bb.2: 13748; RV64IA-NEXT: mv a0, a2 13749; RV64IA-NEXT: ret 13750 %1 = atomicrmw nand i64* %a, i64 %b release 13751 ret i64 %1 13752} 13753 13754define i64 @atomicrmw_nand_i64_acq_rel(i64* %a, i64 %b) nounwind { 13755; RV32I-LABEL: atomicrmw_nand_i64_acq_rel: 13756; RV32I: # %bb.0: 13757; RV32I-NEXT: addi sp, sp, -16 13758; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13759; RV32I-NEXT: li a3, 4 13760; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13761; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13762; RV32I-NEXT: addi sp, sp, 16 13763; RV32I-NEXT: ret 13764; 13765; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel: 13766; RV32IA: # %bb.0: 13767; RV32IA-NEXT: addi sp, sp, -16 13768; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13769; RV32IA-NEXT: li a3, 4 13770; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13771; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13772; RV32IA-NEXT: addi sp, sp, 16 13773; RV32IA-NEXT: ret 13774; 13775; RV64I-LABEL: atomicrmw_nand_i64_acq_rel: 13776; RV64I: # %bb.0: 13777; RV64I-NEXT: addi sp, sp, -16 13778; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13779; RV64I-NEXT: li a2, 4 13780; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13781; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13782; RV64I-NEXT: addi sp, sp, 16 13783; RV64I-NEXT: ret 13784; 13785; RV64IA-LABEL: atomicrmw_nand_i64_acq_rel: 13786; RV64IA: # %bb.0: 13787; RV64IA-NEXT: .LBB188_1: # =>This Inner Loop Header: Depth=1 13788; RV64IA-NEXT: lr.d.aq a2, (a0) 13789; RV64IA-NEXT: and a3, a2, a1 13790; RV64IA-NEXT: not a3, a3 13791; RV64IA-NEXT: sc.d.rl a3, a3, (a0) 13792; RV64IA-NEXT: bnez a3, .LBB188_1 13793; RV64IA-NEXT: # %bb.2: 13794; RV64IA-NEXT: mv a0, a2 13795; RV64IA-NEXT: ret 13796 %1 = atomicrmw nand i64* %a, i64 %b acq_rel 13797 ret i64 %1 13798} 13799 13800define i64 @atomicrmw_nand_i64_seq_cst(i64* %a, i64 %b) nounwind { 13801; RV32I-LABEL: atomicrmw_nand_i64_seq_cst: 13802; RV32I: # %bb.0: 13803; RV32I-NEXT: addi sp, sp, -16 13804; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13805; RV32I-NEXT: li a3, 5 13806; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13807; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13808; RV32I-NEXT: addi sp, sp, 16 13809; RV32I-NEXT: ret 13810; 13811; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst: 13812; RV32IA: # %bb.0: 13813; RV32IA-NEXT: addi sp, sp, -16 13814; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13815; RV32IA-NEXT: li a3, 5 13816; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13817; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13818; RV32IA-NEXT: addi sp, sp, 16 13819; RV32IA-NEXT: ret 13820; 13821; RV64I-LABEL: atomicrmw_nand_i64_seq_cst: 13822; RV64I: # %bb.0: 13823; RV64I-NEXT: addi sp, sp, -16 13824; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13825; RV64I-NEXT: li a2, 5 13826; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13827; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13828; RV64I-NEXT: addi sp, sp, 16 13829; RV64I-NEXT: ret 13830; 13831; RV64IA-LABEL: atomicrmw_nand_i64_seq_cst: 13832; RV64IA: # %bb.0: 13833; RV64IA-NEXT: .LBB189_1: # =>This Inner Loop Header: Depth=1 13834; RV64IA-NEXT: lr.d.aqrl a2, (a0) 13835; RV64IA-NEXT: and a3, a2, a1 13836; RV64IA-NEXT: not a3, a3 13837; RV64IA-NEXT: sc.d.aqrl a3, a3, (a0) 13838; RV64IA-NEXT: bnez a3, .LBB189_1 13839; RV64IA-NEXT: # %bb.2: 13840; RV64IA-NEXT: mv a0, a2 13841; RV64IA-NEXT: ret 13842 %1 = atomicrmw nand i64* %a, i64 %b seq_cst 13843 ret i64 %1 13844} 13845 13846define i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind { 13847; RV32I-LABEL: atomicrmw_or_i64_monotonic: 13848; RV32I: # %bb.0: 13849; RV32I-NEXT: addi sp, sp, -16 13850; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13851; RV32I-NEXT: li a3, 0 13852; RV32I-NEXT: call __atomic_fetch_or_8@plt 13853; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13854; RV32I-NEXT: addi sp, sp, 16 13855; RV32I-NEXT: ret 13856; 13857; RV32IA-LABEL: atomicrmw_or_i64_monotonic: 13858; RV32IA: # %bb.0: 13859; RV32IA-NEXT: addi sp, sp, -16 13860; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13861; RV32IA-NEXT: li a3, 0 13862; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13863; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13864; RV32IA-NEXT: addi sp, sp, 16 13865; RV32IA-NEXT: ret 13866; 13867; RV64I-LABEL: atomicrmw_or_i64_monotonic: 13868; RV64I: # %bb.0: 13869; RV64I-NEXT: addi sp, sp, -16 13870; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13871; RV64I-NEXT: li a2, 0 13872; RV64I-NEXT: call __atomic_fetch_or_8@plt 13873; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13874; RV64I-NEXT: addi sp, sp, 16 13875; RV64I-NEXT: ret 13876; 13877; RV64IA-LABEL: atomicrmw_or_i64_monotonic: 13878; RV64IA: # %bb.0: 13879; RV64IA-NEXT: amoor.d a0, a1, (a0) 13880; RV64IA-NEXT: ret 13881 %1 = atomicrmw or i64* %a, i64 %b monotonic 13882 ret i64 %1 13883} 13884 13885define i64 @atomicrmw_or_i64_acquire(i64 *%a, i64 %b) nounwind { 13886; RV32I-LABEL: atomicrmw_or_i64_acquire: 13887; RV32I: # %bb.0: 13888; RV32I-NEXT: addi sp, sp, -16 13889; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13890; RV32I-NEXT: li a3, 2 13891; RV32I-NEXT: call __atomic_fetch_or_8@plt 13892; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13893; RV32I-NEXT: addi sp, sp, 16 13894; RV32I-NEXT: ret 13895; 13896; RV32IA-LABEL: atomicrmw_or_i64_acquire: 13897; RV32IA: # %bb.0: 13898; RV32IA-NEXT: addi sp, sp, -16 13899; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13900; RV32IA-NEXT: li a3, 2 13901; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13902; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13903; RV32IA-NEXT: addi sp, sp, 16 13904; RV32IA-NEXT: ret 13905; 13906; RV64I-LABEL: atomicrmw_or_i64_acquire: 13907; RV64I: # %bb.0: 13908; RV64I-NEXT: addi sp, sp, -16 13909; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13910; RV64I-NEXT: li a2, 2 13911; RV64I-NEXT: call __atomic_fetch_or_8@plt 13912; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13913; RV64I-NEXT: addi sp, sp, 16 13914; RV64I-NEXT: ret 13915; 13916; RV64IA-LABEL: atomicrmw_or_i64_acquire: 13917; RV64IA: # %bb.0: 13918; RV64IA-NEXT: amoor.d.aq a0, a1, (a0) 13919; RV64IA-NEXT: ret 13920 %1 = atomicrmw or i64* %a, i64 %b acquire 13921 ret i64 %1 13922} 13923 13924define i64 @atomicrmw_or_i64_release(i64 *%a, i64 %b) nounwind { 13925; RV32I-LABEL: atomicrmw_or_i64_release: 13926; RV32I: # %bb.0: 13927; RV32I-NEXT: addi sp, sp, -16 13928; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13929; RV32I-NEXT: li a3, 3 13930; RV32I-NEXT: call __atomic_fetch_or_8@plt 13931; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13932; RV32I-NEXT: addi sp, sp, 16 13933; RV32I-NEXT: ret 13934; 13935; RV32IA-LABEL: atomicrmw_or_i64_release: 13936; RV32IA: # %bb.0: 13937; RV32IA-NEXT: addi sp, sp, -16 13938; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13939; RV32IA-NEXT: li a3, 3 13940; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13941; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13942; RV32IA-NEXT: addi sp, sp, 16 13943; RV32IA-NEXT: ret 13944; 13945; RV64I-LABEL: atomicrmw_or_i64_release: 13946; RV64I: # %bb.0: 13947; RV64I-NEXT: addi sp, sp, -16 13948; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13949; RV64I-NEXT: li a2, 3 13950; RV64I-NEXT: call __atomic_fetch_or_8@plt 13951; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13952; RV64I-NEXT: addi sp, sp, 16 13953; RV64I-NEXT: ret 13954; 13955; RV64IA-LABEL: atomicrmw_or_i64_release: 13956; RV64IA: # %bb.0: 13957; RV64IA-NEXT: amoor.d.rl a0, a1, (a0) 13958; RV64IA-NEXT: ret 13959 %1 = atomicrmw or i64* %a, i64 %b release 13960 ret i64 %1 13961} 13962 13963define i64 @atomicrmw_or_i64_acq_rel(i64 *%a, i64 %b) nounwind { 13964; RV32I-LABEL: atomicrmw_or_i64_acq_rel: 13965; RV32I: # %bb.0: 13966; RV32I-NEXT: addi sp, sp, -16 13967; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13968; RV32I-NEXT: li a3, 4 13969; RV32I-NEXT: call __atomic_fetch_or_8@plt 13970; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13971; RV32I-NEXT: addi sp, sp, 16 13972; RV32I-NEXT: ret 13973; 13974; RV32IA-LABEL: atomicrmw_or_i64_acq_rel: 13975; RV32IA: # %bb.0: 13976; RV32IA-NEXT: addi sp, sp, -16 13977; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13978; RV32IA-NEXT: li a3, 4 13979; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13980; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13981; RV32IA-NEXT: addi sp, sp, 16 13982; RV32IA-NEXT: ret 13983; 13984; RV64I-LABEL: atomicrmw_or_i64_acq_rel: 13985; RV64I: # %bb.0: 13986; RV64I-NEXT: addi sp, sp, -16 13987; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13988; RV64I-NEXT: li a2, 4 13989; RV64I-NEXT: call __atomic_fetch_or_8@plt 13990; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13991; RV64I-NEXT: addi sp, sp, 16 13992; RV64I-NEXT: ret 13993; 13994; RV64IA-LABEL: atomicrmw_or_i64_acq_rel: 13995; RV64IA: # %bb.0: 13996; RV64IA-NEXT: amoor.d.aqrl a0, a1, (a0) 13997; RV64IA-NEXT: ret 13998 %1 = atomicrmw or i64* %a, i64 %b acq_rel 13999 ret i64 %1 14000} 14001 14002define i64 @atomicrmw_or_i64_seq_cst(i64 *%a, i64 %b) nounwind { 14003; RV32I-LABEL: atomicrmw_or_i64_seq_cst: 14004; RV32I: # %bb.0: 14005; RV32I-NEXT: addi sp, sp, -16 14006; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14007; RV32I-NEXT: li a3, 5 14008; RV32I-NEXT: call __atomic_fetch_or_8@plt 14009; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14010; RV32I-NEXT: addi sp, sp, 16 14011; RV32I-NEXT: ret 14012; 14013; RV32IA-LABEL: atomicrmw_or_i64_seq_cst: 14014; RV32IA: # %bb.0: 14015; RV32IA-NEXT: addi sp, sp, -16 14016; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14017; RV32IA-NEXT: li a3, 5 14018; RV32IA-NEXT: call __atomic_fetch_or_8@plt 14019; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14020; RV32IA-NEXT: addi sp, sp, 16 14021; RV32IA-NEXT: ret 14022; 14023; RV64I-LABEL: atomicrmw_or_i64_seq_cst: 14024; RV64I: # %bb.0: 14025; RV64I-NEXT: addi sp, sp, -16 14026; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14027; RV64I-NEXT: li a2, 5 14028; RV64I-NEXT: call __atomic_fetch_or_8@plt 14029; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14030; RV64I-NEXT: addi sp, sp, 16 14031; RV64I-NEXT: ret 14032; 14033; RV64IA-LABEL: atomicrmw_or_i64_seq_cst: 14034; RV64IA: # %bb.0: 14035; RV64IA-NEXT: amoor.d.aqrl a0, a1, (a0) 14036; RV64IA-NEXT: ret 14037 %1 = atomicrmw or i64* %a, i64 %b seq_cst 14038 ret i64 %1 14039} 14040 14041define i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind { 14042; RV32I-LABEL: atomicrmw_xor_i64_monotonic: 14043; RV32I: # %bb.0: 14044; RV32I-NEXT: addi sp, sp, -16 14045; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14046; RV32I-NEXT: li a3, 0 14047; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14048; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14049; RV32I-NEXT: addi sp, sp, 16 14050; RV32I-NEXT: ret 14051; 14052; RV32IA-LABEL: atomicrmw_xor_i64_monotonic: 14053; RV32IA: # %bb.0: 14054; RV32IA-NEXT: addi sp, sp, -16 14055; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14056; RV32IA-NEXT: li a3, 0 14057; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14058; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14059; RV32IA-NEXT: addi sp, sp, 16 14060; RV32IA-NEXT: ret 14061; 14062; RV64I-LABEL: atomicrmw_xor_i64_monotonic: 14063; RV64I: # %bb.0: 14064; RV64I-NEXT: addi sp, sp, -16 14065; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14066; RV64I-NEXT: li a2, 0 14067; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14068; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14069; RV64I-NEXT: addi sp, sp, 16 14070; RV64I-NEXT: ret 14071; 14072; RV64IA-LABEL: atomicrmw_xor_i64_monotonic: 14073; RV64IA: # %bb.0: 14074; RV64IA-NEXT: amoxor.d a0, a1, (a0) 14075; RV64IA-NEXT: ret 14076 %1 = atomicrmw xor i64* %a, i64 %b monotonic 14077 ret i64 %1 14078} 14079 14080define i64 @atomicrmw_xor_i64_acquire(i64 *%a, i64 %b) nounwind { 14081; RV32I-LABEL: atomicrmw_xor_i64_acquire: 14082; RV32I: # %bb.0: 14083; RV32I-NEXT: addi sp, sp, -16 14084; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14085; RV32I-NEXT: li a3, 2 14086; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14087; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14088; RV32I-NEXT: addi sp, sp, 16 14089; RV32I-NEXT: ret 14090; 14091; RV32IA-LABEL: atomicrmw_xor_i64_acquire: 14092; RV32IA: # %bb.0: 14093; RV32IA-NEXT: addi sp, sp, -16 14094; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14095; RV32IA-NEXT: li a3, 2 14096; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14097; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14098; RV32IA-NEXT: addi sp, sp, 16 14099; RV32IA-NEXT: ret 14100; 14101; RV64I-LABEL: atomicrmw_xor_i64_acquire: 14102; RV64I: # %bb.0: 14103; RV64I-NEXT: addi sp, sp, -16 14104; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14105; RV64I-NEXT: li a2, 2 14106; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14107; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14108; RV64I-NEXT: addi sp, sp, 16 14109; RV64I-NEXT: ret 14110; 14111; RV64IA-LABEL: atomicrmw_xor_i64_acquire: 14112; RV64IA: # %bb.0: 14113; RV64IA-NEXT: amoxor.d.aq a0, a1, (a0) 14114; RV64IA-NEXT: ret 14115 %1 = atomicrmw xor i64* %a, i64 %b acquire 14116 ret i64 %1 14117} 14118 14119define i64 @atomicrmw_xor_i64_release(i64 *%a, i64 %b) nounwind { 14120; RV32I-LABEL: atomicrmw_xor_i64_release: 14121; RV32I: # %bb.0: 14122; RV32I-NEXT: addi sp, sp, -16 14123; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14124; RV32I-NEXT: li a3, 3 14125; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14126; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14127; RV32I-NEXT: addi sp, sp, 16 14128; RV32I-NEXT: ret 14129; 14130; RV32IA-LABEL: atomicrmw_xor_i64_release: 14131; RV32IA: # %bb.0: 14132; RV32IA-NEXT: addi sp, sp, -16 14133; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14134; RV32IA-NEXT: li a3, 3 14135; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14136; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14137; RV32IA-NEXT: addi sp, sp, 16 14138; RV32IA-NEXT: ret 14139; 14140; RV64I-LABEL: atomicrmw_xor_i64_release: 14141; RV64I: # %bb.0: 14142; RV64I-NEXT: addi sp, sp, -16 14143; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14144; RV64I-NEXT: li a2, 3 14145; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14146; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14147; RV64I-NEXT: addi sp, sp, 16 14148; RV64I-NEXT: ret 14149; 14150; RV64IA-LABEL: atomicrmw_xor_i64_release: 14151; RV64IA: # %bb.0: 14152; RV64IA-NEXT: amoxor.d.rl a0, a1, (a0) 14153; RV64IA-NEXT: ret 14154 %1 = atomicrmw xor i64* %a, i64 %b release 14155 ret i64 %1 14156} 14157 14158define i64 @atomicrmw_xor_i64_acq_rel(i64 *%a, i64 %b) nounwind { 14159; RV32I-LABEL: atomicrmw_xor_i64_acq_rel: 14160; RV32I: # %bb.0: 14161; RV32I-NEXT: addi sp, sp, -16 14162; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14163; RV32I-NEXT: li a3, 4 14164; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14165; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14166; RV32I-NEXT: addi sp, sp, 16 14167; RV32I-NEXT: ret 14168; 14169; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel: 14170; RV32IA: # %bb.0: 14171; RV32IA-NEXT: addi sp, sp, -16 14172; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14173; RV32IA-NEXT: li a3, 4 14174; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14175; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14176; RV32IA-NEXT: addi sp, sp, 16 14177; RV32IA-NEXT: ret 14178; 14179; RV64I-LABEL: atomicrmw_xor_i64_acq_rel: 14180; RV64I: # %bb.0: 14181; RV64I-NEXT: addi sp, sp, -16 14182; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14183; RV64I-NEXT: li a2, 4 14184; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14185; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14186; RV64I-NEXT: addi sp, sp, 16 14187; RV64I-NEXT: ret 14188; 14189; RV64IA-LABEL: atomicrmw_xor_i64_acq_rel: 14190; RV64IA: # %bb.0: 14191; RV64IA-NEXT: amoxor.d.aqrl a0, a1, (a0) 14192; RV64IA-NEXT: ret 14193 %1 = atomicrmw xor i64* %a, i64 %b acq_rel 14194 ret i64 %1 14195} 14196 14197define i64 @atomicrmw_xor_i64_seq_cst(i64 *%a, i64 %b) nounwind { 14198; RV32I-LABEL: atomicrmw_xor_i64_seq_cst: 14199; RV32I: # %bb.0: 14200; RV32I-NEXT: addi sp, sp, -16 14201; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14202; RV32I-NEXT: li a3, 5 14203; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14204; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14205; RV32I-NEXT: addi sp, sp, 16 14206; RV32I-NEXT: ret 14207; 14208; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst: 14209; RV32IA: # %bb.0: 14210; RV32IA-NEXT: addi sp, sp, -16 14211; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14212; RV32IA-NEXT: li a3, 5 14213; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14214; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14215; RV32IA-NEXT: addi sp, sp, 16 14216; RV32IA-NEXT: ret 14217; 14218; RV64I-LABEL: atomicrmw_xor_i64_seq_cst: 14219; RV64I: # %bb.0: 14220; RV64I-NEXT: addi sp, sp, -16 14221; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14222; RV64I-NEXT: li a2, 5 14223; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14224; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14225; RV64I-NEXT: addi sp, sp, 16 14226; RV64I-NEXT: ret 14227; 14228; RV64IA-LABEL: atomicrmw_xor_i64_seq_cst: 14229; RV64IA: # %bb.0: 14230; RV64IA-NEXT: amoxor.d.aqrl a0, a1, (a0) 14231; RV64IA-NEXT: ret 14232 %1 = atomicrmw xor i64* %a, i64 %b seq_cst 14233 ret i64 %1 14234} 14235 14236define i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind { 14237; RV32I-LABEL: atomicrmw_max_i64_monotonic: 14238; RV32I: # %bb.0: 14239; RV32I-NEXT: addi sp, sp, -32 14240; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14241; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14242; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14243; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14244; RV32I-NEXT: mv s0, a0 14245; RV32I-NEXT: lw a5, 4(a0) 14246; RV32I-NEXT: lw a4, 0(a0) 14247; RV32I-NEXT: mv s1, a2 14248; RV32I-NEXT: mv s2, a1 14249; RV32I-NEXT: j .LBB200_2 14250; RV32I-NEXT: .LBB200_1: # %atomicrmw.start 14251; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14252; RV32I-NEXT: sw a4, 8(sp) 14253; RV32I-NEXT: sw a5, 12(sp) 14254; RV32I-NEXT: addi a1, sp, 8 14255; RV32I-NEXT: mv a0, s0 14256; RV32I-NEXT: li a4, 0 14257; RV32I-NEXT: li a5, 0 14258; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14259; RV32I-NEXT: lw a5, 12(sp) 14260; RV32I-NEXT: lw a4, 8(sp) 14261; RV32I-NEXT: bnez a0, .LBB200_7 14262; RV32I-NEXT: .LBB200_2: # %atomicrmw.start 14263; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14264; RV32I-NEXT: beq a5, s1, .LBB200_4 14265; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14266; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14267; RV32I-NEXT: slt a0, s1, a5 14268; RV32I-NEXT: j .LBB200_5 14269; RV32I-NEXT: .LBB200_4: # in Loop: Header=BB200_2 Depth=1 14270; RV32I-NEXT: sltu a0, s2, a4 14271; RV32I-NEXT: .LBB200_5: # %atomicrmw.start 14272; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14273; RV32I-NEXT: mv a2, a4 14274; RV32I-NEXT: mv a3, a5 14275; RV32I-NEXT: bnez a0, .LBB200_1 14276; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14277; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14278; RV32I-NEXT: mv a2, s2 14279; RV32I-NEXT: mv a3, s1 14280; RV32I-NEXT: j .LBB200_1 14281; RV32I-NEXT: .LBB200_7: # %atomicrmw.end 14282; RV32I-NEXT: mv a0, a4 14283; RV32I-NEXT: mv a1, a5 14284; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14285; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14286; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14287; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14288; RV32I-NEXT: addi sp, sp, 32 14289; RV32I-NEXT: ret 14290; 14291; RV32IA-LABEL: atomicrmw_max_i64_monotonic: 14292; RV32IA: # %bb.0: 14293; RV32IA-NEXT: addi sp, sp, -32 14294; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14295; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14296; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14297; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14298; RV32IA-NEXT: mv s0, a0 14299; RV32IA-NEXT: lw a5, 4(a0) 14300; RV32IA-NEXT: lw a4, 0(a0) 14301; RV32IA-NEXT: mv s1, a2 14302; RV32IA-NEXT: mv s2, a1 14303; RV32IA-NEXT: j .LBB200_2 14304; RV32IA-NEXT: .LBB200_1: # %atomicrmw.start 14305; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14306; RV32IA-NEXT: sw a4, 8(sp) 14307; RV32IA-NEXT: sw a5, 12(sp) 14308; RV32IA-NEXT: addi a1, sp, 8 14309; RV32IA-NEXT: mv a0, s0 14310; RV32IA-NEXT: li a4, 0 14311; RV32IA-NEXT: li a5, 0 14312; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14313; RV32IA-NEXT: lw a5, 12(sp) 14314; RV32IA-NEXT: lw a4, 8(sp) 14315; RV32IA-NEXT: bnez a0, .LBB200_7 14316; RV32IA-NEXT: .LBB200_2: # %atomicrmw.start 14317; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14318; RV32IA-NEXT: beq a5, s1, .LBB200_4 14319; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14320; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14321; RV32IA-NEXT: slt a0, s1, a5 14322; RV32IA-NEXT: j .LBB200_5 14323; RV32IA-NEXT: .LBB200_4: # in Loop: Header=BB200_2 Depth=1 14324; RV32IA-NEXT: sltu a0, s2, a4 14325; RV32IA-NEXT: .LBB200_5: # %atomicrmw.start 14326; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14327; RV32IA-NEXT: mv a2, a4 14328; RV32IA-NEXT: mv a3, a5 14329; RV32IA-NEXT: bnez a0, .LBB200_1 14330; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14331; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14332; RV32IA-NEXT: mv a2, s2 14333; RV32IA-NEXT: mv a3, s1 14334; RV32IA-NEXT: j .LBB200_1 14335; RV32IA-NEXT: .LBB200_7: # %atomicrmw.end 14336; RV32IA-NEXT: mv a0, a4 14337; RV32IA-NEXT: mv a1, a5 14338; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14339; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14340; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14341; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14342; RV32IA-NEXT: addi sp, sp, 32 14343; RV32IA-NEXT: ret 14344; 14345; RV64I-LABEL: atomicrmw_max_i64_monotonic: 14346; RV64I: # %bb.0: 14347; RV64I-NEXT: addi sp, sp, -32 14348; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14349; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14350; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14351; RV64I-NEXT: mv s0, a0 14352; RV64I-NEXT: ld a3, 0(a0) 14353; RV64I-NEXT: mv s1, a1 14354; RV64I-NEXT: j .LBB200_2 14355; RV64I-NEXT: .LBB200_1: # %atomicrmw.start 14356; RV64I-NEXT: # in Loop: Header=BB200_2 Depth=1 14357; RV64I-NEXT: sd a3, 0(sp) 14358; RV64I-NEXT: mv a1, sp 14359; RV64I-NEXT: mv a0, s0 14360; RV64I-NEXT: li a3, 0 14361; RV64I-NEXT: li a4, 0 14362; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14363; RV64I-NEXT: ld a3, 0(sp) 14364; RV64I-NEXT: bnez a0, .LBB200_4 14365; RV64I-NEXT: .LBB200_2: # %atomicrmw.start 14366; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14367; RV64I-NEXT: mv a2, a3 14368; RV64I-NEXT: blt s1, a3, .LBB200_1 14369; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14370; RV64I-NEXT: # in Loop: Header=BB200_2 Depth=1 14371; RV64I-NEXT: mv a2, s1 14372; RV64I-NEXT: j .LBB200_1 14373; RV64I-NEXT: .LBB200_4: # %atomicrmw.end 14374; RV64I-NEXT: mv a0, a3 14375; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14376; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14377; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14378; RV64I-NEXT: addi sp, sp, 32 14379; RV64I-NEXT: ret 14380; 14381; RV64IA-LABEL: atomicrmw_max_i64_monotonic: 14382; RV64IA: # %bb.0: 14383; RV64IA-NEXT: amomax.d a0, a1, (a0) 14384; RV64IA-NEXT: ret 14385 %1 = atomicrmw max i64* %a, i64 %b monotonic 14386 ret i64 %1 14387} 14388 14389define i64 @atomicrmw_max_i64_acquire(i64 *%a, i64 %b) nounwind { 14390; RV32I-LABEL: atomicrmw_max_i64_acquire: 14391; RV32I: # %bb.0: 14392; RV32I-NEXT: addi sp, sp, -32 14393; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14394; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14395; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14396; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14397; RV32I-NEXT: mv s0, a0 14398; RV32I-NEXT: lw a5, 4(a0) 14399; RV32I-NEXT: lw a4, 0(a0) 14400; RV32I-NEXT: mv s1, a2 14401; RV32I-NEXT: mv s2, a1 14402; RV32I-NEXT: j .LBB201_2 14403; RV32I-NEXT: .LBB201_1: # %atomicrmw.start 14404; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14405; RV32I-NEXT: sw a4, 8(sp) 14406; RV32I-NEXT: sw a5, 12(sp) 14407; RV32I-NEXT: addi a1, sp, 8 14408; RV32I-NEXT: li a4, 2 14409; RV32I-NEXT: li a5, 2 14410; RV32I-NEXT: mv a0, s0 14411; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14412; RV32I-NEXT: lw a5, 12(sp) 14413; RV32I-NEXT: lw a4, 8(sp) 14414; RV32I-NEXT: bnez a0, .LBB201_7 14415; RV32I-NEXT: .LBB201_2: # %atomicrmw.start 14416; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14417; RV32I-NEXT: beq a5, s1, .LBB201_4 14418; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14419; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14420; RV32I-NEXT: slt a0, s1, a5 14421; RV32I-NEXT: j .LBB201_5 14422; RV32I-NEXT: .LBB201_4: # in Loop: Header=BB201_2 Depth=1 14423; RV32I-NEXT: sltu a0, s2, a4 14424; RV32I-NEXT: .LBB201_5: # %atomicrmw.start 14425; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14426; RV32I-NEXT: mv a2, a4 14427; RV32I-NEXT: mv a3, a5 14428; RV32I-NEXT: bnez a0, .LBB201_1 14429; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14430; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14431; RV32I-NEXT: mv a2, s2 14432; RV32I-NEXT: mv a3, s1 14433; RV32I-NEXT: j .LBB201_1 14434; RV32I-NEXT: .LBB201_7: # %atomicrmw.end 14435; RV32I-NEXT: mv a0, a4 14436; RV32I-NEXT: mv a1, a5 14437; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14438; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14439; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14440; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14441; RV32I-NEXT: addi sp, sp, 32 14442; RV32I-NEXT: ret 14443; 14444; RV32IA-LABEL: atomicrmw_max_i64_acquire: 14445; RV32IA: # %bb.0: 14446; RV32IA-NEXT: addi sp, sp, -32 14447; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14448; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14449; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14450; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14451; RV32IA-NEXT: mv s0, a0 14452; RV32IA-NEXT: lw a5, 4(a0) 14453; RV32IA-NEXT: lw a4, 0(a0) 14454; RV32IA-NEXT: mv s1, a2 14455; RV32IA-NEXT: mv s2, a1 14456; RV32IA-NEXT: j .LBB201_2 14457; RV32IA-NEXT: .LBB201_1: # %atomicrmw.start 14458; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14459; RV32IA-NEXT: sw a4, 8(sp) 14460; RV32IA-NEXT: sw a5, 12(sp) 14461; RV32IA-NEXT: addi a1, sp, 8 14462; RV32IA-NEXT: li a4, 2 14463; RV32IA-NEXT: li a5, 2 14464; RV32IA-NEXT: mv a0, s0 14465; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14466; RV32IA-NEXT: lw a5, 12(sp) 14467; RV32IA-NEXT: lw a4, 8(sp) 14468; RV32IA-NEXT: bnez a0, .LBB201_7 14469; RV32IA-NEXT: .LBB201_2: # %atomicrmw.start 14470; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14471; RV32IA-NEXT: beq a5, s1, .LBB201_4 14472; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14473; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14474; RV32IA-NEXT: slt a0, s1, a5 14475; RV32IA-NEXT: j .LBB201_5 14476; RV32IA-NEXT: .LBB201_4: # in Loop: Header=BB201_2 Depth=1 14477; RV32IA-NEXT: sltu a0, s2, a4 14478; RV32IA-NEXT: .LBB201_5: # %atomicrmw.start 14479; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14480; RV32IA-NEXT: mv a2, a4 14481; RV32IA-NEXT: mv a3, a5 14482; RV32IA-NEXT: bnez a0, .LBB201_1 14483; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14484; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14485; RV32IA-NEXT: mv a2, s2 14486; RV32IA-NEXT: mv a3, s1 14487; RV32IA-NEXT: j .LBB201_1 14488; RV32IA-NEXT: .LBB201_7: # %atomicrmw.end 14489; RV32IA-NEXT: mv a0, a4 14490; RV32IA-NEXT: mv a1, a5 14491; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14492; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14493; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14494; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14495; RV32IA-NEXT: addi sp, sp, 32 14496; RV32IA-NEXT: ret 14497; 14498; RV64I-LABEL: atomicrmw_max_i64_acquire: 14499; RV64I: # %bb.0: 14500; RV64I-NEXT: addi sp, sp, -32 14501; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14502; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14503; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14504; RV64I-NEXT: mv s0, a0 14505; RV64I-NEXT: ld a3, 0(a0) 14506; RV64I-NEXT: mv s1, a1 14507; RV64I-NEXT: j .LBB201_2 14508; RV64I-NEXT: .LBB201_1: # %atomicrmw.start 14509; RV64I-NEXT: # in Loop: Header=BB201_2 Depth=1 14510; RV64I-NEXT: sd a3, 0(sp) 14511; RV64I-NEXT: mv a1, sp 14512; RV64I-NEXT: li a3, 2 14513; RV64I-NEXT: li a4, 2 14514; RV64I-NEXT: mv a0, s0 14515; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14516; RV64I-NEXT: ld a3, 0(sp) 14517; RV64I-NEXT: bnez a0, .LBB201_4 14518; RV64I-NEXT: .LBB201_2: # %atomicrmw.start 14519; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14520; RV64I-NEXT: mv a2, a3 14521; RV64I-NEXT: blt s1, a3, .LBB201_1 14522; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14523; RV64I-NEXT: # in Loop: Header=BB201_2 Depth=1 14524; RV64I-NEXT: mv a2, s1 14525; RV64I-NEXT: j .LBB201_1 14526; RV64I-NEXT: .LBB201_4: # %atomicrmw.end 14527; RV64I-NEXT: mv a0, a3 14528; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14529; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14530; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14531; RV64I-NEXT: addi sp, sp, 32 14532; RV64I-NEXT: ret 14533; 14534; RV64IA-LABEL: atomicrmw_max_i64_acquire: 14535; RV64IA: # %bb.0: 14536; RV64IA-NEXT: amomax.d.aq a0, a1, (a0) 14537; RV64IA-NEXT: ret 14538 %1 = atomicrmw max i64* %a, i64 %b acquire 14539 ret i64 %1 14540} 14541 14542define i64 @atomicrmw_max_i64_release(i64 *%a, i64 %b) nounwind { 14543; RV32I-LABEL: atomicrmw_max_i64_release: 14544; RV32I: # %bb.0: 14545; RV32I-NEXT: addi sp, sp, -32 14546; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14547; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14548; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14549; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14550; RV32I-NEXT: mv s0, a0 14551; RV32I-NEXT: lw a5, 4(a0) 14552; RV32I-NEXT: lw a4, 0(a0) 14553; RV32I-NEXT: mv s1, a2 14554; RV32I-NEXT: mv s2, a1 14555; RV32I-NEXT: j .LBB202_2 14556; RV32I-NEXT: .LBB202_1: # %atomicrmw.start 14557; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14558; RV32I-NEXT: sw a4, 8(sp) 14559; RV32I-NEXT: sw a5, 12(sp) 14560; RV32I-NEXT: addi a1, sp, 8 14561; RV32I-NEXT: li a4, 3 14562; RV32I-NEXT: mv a0, s0 14563; RV32I-NEXT: li a5, 0 14564; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14565; RV32I-NEXT: lw a5, 12(sp) 14566; RV32I-NEXT: lw a4, 8(sp) 14567; RV32I-NEXT: bnez a0, .LBB202_7 14568; RV32I-NEXT: .LBB202_2: # %atomicrmw.start 14569; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14570; RV32I-NEXT: beq a5, s1, .LBB202_4 14571; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14572; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14573; RV32I-NEXT: slt a0, s1, a5 14574; RV32I-NEXT: j .LBB202_5 14575; RV32I-NEXT: .LBB202_4: # in Loop: Header=BB202_2 Depth=1 14576; RV32I-NEXT: sltu a0, s2, a4 14577; RV32I-NEXT: .LBB202_5: # %atomicrmw.start 14578; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14579; RV32I-NEXT: mv a2, a4 14580; RV32I-NEXT: mv a3, a5 14581; RV32I-NEXT: bnez a0, .LBB202_1 14582; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14583; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14584; RV32I-NEXT: mv a2, s2 14585; RV32I-NEXT: mv a3, s1 14586; RV32I-NEXT: j .LBB202_1 14587; RV32I-NEXT: .LBB202_7: # %atomicrmw.end 14588; RV32I-NEXT: mv a0, a4 14589; RV32I-NEXT: mv a1, a5 14590; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14591; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14592; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14593; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14594; RV32I-NEXT: addi sp, sp, 32 14595; RV32I-NEXT: ret 14596; 14597; RV32IA-LABEL: atomicrmw_max_i64_release: 14598; RV32IA: # %bb.0: 14599; RV32IA-NEXT: addi sp, sp, -32 14600; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14601; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14602; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14603; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14604; RV32IA-NEXT: mv s0, a0 14605; RV32IA-NEXT: lw a5, 4(a0) 14606; RV32IA-NEXT: lw a4, 0(a0) 14607; RV32IA-NEXT: mv s1, a2 14608; RV32IA-NEXT: mv s2, a1 14609; RV32IA-NEXT: j .LBB202_2 14610; RV32IA-NEXT: .LBB202_1: # %atomicrmw.start 14611; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14612; RV32IA-NEXT: sw a4, 8(sp) 14613; RV32IA-NEXT: sw a5, 12(sp) 14614; RV32IA-NEXT: addi a1, sp, 8 14615; RV32IA-NEXT: li a4, 3 14616; RV32IA-NEXT: mv a0, s0 14617; RV32IA-NEXT: li a5, 0 14618; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14619; RV32IA-NEXT: lw a5, 12(sp) 14620; RV32IA-NEXT: lw a4, 8(sp) 14621; RV32IA-NEXT: bnez a0, .LBB202_7 14622; RV32IA-NEXT: .LBB202_2: # %atomicrmw.start 14623; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14624; RV32IA-NEXT: beq a5, s1, .LBB202_4 14625; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14626; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14627; RV32IA-NEXT: slt a0, s1, a5 14628; RV32IA-NEXT: j .LBB202_5 14629; RV32IA-NEXT: .LBB202_4: # in Loop: Header=BB202_2 Depth=1 14630; RV32IA-NEXT: sltu a0, s2, a4 14631; RV32IA-NEXT: .LBB202_5: # %atomicrmw.start 14632; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14633; RV32IA-NEXT: mv a2, a4 14634; RV32IA-NEXT: mv a3, a5 14635; RV32IA-NEXT: bnez a0, .LBB202_1 14636; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14637; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14638; RV32IA-NEXT: mv a2, s2 14639; RV32IA-NEXT: mv a3, s1 14640; RV32IA-NEXT: j .LBB202_1 14641; RV32IA-NEXT: .LBB202_7: # %atomicrmw.end 14642; RV32IA-NEXT: mv a0, a4 14643; RV32IA-NEXT: mv a1, a5 14644; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14645; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14646; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14647; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14648; RV32IA-NEXT: addi sp, sp, 32 14649; RV32IA-NEXT: ret 14650; 14651; RV64I-LABEL: atomicrmw_max_i64_release: 14652; RV64I: # %bb.0: 14653; RV64I-NEXT: addi sp, sp, -32 14654; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14655; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14656; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14657; RV64I-NEXT: mv s0, a0 14658; RV64I-NEXT: ld a3, 0(a0) 14659; RV64I-NEXT: mv s1, a1 14660; RV64I-NEXT: j .LBB202_2 14661; RV64I-NEXT: .LBB202_1: # %atomicrmw.start 14662; RV64I-NEXT: # in Loop: Header=BB202_2 Depth=1 14663; RV64I-NEXT: sd a3, 0(sp) 14664; RV64I-NEXT: mv a1, sp 14665; RV64I-NEXT: li a3, 3 14666; RV64I-NEXT: mv a0, s0 14667; RV64I-NEXT: li a4, 0 14668; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14669; RV64I-NEXT: ld a3, 0(sp) 14670; RV64I-NEXT: bnez a0, .LBB202_4 14671; RV64I-NEXT: .LBB202_2: # %atomicrmw.start 14672; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14673; RV64I-NEXT: mv a2, a3 14674; RV64I-NEXT: blt s1, a3, .LBB202_1 14675; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14676; RV64I-NEXT: # in Loop: Header=BB202_2 Depth=1 14677; RV64I-NEXT: mv a2, s1 14678; RV64I-NEXT: j .LBB202_1 14679; RV64I-NEXT: .LBB202_4: # %atomicrmw.end 14680; RV64I-NEXT: mv a0, a3 14681; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14682; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14683; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14684; RV64I-NEXT: addi sp, sp, 32 14685; RV64I-NEXT: ret 14686; 14687; RV64IA-LABEL: atomicrmw_max_i64_release: 14688; RV64IA: # %bb.0: 14689; RV64IA-NEXT: amomax.d.rl a0, a1, (a0) 14690; RV64IA-NEXT: ret 14691 %1 = atomicrmw max i64* %a, i64 %b release 14692 ret i64 %1 14693} 14694 14695define i64 @atomicrmw_max_i64_acq_rel(i64 *%a, i64 %b) nounwind { 14696; RV32I-LABEL: atomicrmw_max_i64_acq_rel: 14697; RV32I: # %bb.0: 14698; RV32I-NEXT: addi sp, sp, -32 14699; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14700; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14701; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14702; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14703; RV32I-NEXT: mv s0, a0 14704; RV32I-NEXT: lw a5, 4(a0) 14705; RV32I-NEXT: lw a4, 0(a0) 14706; RV32I-NEXT: mv s1, a2 14707; RV32I-NEXT: mv s2, a1 14708; RV32I-NEXT: j .LBB203_2 14709; RV32I-NEXT: .LBB203_1: # %atomicrmw.start 14710; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14711; RV32I-NEXT: sw a4, 8(sp) 14712; RV32I-NEXT: sw a5, 12(sp) 14713; RV32I-NEXT: addi a1, sp, 8 14714; RV32I-NEXT: li a4, 4 14715; RV32I-NEXT: li a5, 2 14716; RV32I-NEXT: mv a0, s0 14717; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14718; RV32I-NEXT: lw a5, 12(sp) 14719; RV32I-NEXT: lw a4, 8(sp) 14720; RV32I-NEXT: bnez a0, .LBB203_7 14721; RV32I-NEXT: .LBB203_2: # %atomicrmw.start 14722; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14723; RV32I-NEXT: beq a5, s1, .LBB203_4 14724; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14725; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14726; RV32I-NEXT: slt a0, s1, a5 14727; RV32I-NEXT: j .LBB203_5 14728; RV32I-NEXT: .LBB203_4: # in Loop: Header=BB203_2 Depth=1 14729; RV32I-NEXT: sltu a0, s2, a4 14730; RV32I-NEXT: .LBB203_5: # %atomicrmw.start 14731; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14732; RV32I-NEXT: mv a2, a4 14733; RV32I-NEXT: mv a3, a5 14734; RV32I-NEXT: bnez a0, .LBB203_1 14735; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14736; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14737; RV32I-NEXT: mv a2, s2 14738; RV32I-NEXT: mv a3, s1 14739; RV32I-NEXT: j .LBB203_1 14740; RV32I-NEXT: .LBB203_7: # %atomicrmw.end 14741; RV32I-NEXT: mv a0, a4 14742; RV32I-NEXT: mv a1, a5 14743; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14744; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14745; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14746; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14747; RV32I-NEXT: addi sp, sp, 32 14748; RV32I-NEXT: ret 14749; 14750; RV32IA-LABEL: atomicrmw_max_i64_acq_rel: 14751; RV32IA: # %bb.0: 14752; RV32IA-NEXT: addi sp, sp, -32 14753; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14754; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14755; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14756; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14757; RV32IA-NEXT: mv s0, a0 14758; RV32IA-NEXT: lw a5, 4(a0) 14759; RV32IA-NEXT: lw a4, 0(a0) 14760; RV32IA-NEXT: mv s1, a2 14761; RV32IA-NEXT: mv s2, a1 14762; RV32IA-NEXT: j .LBB203_2 14763; RV32IA-NEXT: .LBB203_1: # %atomicrmw.start 14764; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14765; RV32IA-NEXT: sw a4, 8(sp) 14766; RV32IA-NEXT: sw a5, 12(sp) 14767; RV32IA-NEXT: addi a1, sp, 8 14768; RV32IA-NEXT: li a4, 4 14769; RV32IA-NEXT: li a5, 2 14770; RV32IA-NEXT: mv a0, s0 14771; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14772; RV32IA-NEXT: lw a5, 12(sp) 14773; RV32IA-NEXT: lw a4, 8(sp) 14774; RV32IA-NEXT: bnez a0, .LBB203_7 14775; RV32IA-NEXT: .LBB203_2: # %atomicrmw.start 14776; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14777; RV32IA-NEXT: beq a5, s1, .LBB203_4 14778; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14779; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14780; RV32IA-NEXT: slt a0, s1, a5 14781; RV32IA-NEXT: j .LBB203_5 14782; RV32IA-NEXT: .LBB203_4: # in Loop: Header=BB203_2 Depth=1 14783; RV32IA-NEXT: sltu a0, s2, a4 14784; RV32IA-NEXT: .LBB203_5: # %atomicrmw.start 14785; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14786; RV32IA-NEXT: mv a2, a4 14787; RV32IA-NEXT: mv a3, a5 14788; RV32IA-NEXT: bnez a0, .LBB203_1 14789; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14790; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14791; RV32IA-NEXT: mv a2, s2 14792; RV32IA-NEXT: mv a3, s1 14793; RV32IA-NEXT: j .LBB203_1 14794; RV32IA-NEXT: .LBB203_7: # %atomicrmw.end 14795; RV32IA-NEXT: mv a0, a4 14796; RV32IA-NEXT: mv a1, a5 14797; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14798; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14799; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14800; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14801; RV32IA-NEXT: addi sp, sp, 32 14802; RV32IA-NEXT: ret 14803; 14804; RV64I-LABEL: atomicrmw_max_i64_acq_rel: 14805; RV64I: # %bb.0: 14806; RV64I-NEXT: addi sp, sp, -32 14807; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14808; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14809; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14810; RV64I-NEXT: mv s0, a0 14811; RV64I-NEXT: ld a3, 0(a0) 14812; RV64I-NEXT: mv s1, a1 14813; RV64I-NEXT: j .LBB203_2 14814; RV64I-NEXT: .LBB203_1: # %atomicrmw.start 14815; RV64I-NEXT: # in Loop: Header=BB203_2 Depth=1 14816; RV64I-NEXT: sd a3, 0(sp) 14817; RV64I-NEXT: mv a1, sp 14818; RV64I-NEXT: li a3, 4 14819; RV64I-NEXT: li a4, 2 14820; RV64I-NEXT: mv a0, s0 14821; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14822; RV64I-NEXT: ld a3, 0(sp) 14823; RV64I-NEXT: bnez a0, .LBB203_4 14824; RV64I-NEXT: .LBB203_2: # %atomicrmw.start 14825; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14826; RV64I-NEXT: mv a2, a3 14827; RV64I-NEXT: blt s1, a3, .LBB203_1 14828; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14829; RV64I-NEXT: # in Loop: Header=BB203_2 Depth=1 14830; RV64I-NEXT: mv a2, s1 14831; RV64I-NEXT: j .LBB203_1 14832; RV64I-NEXT: .LBB203_4: # %atomicrmw.end 14833; RV64I-NEXT: mv a0, a3 14834; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14835; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14836; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14837; RV64I-NEXT: addi sp, sp, 32 14838; RV64I-NEXT: ret 14839; 14840; RV64IA-LABEL: atomicrmw_max_i64_acq_rel: 14841; RV64IA: # %bb.0: 14842; RV64IA-NEXT: amomax.d.aqrl a0, a1, (a0) 14843; RV64IA-NEXT: ret 14844 %1 = atomicrmw max i64* %a, i64 %b acq_rel 14845 ret i64 %1 14846} 14847 14848define i64 @atomicrmw_max_i64_seq_cst(i64 *%a, i64 %b) nounwind { 14849; RV32I-LABEL: atomicrmw_max_i64_seq_cst: 14850; RV32I: # %bb.0: 14851; RV32I-NEXT: addi sp, sp, -32 14852; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14853; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14854; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14855; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14856; RV32I-NEXT: mv s0, a0 14857; RV32I-NEXT: lw a5, 4(a0) 14858; RV32I-NEXT: lw a4, 0(a0) 14859; RV32I-NEXT: mv s1, a2 14860; RV32I-NEXT: mv s2, a1 14861; RV32I-NEXT: j .LBB204_2 14862; RV32I-NEXT: .LBB204_1: # %atomicrmw.start 14863; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14864; RV32I-NEXT: sw a4, 8(sp) 14865; RV32I-NEXT: sw a5, 12(sp) 14866; RV32I-NEXT: addi a1, sp, 8 14867; RV32I-NEXT: li a4, 5 14868; RV32I-NEXT: li a5, 5 14869; RV32I-NEXT: mv a0, s0 14870; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14871; RV32I-NEXT: lw a5, 12(sp) 14872; RV32I-NEXT: lw a4, 8(sp) 14873; RV32I-NEXT: bnez a0, .LBB204_7 14874; RV32I-NEXT: .LBB204_2: # %atomicrmw.start 14875; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14876; RV32I-NEXT: beq a5, s1, .LBB204_4 14877; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14878; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14879; RV32I-NEXT: slt a0, s1, a5 14880; RV32I-NEXT: j .LBB204_5 14881; RV32I-NEXT: .LBB204_4: # in Loop: Header=BB204_2 Depth=1 14882; RV32I-NEXT: sltu a0, s2, a4 14883; RV32I-NEXT: .LBB204_5: # %atomicrmw.start 14884; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14885; RV32I-NEXT: mv a2, a4 14886; RV32I-NEXT: mv a3, a5 14887; RV32I-NEXT: bnez a0, .LBB204_1 14888; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14889; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14890; RV32I-NEXT: mv a2, s2 14891; RV32I-NEXT: mv a3, s1 14892; RV32I-NEXT: j .LBB204_1 14893; RV32I-NEXT: .LBB204_7: # %atomicrmw.end 14894; RV32I-NEXT: mv a0, a4 14895; RV32I-NEXT: mv a1, a5 14896; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14897; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14898; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14899; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14900; RV32I-NEXT: addi sp, sp, 32 14901; RV32I-NEXT: ret 14902; 14903; RV32IA-LABEL: atomicrmw_max_i64_seq_cst: 14904; RV32IA: # %bb.0: 14905; RV32IA-NEXT: addi sp, sp, -32 14906; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14907; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14908; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14909; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14910; RV32IA-NEXT: mv s0, a0 14911; RV32IA-NEXT: lw a5, 4(a0) 14912; RV32IA-NEXT: lw a4, 0(a0) 14913; RV32IA-NEXT: mv s1, a2 14914; RV32IA-NEXT: mv s2, a1 14915; RV32IA-NEXT: j .LBB204_2 14916; RV32IA-NEXT: .LBB204_1: # %atomicrmw.start 14917; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14918; RV32IA-NEXT: sw a4, 8(sp) 14919; RV32IA-NEXT: sw a5, 12(sp) 14920; RV32IA-NEXT: addi a1, sp, 8 14921; RV32IA-NEXT: li a4, 5 14922; RV32IA-NEXT: li a5, 5 14923; RV32IA-NEXT: mv a0, s0 14924; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14925; RV32IA-NEXT: lw a5, 12(sp) 14926; RV32IA-NEXT: lw a4, 8(sp) 14927; RV32IA-NEXT: bnez a0, .LBB204_7 14928; RV32IA-NEXT: .LBB204_2: # %atomicrmw.start 14929; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14930; RV32IA-NEXT: beq a5, s1, .LBB204_4 14931; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14932; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14933; RV32IA-NEXT: slt a0, s1, a5 14934; RV32IA-NEXT: j .LBB204_5 14935; RV32IA-NEXT: .LBB204_4: # in Loop: Header=BB204_2 Depth=1 14936; RV32IA-NEXT: sltu a0, s2, a4 14937; RV32IA-NEXT: .LBB204_5: # %atomicrmw.start 14938; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14939; RV32IA-NEXT: mv a2, a4 14940; RV32IA-NEXT: mv a3, a5 14941; RV32IA-NEXT: bnez a0, .LBB204_1 14942; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14943; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14944; RV32IA-NEXT: mv a2, s2 14945; RV32IA-NEXT: mv a3, s1 14946; RV32IA-NEXT: j .LBB204_1 14947; RV32IA-NEXT: .LBB204_7: # %atomicrmw.end 14948; RV32IA-NEXT: mv a0, a4 14949; RV32IA-NEXT: mv a1, a5 14950; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14951; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14952; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14953; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14954; RV32IA-NEXT: addi sp, sp, 32 14955; RV32IA-NEXT: ret 14956; 14957; RV64I-LABEL: atomicrmw_max_i64_seq_cst: 14958; RV64I: # %bb.0: 14959; RV64I-NEXT: addi sp, sp, -32 14960; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14961; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14962; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14963; RV64I-NEXT: mv s0, a0 14964; RV64I-NEXT: ld a3, 0(a0) 14965; RV64I-NEXT: mv s1, a1 14966; RV64I-NEXT: j .LBB204_2 14967; RV64I-NEXT: .LBB204_1: # %atomicrmw.start 14968; RV64I-NEXT: # in Loop: Header=BB204_2 Depth=1 14969; RV64I-NEXT: sd a3, 0(sp) 14970; RV64I-NEXT: mv a1, sp 14971; RV64I-NEXT: li a3, 5 14972; RV64I-NEXT: li a4, 5 14973; RV64I-NEXT: mv a0, s0 14974; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14975; RV64I-NEXT: ld a3, 0(sp) 14976; RV64I-NEXT: bnez a0, .LBB204_4 14977; RV64I-NEXT: .LBB204_2: # %atomicrmw.start 14978; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14979; RV64I-NEXT: mv a2, a3 14980; RV64I-NEXT: blt s1, a3, .LBB204_1 14981; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14982; RV64I-NEXT: # in Loop: Header=BB204_2 Depth=1 14983; RV64I-NEXT: mv a2, s1 14984; RV64I-NEXT: j .LBB204_1 14985; RV64I-NEXT: .LBB204_4: # %atomicrmw.end 14986; RV64I-NEXT: mv a0, a3 14987; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14988; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14989; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14990; RV64I-NEXT: addi sp, sp, 32 14991; RV64I-NEXT: ret 14992; 14993; RV64IA-LABEL: atomicrmw_max_i64_seq_cst: 14994; RV64IA: # %bb.0: 14995; RV64IA-NEXT: amomax.d.aqrl a0, a1, (a0) 14996; RV64IA-NEXT: ret 14997 %1 = atomicrmw max i64* %a, i64 %b seq_cst 14998 ret i64 %1 14999} 15000 15001define i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind { 15002; RV32I-LABEL: atomicrmw_min_i64_monotonic: 15003; RV32I: # %bb.0: 15004; RV32I-NEXT: addi sp, sp, -32 15005; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15006; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15007; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15008; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15009; RV32I-NEXT: mv s0, a0 15010; RV32I-NEXT: lw a5, 4(a0) 15011; RV32I-NEXT: lw a4, 0(a0) 15012; RV32I-NEXT: mv s1, a2 15013; RV32I-NEXT: mv s2, a1 15014; RV32I-NEXT: j .LBB205_2 15015; RV32I-NEXT: .LBB205_1: # %atomicrmw.start 15016; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15017; RV32I-NEXT: sw a4, 8(sp) 15018; RV32I-NEXT: sw a5, 12(sp) 15019; RV32I-NEXT: addi a1, sp, 8 15020; RV32I-NEXT: mv a0, s0 15021; RV32I-NEXT: li a4, 0 15022; RV32I-NEXT: li a5, 0 15023; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15024; RV32I-NEXT: lw a5, 12(sp) 15025; RV32I-NEXT: lw a4, 8(sp) 15026; RV32I-NEXT: bnez a0, .LBB205_7 15027; RV32I-NEXT: .LBB205_2: # %atomicrmw.start 15028; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15029; RV32I-NEXT: beq a5, s1, .LBB205_4 15030; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15031; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15032; RV32I-NEXT: slt a0, s1, a5 15033; RV32I-NEXT: j .LBB205_5 15034; RV32I-NEXT: .LBB205_4: # in Loop: Header=BB205_2 Depth=1 15035; RV32I-NEXT: sltu a0, s2, a4 15036; RV32I-NEXT: .LBB205_5: # %atomicrmw.start 15037; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15038; RV32I-NEXT: xori a0, a0, 1 15039; RV32I-NEXT: mv a2, a4 15040; RV32I-NEXT: mv a3, a5 15041; RV32I-NEXT: bnez a0, .LBB205_1 15042; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15043; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15044; RV32I-NEXT: mv a2, s2 15045; RV32I-NEXT: mv a3, s1 15046; RV32I-NEXT: j .LBB205_1 15047; RV32I-NEXT: .LBB205_7: # %atomicrmw.end 15048; RV32I-NEXT: mv a0, a4 15049; RV32I-NEXT: mv a1, a5 15050; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15051; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15052; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15053; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15054; RV32I-NEXT: addi sp, sp, 32 15055; RV32I-NEXT: ret 15056; 15057; RV32IA-LABEL: atomicrmw_min_i64_monotonic: 15058; RV32IA: # %bb.0: 15059; RV32IA-NEXT: addi sp, sp, -32 15060; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15061; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15062; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15063; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15064; RV32IA-NEXT: mv s0, a0 15065; RV32IA-NEXT: lw a5, 4(a0) 15066; RV32IA-NEXT: lw a4, 0(a0) 15067; RV32IA-NEXT: mv s1, a2 15068; RV32IA-NEXT: mv s2, a1 15069; RV32IA-NEXT: j .LBB205_2 15070; RV32IA-NEXT: .LBB205_1: # %atomicrmw.start 15071; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15072; RV32IA-NEXT: sw a4, 8(sp) 15073; RV32IA-NEXT: sw a5, 12(sp) 15074; RV32IA-NEXT: addi a1, sp, 8 15075; RV32IA-NEXT: mv a0, s0 15076; RV32IA-NEXT: li a4, 0 15077; RV32IA-NEXT: li a5, 0 15078; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15079; RV32IA-NEXT: lw a5, 12(sp) 15080; RV32IA-NEXT: lw a4, 8(sp) 15081; RV32IA-NEXT: bnez a0, .LBB205_7 15082; RV32IA-NEXT: .LBB205_2: # %atomicrmw.start 15083; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15084; RV32IA-NEXT: beq a5, s1, .LBB205_4 15085; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15086; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15087; RV32IA-NEXT: slt a0, s1, a5 15088; RV32IA-NEXT: j .LBB205_5 15089; RV32IA-NEXT: .LBB205_4: # in Loop: Header=BB205_2 Depth=1 15090; RV32IA-NEXT: sltu a0, s2, a4 15091; RV32IA-NEXT: .LBB205_5: # %atomicrmw.start 15092; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15093; RV32IA-NEXT: xori a0, a0, 1 15094; RV32IA-NEXT: mv a2, a4 15095; RV32IA-NEXT: mv a3, a5 15096; RV32IA-NEXT: bnez a0, .LBB205_1 15097; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15098; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15099; RV32IA-NEXT: mv a2, s2 15100; RV32IA-NEXT: mv a3, s1 15101; RV32IA-NEXT: j .LBB205_1 15102; RV32IA-NEXT: .LBB205_7: # %atomicrmw.end 15103; RV32IA-NEXT: mv a0, a4 15104; RV32IA-NEXT: mv a1, a5 15105; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15106; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15107; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15108; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15109; RV32IA-NEXT: addi sp, sp, 32 15110; RV32IA-NEXT: ret 15111; 15112; RV64I-LABEL: atomicrmw_min_i64_monotonic: 15113; RV64I: # %bb.0: 15114; RV64I-NEXT: addi sp, sp, -32 15115; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15116; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15117; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15118; RV64I-NEXT: mv s0, a0 15119; RV64I-NEXT: ld a3, 0(a0) 15120; RV64I-NEXT: mv s1, a1 15121; RV64I-NEXT: j .LBB205_2 15122; RV64I-NEXT: .LBB205_1: # %atomicrmw.start 15123; RV64I-NEXT: # in Loop: Header=BB205_2 Depth=1 15124; RV64I-NEXT: sd a3, 0(sp) 15125; RV64I-NEXT: mv a1, sp 15126; RV64I-NEXT: mv a0, s0 15127; RV64I-NEXT: li a3, 0 15128; RV64I-NEXT: li a4, 0 15129; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15130; RV64I-NEXT: ld a3, 0(sp) 15131; RV64I-NEXT: bnez a0, .LBB205_4 15132; RV64I-NEXT: .LBB205_2: # %atomicrmw.start 15133; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15134; RV64I-NEXT: mv a2, a3 15135; RV64I-NEXT: bge s1, a3, .LBB205_1 15136; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15137; RV64I-NEXT: # in Loop: Header=BB205_2 Depth=1 15138; RV64I-NEXT: mv a2, s1 15139; RV64I-NEXT: j .LBB205_1 15140; RV64I-NEXT: .LBB205_4: # %atomicrmw.end 15141; RV64I-NEXT: mv a0, a3 15142; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15143; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15144; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15145; RV64I-NEXT: addi sp, sp, 32 15146; RV64I-NEXT: ret 15147; 15148; RV64IA-LABEL: atomicrmw_min_i64_monotonic: 15149; RV64IA: # %bb.0: 15150; RV64IA-NEXT: amomin.d a0, a1, (a0) 15151; RV64IA-NEXT: ret 15152 %1 = atomicrmw min i64* %a, i64 %b monotonic 15153 ret i64 %1 15154} 15155 15156define i64 @atomicrmw_min_i64_acquire(i64 *%a, i64 %b) nounwind { 15157; RV32I-LABEL: atomicrmw_min_i64_acquire: 15158; RV32I: # %bb.0: 15159; RV32I-NEXT: addi sp, sp, -32 15160; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15161; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15162; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15163; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15164; RV32I-NEXT: mv s0, a0 15165; RV32I-NEXT: lw a5, 4(a0) 15166; RV32I-NEXT: lw a4, 0(a0) 15167; RV32I-NEXT: mv s1, a2 15168; RV32I-NEXT: mv s2, a1 15169; RV32I-NEXT: j .LBB206_2 15170; RV32I-NEXT: .LBB206_1: # %atomicrmw.start 15171; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15172; RV32I-NEXT: sw a4, 8(sp) 15173; RV32I-NEXT: sw a5, 12(sp) 15174; RV32I-NEXT: addi a1, sp, 8 15175; RV32I-NEXT: li a4, 2 15176; RV32I-NEXT: li a5, 2 15177; RV32I-NEXT: mv a0, s0 15178; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15179; RV32I-NEXT: lw a5, 12(sp) 15180; RV32I-NEXT: lw a4, 8(sp) 15181; RV32I-NEXT: bnez a0, .LBB206_7 15182; RV32I-NEXT: .LBB206_2: # %atomicrmw.start 15183; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15184; RV32I-NEXT: beq a5, s1, .LBB206_4 15185; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15186; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15187; RV32I-NEXT: slt a0, s1, a5 15188; RV32I-NEXT: j .LBB206_5 15189; RV32I-NEXT: .LBB206_4: # in Loop: Header=BB206_2 Depth=1 15190; RV32I-NEXT: sltu a0, s2, a4 15191; RV32I-NEXT: .LBB206_5: # %atomicrmw.start 15192; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15193; RV32I-NEXT: xori a0, a0, 1 15194; RV32I-NEXT: mv a2, a4 15195; RV32I-NEXT: mv a3, a5 15196; RV32I-NEXT: bnez a0, .LBB206_1 15197; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15198; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15199; RV32I-NEXT: mv a2, s2 15200; RV32I-NEXT: mv a3, s1 15201; RV32I-NEXT: j .LBB206_1 15202; RV32I-NEXT: .LBB206_7: # %atomicrmw.end 15203; RV32I-NEXT: mv a0, a4 15204; RV32I-NEXT: mv a1, a5 15205; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15206; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15207; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15208; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15209; RV32I-NEXT: addi sp, sp, 32 15210; RV32I-NEXT: ret 15211; 15212; RV32IA-LABEL: atomicrmw_min_i64_acquire: 15213; RV32IA: # %bb.0: 15214; RV32IA-NEXT: addi sp, sp, -32 15215; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15216; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15217; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15218; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15219; RV32IA-NEXT: mv s0, a0 15220; RV32IA-NEXT: lw a5, 4(a0) 15221; RV32IA-NEXT: lw a4, 0(a0) 15222; RV32IA-NEXT: mv s1, a2 15223; RV32IA-NEXT: mv s2, a1 15224; RV32IA-NEXT: j .LBB206_2 15225; RV32IA-NEXT: .LBB206_1: # %atomicrmw.start 15226; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15227; RV32IA-NEXT: sw a4, 8(sp) 15228; RV32IA-NEXT: sw a5, 12(sp) 15229; RV32IA-NEXT: addi a1, sp, 8 15230; RV32IA-NEXT: li a4, 2 15231; RV32IA-NEXT: li a5, 2 15232; RV32IA-NEXT: mv a0, s0 15233; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15234; RV32IA-NEXT: lw a5, 12(sp) 15235; RV32IA-NEXT: lw a4, 8(sp) 15236; RV32IA-NEXT: bnez a0, .LBB206_7 15237; RV32IA-NEXT: .LBB206_2: # %atomicrmw.start 15238; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15239; RV32IA-NEXT: beq a5, s1, .LBB206_4 15240; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15241; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15242; RV32IA-NEXT: slt a0, s1, a5 15243; RV32IA-NEXT: j .LBB206_5 15244; RV32IA-NEXT: .LBB206_4: # in Loop: Header=BB206_2 Depth=1 15245; RV32IA-NEXT: sltu a0, s2, a4 15246; RV32IA-NEXT: .LBB206_5: # %atomicrmw.start 15247; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15248; RV32IA-NEXT: xori a0, a0, 1 15249; RV32IA-NEXT: mv a2, a4 15250; RV32IA-NEXT: mv a3, a5 15251; RV32IA-NEXT: bnez a0, .LBB206_1 15252; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15253; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15254; RV32IA-NEXT: mv a2, s2 15255; RV32IA-NEXT: mv a3, s1 15256; RV32IA-NEXT: j .LBB206_1 15257; RV32IA-NEXT: .LBB206_7: # %atomicrmw.end 15258; RV32IA-NEXT: mv a0, a4 15259; RV32IA-NEXT: mv a1, a5 15260; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15261; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15262; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15263; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15264; RV32IA-NEXT: addi sp, sp, 32 15265; RV32IA-NEXT: ret 15266; 15267; RV64I-LABEL: atomicrmw_min_i64_acquire: 15268; RV64I: # %bb.0: 15269; RV64I-NEXT: addi sp, sp, -32 15270; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15271; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15272; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15273; RV64I-NEXT: mv s0, a0 15274; RV64I-NEXT: ld a3, 0(a0) 15275; RV64I-NEXT: mv s1, a1 15276; RV64I-NEXT: j .LBB206_2 15277; RV64I-NEXT: .LBB206_1: # %atomicrmw.start 15278; RV64I-NEXT: # in Loop: Header=BB206_2 Depth=1 15279; RV64I-NEXT: sd a3, 0(sp) 15280; RV64I-NEXT: mv a1, sp 15281; RV64I-NEXT: li a3, 2 15282; RV64I-NEXT: li a4, 2 15283; RV64I-NEXT: mv a0, s0 15284; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15285; RV64I-NEXT: ld a3, 0(sp) 15286; RV64I-NEXT: bnez a0, .LBB206_4 15287; RV64I-NEXT: .LBB206_2: # %atomicrmw.start 15288; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15289; RV64I-NEXT: mv a2, a3 15290; RV64I-NEXT: bge s1, a3, .LBB206_1 15291; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15292; RV64I-NEXT: # in Loop: Header=BB206_2 Depth=1 15293; RV64I-NEXT: mv a2, s1 15294; RV64I-NEXT: j .LBB206_1 15295; RV64I-NEXT: .LBB206_4: # %atomicrmw.end 15296; RV64I-NEXT: mv a0, a3 15297; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15298; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15299; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15300; RV64I-NEXT: addi sp, sp, 32 15301; RV64I-NEXT: ret 15302; 15303; RV64IA-LABEL: atomicrmw_min_i64_acquire: 15304; RV64IA: # %bb.0: 15305; RV64IA-NEXT: amomin.d.aq a0, a1, (a0) 15306; RV64IA-NEXT: ret 15307 %1 = atomicrmw min i64* %a, i64 %b acquire 15308 ret i64 %1 15309} 15310 15311define i64 @atomicrmw_min_i64_release(i64 *%a, i64 %b) nounwind { 15312; RV32I-LABEL: atomicrmw_min_i64_release: 15313; RV32I: # %bb.0: 15314; RV32I-NEXT: addi sp, sp, -32 15315; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15316; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15317; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15318; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15319; RV32I-NEXT: mv s0, a0 15320; RV32I-NEXT: lw a5, 4(a0) 15321; RV32I-NEXT: lw a4, 0(a0) 15322; RV32I-NEXT: mv s1, a2 15323; RV32I-NEXT: mv s2, a1 15324; RV32I-NEXT: j .LBB207_2 15325; RV32I-NEXT: .LBB207_1: # %atomicrmw.start 15326; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15327; RV32I-NEXT: sw a4, 8(sp) 15328; RV32I-NEXT: sw a5, 12(sp) 15329; RV32I-NEXT: addi a1, sp, 8 15330; RV32I-NEXT: li a4, 3 15331; RV32I-NEXT: mv a0, s0 15332; RV32I-NEXT: li a5, 0 15333; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15334; RV32I-NEXT: lw a5, 12(sp) 15335; RV32I-NEXT: lw a4, 8(sp) 15336; RV32I-NEXT: bnez a0, .LBB207_7 15337; RV32I-NEXT: .LBB207_2: # %atomicrmw.start 15338; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15339; RV32I-NEXT: beq a5, s1, .LBB207_4 15340; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15341; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15342; RV32I-NEXT: slt a0, s1, a5 15343; RV32I-NEXT: j .LBB207_5 15344; RV32I-NEXT: .LBB207_4: # in Loop: Header=BB207_2 Depth=1 15345; RV32I-NEXT: sltu a0, s2, a4 15346; RV32I-NEXT: .LBB207_5: # %atomicrmw.start 15347; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15348; RV32I-NEXT: xori a0, a0, 1 15349; RV32I-NEXT: mv a2, a4 15350; RV32I-NEXT: mv a3, a5 15351; RV32I-NEXT: bnez a0, .LBB207_1 15352; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15353; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15354; RV32I-NEXT: mv a2, s2 15355; RV32I-NEXT: mv a3, s1 15356; RV32I-NEXT: j .LBB207_1 15357; RV32I-NEXT: .LBB207_7: # %atomicrmw.end 15358; RV32I-NEXT: mv a0, a4 15359; RV32I-NEXT: mv a1, a5 15360; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15361; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15362; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15363; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15364; RV32I-NEXT: addi sp, sp, 32 15365; RV32I-NEXT: ret 15366; 15367; RV32IA-LABEL: atomicrmw_min_i64_release: 15368; RV32IA: # %bb.0: 15369; RV32IA-NEXT: addi sp, sp, -32 15370; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15371; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15372; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15373; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15374; RV32IA-NEXT: mv s0, a0 15375; RV32IA-NEXT: lw a5, 4(a0) 15376; RV32IA-NEXT: lw a4, 0(a0) 15377; RV32IA-NEXT: mv s1, a2 15378; RV32IA-NEXT: mv s2, a1 15379; RV32IA-NEXT: j .LBB207_2 15380; RV32IA-NEXT: .LBB207_1: # %atomicrmw.start 15381; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15382; RV32IA-NEXT: sw a4, 8(sp) 15383; RV32IA-NEXT: sw a5, 12(sp) 15384; RV32IA-NEXT: addi a1, sp, 8 15385; RV32IA-NEXT: li a4, 3 15386; RV32IA-NEXT: mv a0, s0 15387; RV32IA-NEXT: li a5, 0 15388; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15389; RV32IA-NEXT: lw a5, 12(sp) 15390; RV32IA-NEXT: lw a4, 8(sp) 15391; RV32IA-NEXT: bnez a0, .LBB207_7 15392; RV32IA-NEXT: .LBB207_2: # %atomicrmw.start 15393; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15394; RV32IA-NEXT: beq a5, s1, .LBB207_4 15395; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15396; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15397; RV32IA-NEXT: slt a0, s1, a5 15398; RV32IA-NEXT: j .LBB207_5 15399; RV32IA-NEXT: .LBB207_4: # in Loop: Header=BB207_2 Depth=1 15400; RV32IA-NEXT: sltu a0, s2, a4 15401; RV32IA-NEXT: .LBB207_5: # %atomicrmw.start 15402; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15403; RV32IA-NEXT: xori a0, a0, 1 15404; RV32IA-NEXT: mv a2, a4 15405; RV32IA-NEXT: mv a3, a5 15406; RV32IA-NEXT: bnez a0, .LBB207_1 15407; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15408; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15409; RV32IA-NEXT: mv a2, s2 15410; RV32IA-NEXT: mv a3, s1 15411; RV32IA-NEXT: j .LBB207_1 15412; RV32IA-NEXT: .LBB207_7: # %atomicrmw.end 15413; RV32IA-NEXT: mv a0, a4 15414; RV32IA-NEXT: mv a1, a5 15415; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15416; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15417; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15418; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15419; RV32IA-NEXT: addi sp, sp, 32 15420; RV32IA-NEXT: ret 15421; 15422; RV64I-LABEL: atomicrmw_min_i64_release: 15423; RV64I: # %bb.0: 15424; RV64I-NEXT: addi sp, sp, -32 15425; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15426; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15427; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15428; RV64I-NEXT: mv s0, a0 15429; RV64I-NEXT: ld a3, 0(a0) 15430; RV64I-NEXT: mv s1, a1 15431; RV64I-NEXT: j .LBB207_2 15432; RV64I-NEXT: .LBB207_1: # %atomicrmw.start 15433; RV64I-NEXT: # in Loop: Header=BB207_2 Depth=1 15434; RV64I-NEXT: sd a3, 0(sp) 15435; RV64I-NEXT: mv a1, sp 15436; RV64I-NEXT: li a3, 3 15437; RV64I-NEXT: mv a0, s0 15438; RV64I-NEXT: li a4, 0 15439; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15440; RV64I-NEXT: ld a3, 0(sp) 15441; RV64I-NEXT: bnez a0, .LBB207_4 15442; RV64I-NEXT: .LBB207_2: # %atomicrmw.start 15443; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15444; RV64I-NEXT: mv a2, a3 15445; RV64I-NEXT: bge s1, a3, .LBB207_1 15446; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15447; RV64I-NEXT: # in Loop: Header=BB207_2 Depth=1 15448; RV64I-NEXT: mv a2, s1 15449; RV64I-NEXT: j .LBB207_1 15450; RV64I-NEXT: .LBB207_4: # %atomicrmw.end 15451; RV64I-NEXT: mv a0, a3 15452; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15453; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15454; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15455; RV64I-NEXT: addi sp, sp, 32 15456; RV64I-NEXT: ret 15457; 15458; RV64IA-LABEL: atomicrmw_min_i64_release: 15459; RV64IA: # %bb.0: 15460; RV64IA-NEXT: amomin.d.rl a0, a1, (a0) 15461; RV64IA-NEXT: ret 15462 %1 = atomicrmw min i64* %a, i64 %b release 15463 ret i64 %1 15464} 15465 15466define i64 @atomicrmw_min_i64_acq_rel(i64 *%a, i64 %b) nounwind { 15467; RV32I-LABEL: atomicrmw_min_i64_acq_rel: 15468; RV32I: # %bb.0: 15469; RV32I-NEXT: addi sp, sp, -32 15470; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15471; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15472; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15473; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15474; RV32I-NEXT: mv s0, a0 15475; RV32I-NEXT: lw a5, 4(a0) 15476; RV32I-NEXT: lw a4, 0(a0) 15477; RV32I-NEXT: mv s1, a2 15478; RV32I-NEXT: mv s2, a1 15479; RV32I-NEXT: j .LBB208_2 15480; RV32I-NEXT: .LBB208_1: # %atomicrmw.start 15481; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15482; RV32I-NEXT: sw a4, 8(sp) 15483; RV32I-NEXT: sw a5, 12(sp) 15484; RV32I-NEXT: addi a1, sp, 8 15485; RV32I-NEXT: li a4, 4 15486; RV32I-NEXT: li a5, 2 15487; RV32I-NEXT: mv a0, s0 15488; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15489; RV32I-NEXT: lw a5, 12(sp) 15490; RV32I-NEXT: lw a4, 8(sp) 15491; RV32I-NEXT: bnez a0, .LBB208_7 15492; RV32I-NEXT: .LBB208_2: # %atomicrmw.start 15493; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15494; RV32I-NEXT: beq a5, s1, .LBB208_4 15495; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15496; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15497; RV32I-NEXT: slt a0, s1, a5 15498; RV32I-NEXT: j .LBB208_5 15499; RV32I-NEXT: .LBB208_4: # in Loop: Header=BB208_2 Depth=1 15500; RV32I-NEXT: sltu a0, s2, a4 15501; RV32I-NEXT: .LBB208_5: # %atomicrmw.start 15502; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15503; RV32I-NEXT: xori a0, a0, 1 15504; RV32I-NEXT: mv a2, a4 15505; RV32I-NEXT: mv a3, a5 15506; RV32I-NEXT: bnez a0, .LBB208_1 15507; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15508; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15509; RV32I-NEXT: mv a2, s2 15510; RV32I-NEXT: mv a3, s1 15511; RV32I-NEXT: j .LBB208_1 15512; RV32I-NEXT: .LBB208_7: # %atomicrmw.end 15513; RV32I-NEXT: mv a0, a4 15514; RV32I-NEXT: mv a1, a5 15515; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15516; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15517; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15518; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15519; RV32I-NEXT: addi sp, sp, 32 15520; RV32I-NEXT: ret 15521; 15522; RV32IA-LABEL: atomicrmw_min_i64_acq_rel: 15523; RV32IA: # %bb.0: 15524; RV32IA-NEXT: addi sp, sp, -32 15525; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15526; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15527; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15528; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15529; RV32IA-NEXT: mv s0, a0 15530; RV32IA-NEXT: lw a5, 4(a0) 15531; RV32IA-NEXT: lw a4, 0(a0) 15532; RV32IA-NEXT: mv s1, a2 15533; RV32IA-NEXT: mv s2, a1 15534; RV32IA-NEXT: j .LBB208_2 15535; RV32IA-NEXT: .LBB208_1: # %atomicrmw.start 15536; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15537; RV32IA-NEXT: sw a4, 8(sp) 15538; RV32IA-NEXT: sw a5, 12(sp) 15539; RV32IA-NEXT: addi a1, sp, 8 15540; RV32IA-NEXT: li a4, 4 15541; RV32IA-NEXT: li a5, 2 15542; RV32IA-NEXT: mv a0, s0 15543; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15544; RV32IA-NEXT: lw a5, 12(sp) 15545; RV32IA-NEXT: lw a4, 8(sp) 15546; RV32IA-NEXT: bnez a0, .LBB208_7 15547; RV32IA-NEXT: .LBB208_2: # %atomicrmw.start 15548; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15549; RV32IA-NEXT: beq a5, s1, .LBB208_4 15550; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15551; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15552; RV32IA-NEXT: slt a0, s1, a5 15553; RV32IA-NEXT: j .LBB208_5 15554; RV32IA-NEXT: .LBB208_4: # in Loop: Header=BB208_2 Depth=1 15555; RV32IA-NEXT: sltu a0, s2, a4 15556; RV32IA-NEXT: .LBB208_5: # %atomicrmw.start 15557; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15558; RV32IA-NEXT: xori a0, a0, 1 15559; RV32IA-NEXT: mv a2, a4 15560; RV32IA-NEXT: mv a3, a5 15561; RV32IA-NEXT: bnez a0, .LBB208_1 15562; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15563; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15564; RV32IA-NEXT: mv a2, s2 15565; RV32IA-NEXT: mv a3, s1 15566; RV32IA-NEXT: j .LBB208_1 15567; RV32IA-NEXT: .LBB208_7: # %atomicrmw.end 15568; RV32IA-NEXT: mv a0, a4 15569; RV32IA-NEXT: mv a1, a5 15570; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15571; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15572; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15573; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15574; RV32IA-NEXT: addi sp, sp, 32 15575; RV32IA-NEXT: ret 15576; 15577; RV64I-LABEL: atomicrmw_min_i64_acq_rel: 15578; RV64I: # %bb.0: 15579; RV64I-NEXT: addi sp, sp, -32 15580; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15581; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15582; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15583; RV64I-NEXT: mv s0, a0 15584; RV64I-NEXT: ld a3, 0(a0) 15585; RV64I-NEXT: mv s1, a1 15586; RV64I-NEXT: j .LBB208_2 15587; RV64I-NEXT: .LBB208_1: # %atomicrmw.start 15588; RV64I-NEXT: # in Loop: Header=BB208_2 Depth=1 15589; RV64I-NEXT: sd a3, 0(sp) 15590; RV64I-NEXT: mv a1, sp 15591; RV64I-NEXT: li a3, 4 15592; RV64I-NEXT: li a4, 2 15593; RV64I-NEXT: mv a0, s0 15594; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15595; RV64I-NEXT: ld a3, 0(sp) 15596; RV64I-NEXT: bnez a0, .LBB208_4 15597; RV64I-NEXT: .LBB208_2: # %atomicrmw.start 15598; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15599; RV64I-NEXT: mv a2, a3 15600; RV64I-NEXT: bge s1, a3, .LBB208_1 15601; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15602; RV64I-NEXT: # in Loop: Header=BB208_2 Depth=1 15603; RV64I-NEXT: mv a2, s1 15604; RV64I-NEXT: j .LBB208_1 15605; RV64I-NEXT: .LBB208_4: # %atomicrmw.end 15606; RV64I-NEXT: mv a0, a3 15607; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15608; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15609; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15610; RV64I-NEXT: addi sp, sp, 32 15611; RV64I-NEXT: ret 15612; 15613; RV64IA-LABEL: atomicrmw_min_i64_acq_rel: 15614; RV64IA: # %bb.0: 15615; RV64IA-NEXT: amomin.d.aqrl a0, a1, (a0) 15616; RV64IA-NEXT: ret 15617 %1 = atomicrmw min i64* %a, i64 %b acq_rel 15618 ret i64 %1 15619} 15620 15621define i64 @atomicrmw_min_i64_seq_cst(i64 *%a, i64 %b) nounwind { 15622; RV32I-LABEL: atomicrmw_min_i64_seq_cst: 15623; RV32I: # %bb.0: 15624; RV32I-NEXT: addi sp, sp, -32 15625; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15626; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15627; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15628; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15629; RV32I-NEXT: mv s0, a0 15630; RV32I-NEXT: lw a5, 4(a0) 15631; RV32I-NEXT: lw a4, 0(a0) 15632; RV32I-NEXT: mv s1, a2 15633; RV32I-NEXT: mv s2, a1 15634; RV32I-NEXT: j .LBB209_2 15635; RV32I-NEXT: .LBB209_1: # %atomicrmw.start 15636; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15637; RV32I-NEXT: sw a4, 8(sp) 15638; RV32I-NEXT: sw a5, 12(sp) 15639; RV32I-NEXT: addi a1, sp, 8 15640; RV32I-NEXT: li a4, 5 15641; RV32I-NEXT: li a5, 5 15642; RV32I-NEXT: mv a0, s0 15643; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15644; RV32I-NEXT: lw a5, 12(sp) 15645; RV32I-NEXT: lw a4, 8(sp) 15646; RV32I-NEXT: bnez a0, .LBB209_7 15647; RV32I-NEXT: .LBB209_2: # %atomicrmw.start 15648; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15649; RV32I-NEXT: beq a5, s1, .LBB209_4 15650; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15651; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15652; RV32I-NEXT: slt a0, s1, a5 15653; RV32I-NEXT: j .LBB209_5 15654; RV32I-NEXT: .LBB209_4: # in Loop: Header=BB209_2 Depth=1 15655; RV32I-NEXT: sltu a0, s2, a4 15656; RV32I-NEXT: .LBB209_5: # %atomicrmw.start 15657; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15658; RV32I-NEXT: xori a0, a0, 1 15659; RV32I-NEXT: mv a2, a4 15660; RV32I-NEXT: mv a3, a5 15661; RV32I-NEXT: bnez a0, .LBB209_1 15662; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15663; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15664; RV32I-NEXT: mv a2, s2 15665; RV32I-NEXT: mv a3, s1 15666; RV32I-NEXT: j .LBB209_1 15667; RV32I-NEXT: .LBB209_7: # %atomicrmw.end 15668; RV32I-NEXT: mv a0, a4 15669; RV32I-NEXT: mv a1, a5 15670; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15671; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15672; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15673; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15674; RV32I-NEXT: addi sp, sp, 32 15675; RV32I-NEXT: ret 15676; 15677; RV32IA-LABEL: atomicrmw_min_i64_seq_cst: 15678; RV32IA: # %bb.0: 15679; RV32IA-NEXT: addi sp, sp, -32 15680; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15681; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15682; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15683; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15684; RV32IA-NEXT: mv s0, a0 15685; RV32IA-NEXT: lw a5, 4(a0) 15686; RV32IA-NEXT: lw a4, 0(a0) 15687; RV32IA-NEXT: mv s1, a2 15688; RV32IA-NEXT: mv s2, a1 15689; RV32IA-NEXT: j .LBB209_2 15690; RV32IA-NEXT: .LBB209_1: # %atomicrmw.start 15691; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15692; RV32IA-NEXT: sw a4, 8(sp) 15693; RV32IA-NEXT: sw a5, 12(sp) 15694; RV32IA-NEXT: addi a1, sp, 8 15695; RV32IA-NEXT: li a4, 5 15696; RV32IA-NEXT: li a5, 5 15697; RV32IA-NEXT: mv a0, s0 15698; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15699; RV32IA-NEXT: lw a5, 12(sp) 15700; RV32IA-NEXT: lw a4, 8(sp) 15701; RV32IA-NEXT: bnez a0, .LBB209_7 15702; RV32IA-NEXT: .LBB209_2: # %atomicrmw.start 15703; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15704; RV32IA-NEXT: beq a5, s1, .LBB209_4 15705; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15706; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15707; RV32IA-NEXT: slt a0, s1, a5 15708; RV32IA-NEXT: j .LBB209_5 15709; RV32IA-NEXT: .LBB209_4: # in Loop: Header=BB209_2 Depth=1 15710; RV32IA-NEXT: sltu a0, s2, a4 15711; RV32IA-NEXT: .LBB209_5: # %atomicrmw.start 15712; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15713; RV32IA-NEXT: xori a0, a0, 1 15714; RV32IA-NEXT: mv a2, a4 15715; RV32IA-NEXT: mv a3, a5 15716; RV32IA-NEXT: bnez a0, .LBB209_1 15717; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15718; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15719; RV32IA-NEXT: mv a2, s2 15720; RV32IA-NEXT: mv a3, s1 15721; RV32IA-NEXT: j .LBB209_1 15722; RV32IA-NEXT: .LBB209_7: # %atomicrmw.end 15723; RV32IA-NEXT: mv a0, a4 15724; RV32IA-NEXT: mv a1, a5 15725; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15726; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15727; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15728; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15729; RV32IA-NEXT: addi sp, sp, 32 15730; RV32IA-NEXT: ret 15731; 15732; RV64I-LABEL: atomicrmw_min_i64_seq_cst: 15733; RV64I: # %bb.0: 15734; RV64I-NEXT: addi sp, sp, -32 15735; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15736; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15737; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15738; RV64I-NEXT: mv s0, a0 15739; RV64I-NEXT: ld a3, 0(a0) 15740; RV64I-NEXT: mv s1, a1 15741; RV64I-NEXT: j .LBB209_2 15742; RV64I-NEXT: .LBB209_1: # %atomicrmw.start 15743; RV64I-NEXT: # in Loop: Header=BB209_2 Depth=1 15744; RV64I-NEXT: sd a3, 0(sp) 15745; RV64I-NEXT: mv a1, sp 15746; RV64I-NEXT: li a3, 5 15747; RV64I-NEXT: li a4, 5 15748; RV64I-NEXT: mv a0, s0 15749; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15750; RV64I-NEXT: ld a3, 0(sp) 15751; RV64I-NEXT: bnez a0, .LBB209_4 15752; RV64I-NEXT: .LBB209_2: # %atomicrmw.start 15753; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15754; RV64I-NEXT: mv a2, a3 15755; RV64I-NEXT: bge s1, a3, .LBB209_1 15756; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15757; RV64I-NEXT: # in Loop: Header=BB209_2 Depth=1 15758; RV64I-NEXT: mv a2, s1 15759; RV64I-NEXT: j .LBB209_1 15760; RV64I-NEXT: .LBB209_4: # %atomicrmw.end 15761; RV64I-NEXT: mv a0, a3 15762; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15763; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15764; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15765; RV64I-NEXT: addi sp, sp, 32 15766; RV64I-NEXT: ret 15767; 15768; RV64IA-LABEL: atomicrmw_min_i64_seq_cst: 15769; RV64IA: # %bb.0: 15770; RV64IA-NEXT: amomin.d.aqrl a0, a1, (a0) 15771; RV64IA-NEXT: ret 15772 %1 = atomicrmw min i64* %a, i64 %b seq_cst 15773 ret i64 %1 15774} 15775 15776define i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind { 15777; RV32I-LABEL: atomicrmw_umax_i64_monotonic: 15778; RV32I: # %bb.0: 15779; RV32I-NEXT: addi sp, sp, -32 15780; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15781; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15782; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15783; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15784; RV32I-NEXT: mv s0, a0 15785; RV32I-NEXT: lw a5, 4(a0) 15786; RV32I-NEXT: lw a4, 0(a0) 15787; RV32I-NEXT: mv s1, a2 15788; RV32I-NEXT: mv s2, a1 15789; RV32I-NEXT: j .LBB210_2 15790; RV32I-NEXT: .LBB210_1: # %atomicrmw.start 15791; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15792; RV32I-NEXT: sw a4, 8(sp) 15793; RV32I-NEXT: sw a5, 12(sp) 15794; RV32I-NEXT: addi a1, sp, 8 15795; RV32I-NEXT: mv a0, s0 15796; RV32I-NEXT: li a4, 0 15797; RV32I-NEXT: li a5, 0 15798; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15799; RV32I-NEXT: lw a5, 12(sp) 15800; RV32I-NEXT: lw a4, 8(sp) 15801; RV32I-NEXT: bnez a0, .LBB210_7 15802; RV32I-NEXT: .LBB210_2: # %atomicrmw.start 15803; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15804; RV32I-NEXT: beq a5, s1, .LBB210_4 15805; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15806; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15807; RV32I-NEXT: sltu a0, s1, a5 15808; RV32I-NEXT: j .LBB210_5 15809; RV32I-NEXT: .LBB210_4: # in Loop: Header=BB210_2 Depth=1 15810; RV32I-NEXT: sltu a0, s2, a4 15811; RV32I-NEXT: .LBB210_5: # %atomicrmw.start 15812; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15813; RV32I-NEXT: mv a2, a4 15814; RV32I-NEXT: mv a3, a5 15815; RV32I-NEXT: bnez a0, .LBB210_1 15816; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15817; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15818; RV32I-NEXT: mv a2, s2 15819; RV32I-NEXT: mv a3, s1 15820; RV32I-NEXT: j .LBB210_1 15821; RV32I-NEXT: .LBB210_7: # %atomicrmw.end 15822; RV32I-NEXT: mv a0, a4 15823; RV32I-NEXT: mv a1, a5 15824; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15825; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15826; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15827; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15828; RV32I-NEXT: addi sp, sp, 32 15829; RV32I-NEXT: ret 15830; 15831; RV32IA-LABEL: atomicrmw_umax_i64_monotonic: 15832; RV32IA: # %bb.0: 15833; RV32IA-NEXT: addi sp, sp, -32 15834; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15835; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15836; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15837; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15838; RV32IA-NEXT: mv s0, a0 15839; RV32IA-NEXT: lw a5, 4(a0) 15840; RV32IA-NEXT: lw a4, 0(a0) 15841; RV32IA-NEXT: mv s1, a2 15842; RV32IA-NEXT: mv s2, a1 15843; RV32IA-NEXT: j .LBB210_2 15844; RV32IA-NEXT: .LBB210_1: # %atomicrmw.start 15845; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15846; RV32IA-NEXT: sw a4, 8(sp) 15847; RV32IA-NEXT: sw a5, 12(sp) 15848; RV32IA-NEXT: addi a1, sp, 8 15849; RV32IA-NEXT: mv a0, s0 15850; RV32IA-NEXT: li a4, 0 15851; RV32IA-NEXT: li a5, 0 15852; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15853; RV32IA-NEXT: lw a5, 12(sp) 15854; RV32IA-NEXT: lw a4, 8(sp) 15855; RV32IA-NEXT: bnez a0, .LBB210_7 15856; RV32IA-NEXT: .LBB210_2: # %atomicrmw.start 15857; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15858; RV32IA-NEXT: beq a5, s1, .LBB210_4 15859; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15860; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15861; RV32IA-NEXT: sltu a0, s1, a5 15862; RV32IA-NEXT: j .LBB210_5 15863; RV32IA-NEXT: .LBB210_4: # in Loop: Header=BB210_2 Depth=1 15864; RV32IA-NEXT: sltu a0, s2, a4 15865; RV32IA-NEXT: .LBB210_5: # %atomicrmw.start 15866; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15867; RV32IA-NEXT: mv a2, a4 15868; RV32IA-NEXT: mv a3, a5 15869; RV32IA-NEXT: bnez a0, .LBB210_1 15870; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15871; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15872; RV32IA-NEXT: mv a2, s2 15873; RV32IA-NEXT: mv a3, s1 15874; RV32IA-NEXT: j .LBB210_1 15875; RV32IA-NEXT: .LBB210_7: # %atomicrmw.end 15876; RV32IA-NEXT: mv a0, a4 15877; RV32IA-NEXT: mv a1, a5 15878; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15879; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15880; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15881; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15882; RV32IA-NEXT: addi sp, sp, 32 15883; RV32IA-NEXT: ret 15884; 15885; RV64I-LABEL: atomicrmw_umax_i64_monotonic: 15886; RV64I: # %bb.0: 15887; RV64I-NEXT: addi sp, sp, -32 15888; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15889; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15890; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15891; RV64I-NEXT: mv s0, a0 15892; RV64I-NEXT: ld a3, 0(a0) 15893; RV64I-NEXT: mv s1, a1 15894; RV64I-NEXT: j .LBB210_2 15895; RV64I-NEXT: .LBB210_1: # %atomicrmw.start 15896; RV64I-NEXT: # in Loop: Header=BB210_2 Depth=1 15897; RV64I-NEXT: sd a3, 0(sp) 15898; RV64I-NEXT: mv a1, sp 15899; RV64I-NEXT: mv a0, s0 15900; RV64I-NEXT: li a3, 0 15901; RV64I-NEXT: li a4, 0 15902; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15903; RV64I-NEXT: ld a3, 0(sp) 15904; RV64I-NEXT: bnez a0, .LBB210_4 15905; RV64I-NEXT: .LBB210_2: # %atomicrmw.start 15906; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15907; RV64I-NEXT: mv a2, a3 15908; RV64I-NEXT: bltu s1, a3, .LBB210_1 15909; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15910; RV64I-NEXT: # in Loop: Header=BB210_2 Depth=1 15911; RV64I-NEXT: mv a2, s1 15912; RV64I-NEXT: j .LBB210_1 15913; RV64I-NEXT: .LBB210_4: # %atomicrmw.end 15914; RV64I-NEXT: mv a0, a3 15915; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15916; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15917; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15918; RV64I-NEXT: addi sp, sp, 32 15919; RV64I-NEXT: ret 15920; 15921; RV64IA-LABEL: atomicrmw_umax_i64_monotonic: 15922; RV64IA: # %bb.0: 15923; RV64IA-NEXT: amomaxu.d a0, a1, (a0) 15924; RV64IA-NEXT: ret 15925 %1 = atomicrmw umax i64* %a, i64 %b monotonic 15926 ret i64 %1 15927} 15928 15929define i64 @atomicrmw_umax_i64_acquire(i64 *%a, i64 %b) nounwind { 15930; RV32I-LABEL: atomicrmw_umax_i64_acquire: 15931; RV32I: # %bb.0: 15932; RV32I-NEXT: addi sp, sp, -32 15933; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15934; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15935; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15936; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15937; RV32I-NEXT: mv s0, a0 15938; RV32I-NEXT: lw a5, 4(a0) 15939; RV32I-NEXT: lw a4, 0(a0) 15940; RV32I-NEXT: mv s1, a2 15941; RV32I-NEXT: mv s2, a1 15942; RV32I-NEXT: j .LBB211_2 15943; RV32I-NEXT: .LBB211_1: # %atomicrmw.start 15944; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15945; RV32I-NEXT: sw a4, 8(sp) 15946; RV32I-NEXT: sw a5, 12(sp) 15947; RV32I-NEXT: addi a1, sp, 8 15948; RV32I-NEXT: li a4, 2 15949; RV32I-NEXT: li a5, 2 15950; RV32I-NEXT: mv a0, s0 15951; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15952; RV32I-NEXT: lw a5, 12(sp) 15953; RV32I-NEXT: lw a4, 8(sp) 15954; RV32I-NEXT: bnez a0, .LBB211_7 15955; RV32I-NEXT: .LBB211_2: # %atomicrmw.start 15956; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15957; RV32I-NEXT: beq a5, s1, .LBB211_4 15958; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15959; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15960; RV32I-NEXT: sltu a0, s1, a5 15961; RV32I-NEXT: j .LBB211_5 15962; RV32I-NEXT: .LBB211_4: # in Loop: Header=BB211_2 Depth=1 15963; RV32I-NEXT: sltu a0, s2, a4 15964; RV32I-NEXT: .LBB211_5: # %atomicrmw.start 15965; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15966; RV32I-NEXT: mv a2, a4 15967; RV32I-NEXT: mv a3, a5 15968; RV32I-NEXT: bnez a0, .LBB211_1 15969; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15970; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15971; RV32I-NEXT: mv a2, s2 15972; RV32I-NEXT: mv a3, s1 15973; RV32I-NEXT: j .LBB211_1 15974; RV32I-NEXT: .LBB211_7: # %atomicrmw.end 15975; RV32I-NEXT: mv a0, a4 15976; RV32I-NEXT: mv a1, a5 15977; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15978; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15979; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15980; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15981; RV32I-NEXT: addi sp, sp, 32 15982; RV32I-NEXT: ret 15983; 15984; RV32IA-LABEL: atomicrmw_umax_i64_acquire: 15985; RV32IA: # %bb.0: 15986; RV32IA-NEXT: addi sp, sp, -32 15987; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15988; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15989; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15990; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15991; RV32IA-NEXT: mv s0, a0 15992; RV32IA-NEXT: lw a5, 4(a0) 15993; RV32IA-NEXT: lw a4, 0(a0) 15994; RV32IA-NEXT: mv s1, a2 15995; RV32IA-NEXT: mv s2, a1 15996; RV32IA-NEXT: j .LBB211_2 15997; RV32IA-NEXT: .LBB211_1: # %atomicrmw.start 15998; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 15999; RV32IA-NEXT: sw a4, 8(sp) 16000; RV32IA-NEXT: sw a5, 12(sp) 16001; RV32IA-NEXT: addi a1, sp, 8 16002; RV32IA-NEXT: li a4, 2 16003; RV32IA-NEXT: li a5, 2 16004; RV32IA-NEXT: mv a0, s0 16005; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16006; RV32IA-NEXT: lw a5, 12(sp) 16007; RV32IA-NEXT: lw a4, 8(sp) 16008; RV32IA-NEXT: bnez a0, .LBB211_7 16009; RV32IA-NEXT: .LBB211_2: # %atomicrmw.start 16010; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16011; RV32IA-NEXT: beq a5, s1, .LBB211_4 16012; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16013; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 16014; RV32IA-NEXT: sltu a0, s1, a5 16015; RV32IA-NEXT: j .LBB211_5 16016; RV32IA-NEXT: .LBB211_4: # in Loop: Header=BB211_2 Depth=1 16017; RV32IA-NEXT: sltu a0, s2, a4 16018; RV32IA-NEXT: .LBB211_5: # %atomicrmw.start 16019; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 16020; RV32IA-NEXT: mv a2, a4 16021; RV32IA-NEXT: mv a3, a5 16022; RV32IA-NEXT: bnez a0, .LBB211_1 16023; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16024; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 16025; RV32IA-NEXT: mv a2, s2 16026; RV32IA-NEXT: mv a3, s1 16027; RV32IA-NEXT: j .LBB211_1 16028; RV32IA-NEXT: .LBB211_7: # %atomicrmw.end 16029; RV32IA-NEXT: mv a0, a4 16030; RV32IA-NEXT: mv a1, a5 16031; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16032; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16033; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16034; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16035; RV32IA-NEXT: addi sp, sp, 32 16036; RV32IA-NEXT: ret 16037; 16038; RV64I-LABEL: atomicrmw_umax_i64_acquire: 16039; RV64I: # %bb.0: 16040; RV64I-NEXT: addi sp, sp, -32 16041; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16042; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16043; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16044; RV64I-NEXT: mv s0, a0 16045; RV64I-NEXT: ld a3, 0(a0) 16046; RV64I-NEXT: mv s1, a1 16047; RV64I-NEXT: j .LBB211_2 16048; RV64I-NEXT: .LBB211_1: # %atomicrmw.start 16049; RV64I-NEXT: # in Loop: Header=BB211_2 Depth=1 16050; RV64I-NEXT: sd a3, 0(sp) 16051; RV64I-NEXT: mv a1, sp 16052; RV64I-NEXT: li a3, 2 16053; RV64I-NEXT: li a4, 2 16054; RV64I-NEXT: mv a0, s0 16055; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16056; RV64I-NEXT: ld a3, 0(sp) 16057; RV64I-NEXT: bnez a0, .LBB211_4 16058; RV64I-NEXT: .LBB211_2: # %atomicrmw.start 16059; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16060; RV64I-NEXT: mv a2, a3 16061; RV64I-NEXT: bltu s1, a3, .LBB211_1 16062; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16063; RV64I-NEXT: # in Loop: Header=BB211_2 Depth=1 16064; RV64I-NEXT: mv a2, s1 16065; RV64I-NEXT: j .LBB211_1 16066; RV64I-NEXT: .LBB211_4: # %atomicrmw.end 16067; RV64I-NEXT: mv a0, a3 16068; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16069; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16070; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16071; RV64I-NEXT: addi sp, sp, 32 16072; RV64I-NEXT: ret 16073; 16074; RV64IA-LABEL: atomicrmw_umax_i64_acquire: 16075; RV64IA: # %bb.0: 16076; RV64IA-NEXT: amomaxu.d.aq a0, a1, (a0) 16077; RV64IA-NEXT: ret 16078 %1 = atomicrmw umax i64* %a, i64 %b acquire 16079 ret i64 %1 16080} 16081 16082define i64 @atomicrmw_umax_i64_release(i64 *%a, i64 %b) nounwind { 16083; RV32I-LABEL: atomicrmw_umax_i64_release: 16084; RV32I: # %bb.0: 16085; RV32I-NEXT: addi sp, sp, -32 16086; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16087; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16088; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16089; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16090; RV32I-NEXT: mv s0, a0 16091; RV32I-NEXT: lw a5, 4(a0) 16092; RV32I-NEXT: lw a4, 0(a0) 16093; RV32I-NEXT: mv s1, a2 16094; RV32I-NEXT: mv s2, a1 16095; RV32I-NEXT: j .LBB212_2 16096; RV32I-NEXT: .LBB212_1: # %atomicrmw.start 16097; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16098; RV32I-NEXT: sw a4, 8(sp) 16099; RV32I-NEXT: sw a5, 12(sp) 16100; RV32I-NEXT: addi a1, sp, 8 16101; RV32I-NEXT: li a4, 3 16102; RV32I-NEXT: mv a0, s0 16103; RV32I-NEXT: li a5, 0 16104; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16105; RV32I-NEXT: lw a5, 12(sp) 16106; RV32I-NEXT: lw a4, 8(sp) 16107; RV32I-NEXT: bnez a0, .LBB212_7 16108; RV32I-NEXT: .LBB212_2: # %atomicrmw.start 16109; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16110; RV32I-NEXT: beq a5, s1, .LBB212_4 16111; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16112; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16113; RV32I-NEXT: sltu a0, s1, a5 16114; RV32I-NEXT: j .LBB212_5 16115; RV32I-NEXT: .LBB212_4: # in Loop: Header=BB212_2 Depth=1 16116; RV32I-NEXT: sltu a0, s2, a4 16117; RV32I-NEXT: .LBB212_5: # %atomicrmw.start 16118; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16119; RV32I-NEXT: mv a2, a4 16120; RV32I-NEXT: mv a3, a5 16121; RV32I-NEXT: bnez a0, .LBB212_1 16122; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16123; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16124; RV32I-NEXT: mv a2, s2 16125; RV32I-NEXT: mv a3, s1 16126; RV32I-NEXT: j .LBB212_1 16127; RV32I-NEXT: .LBB212_7: # %atomicrmw.end 16128; RV32I-NEXT: mv a0, a4 16129; RV32I-NEXT: mv a1, a5 16130; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16131; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16132; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16133; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16134; RV32I-NEXT: addi sp, sp, 32 16135; RV32I-NEXT: ret 16136; 16137; RV32IA-LABEL: atomicrmw_umax_i64_release: 16138; RV32IA: # %bb.0: 16139; RV32IA-NEXT: addi sp, sp, -32 16140; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16141; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16142; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16143; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16144; RV32IA-NEXT: mv s0, a0 16145; RV32IA-NEXT: lw a5, 4(a0) 16146; RV32IA-NEXT: lw a4, 0(a0) 16147; RV32IA-NEXT: mv s1, a2 16148; RV32IA-NEXT: mv s2, a1 16149; RV32IA-NEXT: j .LBB212_2 16150; RV32IA-NEXT: .LBB212_1: # %atomicrmw.start 16151; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16152; RV32IA-NEXT: sw a4, 8(sp) 16153; RV32IA-NEXT: sw a5, 12(sp) 16154; RV32IA-NEXT: addi a1, sp, 8 16155; RV32IA-NEXT: li a4, 3 16156; RV32IA-NEXT: mv a0, s0 16157; RV32IA-NEXT: li a5, 0 16158; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16159; RV32IA-NEXT: lw a5, 12(sp) 16160; RV32IA-NEXT: lw a4, 8(sp) 16161; RV32IA-NEXT: bnez a0, .LBB212_7 16162; RV32IA-NEXT: .LBB212_2: # %atomicrmw.start 16163; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16164; RV32IA-NEXT: beq a5, s1, .LBB212_4 16165; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16166; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16167; RV32IA-NEXT: sltu a0, s1, a5 16168; RV32IA-NEXT: j .LBB212_5 16169; RV32IA-NEXT: .LBB212_4: # in Loop: Header=BB212_2 Depth=1 16170; RV32IA-NEXT: sltu a0, s2, a4 16171; RV32IA-NEXT: .LBB212_5: # %atomicrmw.start 16172; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16173; RV32IA-NEXT: mv a2, a4 16174; RV32IA-NEXT: mv a3, a5 16175; RV32IA-NEXT: bnez a0, .LBB212_1 16176; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16177; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16178; RV32IA-NEXT: mv a2, s2 16179; RV32IA-NEXT: mv a3, s1 16180; RV32IA-NEXT: j .LBB212_1 16181; RV32IA-NEXT: .LBB212_7: # %atomicrmw.end 16182; RV32IA-NEXT: mv a0, a4 16183; RV32IA-NEXT: mv a1, a5 16184; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16185; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16186; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16187; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16188; RV32IA-NEXT: addi sp, sp, 32 16189; RV32IA-NEXT: ret 16190; 16191; RV64I-LABEL: atomicrmw_umax_i64_release: 16192; RV64I: # %bb.0: 16193; RV64I-NEXT: addi sp, sp, -32 16194; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16195; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16196; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16197; RV64I-NEXT: mv s0, a0 16198; RV64I-NEXT: ld a3, 0(a0) 16199; RV64I-NEXT: mv s1, a1 16200; RV64I-NEXT: j .LBB212_2 16201; RV64I-NEXT: .LBB212_1: # %atomicrmw.start 16202; RV64I-NEXT: # in Loop: Header=BB212_2 Depth=1 16203; RV64I-NEXT: sd a3, 0(sp) 16204; RV64I-NEXT: mv a1, sp 16205; RV64I-NEXT: li a3, 3 16206; RV64I-NEXT: mv a0, s0 16207; RV64I-NEXT: li a4, 0 16208; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16209; RV64I-NEXT: ld a3, 0(sp) 16210; RV64I-NEXT: bnez a0, .LBB212_4 16211; RV64I-NEXT: .LBB212_2: # %atomicrmw.start 16212; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16213; RV64I-NEXT: mv a2, a3 16214; RV64I-NEXT: bltu s1, a3, .LBB212_1 16215; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16216; RV64I-NEXT: # in Loop: Header=BB212_2 Depth=1 16217; RV64I-NEXT: mv a2, s1 16218; RV64I-NEXT: j .LBB212_1 16219; RV64I-NEXT: .LBB212_4: # %atomicrmw.end 16220; RV64I-NEXT: mv a0, a3 16221; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16222; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16223; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16224; RV64I-NEXT: addi sp, sp, 32 16225; RV64I-NEXT: ret 16226; 16227; RV64IA-LABEL: atomicrmw_umax_i64_release: 16228; RV64IA: # %bb.0: 16229; RV64IA-NEXT: amomaxu.d.rl a0, a1, (a0) 16230; RV64IA-NEXT: ret 16231 %1 = atomicrmw umax i64* %a, i64 %b release 16232 ret i64 %1 16233} 16234 16235define i64 @atomicrmw_umax_i64_acq_rel(i64 *%a, i64 %b) nounwind { 16236; RV32I-LABEL: atomicrmw_umax_i64_acq_rel: 16237; RV32I: # %bb.0: 16238; RV32I-NEXT: addi sp, sp, -32 16239; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16240; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16241; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16242; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16243; RV32I-NEXT: mv s0, a0 16244; RV32I-NEXT: lw a5, 4(a0) 16245; RV32I-NEXT: lw a4, 0(a0) 16246; RV32I-NEXT: mv s1, a2 16247; RV32I-NEXT: mv s2, a1 16248; RV32I-NEXT: j .LBB213_2 16249; RV32I-NEXT: .LBB213_1: # %atomicrmw.start 16250; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16251; RV32I-NEXT: sw a4, 8(sp) 16252; RV32I-NEXT: sw a5, 12(sp) 16253; RV32I-NEXT: addi a1, sp, 8 16254; RV32I-NEXT: li a4, 4 16255; RV32I-NEXT: li a5, 2 16256; RV32I-NEXT: mv a0, s0 16257; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16258; RV32I-NEXT: lw a5, 12(sp) 16259; RV32I-NEXT: lw a4, 8(sp) 16260; RV32I-NEXT: bnez a0, .LBB213_7 16261; RV32I-NEXT: .LBB213_2: # %atomicrmw.start 16262; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16263; RV32I-NEXT: beq a5, s1, .LBB213_4 16264; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16265; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16266; RV32I-NEXT: sltu a0, s1, a5 16267; RV32I-NEXT: j .LBB213_5 16268; RV32I-NEXT: .LBB213_4: # in Loop: Header=BB213_2 Depth=1 16269; RV32I-NEXT: sltu a0, s2, a4 16270; RV32I-NEXT: .LBB213_5: # %atomicrmw.start 16271; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16272; RV32I-NEXT: mv a2, a4 16273; RV32I-NEXT: mv a3, a5 16274; RV32I-NEXT: bnez a0, .LBB213_1 16275; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16276; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16277; RV32I-NEXT: mv a2, s2 16278; RV32I-NEXT: mv a3, s1 16279; RV32I-NEXT: j .LBB213_1 16280; RV32I-NEXT: .LBB213_7: # %atomicrmw.end 16281; RV32I-NEXT: mv a0, a4 16282; RV32I-NEXT: mv a1, a5 16283; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16284; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16285; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16286; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16287; RV32I-NEXT: addi sp, sp, 32 16288; RV32I-NEXT: ret 16289; 16290; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel: 16291; RV32IA: # %bb.0: 16292; RV32IA-NEXT: addi sp, sp, -32 16293; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16294; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16295; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16296; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16297; RV32IA-NEXT: mv s0, a0 16298; RV32IA-NEXT: lw a5, 4(a0) 16299; RV32IA-NEXT: lw a4, 0(a0) 16300; RV32IA-NEXT: mv s1, a2 16301; RV32IA-NEXT: mv s2, a1 16302; RV32IA-NEXT: j .LBB213_2 16303; RV32IA-NEXT: .LBB213_1: # %atomicrmw.start 16304; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16305; RV32IA-NEXT: sw a4, 8(sp) 16306; RV32IA-NEXT: sw a5, 12(sp) 16307; RV32IA-NEXT: addi a1, sp, 8 16308; RV32IA-NEXT: li a4, 4 16309; RV32IA-NEXT: li a5, 2 16310; RV32IA-NEXT: mv a0, s0 16311; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16312; RV32IA-NEXT: lw a5, 12(sp) 16313; RV32IA-NEXT: lw a4, 8(sp) 16314; RV32IA-NEXT: bnez a0, .LBB213_7 16315; RV32IA-NEXT: .LBB213_2: # %atomicrmw.start 16316; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16317; RV32IA-NEXT: beq a5, s1, .LBB213_4 16318; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16319; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16320; RV32IA-NEXT: sltu a0, s1, a5 16321; RV32IA-NEXT: j .LBB213_5 16322; RV32IA-NEXT: .LBB213_4: # in Loop: Header=BB213_2 Depth=1 16323; RV32IA-NEXT: sltu a0, s2, a4 16324; RV32IA-NEXT: .LBB213_5: # %atomicrmw.start 16325; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16326; RV32IA-NEXT: mv a2, a4 16327; RV32IA-NEXT: mv a3, a5 16328; RV32IA-NEXT: bnez a0, .LBB213_1 16329; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16330; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16331; RV32IA-NEXT: mv a2, s2 16332; RV32IA-NEXT: mv a3, s1 16333; RV32IA-NEXT: j .LBB213_1 16334; RV32IA-NEXT: .LBB213_7: # %atomicrmw.end 16335; RV32IA-NEXT: mv a0, a4 16336; RV32IA-NEXT: mv a1, a5 16337; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16338; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16339; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16340; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16341; RV32IA-NEXT: addi sp, sp, 32 16342; RV32IA-NEXT: ret 16343; 16344; RV64I-LABEL: atomicrmw_umax_i64_acq_rel: 16345; RV64I: # %bb.0: 16346; RV64I-NEXT: addi sp, sp, -32 16347; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16348; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16349; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16350; RV64I-NEXT: mv s0, a0 16351; RV64I-NEXT: ld a3, 0(a0) 16352; RV64I-NEXT: mv s1, a1 16353; RV64I-NEXT: j .LBB213_2 16354; RV64I-NEXT: .LBB213_1: # %atomicrmw.start 16355; RV64I-NEXT: # in Loop: Header=BB213_2 Depth=1 16356; RV64I-NEXT: sd a3, 0(sp) 16357; RV64I-NEXT: mv a1, sp 16358; RV64I-NEXT: li a3, 4 16359; RV64I-NEXT: li a4, 2 16360; RV64I-NEXT: mv a0, s0 16361; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16362; RV64I-NEXT: ld a3, 0(sp) 16363; RV64I-NEXT: bnez a0, .LBB213_4 16364; RV64I-NEXT: .LBB213_2: # %atomicrmw.start 16365; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16366; RV64I-NEXT: mv a2, a3 16367; RV64I-NEXT: bltu s1, a3, .LBB213_1 16368; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16369; RV64I-NEXT: # in Loop: Header=BB213_2 Depth=1 16370; RV64I-NEXT: mv a2, s1 16371; RV64I-NEXT: j .LBB213_1 16372; RV64I-NEXT: .LBB213_4: # %atomicrmw.end 16373; RV64I-NEXT: mv a0, a3 16374; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16375; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16376; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16377; RV64I-NEXT: addi sp, sp, 32 16378; RV64I-NEXT: ret 16379; 16380; RV64IA-LABEL: atomicrmw_umax_i64_acq_rel: 16381; RV64IA: # %bb.0: 16382; RV64IA-NEXT: amomaxu.d.aqrl a0, a1, (a0) 16383; RV64IA-NEXT: ret 16384 %1 = atomicrmw umax i64* %a, i64 %b acq_rel 16385 ret i64 %1 16386} 16387 16388define i64 @atomicrmw_umax_i64_seq_cst(i64 *%a, i64 %b) nounwind { 16389; RV32I-LABEL: atomicrmw_umax_i64_seq_cst: 16390; RV32I: # %bb.0: 16391; RV32I-NEXT: addi sp, sp, -32 16392; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16393; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16394; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16395; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16396; RV32I-NEXT: mv s0, a0 16397; RV32I-NEXT: lw a5, 4(a0) 16398; RV32I-NEXT: lw a4, 0(a0) 16399; RV32I-NEXT: mv s1, a2 16400; RV32I-NEXT: mv s2, a1 16401; RV32I-NEXT: j .LBB214_2 16402; RV32I-NEXT: .LBB214_1: # %atomicrmw.start 16403; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16404; RV32I-NEXT: sw a4, 8(sp) 16405; RV32I-NEXT: sw a5, 12(sp) 16406; RV32I-NEXT: addi a1, sp, 8 16407; RV32I-NEXT: li a4, 5 16408; RV32I-NEXT: li a5, 5 16409; RV32I-NEXT: mv a0, s0 16410; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16411; RV32I-NEXT: lw a5, 12(sp) 16412; RV32I-NEXT: lw a4, 8(sp) 16413; RV32I-NEXT: bnez a0, .LBB214_7 16414; RV32I-NEXT: .LBB214_2: # %atomicrmw.start 16415; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16416; RV32I-NEXT: beq a5, s1, .LBB214_4 16417; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16418; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16419; RV32I-NEXT: sltu a0, s1, a5 16420; RV32I-NEXT: j .LBB214_5 16421; RV32I-NEXT: .LBB214_4: # in Loop: Header=BB214_2 Depth=1 16422; RV32I-NEXT: sltu a0, s2, a4 16423; RV32I-NEXT: .LBB214_5: # %atomicrmw.start 16424; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16425; RV32I-NEXT: mv a2, a4 16426; RV32I-NEXT: mv a3, a5 16427; RV32I-NEXT: bnez a0, .LBB214_1 16428; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16429; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16430; RV32I-NEXT: mv a2, s2 16431; RV32I-NEXT: mv a3, s1 16432; RV32I-NEXT: j .LBB214_1 16433; RV32I-NEXT: .LBB214_7: # %atomicrmw.end 16434; RV32I-NEXT: mv a0, a4 16435; RV32I-NEXT: mv a1, a5 16436; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16437; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16438; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16439; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16440; RV32I-NEXT: addi sp, sp, 32 16441; RV32I-NEXT: ret 16442; 16443; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst: 16444; RV32IA: # %bb.0: 16445; RV32IA-NEXT: addi sp, sp, -32 16446; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16447; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16448; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16449; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16450; RV32IA-NEXT: mv s0, a0 16451; RV32IA-NEXT: lw a5, 4(a0) 16452; RV32IA-NEXT: lw a4, 0(a0) 16453; RV32IA-NEXT: mv s1, a2 16454; RV32IA-NEXT: mv s2, a1 16455; RV32IA-NEXT: j .LBB214_2 16456; RV32IA-NEXT: .LBB214_1: # %atomicrmw.start 16457; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16458; RV32IA-NEXT: sw a4, 8(sp) 16459; RV32IA-NEXT: sw a5, 12(sp) 16460; RV32IA-NEXT: addi a1, sp, 8 16461; RV32IA-NEXT: li a4, 5 16462; RV32IA-NEXT: li a5, 5 16463; RV32IA-NEXT: mv a0, s0 16464; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16465; RV32IA-NEXT: lw a5, 12(sp) 16466; RV32IA-NEXT: lw a4, 8(sp) 16467; RV32IA-NEXT: bnez a0, .LBB214_7 16468; RV32IA-NEXT: .LBB214_2: # %atomicrmw.start 16469; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16470; RV32IA-NEXT: beq a5, s1, .LBB214_4 16471; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16472; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16473; RV32IA-NEXT: sltu a0, s1, a5 16474; RV32IA-NEXT: j .LBB214_5 16475; RV32IA-NEXT: .LBB214_4: # in Loop: Header=BB214_2 Depth=1 16476; RV32IA-NEXT: sltu a0, s2, a4 16477; RV32IA-NEXT: .LBB214_5: # %atomicrmw.start 16478; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16479; RV32IA-NEXT: mv a2, a4 16480; RV32IA-NEXT: mv a3, a5 16481; RV32IA-NEXT: bnez a0, .LBB214_1 16482; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16483; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16484; RV32IA-NEXT: mv a2, s2 16485; RV32IA-NEXT: mv a3, s1 16486; RV32IA-NEXT: j .LBB214_1 16487; RV32IA-NEXT: .LBB214_7: # %atomicrmw.end 16488; RV32IA-NEXT: mv a0, a4 16489; RV32IA-NEXT: mv a1, a5 16490; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16491; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16492; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16493; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16494; RV32IA-NEXT: addi sp, sp, 32 16495; RV32IA-NEXT: ret 16496; 16497; RV64I-LABEL: atomicrmw_umax_i64_seq_cst: 16498; RV64I: # %bb.0: 16499; RV64I-NEXT: addi sp, sp, -32 16500; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16501; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16502; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16503; RV64I-NEXT: mv s0, a0 16504; RV64I-NEXT: ld a3, 0(a0) 16505; RV64I-NEXT: mv s1, a1 16506; RV64I-NEXT: j .LBB214_2 16507; RV64I-NEXT: .LBB214_1: # %atomicrmw.start 16508; RV64I-NEXT: # in Loop: Header=BB214_2 Depth=1 16509; RV64I-NEXT: sd a3, 0(sp) 16510; RV64I-NEXT: mv a1, sp 16511; RV64I-NEXT: li a3, 5 16512; RV64I-NEXT: li a4, 5 16513; RV64I-NEXT: mv a0, s0 16514; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16515; RV64I-NEXT: ld a3, 0(sp) 16516; RV64I-NEXT: bnez a0, .LBB214_4 16517; RV64I-NEXT: .LBB214_2: # %atomicrmw.start 16518; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16519; RV64I-NEXT: mv a2, a3 16520; RV64I-NEXT: bltu s1, a3, .LBB214_1 16521; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16522; RV64I-NEXT: # in Loop: Header=BB214_2 Depth=1 16523; RV64I-NEXT: mv a2, s1 16524; RV64I-NEXT: j .LBB214_1 16525; RV64I-NEXT: .LBB214_4: # %atomicrmw.end 16526; RV64I-NEXT: mv a0, a3 16527; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16528; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16529; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16530; RV64I-NEXT: addi sp, sp, 32 16531; RV64I-NEXT: ret 16532; 16533; RV64IA-LABEL: atomicrmw_umax_i64_seq_cst: 16534; RV64IA: # %bb.0: 16535; RV64IA-NEXT: amomaxu.d.aqrl a0, a1, (a0) 16536; RV64IA-NEXT: ret 16537 %1 = atomicrmw umax i64* %a, i64 %b seq_cst 16538 ret i64 %1 16539} 16540 16541define i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind { 16542; RV32I-LABEL: atomicrmw_umin_i64_monotonic: 16543; RV32I: # %bb.0: 16544; RV32I-NEXT: addi sp, sp, -32 16545; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16546; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16547; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16548; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16549; RV32I-NEXT: mv s0, a0 16550; RV32I-NEXT: lw a5, 4(a0) 16551; RV32I-NEXT: lw a4, 0(a0) 16552; RV32I-NEXT: mv s1, a2 16553; RV32I-NEXT: mv s2, a1 16554; RV32I-NEXT: j .LBB215_2 16555; RV32I-NEXT: .LBB215_1: # %atomicrmw.start 16556; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16557; RV32I-NEXT: sw a4, 8(sp) 16558; RV32I-NEXT: sw a5, 12(sp) 16559; RV32I-NEXT: addi a1, sp, 8 16560; RV32I-NEXT: mv a0, s0 16561; RV32I-NEXT: li a4, 0 16562; RV32I-NEXT: li a5, 0 16563; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16564; RV32I-NEXT: lw a5, 12(sp) 16565; RV32I-NEXT: lw a4, 8(sp) 16566; RV32I-NEXT: bnez a0, .LBB215_7 16567; RV32I-NEXT: .LBB215_2: # %atomicrmw.start 16568; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16569; RV32I-NEXT: beq a5, s1, .LBB215_4 16570; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16571; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16572; RV32I-NEXT: sltu a0, s1, a5 16573; RV32I-NEXT: j .LBB215_5 16574; RV32I-NEXT: .LBB215_4: # in Loop: Header=BB215_2 Depth=1 16575; RV32I-NEXT: sltu a0, s2, a4 16576; RV32I-NEXT: .LBB215_5: # %atomicrmw.start 16577; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16578; RV32I-NEXT: xori a0, a0, 1 16579; RV32I-NEXT: mv a2, a4 16580; RV32I-NEXT: mv a3, a5 16581; RV32I-NEXT: bnez a0, .LBB215_1 16582; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16583; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16584; RV32I-NEXT: mv a2, s2 16585; RV32I-NEXT: mv a3, s1 16586; RV32I-NEXT: j .LBB215_1 16587; RV32I-NEXT: .LBB215_7: # %atomicrmw.end 16588; RV32I-NEXT: mv a0, a4 16589; RV32I-NEXT: mv a1, a5 16590; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16591; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16592; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16593; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16594; RV32I-NEXT: addi sp, sp, 32 16595; RV32I-NEXT: ret 16596; 16597; RV32IA-LABEL: atomicrmw_umin_i64_monotonic: 16598; RV32IA: # %bb.0: 16599; RV32IA-NEXT: addi sp, sp, -32 16600; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16601; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16602; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16603; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16604; RV32IA-NEXT: mv s0, a0 16605; RV32IA-NEXT: lw a5, 4(a0) 16606; RV32IA-NEXT: lw a4, 0(a0) 16607; RV32IA-NEXT: mv s1, a2 16608; RV32IA-NEXT: mv s2, a1 16609; RV32IA-NEXT: j .LBB215_2 16610; RV32IA-NEXT: .LBB215_1: # %atomicrmw.start 16611; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16612; RV32IA-NEXT: sw a4, 8(sp) 16613; RV32IA-NEXT: sw a5, 12(sp) 16614; RV32IA-NEXT: addi a1, sp, 8 16615; RV32IA-NEXT: mv a0, s0 16616; RV32IA-NEXT: li a4, 0 16617; RV32IA-NEXT: li a5, 0 16618; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16619; RV32IA-NEXT: lw a5, 12(sp) 16620; RV32IA-NEXT: lw a4, 8(sp) 16621; RV32IA-NEXT: bnez a0, .LBB215_7 16622; RV32IA-NEXT: .LBB215_2: # %atomicrmw.start 16623; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16624; RV32IA-NEXT: beq a5, s1, .LBB215_4 16625; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16626; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16627; RV32IA-NEXT: sltu a0, s1, a5 16628; RV32IA-NEXT: j .LBB215_5 16629; RV32IA-NEXT: .LBB215_4: # in Loop: Header=BB215_2 Depth=1 16630; RV32IA-NEXT: sltu a0, s2, a4 16631; RV32IA-NEXT: .LBB215_5: # %atomicrmw.start 16632; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16633; RV32IA-NEXT: xori a0, a0, 1 16634; RV32IA-NEXT: mv a2, a4 16635; RV32IA-NEXT: mv a3, a5 16636; RV32IA-NEXT: bnez a0, .LBB215_1 16637; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16638; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16639; RV32IA-NEXT: mv a2, s2 16640; RV32IA-NEXT: mv a3, s1 16641; RV32IA-NEXT: j .LBB215_1 16642; RV32IA-NEXT: .LBB215_7: # %atomicrmw.end 16643; RV32IA-NEXT: mv a0, a4 16644; RV32IA-NEXT: mv a1, a5 16645; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16646; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16647; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16648; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16649; RV32IA-NEXT: addi sp, sp, 32 16650; RV32IA-NEXT: ret 16651; 16652; RV64I-LABEL: atomicrmw_umin_i64_monotonic: 16653; RV64I: # %bb.0: 16654; RV64I-NEXT: addi sp, sp, -32 16655; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16656; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16657; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16658; RV64I-NEXT: mv s0, a0 16659; RV64I-NEXT: ld a3, 0(a0) 16660; RV64I-NEXT: mv s1, a1 16661; RV64I-NEXT: j .LBB215_2 16662; RV64I-NEXT: .LBB215_1: # %atomicrmw.start 16663; RV64I-NEXT: # in Loop: Header=BB215_2 Depth=1 16664; RV64I-NEXT: sd a3, 0(sp) 16665; RV64I-NEXT: mv a1, sp 16666; RV64I-NEXT: mv a0, s0 16667; RV64I-NEXT: li a3, 0 16668; RV64I-NEXT: li a4, 0 16669; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16670; RV64I-NEXT: ld a3, 0(sp) 16671; RV64I-NEXT: bnez a0, .LBB215_4 16672; RV64I-NEXT: .LBB215_2: # %atomicrmw.start 16673; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16674; RV64I-NEXT: mv a2, a3 16675; RV64I-NEXT: bgeu s1, a3, .LBB215_1 16676; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16677; RV64I-NEXT: # in Loop: Header=BB215_2 Depth=1 16678; RV64I-NEXT: mv a2, s1 16679; RV64I-NEXT: j .LBB215_1 16680; RV64I-NEXT: .LBB215_4: # %atomicrmw.end 16681; RV64I-NEXT: mv a0, a3 16682; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16683; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16684; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16685; RV64I-NEXT: addi sp, sp, 32 16686; RV64I-NEXT: ret 16687; 16688; RV64IA-LABEL: atomicrmw_umin_i64_monotonic: 16689; RV64IA: # %bb.0: 16690; RV64IA-NEXT: amominu.d a0, a1, (a0) 16691; RV64IA-NEXT: ret 16692 %1 = atomicrmw umin i64* %a, i64 %b monotonic 16693 ret i64 %1 16694} 16695 16696define i64 @atomicrmw_umin_i64_acquire(i64 *%a, i64 %b) nounwind { 16697; RV32I-LABEL: atomicrmw_umin_i64_acquire: 16698; RV32I: # %bb.0: 16699; RV32I-NEXT: addi sp, sp, -32 16700; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16701; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16702; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16703; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16704; RV32I-NEXT: mv s0, a0 16705; RV32I-NEXT: lw a5, 4(a0) 16706; RV32I-NEXT: lw a4, 0(a0) 16707; RV32I-NEXT: mv s1, a2 16708; RV32I-NEXT: mv s2, a1 16709; RV32I-NEXT: j .LBB216_2 16710; RV32I-NEXT: .LBB216_1: # %atomicrmw.start 16711; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16712; RV32I-NEXT: sw a4, 8(sp) 16713; RV32I-NEXT: sw a5, 12(sp) 16714; RV32I-NEXT: addi a1, sp, 8 16715; RV32I-NEXT: li a4, 2 16716; RV32I-NEXT: li a5, 2 16717; RV32I-NEXT: mv a0, s0 16718; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16719; RV32I-NEXT: lw a5, 12(sp) 16720; RV32I-NEXT: lw a4, 8(sp) 16721; RV32I-NEXT: bnez a0, .LBB216_7 16722; RV32I-NEXT: .LBB216_2: # %atomicrmw.start 16723; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16724; RV32I-NEXT: beq a5, s1, .LBB216_4 16725; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16726; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16727; RV32I-NEXT: sltu a0, s1, a5 16728; RV32I-NEXT: j .LBB216_5 16729; RV32I-NEXT: .LBB216_4: # in Loop: Header=BB216_2 Depth=1 16730; RV32I-NEXT: sltu a0, s2, a4 16731; RV32I-NEXT: .LBB216_5: # %atomicrmw.start 16732; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16733; RV32I-NEXT: xori a0, a0, 1 16734; RV32I-NEXT: mv a2, a4 16735; RV32I-NEXT: mv a3, a5 16736; RV32I-NEXT: bnez a0, .LBB216_1 16737; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16738; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16739; RV32I-NEXT: mv a2, s2 16740; RV32I-NEXT: mv a3, s1 16741; RV32I-NEXT: j .LBB216_1 16742; RV32I-NEXT: .LBB216_7: # %atomicrmw.end 16743; RV32I-NEXT: mv a0, a4 16744; RV32I-NEXT: mv a1, a5 16745; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16746; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16747; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16748; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16749; RV32I-NEXT: addi sp, sp, 32 16750; RV32I-NEXT: ret 16751; 16752; RV32IA-LABEL: atomicrmw_umin_i64_acquire: 16753; RV32IA: # %bb.0: 16754; RV32IA-NEXT: addi sp, sp, -32 16755; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16756; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16757; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16758; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16759; RV32IA-NEXT: mv s0, a0 16760; RV32IA-NEXT: lw a5, 4(a0) 16761; RV32IA-NEXT: lw a4, 0(a0) 16762; RV32IA-NEXT: mv s1, a2 16763; RV32IA-NEXT: mv s2, a1 16764; RV32IA-NEXT: j .LBB216_2 16765; RV32IA-NEXT: .LBB216_1: # %atomicrmw.start 16766; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16767; RV32IA-NEXT: sw a4, 8(sp) 16768; RV32IA-NEXT: sw a5, 12(sp) 16769; RV32IA-NEXT: addi a1, sp, 8 16770; RV32IA-NEXT: li a4, 2 16771; RV32IA-NEXT: li a5, 2 16772; RV32IA-NEXT: mv a0, s0 16773; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16774; RV32IA-NEXT: lw a5, 12(sp) 16775; RV32IA-NEXT: lw a4, 8(sp) 16776; RV32IA-NEXT: bnez a0, .LBB216_7 16777; RV32IA-NEXT: .LBB216_2: # %atomicrmw.start 16778; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16779; RV32IA-NEXT: beq a5, s1, .LBB216_4 16780; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16781; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16782; RV32IA-NEXT: sltu a0, s1, a5 16783; RV32IA-NEXT: j .LBB216_5 16784; RV32IA-NEXT: .LBB216_4: # in Loop: Header=BB216_2 Depth=1 16785; RV32IA-NEXT: sltu a0, s2, a4 16786; RV32IA-NEXT: .LBB216_5: # %atomicrmw.start 16787; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16788; RV32IA-NEXT: xori a0, a0, 1 16789; RV32IA-NEXT: mv a2, a4 16790; RV32IA-NEXT: mv a3, a5 16791; RV32IA-NEXT: bnez a0, .LBB216_1 16792; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16793; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16794; RV32IA-NEXT: mv a2, s2 16795; RV32IA-NEXT: mv a3, s1 16796; RV32IA-NEXT: j .LBB216_1 16797; RV32IA-NEXT: .LBB216_7: # %atomicrmw.end 16798; RV32IA-NEXT: mv a0, a4 16799; RV32IA-NEXT: mv a1, a5 16800; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16801; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16802; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16803; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16804; RV32IA-NEXT: addi sp, sp, 32 16805; RV32IA-NEXT: ret 16806; 16807; RV64I-LABEL: atomicrmw_umin_i64_acquire: 16808; RV64I: # %bb.0: 16809; RV64I-NEXT: addi sp, sp, -32 16810; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16811; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16812; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16813; RV64I-NEXT: mv s0, a0 16814; RV64I-NEXT: ld a3, 0(a0) 16815; RV64I-NEXT: mv s1, a1 16816; RV64I-NEXT: j .LBB216_2 16817; RV64I-NEXT: .LBB216_1: # %atomicrmw.start 16818; RV64I-NEXT: # in Loop: Header=BB216_2 Depth=1 16819; RV64I-NEXT: sd a3, 0(sp) 16820; RV64I-NEXT: mv a1, sp 16821; RV64I-NEXT: li a3, 2 16822; RV64I-NEXT: li a4, 2 16823; RV64I-NEXT: mv a0, s0 16824; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16825; RV64I-NEXT: ld a3, 0(sp) 16826; RV64I-NEXT: bnez a0, .LBB216_4 16827; RV64I-NEXT: .LBB216_2: # %atomicrmw.start 16828; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16829; RV64I-NEXT: mv a2, a3 16830; RV64I-NEXT: bgeu s1, a3, .LBB216_1 16831; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16832; RV64I-NEXT: # in Loop: Header=BB216_2 Depth=1 16833; RV64I-NEXT: mv a2, s1 16834; RV64I-NEXT: j .LBB216_1 16835; RV64I-NEXT: .LBB216_4: # %atomicrmw.end 16836; RV64I-NEXT: mv a0, a3 16837; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16838; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16839; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16840; RV64I-NEXT: addi sp, sp, 32 16841; RV64I-NEXT: ret 16842; 16843; RV64IA-LABEL: atomicrmw_umin_i64_acquire: 16844; RV64IA: # %bb.0: 16845; RV64IA-NEXT: amominu.d.aq a0, a1, (a0) 16846; RV64IA-NEXT: ret 16847 %1 = atomicrmw umin i64* %a, i64 %b acquire 16848 ret i64 %1 16849} 16850 16851define i64 @atomicrmw_umin_i64_release(i64 *%a, i64 %b) nounwind { 16852; RV32I-LABEL: atomicrmw_umin_i64_release: 16853; RV32I: # %bb.0: 16854; RV32I-NEXT: addi sp, sp, -32 16855; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16856; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16857; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16858; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16859; RV32I-NEXT: mv s0, a0 16860; RV32I-NEXT: lw a5, 4(a0) 16861; RV32I-NEXT: lw a4, 0(a0) 16862; RV32I-NEXT: mv s1, a2 16863; RV32I-NEXT: mv s2, a1 16864; RV32I-NEXT: j .LBB217_2 16865; RV32I-NEXT: .LBB217_1: # %atomicrmw.start 16866; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16867; RV32I-NEXT: sw a4, 8(sp) 16868; RV32I-NEXT: sw a5, 12(sp) 16869; RV32I-NEXT: addi a1, sp, 8 16870; RV32I-NEXT: li a4, 3 16871; RV32I-NEXT: mv a0, s0 16872; RV32I-NEXT: li a5, 0 16873; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16874; RV32I-NEXT: lw a5, 12(sp) 16875; RV32I-NEXT: lw a4, 8(sp) 16876; RV32I-NEXT: bnez a0, .LBB217_7 16877; RV32I-NEXT: .LBB217_2: # %atomicrmw.start 16878; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16879; RV32I-NEXT: beq a5, s1, .LBB217_4 16880; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16881; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16882; RV32I-NEXT: sltu a0, s1, a5 16883; RV32I-NEXT: j .LBB217_5 16884; RV32I-NEXT: .LBB217_4: # in Loop: Header=BB217_2 Depth=1 16885; RV32I-NEXT: sltu a0, s2, a4 16886; RV32I-NEXT: .LBB217_5: # %atomicrmw.start 16887; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16888; RV32I-NEXT: xori a0, a0, 1 16889; RV32I-NEXT: mv a2, a4 16890; RV32I-NEXT: mv a3, a5 16891; RV32I-NEXT: bnez a0, .LBB217_1 16892; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16893; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16894; RV32I-NEXT: mv a2, s2 16895; RV32I-NEXT: mv a3, s1 16896; RV32I-NEXT: j .LBB217_1 16897; RV32I-NEXT: .LBB217_7: # %atomicrmw.end 16898; RV32I-NEXT: mv a0, a4 16899; RV32I-NEXT: mv a1, a5 16900; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16901; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16902; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16903; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16904; RV32I-NEXT: addi sp, sp, 32 16905; RV32I-NEXT: ret 16906; 16907; RV32IA-LABEL: atomicrmw_umin_i64_release: 16908; RV32IA: # %bb.0: 16909; RV32IA-NEXT: addi sp, sp, -32 16910; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16911; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16912; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16913; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16914; RV32IA-NEXT: mv s0, a0 16915; RV32IA-NEXT: lw a5, 4(a0) 16916; RV32IA-NEXT: lw a4, 0(a0) 16917; RV32IA-NEXT: mv s1, a2 16918; RV32IA-NEXT: mv s2, a1 16919; RV32IA-NEXT: j .LBB217_2 16920; RV32IA-NEXT: .LBB217_1: # %atomicrmw.start 16921; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16922; RV32IA-NEXT: sw a4, 8(sp) 16923; RV32IA-NEXT: sw a5, 12(sp) 16924; RV32IA-NEXT: addi a1, sp, 8 16925; RV32IA-NEXT: li a4, 3 16926; RV32IA-NEXT: mv a0, s0 16927; RV32IA-NEXT: li a5, 0 16928; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16929; RV32IA-NEXT: lw a5, 12(sp) 16930; RV32IA-NEXT: lw a4, 8(sp) 16931; RV32IA-NEXT: bnez a0, .LBB217_7 16932; RV32IA-NEXT: .LBB217_2: # %atomicrmw.start 16933; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16934; RV32IA-NEXT: beq a5, s1, .LBB217_4 16935; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16936; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16937; RV32IA-NEXT: sltu a0, s1, a5 16938; RV32IA-NEXT: j .LBB217_5 16939; RV32IA-NEXT: .LBB217_4: # in Loop: Header=BB217_2 Depth=1 16940; RV32IA-NEXT: sltu a0, s2, a4 16941; RV32IA-NEXT: .LBB217_5: # %atomicrmw.start 16942; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16943; RV32IA-NEXT: xori a0, a0, 1 16944; RV32IA-NEXT: mv a2, a4 16945; RV32IA-NEXT: mv a3, a5 16946; RV32IA-NEXT: bnez a0, .LBB217_1 16947; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16948; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16949; RV32IA-NEXT: mv a2, s2 16950; RV32IA-NEXT: mv a3, s1 16951; RV32IA-NEXT: j .LBB217_1 16952; RV32IA-NEXT: .LBB217_7: # %atomicrmw.end 16953; RV32IA-NEXT: mv a0, a4 16954; RV32IA-NEXT: mv a1, a5 16955; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16956; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16957; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16958; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16959; RV32IA-NEXT: addi sp, sp, 32 16960; RV32IA-NEXT: ret 16961; 16962; RV64I-LABEL: atomicrmw_umin_i64_release: 16963; RV64I: # %bb.0: 16964; RV64I-NEXT: addi sp, sp, -32 16965; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16966; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16967; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16968; RV64I-NEXT: mv s0, a0 16969; RV64I-NEXT: ld a3, 0(a0) 16970; RV64I-NEXT: mv s1, a1 16971; RV64I-NEXT: j .LBB217_2 16972; RV64I-NEXT: .LBB217_1: # %atomicrmw.start 16973; RV64I-NEXT: # in Loop: Header=BB217_2 Depth=1 16974; RV64I-NEXT: sd a3, 0(sp) 16975; RV64I-NEXT: mv a1, sp 16976; RV64I-NEXT: li a3, 3 16977; RV64I-NEXT: mv a0, s0 16978; RV64I-NEXT: li a4, 0 16979; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16980; RV64I-NEXT: ld a3, 0(sp) 16981; RV64I-NEXT: bnez a0, .LBB217_4 16982; RV64I-NEXT: .LBB217_2: # %atomicrmw.start 16983; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16984; RV64I-NEXT: mv a2, a3 16985; RV64I-NEXT: bgeu s1, a3, .LBB217_1 16986; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16987; RV64I-NEXT: # in Loop: Header=BB217_2 Depth=1 16988; RV64I-NEXT: mv a2, s1 16989; RV64I-NEXT: j .LBB217_1 16990; RV64I-NEXT: .LBB217_4: # %atomicrmw.end 16991; RV64I-NEXT: mv a0, a3 16992; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16993; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16994; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16995; RV64I-NEXT: addi sp, sp, 32 16996; RV64I-NEXT: ret 16997; 16998; RV64IA-LABEL: atomicrmw_umin_i64_release: 16999; RV64IA: # %bb.0: 17000; RV64IA-NEXT: amominu.d.rl a0, a1, (a0) 17001; RV64IA-NEXT: ret 17002 %1 = atomicrmw umin i64* %a, i64 %b release 17003 ret i64 %1 17004} 17005 17006define i64 @atomicrmw_umin_i64_acq_rel(i64 *%a, i64 %b) nounwind { 17007; RV32I-LABEL: atomicrmw_umin_i64_acq_rel: 17008; RV32I: # %bb.0: 17009; RV32I-NEXT: addi sp, sp, -32 17010; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17011; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17012; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17013; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17014; RV32I-NEXT: mv s0, a0 17015; RV32I-NEXT: lw a5, 4(a0) 17016; RV32I-NEXT: lw a4, 0(a0) 17017; RV32I-NEXT: mv s1, a2 17018; RV32I-NEXT: mv s2, a1 17019; RV32I-NEXT: j .LBB218_2 17020; RV32I-NEXT: .LBB218_1: # %atomicrmw.start 17021; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17022; RV32I-NEXT: sw a4, 8(sp) 17023; RV32I-NEXT: sw a5, 12(sp) 17024; RV32I-NEXT: addi a1, sp, 8 17025; RV32I-NEXT: li a4, 4 17026; RV32I-NEXT: li a5, 2 17027; RV32I-NEXT: mv a0, s0 17028; RV32I-NEXT: call __atomic_compare_exchange_8@plt 17029; RV32I-NEXT: lw a5, 12(sp) 17030; RV32I-NEXT: lw a4, 8(sp) 17031; RV32I-NEXT: bnez a0, .LBB218_7 17032; RV32I-NEXT: .LBB218_2: # %atomicrmw.start 17033; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17034; RV32I-NEXT: beq a5, s1, .LBB218_4 17035; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17036; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17037; RV32I-NEXT: sltu a0, s1, a5 17038; RV32I-NEXT: j .LBB218_5 17039; RV32I-NEXT: .LBB218_4: # in Loop: Header=BB218_2 Depth=1 17040; RV32I-NEXT: sltu a0, s2, a4 17041; RV32I-NEXT: .LBB218_5: # %atomicrmw.start 17042; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17043; RV32I-NEXT: xori a0, a0, 1 17044; RV32I-NEXT: mv a2, a4 17045; RV32I-NEXT: mv a3, a5 17046; RV32I-NEXT: bnez a0, .LBB218_1 17047; RV32I-NEXT: # %bb.6: # %atomicrmw.start 17048; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17049; RV32I-NEXT: mv a2, s2 17050; RV32I-NEXT: mv a3, s1 17051; RV32I-NEXT: j .LBB218_1 17052; RV32I-NEXT: .LBB218_7: # %atomicrmw.end 17053; RV32I-NEXT: mv a0, a4 17054; RV32I-NEXT: mv a1, a5 17055; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17056; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17057; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17058; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17059; RV32I-NEXT: addi sp, sp, 32 17060; RV32I-NEXT: ret 17061; 17062; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel: 17063; RV32IA: # %bb.0: 17064; RV32IA-NEXT: addi sp, sp, -32 17065; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17066; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17067; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17068; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17069; RV32IA-NEXT: mv s0, a0 17070; RV32IA-NEXT: lw a5, 4(a0) 17071; RV32IA-NEXT: lw a4, 0(a0) 17072; RV32IA-NEXT: mv s1, a2 17073; RV32IA-NEXT: mv s2, a1 17074; RV32IA-NEXT: j .LBB218_2 17075; RV32IA-NEXT: .LBB218_1: # %atomicrmw.start 17076; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17077; RV32IA-NEXT: sw a4, 8(sp) 17078; RV32IA-NEXT: sw a5, 12(sp) 17079; RV32IA-NEXT: addi a1, sp, 8 17080; RV32IA-NEXT: li a4, 4 17081; RV32IA-NEXT: li a5, 2 17082; RV32IA-NEXT: mv a0, s0 17083; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 17084; RV32IA-NEXT: lw a5, 12(sp) 17085; RV32IA-NEXT: lw a4, 8(sp) 17086; RV32IA-NEXT: bnez a0, .LBB218_7 17087; RV32IA-NEXT: .LBB218_2: # %atomicrmw.start 17088; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 17089; RV32IA-NEXT: beq a5, s1, .LBB218_4 17090; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 17091; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17092; RV32IA-NEXT: sltu a0, s1, a5 17093; RV32IA-NEXT: j .LBB218_5 17094; RV32IA-NEXT: .LBB218_4: # in Loop: Header=BB218_2 Depth=1 17095; RV32IA-NEXT: sltu a0, s2, a4 17096; RV32IA-NEXT: .LBB218_5: # %atomicrmw.start 17097; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17098; RV32IA-NEXT: xori a0, a0, 1 17099; RV32IA-NEXT: mv a2, a4 17100; RV32IA-NEXT: mv a3, a5 17101; RV32IA-NEXT: bnez a0, .LBB218_1 17102; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 17103; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17104; RV32IA-NEXT: mv a2, s2 17105; RV32IA-NEXT: mv a3, s1 17106; RV32IA-NEXT: j .LBB218_1 17107; RV32IA-NEXT: .LBB218_7: # %atomicrmw.end 17108; RV32IA-NEXT: mv a0, a4 17109; RV32IA-NEXT: mv a1, a5 17110; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17111; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17112; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17113; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17114; RV32IA-NEXT: addi sp, sp, 32 17115; RV32IA-NEXT: ret 17116; 17117; RV64I-LABEL: atomicrmw_umin_i64_acq_rel: 17118; RV64I: # %bb.0: 17119; RV64I-NEXT: addi sp, sp, -32 17120; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 17121; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 17122; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 17123; RV64I-NEXT: mv s0, a0 17124; RV64I-NEXT: ld a3, 0(a0) 17125; RV64I-NEXT: mv s1, a1 17126; RV64I-NEXT: j .LBB218_2 17127; RV64I-NEXT: .LBB218_1: # %atomicrmw.start 17128; RV64I-NEXT: # in Loop: Header=BB218_2 Depth=1 17129; RV64I-NEXT: sd a3, 0(sp) 17130; RV64I-NEXT: mv a1, sp 17131; RV64I-NEXT: li a3, 4 17132; RV64I-NEXT: li a4, 2 17133; RV64I-NEXT: mv a0, s0 17134; RV64I-NEXT: call __atomic_compare_exchange_8@plt 17135; RV64I-NEXT: ld a3, 0(sp) 17136; RV64I-NEXT: bnez a0, .LBB218_4 17137; RV64I-NEXT: .LBB218_2: # %atomicrmw.start 17138; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17139; RV64I-NEXT: mv a2, a3 17140; RV64I-NEXT: bgeu s1, a3, .LBB218_1 17141; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17142; RV64I-NEXT: # in Loop: Header=BB218_2 Depth=1 17143; RV64I-NEXT: mv a2, s1 17144; RV64I-NEXT: j .LBB218_1 17145; RV64I-NEXT: .LBB218_4: # %atomicrmw.end 17146; RV64I-NEXT: mv a0, a3 17147; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 17148; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 17149; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 17150; RV64I-NEXT: addi sp, sp, 32 17151; RV64I-NEXT: ret 17152; 17153; RV64IA-LABEL: atomicrmw_umin_i64_acq_rel: 17154; RV64IA: # %bb.0: 17155; RV64IA-NEXT: amominu.d.aqrl a0, a1, (a0) 17156; RV64IA-NEXT: ret 17157 %1 = atomicrmw umin i64* %a, i64 %b acq_rel 17158 ret i64 %1 17159} 17160 17161define i64 @atomicrmw_umin_i64_seq_cst(i64 *%a, i64 %b) nounwind { 17162; RV32I-LABEL: atomicrmw_umin_i64_seq_cst: 17163; RV32I: # %bb.0: 17164; RV32I-NEXT: addi sp, sp, -32 17165; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17166; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17167; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17168; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17169; RV32I-NEXT: mv s0, a0 17170; RV32I-NEXT: lw a5, 4(a0) 17171; RV32I-NEXT: lw a4, 0(a0) 17172; RV32I-NEXT: mv s1, a2 17173; RV32I-NEXT: mv s2, a1 17174; RV32I-NEXT: j .LBB219_2 17175; RV32I-NEXT: .LBB219_1: # %atomicrmw.start 17176; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17177; RV32I-NEXT: sw a4, 8(sp) 17178; RV32I-NEXT: sw a5, 12(sp) 17179; RV32I-NEXT: addi a1, sp, 8 17180; RV32I-NEXT: li a4, 5 17181; RV32I-NEXT: li a5, 5 17182; RV32I-NEXT: mv a0, s0 17183; RV32I-NEXT: call __atomic_compare_exchange_8@plt 17184; RV32I-NEXT: lw a5, 12(sp) 17185; RV32I-NEXT: lw a4, 8(sp) 17186; RV32I-NEXT: bnez a0, .LBB219_7 17187; RV32I-NEXT: .LBB219_2: # %atomicrmw.start 17188; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17189; RV32I-NEXT: beq a5, s1, .LBB219_4 17190; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17191; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17192; RV32I-NEXT: sltu a0, s1, a5 17193; RV32I-NEXT: j .LBB219_5 17194; RV32I-NEXT: .LBB219_4: # in Loop: Header=BB219_2 Depth=1 17195; RV32I-NEXT: sltu a0, s2, a4 17196; RV32I-NEXT: .LBB219_5: # %atomicrmw.start 17197; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17198; RV32I-NEXT: xori a0, a0, 1 17199; RV32I-NEXT: mv a2, a4 17200; RV32I-NEXT: mv a3, a5 17201; RV32I-NEXT: bnez a0, .LBB219_1 17202; RV32I-NEXT: # %bb.6: # %atomicrmw.start 17203; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17204; RV32I-NEXT: mv a2, s2 17205; RV32I-NEXT: mv a3, s1 17206; RV32I-NEXT: j .LBB219_1 17207; RV32I-NEXT: .LBB219_7: # %atomicrmw.end 17208; RV32I-NEXT: mv a0, a4 17209; RV32I-NEXT: mv a1, a5 17210; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17211; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17212; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17213; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17214; RV32I-NEXT: addi sp, sp, 32 17215; RV32I-NEXT: ret 17216; 17217; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst: 17218; RV32IA: # %bb.0: 17219; RV32IA-NEXT: addi sp, sp, -32 17220; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17221; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17222; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17223; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17224; RV32IA-NEXT: mv s0, a0 17225; RV32IA-NEXT: lw a5, 4(a0) 17226; RV32IA-NEXT: lw a4, 0(a0) 17227; RV32IA-NEXT: mv s1, a2 17228; RV32IA-NEXT: mv s2, a1 17229; RV32IA-NEXT: j .LBB219_2 17230; RV32IA-NEXT: .LBB219_1: # %atomicrmw.start 17231; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17232; RV32IA-NEXT: sw a4, 8(sp) 17233; RV32IA-NEXT: sw a5, 12(sp) 17234; RV32IA-NEXT: addi a1, sp, 8 17235; RV32IA-NEXT: li a4, 5 17236; RV32IA-NEXT: li a5, 5 17237; RV32IA-NEXT: mv a0, s0 17238; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 17239; RV32IA-NEXT: lw a5, 12(sp) 17240; RV32IA-NEXT: lw a4, 8(sp) 17241; RV32IA-NEXT: bnez a0, .LBB219_7 17242; RV32IA-NEXT: .LBB219_2: # %atomicrmw.start 17243; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 17244; RV32IA-NEXT: beq a5, s1, .LBB219_4 17245; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 17246; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17247; RV32IA-NEXT: sltu a0, s1, a5 17248; RV32IA-NEXT: j .LBB219_5 17249; RV32IA-NEXT: .LBB219_4: # in Loop: Header=BB219_2 Depth=1 17250; RV32IA-NEXT: sltu a0, s2, a4 17251; RV32IA-NEXT: .LBB219_5: # %atomicrmw.start 17252; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17253; RV32IA-NEXT: xori a0, a0, 1 17254; RV32IA-NEXT: mv a2, a4 17255; RV32IA-NEXT: mv a3, a5 17256; RV32IA-NEXT: bnez a0, .LBB219_1 17257; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 17258; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17259; RV32IA-NEXT: mv a2, s2 17260; RV32IA-NEXT: mv a3, s1 17261; RV32IA-NEXT: j .LBB219_1 17262; RV32IA-NEXT: .LBB219_7: # %atomicrmw.end 17263; RV32IA-NEXT: mv a0, a4 17264; RV32IA-NEXT: mv a1, a5 17265; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17266; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17267; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17268; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17269; RV32IA-NEXT: addi sp, sp, 32 17270; RV32IA-NEXT: ret 17271; 17272; RV64I-LABEL: atomicrmw_umin_i64_seq_cst: 17273; RV64I: # %bb.0: 17274; RV64I-NEXT: addi sp, sp, -32 17275; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 17276; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 17277; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 17278; RV64I-NEXT: mv s0, a0 17279; RV64I-NEXT: ld a3, 0(a0) 17280; RV64I-NEXT: mv s1, a1 17281; RV64I-NEXT: j .LBB219_2 17282; RV64I-NEXT: .LBB219_1: # %atomicrmw.start 17283; RV64I-NEXT: # in Loop: Header=BB219_2 Depth=1 17284; RV64I-NEXT: sd a3, 0(sp) 17285; RV64I-NEXT: mv a1, sp 17286; RV64I-NEXT: li a3, 5 17287; RV64I-NEXT: li a4, 5 17288; RV64I-NEXT: mv a0, s0 17289; RV64I-NEXT: call __atomic_compare_exchange_8@plt 17290; RV64I-NEXT: ld a3, 0(sp) 17291; RV64I-NEXT: bnez a0, .LBB219_4 17292; RV64I-NEXT: .LBB219_2: # %atomicrmw.start 17293; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17294; RV64I-NEXT: mv a2, a3 17295; RV64I-NEXT: bgeu s1, a3, .LBB219_1 17296; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17297; RV64I-NEXT: # in Loop: Header=BB219_2 Depth=1 17298; RV64I-NEXT: mv a2, s1 17299; RV64I-NEXT: j .LBB219_1 17300; RV64I-NEXT: .LBB219_4: # %atomicrmw.end 17301; RV64I-NEXT: mv a0, a3 17302; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 17303; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 17304; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 17305; RV64I-NEXT: addi sp, sp, 32 17306; RV64I-NEXT: ret 17307; 17308; RV64IA-LABEL: atomicrmw_umin_i64_seq_cst: 17309; RV64IA: # %bb.0: 17310; RV64IA-NEXT: amominu.d.aqrl a0, a1, (a0) 17311; RV64IA-NEXT: ret 17312 %1 = atomicrmw umin i64* %a, i64 %b seq_cst 17313 ret i64 %1 17314} 17315