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 s1, a1 2012; RV32I-NEXT: slli a0, a1, 24 2013; RV32I-NEXT: srai s2, 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 s2, 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, s1 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 a2, 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 a4, 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: xori a3, a3, 24 2055; RV32IA-NEXT: .LBB35_1: # =>This Inner Loop Header: Depth=1 2056; RV32IA-NEXT: lr.w a5, (a2) 2057; RV32IA-NEXT: and a7, a5, a4 2058; RV32IA-NEXT: mv a6, a5 2059; RV32IA-NEXT: sll a7, a7, a3 2060; RV32IA-NEXT: sra a7, a7, a3 2061; RV32IA-NEXT: bge a7, a1, .LBB35_3 2062; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB35_1 Depth=1 2063; RV32IA-NEXT: xor a6, a5, a1 2064; RV32IA-NEXT: and a6, a6, a4 2065; RV32IA-NEXT: xor a6, a5, a6 2066; RV32IA-NEXT: .LBB35_3: # in Loop: Header=BB35_1 Depth=1 2067; RV32IA-NEXT: sc.w a6, a6, (a2) 2068; RV32IA-NEXT: bnez a6, .LBB35_1 2069; RV32IA-NEXT: # %bb.4: 2070; RV32IA-NEXT: srl a0, a5, a0 2071; RV32IA-NEXT: ret 2072; 2073; RV64I-LABEL: atomicrmw_max_i8_monotonic: 2074; RV64I: # %bb.0: 2075; RV64I-NEXT: addi sp, sp, -48 2076; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2077; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2078; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2079; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2080; RV64I-NEXT: mv s0, a0 2081; RV64I-NEXT: lbu a3, 0(a0) 2082; RV64I-NEXT: mv s1, a1 2083; RV64I-NEXT: slli a0, a1, 56 2084; RV64I-NEXT: srai s2, a0, 56 2085; RV64I-NEXT: j .LBB35_2 2086; RV64I-NEXT: .LBB35_1: # %atomicrmw.start 2087; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2088; RV64I-NEXT: sb a3, 15(sp) 2089; RV64I-NEXT: addi a1, sp, 15 2090; RV64I-NEXT: mv a0, s0 2091; RV64I-NEXT: li a3, 0 2092; RV64I-NEXT: li a4, 0 2093; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2094; RV64I-NEXT: lb a3, 15(sp) 2095; RV64I-NEXT: bnez a0, .LBB35_4 2096; RV64I-NEXT: .LBB35_2: # %atomicrmw.start 2097; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2098; RV64I-NEXT: slli a0, a3, 56 2099; RV64I-NEXT: srai a0, a0, 56 2100; RV64I-NEXT: mv a2, a3 2101; RV64I-NEXT: blt s2, a0, .LBB35_1 2102; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2103; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2104; RV64I-NEXT: mv a2, s1 2105; RV64I-NEXT: j .LBB35_1 2106; RV64I-NEXT: .LBB35_4: # %atomicrmw.end 2107; RV64I-NEXT: mv a0, a3 2108; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2109; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2110; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2111; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2112; RV64I-NEXT: addi sp, sp, 48 2113; RV64I-NEXT: ret 2114; 2115; RV64IA-LABEL: atomicrmw_max_i8_monotonic: 2116; RV64IA: # %bb.0: 2117; RV64IA-NEXT: andi a2, a0, -4 2118; RV64IA-NEXT: slliw a0, a0, 3 2119; RV64IA-NEXT: andi a3, a0, 24 2120; RV64IA-NEXT: li a4, 255 2121; RV64IA-NEXT: sllw a4, a4, a0 2122; RV64IA-NEXT: slli a1, a1, 56 2123; RV64IA-NEXT: srai a1, a1, 56 2124; RV64IA-NEXT: sllw a1, a1, a0 2125; RV64IA-NEXT: xori a3, a3, 56 2126; RV64IA-NEXT: .LBB35_1: # =>This Inner Loop Header: Depth=1 2127; RV64IA-NEXT: lr.w a5, (a2) 2128; RV64IA-NEXT: and a7, a5, a4 2129; RV64IA-NEXT: mv a6, a5 2130; RV64IA-NEXT: sll a7, a7, a3 2131; RV64IA-NEXT: sra a7, a7, a3 2132; RV64IA-NEXT: bge a7, a1, .LBB35_3 2133; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB35_1 Depth=1 2134; RV64IA-NEXT: xor a6, a5, a1 2135; RV64IA-NEXT: and a6, a6, a4 2136; RV64IA-NEXT: xor a6, a5, a6 2137; RV64IA-NEXT: .LBB35_3: # in Loop: Header=BB35_1 Depth=1 2138; RV64IA-NEXT: sc.w a6, a6, (a2) 2139; RV64IA-NEXT: bnez a6, .LBB35_1 2140; RV64IA-NEXT: # %bb.4: 2141; RV64IA-NEXT: srlw a0, a5, a0 2142; RV64IA-NEXT: ret 2143 %1 = atomicrmw max i8* %a, i8 %b monotonic 2144 ret i8 %1 2145} 2146 2147define i8 @atomicrmw_max_i8_acquire(i8 *%a, i8 %b) nounwind { 2148; RV32I-LABEL: atomicrmw_max_i8_acquire: 2149; RV32I: # %bb.0: 2150; RV32I-NEXT: addi sp, sp, -32 2151; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2152; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2153; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2154; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2155; RV32I-NEXT: mv s0, a0 2156; RV32I-NEXT: lbu a3, 0(a0) 2157; RV32I-NEXT: mv s1, a1 2158; RV32I-NEXT: slli a0, a1, 24 2159; RV32I-NEXT: srai s2, a0, 24 2160; RV32I-NEXT: j .LBB36_2 2161; RV32I-NEXT: .LBB36_1: # %atomicrmw.start 2162; RV32I-NEXT: # in Loop: Header=BB36_2 Depth=1 2163; RV32I-NEXT: sb a3, 15(sp) 2164; RV32I-NEXT: addi a1, sp, 15 2165; RV32I-NEXT: li a3, 2 2166; RV32I-NEXT: li a4, 2 2167; RV32I-NEXT: mv a0, s0 2168; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2169; RV32I-NEXT: lb a3, 15(sp) 2170; RV32I-NEXT: bnez a0, .LBB36_4 2171; RV32I-NEXT: .LBB36_2: # %atomicrmw.start 2172; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2173; RV32I-NEXT: slli a0, a3, 24 2174; RV32I-NEXT: srai a0, a0, 24 2175; RV32I-NEXT: mv a2, a3 2176; RV32I-NEXT: blt s2, a0, .LBB36_1 2177; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2178; RV32I-NEXT: # in Loop: Header=BB36_2 Depth=1 2179; RV32I-NEXT: mv a2, s1 2180; RV32I-NEXT: j .LBB36_1 2181; RV32I-NEXT: .LBB36_4: # %atomicrmw.end 2182; RV32I-NEXT: mv a0, a3 2183; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2184; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2185; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2186; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2187; RV32I-NEXT: addi sp, sp, 32 2188; RV32I-NEXT: ret 2189; 2190; RV32IA-LABEL: atomicrmw_max_i8_acquire: 2191; RV32IA: # %bb.0: 2192; RV32IA-NEXT: andi a2, a0, -4 2193; RV32IA-NEXT: slli a0, a0, 3 2194; RV32IA-NEXT: andi a3, a0, 24 2195; RV32IA-NEXT: li a4, 255 2196; RV32IA-NEXT: sll a4, a4, a0 2197; RV32IA-NEXT: slli a1, a1, 24 2198; RV32IA-NEXT: srai a1, a1, 24 2199; RV32IA-NEXT: sll a1, a1, a0 2200; RV32IA-NEXT: xori a3, a3, 24 2201; RV32IA-NEXT: .LBB36_1: # =>This Inner Loop Header: Depth=1 2202; RV32IA-NEXT: lr.w.aq a5, (a2) 2203; RV32IA-NEXT: and a7, a5, a4 2204; RV32IA-NEXT: mv a6, a5 2205; RV32IA-NEXT: sll a7, a7, a3 2206; RV32IA-NEXT: sra a7, a7, a3 2207; RV32IA-NEXT: bge a7, a1, .LBB36_3 2208; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB36_1 Depth=1 2209; RV32IA-NEXT: xor a6, a5, a1 2210; RV32IA-NEXT: and a6, a6, a4 2211; RV32IA-NEXT: xor a6, a5, a6 2212; RV32IA-NEXT: .LBB36_3: # in Loop: Header=BB36_1 Depth=1 2213; RV32IA-NEXT: sc.w a6, a6, (a2) 2214; RV32IA-NEXT: bnez a6, .LBB36_1 2215; RV32IA-NEXT: # %bb.4: 2216; RV32IA-NEXT: srl a0, a5, a0 2217; RV32IA-NEXT: ret 2218; 2219; RV64I-LABEL: atomicrmw_max_i8_acquire: 2220; RV64I: # %bb.0: 2221; RV64I-NEXT: addi sp, sp, -48 2222; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2223; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2224; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2225; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2226; RV64I-NEXT: mv s0, a0 2227; RV64I-NEXT: lbu a3, 0(a0) 2228; RV64I-NEXT: mv s1, a1 2229; RV64I-NEXT: slli a0, a1, 56 2230; RV64I-NEXT: srai s2, a0, 56 2231; RV64I-NEXT: j .LBB36_2 2232; RV64I-NEXT: .LBB36_1: # %atomicrmw.start 2233; RV64I-NEXT: # in Loop: Header=BB36_2 Depth=1 2234; RV64I-NEXT: sb a3, 15(sp) 2235; RV64I-NEXT: addi a1, sp, 15 2236; RV64I-NEXT: li a3, 2 2237; RV64I-NEXT: li a4, 2 2238; RV64I-NEXT: mv a0, s0 2239; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2240; RV64I-NEXT: lb a3, 15(sp) 2241; RV64I-NEXT: bnez a0, .LBB36_4 2242; RV64I-NEXT: .LBB36_2: # %atomicrmw.start 2243; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2244; RV64I-NEXT: slli a0, a3, 56 2245; RV64I-NEXT: srai a0, a0, 56 2246; RV64I-NEXT: mv a2, a3 2247; RV64I-NEXT: blt s2, a0, .LBB36_1 2248; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2249; RV64I-NEXT: # in Loop: Header=BB36_2 Depth=1 2250; RV64I-NEXT: mv a2, s1 2251; RV64I-NEXT: j .LBB36_1 2252; RV64I-NEXT: .LBB36_4: # %atomicrmw.end 2253; RV64I-NEXT: mv a0, a3 2254; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2255; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2256; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2257; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2258; RV64I-NEXT: addi sp, sp, 48 2259; RV64I-NEXT: ret 2260; 2261; RV64IA-LABEL: atomicrmw_max_i8_acquire: 2262; RV64IA: # %bb.0: 2263; RV64IA-NEXT: andi a2, a0, -4 2264; RV64IA-NEXT: slliw a0, a0, 3 2265; RV64IA-NEXT: andi a3, a0, 24 2266; RV64IA-NEXT: li a4, 255 2267; RV64IA-NEXT: sllw a4, a4, a0 2268; RV64IA-NEXT: slli a1, a1, 56 2269; RV64IA-NEXT: srai a1, a1, 56 2270; RV64IA-NEXT: sllw a1, a1, a0 2271; RV64IA-NEXT: xori a3, a3, 56 2272; RV64IA-NEXT: .LBB36_1: # =>This Inner Loop Header: Depth=1 2273; RV64IA-NEXT: lr.w.aq a5, (a2) 2274; RV64IA-NEXT: and a7, a5, a4 2275; RV64IA-NEXT: mv a6, a5 2276; RV64IA-NEXT: sll a7, a7, a3 2277; RV64IA-NEXT: sra a7, a7, a3 2278; RV64IA-NEXT: bge a7, a1, .LBB36_3 2279; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB36_1 Depth=1 2280; RV64IA-NEXT: xor a6, a5, a1 2281; RV64IA-NEXT: and a6, a6, a4 2282; RV64IA-NEXT: xor a6, a5, a6 2283; RV64IA-NEXT: .LBB36_3: # in Loop: Header=BB36_1 Depth=1 2284; RV64IA-NEXT: sc.w a6, a6, (a2) 2285; RV64IA-NEXT: bnez a6, .LBB36_1 2286; RV64IA-NEXT: # %bb.4: 2287; RV64IA-NEXT: srlw a0, a5, a0 2288; RV64IA-NEXT: ret 2289 %1 = atomicrmw max i8* %a, i8 %b acquire 2290 ret i8 %1 2291} 2292 2293define i8 @atomicrmw_max_i8_release(i8 *%a, i8 %b) nounwind { 2294; RV32I-LABEL: atomicrmw_max_i8_release: 2295; RV32I: # %bb.0: 2296; RV32I-NEXT: addi sp, sp, -32 2297; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2298; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2299; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2300; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2301; RV32I-NEXT: mv s0, a0 2302; RV32I-NEXT: lbu a3, 0(a0) 2303; RV32I-NEXT: mv s1, a1 2304; RV32I-NEXT: slli a0, a1, 24 2305; RV32I-NEXT: srai s2, a0, 24 2306; RV32I-NEXT: j .LBB37_2 2307; RV32I-NEXT: .LBB37_1: # %atomicrmw.start 2308; RV32I-NEXT: # in Loop: Header=BB37_2 Depth=1 2309; RV32I-NEXT: sb a3, 15(sp) 2310; RV32I-NEXT: addi a1, sp, 15 2311; RV32I-NEXT: li a3, 3 2312; RV32I-NEXT: mv a0, s0 2313; RV32I-NEXT: li a4, 0 2314; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2315; RV32I-NEXT: lb a3, 15(sp) 2316; RV32I-NEXT: bnez a0, .LBB37_4 2317; RV32I-NEXT: .LBB37_2: # %atomicrmw.start 2318; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2319; RV32I-NEXT: slli a0, a3, 24 2320; RV32I-NEXT: srai a0, a0, 24 2321; RV32I-NEXT: mv a2, a3 2322; RV32I-NEXT: blt s2, a0, .LBB37_1 2323; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2324; RV32I-NEXT: # in Loop: Header=BB37_2 Depth=1 2325; RV32I-NEXT: mv a2, s1 2326; RV32I-NEXT: j .LBB37_1 2327; RV32I-NEXT: .LBB37_4: # %atomicrmw.end 2328; RV32I-NEXT: mv a0, a3 2329; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2330; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2331; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2332; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2333; RV32I-NEXT: addi sp, sp, 32 2334; RV32I-NEXT: ret 2335; 2336; RV32IA-LABEL: atomicrmw_max_i8_release: 2337; RV32IA: # %bb.0: 2338; RV32IA-NEXT: andi a2, a0, -4 2339; RV32IA-NEXT: slli a0, a0, 3 2340; RV32IA-NEXT: andi a3, a0, 24 2341; RV32IA-NEXT: li a4, 255 2342; RV32IA-NEXT: sll a4, a4, a0 2343; RV32IA-NEXT: slli a1, a1, 24 2344; RV32IA-NEXT: srai a1, a1, 24 2345; RV32IA-NEXT: sll a1, a1, a0 2346; RV32IA-NEXT: xori a3, a3, 24 2347; RV32IA-NEXT: .LBB37_1: # =>This Inner Loop Header: Depth=1 2348; RV32IA-NEXT: lr.w a5, (a2) 2349; RV32IA-NEXT: and a7, a5, a4 2350; RV32IA-NEXT: mv a6, a5 2351; RV32IA-NEXT: sll a7, a7, a3 2352; RV32IA-NEXT: sra a7, a7, a3 2353; RV32IA-NEXT: bge a7, a1, .LBB37_3 2354; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB37_1 Depth=1 2355; RV32IA-NEXT: xor a6, a5, a1 2356; RV32IA-NEXT: and a6, a6, a4 2357; RV32IA-NEXT: xor a6, a5, a6 2358; RV32IA-NEXT: .LBB37_3: # in Loop: Header=BB37_1 Depth=1 2359; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 2360; RV32IA-NEXT: bnez a6, .LBB37_1 2361; RV32IA-NEXT: # %bb.4: 2362; RV32IA-NEXT: srl a0, a5, a0 2363; RV32IA-NEXT: ret 2364; 2365; RV64I-LABEL: atomicrmw_max_i8_release: 2366; RV64I: # %bb.0: 2367; RV64I-NEXT: addi sp, sp, -48 2368; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2369; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2370; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2371; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2372; RV64I-NEXT: mv s0, a0 2373; RV64I-NEXT: lbu a3, 0(a0) 2374; RV64I-NEXT: mv s1, a1 2375; RV64I-NEXT: slli a0, a1, 56 2376; RV64I-NEXT: srai s2, a0, 56 2377; RV64I-NEXT: j .LBB37_2 2378; RV64I-NEXT: .LBB37_1: # %atomicrmw.start 2379; RV64I-NEXT: # in Loop: Header=BB37_2 Depth=1 2380; RV64I-NEXT: sb a3, 15(sp) 2381; RV64I-NEXT: addi a1, sp, 15 2382; RV64I-NEXT: li a3, 3 2383; RV64I-NEXT: mv a0, s0 2384; RV64I-NEXT: li a4, 0 2385; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2386; RV64I-NEXT: lb a3, 15(sp) 2387; RV64I-NEXT: bnez a0, .LBB37_4 2388; RV64I-NEXT: .LBB37_2: # %atomicrmw.start 2389; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2390; RV64I-NEXT: slli a0, a3, 56 2391; RV64I-NEXT: srai a0, a0, 56 2392; RV64I-NEXT: mv a2, a3 2393; RV64I-NEXT: blt s2, a0, .LBB37_1 2394; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2395; RV64I-NEXT: # in Loop: Header=BB37_2 Depth=1 2396; RV64I-NEXT: mv a2, s1 2397; RV64I-NEXT: j .LBB37_1 2398; RV64I-NEXT: .LBB37_4: # %atomicrmw.end 2399; RV64I-NEXT: mv a0, a3 2400; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2401; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2402; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2403; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2404; RV64I-NEXT: addi sp, sp, 48 2405; RV64I-NEXT: ret 2406; 2407; RV64IA-LABEL: atomicrmw_max_i8_release: 2408; RV64IA: # %bb.0: 2409; RV64IA-NEXT: andi a2, a0, -4 2410; RV64IA-NEXT: slliw a0, a0, 3 2411; RV64IA-NEXT: andi a3, a0, 24 2412; RV64IA-NEXT: li a4, 255 2413; RV64IA-NEXT: sllw a4, a4, a0 2414; RV64IA-NEXT: slli a1, a1, 56 2415; RV64IA-NEXT: srai a1, a1, 56 2416; RV64IA-NEXT: sllw a1, a1, a0 2417; RV64IA-NEXT: xori a3, a3, 56 2418; RV64IA-NEXT: .LBB37_1: # =>This Inner Loop Header: Depth=1 2419; RV64IA-NEXT: lr.w a5, (a2) 2420; RV64IA-NEXT: and a7, a5, a4 2421; RV64IA-NEXT: mv a6, a5 2422; RV64IA-NEXT: sll a7, a7, a3 2423; RV64IA-NEXT: sra a7, a7, a3 2424; RV64IA-NEXT: bge a7, a1, .LBB37_3 2425; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB37_1 Depth=1 2426; RV64IA-NEXT: xor a6, a5, a1 2427; RV64IA-NEXT: and a6, a6, a4 2428; RV64IA-NEXT: xor a6, a5, a6 2429; RV64IA-NEXT: .LBB37_3: # in Loop: Header=BB37_1 Depth=1 2430; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 2431; RV64IA-NEXT: bnez a6, .LBB37_1 2432; RV64IA-NEXT: # %bb.4: 2433; RV64IA-NEXT: srlw a0, a5, a0 2434; RV64IA-NEXT: ret 2435 %1 = atomicrmw max i8* %a, i8 %b release 2436 ret i8 %1 2437} 2438 2439define i8 @atomicrmw_max_i8_acq_rel(i8 *%a, i8 %b) nounwind { 2440; RV32I-LABEL: atomicrmw_max_i8_acq_rel: 2441; RV32I: # %bb.0: 2442; RV32I-NEXT: addi sp, sp, -32 2443; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2444; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2445; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2446; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2447; RV32I-NEXT: mv s0, a0 2448; RV32I-NEXT: lbu a3, 0(a0) 2449; RV32I-NEXT: mv s1, a1 2450; RV32I-NEXT: slli a0, a1, 24 2451; RV32I-NEXT: srai s2, a0, 24 2452; RV32I-NEXT: j .LBB38_2 2453; RV32I-NEXT: .LBB38_1: # %atomicrmw.start 2454; RV32I-NEXT: # in Loop: Header=BB38_2 Depth=1 2455; RV32I-NEXT: sb a3, 15(sp) 2456; RV32I-NEXT: addi a1, sp, 15 2457; RV32I-NEXT: li a3, 4 2458; RV32I-NEXT: li a4, 2 2459; RV32I-NEXT: mv a0, s0 2460; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2461; RV32I-NEXT: lb a3, 15(sp) 2462; RV32I-NEXT: bnez a0, .LBB38_4 2463; RV32I-NEXT: .LBB38_2: # %atomicrmw.start 2464; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2465; RV32I-NEXT: slli a0, a3, 24 2466; RV32I-NEXT: srai a0, a0, 24 2467; RV32I-NEXT: mv a2, a3 2468; RV32I-NEXT: blt s2, a0, .LBB38_1 2469; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2470; RV32I-NEXT: # in Loop: Header=BB38_2 Depth=1 2471; RV32I-NEXT: mv a2, s1 2472; RV32I-NEXT: j .LBB38_1 2473; RV32I-NEXT: .LBB38_4: # %atomicrmw.end 2474; RV32I-NEXT: mv a0, a3 2475; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2476; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2477; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2478; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2479; RV32I-NEXT: addi sp, sp, 32 2480; RV32I-NEXT: ret 2481; 2482; RV32IA-LABEL: atomicrmw_max_i8_acq_rel: 2483; RV32IA: # %bb.0: 2484; RV32IA-NEXT: andi a2, a0, -4 2485; RV32IA-NEXT: slli a0, a0, 3 2486; RV32IA-NEXT: andi a3, a0, 24 2487; RV32IA-NEXT: li a4, 255 2488; RV32IA-NEXT: sll a4, a4, a0 2489; RV32IA-NEXT: slli a1, a1, 24 2490; RV32IA-NEXT: srai a1, a1, 24 2491; RV32IA-NEXT: sll a1, a1, a0 2492; RV32IA-NEXT: xori a3, a3, 24 2493; RV32IA-NEXT: .LBB38_1: # =>This Inner Loop Header: Depth=1 2494; RV32IA-NEXT: lr.w.aq a5, (a2) 2495; RV32IA-NEXT: and a7, a5, a4 2496; RV32IA-NEXT: mv a6, a5 2497; RV32IA-NEXT: sll a7, a7, a3 2498; RV32IA-NEXT: sra a7, a7, a3 2499; RV32IA-NEXT: bge a7, a1, .LBB38_3 2500; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB38_1 Depth=1 2501; RV32IA-NEXT: xor a6, a5, a1 2502; RV32IA-NEXT: and a6, a6, a4 2503; RV32IA-NEXT: xor a6, a5, a6 2504; RV32IA-NEXT: .LBB38_3: # in Loop: Header=BB38_1 Depth=1 2505; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 2506; RV32IA-NEXT: bnez a6, .LBB38_1 2507; RV32IA-NEXT: # %bb.4: 2508; RV32IA-NEXT: srl a0, a5, a0 2509; RV32IA-NEXT: ret 2510; 2511; RV64I-LABEL: atomicrmw_max_i8_acq_rel: 2512; RV64I: # %bb.0: 2513; RV64I-NEXT: addi sp, sp, -48 2514; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2515; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2516; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2517; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2518; RV64I-NEXT: mv s0, a0 2519; RV64I-NEXT: lbu a3, 0(a0) 2520; RV64I-NEXT: mv s1, a1 2521; RV64I-NEXT: slli a0, a1, 56 2522; RV64I-NEXT: srai s2, a0, 56 2523; RV64I-NEXT: j .LBB38_2 2524; RV64I-NEXT: .LBB38_1: # %atomicrmw.start 2525; RV64I-NEXT: # in Loop: Header=BB38_2 Depth=1 2526; RV64I-NEXT: sb a3, 15(sp) 2527; RV64I-NEXT: addi a1, sp, 15 2528; RV64I-NEXT: li a3, 4 2529; RV64I-NEXT: li a4, 2 2530; RV64I-NEXT: mv a0, s0 2531; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2532; RV64I-NEXT: lb a3, 15(sp) 2533; RV64I-NEXT: bnez a0, .LBB38_4 2534; RV64I-NEXT: .LBB38_2: # %atomicrmw.start 2535; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2536; RV64I-NEXT: slli a0, a3, 56 2537; RV64I-NEXT: srai a0, a0, 56 2538; RV64I-NEXT: mv a2, a3 2539; RV64I-NEXT: blt s2, a0, .LBB38_1 2540; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2541; RV64I-NEXT: # in Loop: Header=BB38_2 Depth=1 2542; RV64I-NEXT: mv a2, s1 2543; RV64I-NEXT: j .LBB38_1 2544; RV64I-NEXT: .LBB38_4: # %atomicrmw.end 2545; RV64I-NEXT: mv a0, a3 2546; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2547; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2548; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2549; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2550; RV64I-NEXT: addi sp, sp, 48 2551; RV64I-NEXT: ret 2552; 2553; RV64IA-LABEL: atomicrmw_max_i8_acq_rel: 2554; RV64IA: # %bb.0: 2555; RV64IA-NEXT: andi a2, a0, -4 2556; RV64IA-NEXT: slliw a0, a0, 3 2557; RV64IA-NEXT: andi a3, a0, 24 2558; RV64IA-NEXT: li a4, 255 2559; RV64IA-NEXT: sllw a4, a4, a0 2560; RV64IA-NEXT: slli a1, a1, 56 2561; RV64IA-NEXT: srai a1, a1, 56 2562; RV64IA-NEXT: sllw a1, a1, a0 2563; RV64IA-NEXT: xori a3, a3, 56 2564; RV64IA-NEXT: .LBB38_1: # =>This Inner Loop Header: Depth=1 2565; RV64IA-NEXT: lr.w.aq a5, (a2) 2566; RV64IA-NEXT: and a7, a5, a4 2567; RV64IA-NEXT: mv a6, a5 2568; RV64IA-NEXT: sll a7, a7, a3 2569; RV64IA-NEXT: sra a7, a7, a3 2570; RV64IA-NEXT: bge a7, a1, .LBB38_3 2571; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB38_1 Depth=1 2572; RV64IA-NEXT: xor a6, a5, a1 2573; RV64IA-NEXT: and a6, a6, a4 2574; RV64IA-NEXT: xor a6, a5, a6 2575; RV64IA-NEXT: .LBB38_3: # in Loop: Header=BB38_1 Depth=1 2576; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 2577; RV64IA-NEXT: bnez a6, .LBB38_1 2578; RV64IA-NEXT: # %bb.4: 2579; RV64IA-NEXT: srlw a0, a5, a0 2580; RV64IA-NEXT: ret 2581 %1 = atomicrmw max i8* %a, i8 %b acq_rel 2582 ret i8 %1 2583} 2584 2585define i8 @atomicrmw_max_i8_seq_cst(i8 *%a, i8 %b) nounwind { 2586; RV32I-LABEL: atomicrmw_max_i8_seq_cst: 2587; RV32I: # %bb.0: 2588; RV32I-NEXT: addi sp, sp, -32 2589; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2590; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2591; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2592; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2593; RV32I-NEXT: mv s0, a0 2594; RV32I-NEXT: lbu a3, 0(a0) 2595; RV32I-NEXT: mv s1, a1 2596; RV32I-NEXT: slli a0, a1, 24 2597; RV32I-NEXT: srai s2, a0, 24 2598; RV32I-NEXT: j .LBB39_2 2599; RV32I-NEXT: .LBB39_1: # %atomicrmw.start 2600; RV32I-NEXT: # in Loop: Header=BB39_2 Depth=1 2601; RV32I-NEXT: sb a3, 15(sp) 2602; RV32I-NEXT: addi a1, sp, 15 2603; RV32I-NEXT: li a3, 5 2604; RV32I-NEXT: li a4, 5 2605; RV32I-NEXT: mv a0, s0 2606; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2607; RV32I-NEXT: lb a3, 15(sp) 2608; RV32I-NEXT: bnez a0, .LBB39_4 2609; RV32I-NEXT: .LBB39_2: # %atomicrmw.start 2610; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2611; RV32I-NEXT: slli a0, a3, 24 2612; RV32I-NEXT: srai a0, a0, 24 2613; RV32I-NEXT: mv a2, a3 2614; RV32I-NEXT: blt s2, a0, .LBB39_1 2615; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2616; RV32I-NEXT: # in Loop: Header=BB39_2 Depth=1 2617; RV32I-NEXT: mv a2, s1 2618; RV32I-NEXT: j .LBB39_1 2619; RV32I-NEXT: .LBB39_4: # %atomicrmw.end 2620; RV32I-NEXT: mv a0, a3 2621; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2622; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2623; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2624; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2625; RV32I-NEXT: addi sp, sp, 32 2626; RV32I-NEXT: ret 2627; 2628; RV32IA-LABEL: atomicrmw_max_i8_seq_cst: 2629; RV32IA: # %bb.0: 2630; RV32IA-NEXT: andi a2, a0, -4 2631; RV32IA-NEXT: slli a0, a0, 3 2632; RV32IA-NEXT: andi a3, a0, 24 2633; RV32IA-NEXT: li a4, 255 2634; RV32IA-NEXT: sll a4, a4, a0 2635; RV32IA-NEXT: slli a1, a1, 24 2636; RV32IA-NEXT: srai a1, a1, 24 2637; RV32IA-NEXT: sll a1, a1, a0 2638; RV32IA-NEXT: xori a3, a3, 24 2639; RV32IA-NEXT: .LBB39_1: # =>This Inner Loop Header: Depth=1 2640; RV32IA-NEXT: lr.w.aqrl a5, (a2) 2641; RV32IA-NEXT: and a7, a5, a4 2642; RV32IA-NEXT: mv a6, a5 2643; RV32IA-NEXT: sll a7, a7, a3 2644; RV32IA-NEXT: sra a7, a7, a3 2645; RV32IA-NEXT: bge a7, a1, .LBB39_3 2646; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB39_1 Depth=1 2647; RV32IA-NEXT: xor a6, a5, a1 2648; RV32IA-NEXT: and a6, a6, a4 2649; RV32IA-NEXT: xor a6, a5, a6 2650; RV32IA-NEXT: .LBB39_3: # in Loop: Header=BB39_1 Depth=1 2651; RV32IA-NEXT: sc.w.aqrl a6, a6, (a2) 2652; RV32IA-NEXT: bnez a6, .LBB39_1 2653; RV32IA-NEXT: # %bb.4: 2654; RV32IA-NEXT: srl a0, a5, a0 2655; RV32IA-NEXT: ret 2656; 2657; RV64I-LABEL: atomicrmw_max_i8_seq_cst: 2658; RV64I: # %bb.0: 2659; RV64I-NEXT: addi sp, sp, -48 2660; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2661; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2662; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2663; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2664; RV64I-NEXT: mv s0, a0 2665; RV64I-NEXT: lbu a3, 0(a0) 2666; RV64I-NEXT: mv s1, a1 2667; RV64I-NEXT: slli a0, a1, 56 2668; RV64I-NEXT: srai s2, a0, 56 2669; RV64I-NEXT: j .LBB39_2 2670; RV64I-NEXT: .LBB39_1: # %atomicrmw.start 2671; RV64I-NEXT: # in Loop: Header=BB39_2 Depth=1 2672; RV64I-NEXT: sb a3, 15(sp) 2673; RV64I-NEXT: addi a1, sp, 15 2674; RV64I-NEXT: li a3, 5 2675; RV64I-NEXT: li a4, 5 2676; RV64I-NEXT: mv a0, s0 2677; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2678; RV64I-NEXT: lb a3, 15(sp) 2679; RV64I-NEXT: bnez a0, .LBB39_4 2680; RV64I-NEXT: .LBB39_2: # %atomicrmw.start 2681; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2682; RV64I-NEXT: slli a0, a3, 56 2683; RV64I-NEXT: srai a0, a0, 56 2684; RV64I-NEXT: mv a2, a3 2685; RV64I-NEXT: blt s2, a0, .LBB39_1 2686; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2687; RV64I-NEXT: # in Loop: Header=BB39_2 Depth=1 2688; RV64I-NEXT: mv a2, s1 2689; RV64I-NEXT: j .LBB39_1 2690; RV64I-NEXT: .LBB39_4: # %atomicrmw.end 2691; RV64I-NEXT: mv a0, a3 2692; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2693; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2694; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2695; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2696; RV64I-NEXT: addi sp, sp, 48 2697; RV64I-NEXT: ret 2698; 2699; RV64IA-LABEL: atomicrmw_max_i8_seq_cst: 2700; RV64IA: # %bb.0: 2701; RV64IA-NEXT: andi a2, a0, -4 2702; RV64IA-NEXT: slliw a0, a0, 3 2703; RV64IA-NEXT: andi a3, a0, 24 2704; RV64IA-NEXT: li a4, 255 2705; RV64IA-NEXT: sllw a4, a4, a0 2706; RV64IA-NEXT: slli a1, a1, 56 2707; RV64IA-NEXT: srai a1, a1, 56 2708; RV64IA-NEXT: sllw a1, a1, a0 2709; RV64IA-NEXT: xori a3, a3, 56 2710; RV64IA-NEXT: .LBB39_1: # =>This Inner Loop Header: Depth=1 2711; RV64IA-NEXT: lr.w.aqrl a5, (a2) 2712; RV64IA-NEXT: and a7, a5, a4 2713; RV64IA-NEXT: mv a6, a5 2714; RV64IA-NEXT: sll a7, a7, a3 2715; RV64IA-NEXT: sra a7, a7, a3 2716; RV64IA-NEXT: bge a7, a1, .LBB39_3 2717; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB39_1 Depth=1 2718; RV64IA-NEXT: xor a6, a5, a1 2719; RV64IA-NEXT: and a6, a6, a4 2720; RV64IA-NEXT: xor a6, a5, a6 2721; RV64IA-NEXT: .LBB39_3: # in Loop: Header=BB39_1 Depth=1 2722; RV64IA-NEXT: sc.w.aqrl a6, a6, (a2) 2723; RV64IA-NEXT: bnez a6, .LBB39_1 2724; RV64IA-NEXT: # %bb.4: 2725; RV64IA-NEXT: srlw a0, a5, a0 2726; RV64IA-NEXT: ret 2727 %1 = atomicrmw max i8* %a, i8 %b seq_cst 2728 ret i8 %1 2729} 2730 2731define i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind { 2732; RV32I-LABEL: atomicrmw_min_i8_monotonic: 2733; RV32I: # %bb.0: 2734; RV32I-NEXT: addi sp, sp, -32 2735; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2736; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2737; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2738; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2739; RV32I-NEXT: mv s0, a0 2740; RV32I-NEXT: lbu a3, 0(a0) 2741; RV32I-NEXT: mv s1, a1 2742; RV32I-NEXT: slli a0, a1, 24 2743; RV32I-NEXT: srai s2, a0, 24 2744; RV32I-NEXT: j .LBB40_2 2745; RV32I-NEXT: .LBB40_1: # %atomicrmw.start 2746; RV32I-NEXT: # in Loop: Header=BB40_2 Depth=1 2747; RV32I-NEXT: sb a3, 15(sp) 2748; RV32I-NEXT: addi a1, sp, 15 2749; RV32I-NEXT: mv a0, s0 2750; RV32I-NEXT: li a3, 0 2751; RV32I-NEXT: li a4, 0 2752; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2753; RV32I-NEXT: lb a3, 15(sp) 2754; RV32I-NEXT: bnez a0, .LBB40_4 2755; RV32I-NEXT: .LBB40_2: # %atomicrmw.start 2756; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2757; RV32I-NEXT: slli a0, a3, 24 2758; RV32I-NEXT: srai a0, a0, 24 2759; RV32I-NEXT: mv a2, a3 2760; RV32I-NEXT: bge s2, a0, .LBB40_1 2761; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2762; RV32I-NEXT: # in Loop: Header=BB40_2 Depth=1 2763; RV32I-NEXT: mv a2, s1 2764; RV32I-NEXT: j .LBB40_1 2765; RV32I-NEXT: .LBB40_4: # %atomicrmw.end 2766; RV32I-NEXT: mv a0, a3 2767; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2768; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2769; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2770; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2771; RV32I-NEXT: addi sp, sp, 32 2772; RV32I-NEXT: ret 2773; 2774; RV32IA-LABEL: atomicrmw_min_i8_monotonic: 2775; RV32IA: # %bb.0: 2776; RV32IA-NEXT: andi a2, a0, -4 2777; RV32IA-NEXT: slli a0, a0, 3 2778; RV32IA-NEXT: andi a3, a0, 24 2779; RV32IA-NEXT: li a4, 255 2780; RV32IA-NEXT: sll a4, a4, a0 2781; RV32IA-NEXT: slli a1, a1, 24 2782; RV32IA-NEXT: srai a1, a1, 24 2783; RV32IA-NEXT: sll a1, a1, a0 2784; RV32IA-NEXT: xori a3, a3, 24 2785; RV32IA-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 2786; RV32IA-NEXT: lr.w a5, (a2) 2787; RV32IA-NEXT: and a7, a5, a4 2788; RV32IA-NEXT: mv a6, a5 2789; RV32IA-NEXT: sll a7, a7, a3 2790; RV32IA-NEXT: sra a7, a7, a3 2791; RV32IA-NEXT: bge a1, a7, .LBB40_3 2792; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB40_1 Depth=1 2793; RV32IA-NEXT: xor a6, a5, a1 2794; RV32IA-NEXT: and a6, a6, a4 2795; RV32IA-NEXT: xor a6, a5, a6 2796; RV32IA-NEXT: .LBB40_3: # in Loop: Header=BB40_1 Depth=1 2797; RV32IA-NEXT: sc.w a6, a6, (a2) 2798; RV32IA-NEXT: bnez a6, .LBB40_1 2799; RV32IA-NEXT: # %bb.4: 2800; RV32IA-NEXT: srl a0, a5, a0 2801; RV32IA-NEXT: ret 2802; 2803; RV64I-LABEL: atomicrmw_min_i8_monotonic: 2804; RV64I: # %bb.0: 2805; RV64I-NEXT: addi sp, sp, -48 2806; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2807; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2808; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2809; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2810; RV64I-NEXT: mv s0, a0 2811; RV64I-NEXT: lbu a3, 0(a0) 2812; RV64I-NEXT: mv s1, a1 2813; RV64I-NEXT: slli a0, a1, 56 2814; RV64I-NEXT: srai s2, a0, 56 2815; RV64I-NEXT: j .LBB40_2 2816; RV64I-NEXT: .LBB40_1: # %atomicrmw.start 2817; RV64I-NEXT: # in Loop: Header=BB40_2 Depth=1 2818; RV64I-NEXT: sb a3, 15(sp) 2819; RV64I-NEXT: addi a1, sp, 15 2820; RV64I-NEXT: mv a0, s0 2821; RV64I-NEXT: li a3, 0 2822; RV64I-NEXT: li a4, 0 2823; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2824; RV64I-NEXT: lb a3, 15(sp) 2825; RV64I-NEXT: bnez a0, .LBB40_4 2826; RV64I-NEXT: .LBB40_2: # %atomicrmw.start 2827; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2828; RV64I-NEXT: slli a0, a3, 56 2829; RV64I-NEXT: srai a0, a0, 56 2830; RV64I-NEXT: mv a2, a3 2831; RV64I-NEXT: bge s2, a0, .LBB40_1 2832; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2833; RV64I-NEXT: # in Loop: Header=BB40_2 Depth=1 2834; RV64I-NEXT: mv a2, s1 2835; RV64I-NEXT: j .LBB40_1 2836; RV64I-NEXT: .LBB40_4: # %atomicrmw.end 2837; RV64I-NEXT: mv a0, a3 2838; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2839; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2840; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2841; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2842; RV64I-NEXT: addi sp, sp, 48 2843; RV64I-NEXT: ret 2844; 2845; RV64IA-LABEL: atomicrmw_min_i8_monotonic: 2846; RV64IA: # %bb.0: 2847; RV64IA-NEXT: andi a2, a0, -4 2848; RV64IA-NEXT: slliw a0, a0, 3 2849; RV64IA-NEXT: andi a3, a0, 24 2850; RV64IA-NEXT: li a4, 255 2851; RV64IA-NEXT: sllw a4, a4, a0 2852; RV64IA-NEXT: slli a1, a1, 56 2853; RV64IA-NEXT: srai a1, a1, 56 2854; RV64IA-NEXT: sllw a1, a1, a0 2855; RV64IA-NEXT: xori a3, a3, 56 2856; RV64IA-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 2857; RV64IA-NEXT: lr.w a5, (a2) 2858; RV64IA-NEXT: and a7, a5, a4 2859; RV64IA-NEXT: mv a6, a5 2860; RV64IA-NEXT: sll a7, a7, a3 2861; RV64IA-NEXT: sra a7, a7, a3 2862; RV64IA-NEXT: bge a1, a7, .LBB40_3 2863; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB40_1 Depth=1 2864; RV64IA-NEXT: xor a6, a5, a1 2865; RV64IA-NEXT: and a6, a6, a4 2866; RV64IA-NEXT: xor a6, a5, a6 2867; RV64IA-NEXT: .LBB40_3: # in Loop: Header=BB40_1 Depth=1 2868; RV64IA-NEXT: sc.w a6, a6, (a2) 2869; RV64IA-NEXT: bnez a6, .LBB40_1 2870; RV64IA-NEXT: # %bb.4: 2871; RV64IA-NEXT: srlw a0, a5, a0 2872; RV64IA-NEXT: ret 2873 %1 = atomicrmw min i8* %a, i8 %b monotonic 2874 ret i8 %1 2875} 2876 2877define i8 @atomicrmw_min_i8_acquire(i8 *%a, i8 %b) nounwind { 2878; RV32I-LABEL: atomicrmw_min_i8_acquire: 2879; RV32I: # %bb.0: 2880; RV32I-NEXT: addi sp, sp, -32 2881; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2882; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2883; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2884; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2885; RV32I-NEXT: mv s0, a0 2886; RV32I-NEXT: lbu a3, 0(a0) 2887; RV32I-NEXT: mv s1, a1 2888; RV32I-NEXT: slli a0, a1, 24 2889; RV32I-NEXT: srai s2, a0, 24 2890; RV32I-NEXT: j .LBB41_2 2891; RV32I-NEXT: .LBB41_1: # %atomicrmw.start 2892; RV32I-NEXT: # in Loop: Header=BB41_2 Depth=1 2893; RV32I-NEXT: sb a3, 15(sp) 2894; RV32I-NEXT: addi a1, sp, 15 2895; RV32I-NEXT: li a3, 2 2896; RV32I-NEXT: li a4, 2 2897; RV32I-NEXT: mv a0, s0 2898; RV32I-NEXT: call __atomic_compare_exchange_1@plt 2899; RV32I-NEXT: lb a3, 15(sp) 2900; RV32I-NEXT: bnez a0, .LBB41_4 2901; RV32I-NEXT: .LBB41_2: # %atomicrmw.start 2902; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2903; RV32I-NEXT: slli a0, a3, 24 2904; RV32I-NEXT: srai a0, a0, 24 2905; RV32I-NEXT: mv a2, a3 2906; RV32I-NEXT: bge s2, a0, .LBB41_1 2907; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2908; RV32I-NEXT: # in Loop: Header=BB41_2 Depth=1 2909; RV32I-NEXT: mv a2, s1 2910; RV32I-NEXT: j .LBB41_1 2911; RV32I-NEXT: .LBB41_4: # %atomicrmw.end 2912; RV32I-NEXT: mv a0, a3 2913; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2914; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2915; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2916; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2917; RV32I-NEXT: addi sp, sp, 32 2918; RV32I-NEXT: ret 2919; 2920; RV32IA-LABEL: atomicrmw_min_i8_acquire: 2921; RV32IA: # %bb.0: 2922; RV32IA-NEXT: andi a2, a0, -4 2923; RV32IA-NEXT: slli a0, a0, 3 2924; RV32IA-NEXT: andi a3, a0, 24 2925; RV32IA-NEXT: li a4, 255 2926; RV32IA-NEXT: sll a4, a4, a0 2927; RV32IA-NEXT: slli a1, a1, 24 2928; RV32IA-NEXT: srai a1, a1, 24 2929; RV32IA-NEXT: sll a1, a1, a0 2930; RV32IA-NEXT: xori a3, a3, 24 2931; RV32IA-NEXT: .LBB41_1: # =>This Inner Loop Header: Depth=1 2932; RV32IA-NEXT: lr.w.aq a5, (a2) 2933; RV32IA-NEXT: and a7, a5, a4 2934; RV32IA-NEXT: mv a6, a5 2935; RV32IA-NEXT: sll a7, a7, a3 2936; RV32IA-NEXT: sra a7, a7, a3 2937; RV32IA-NEXT: bge a1, a7, .LBB41_3 2938; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB41_1 Depth=1 2939; RV32IA-NEXT: xor a6, a5, a1 2940; RV32IA-NEXT: and a6, a6, a4 2941; RV32IA-NEXT: xor a6, a5, a6 2942; RV32IA-NEXT: .LBB41_3: # in Loop: Header=BB41_1 Depth=1 2943; RV32IA-NEXT: sc.w a6, a6, (a2) 2944; RV32IA-NEXT: bnez a6, .LBB41_1 2945; RV32IA-NEXT: # %bb.4: 2946; RV32IA-NEXT: srl a0, a5, a0 2947; RV32IA-NEXT: ret 2948; 2949; RV64I-LABEL: atomicrmw_min_i8_acquire: 2950; RV64I: # %bb.0: 2951; RV64I-NEXT: addi sp, sp, -48 2952; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2953; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2954; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2955; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2956; RV64I-NEXT: mv s0, a0 2957; RV64I-NEXT: lbu a3, 0(a0) 2958; RV64I-NEXT: mv s1, a1 2959; RV64I-NEXT: slli a0, a1, 56 2960; RV64I-NEXT: srai s2, a0, 56 2961; RV64I-NEXT: j .LBB41_2 2962; RV64I-NEXT: .LBB41_1: # %atomicrmw.start 2963; RV64I-NEXT: # in Loop: Header=BB41_2 Depth=1 2964; RV64I-NEXT: sb a3, 15(sp) 2965; RV64I-NEXT: addi a1, sp, 15 2966; RV64I-NEXT: li a3, 2 2967; RV64I-NEXT: li a4, 2 2968; RV64I-NEXT: mv a0, s0 2969; RV64I-NEXT: call __atomic_compare_exchange_1@plt 2970; RV64I-NEXT: lb a3, 15(sp) 2971; RV64I-NEXT: bnez a0, .LBB41_4 2972; RV64I-NEXT: .LBB41_2: # %atomicrmw.start 2973; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2974; RV64I-NEXT: slli a0, a3, 56 2975; RV64I-NEXT: srai a0, a0, 56 2976; RV64I-NEXT: mv a2, a3 2977; RV64I-NEXT: bge s2, a0, .LBB41_1 2978; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2979; RV64I-NEXT: # in Loop: Header=BB41_2 Depth=1 2980; RV64I-NEXT: mv a2, s1 2981; RV64I-NEXT: j .LBB41_1 2982; RV64I-NEXT: .LBB41_4: # %atomicrmw.end 2983; RV64I-NEXT: mv a0, a3 2984; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2985; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2986; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2987; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2988; RV64I-NEXT: addi sp, sp, 48 2989; RV64I-NEXT: ret 2990; 2991; RV64IA-LABEL: atomicrmw_min_i8_acquire: 2992; RV64IA: # %bb.0: 2993; RV64IA-NEXT: andi a2, a0, -4 2994; RV64IA-NEXT: slliw a0, a0, 3 2995; RV64IA-NEXT: andi a3, a0, 24 2996; RV64IA-NEXT: li a4, 255 2997; RV64IA-NEXT: sllw a4, a4, a0 2998; RV64IA-NEXT: slli a1, a1, 56 2999; RV64IA-NEXT: srai a1, a1, 56 3000; RV64IA-NEXT: sllw a1, a1, a0 3001; RV64IA-NEXT: xori a3, a3, 56 3002; RV64IA-NEXT: .LBB41_1: # =>This Inner Loop Header: Depth=1 3003; RV64IA-NEXT: lr.w.aq a5, (a2) 3004; RV64IA-NEXT: and a7, a5, a4 3005; RV64IA-NEXT: mv a6, a5 3006; RV64IA-NEXT: sll a7, a7, a3 3007; RV64IA-NEXT: sra a7, a7, a3 3008; RV64IA-NEXT: bge a1, a7, .LBB41_3 3009; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB41_1 Depth=1 3010; RV64IA-NEXT: xor a6, a5, a1 3011; RV64IA-NEXT: and a6, a6, a4 3012; RV64IA-NEXT: xor a6, a5, a6 3013; RV64IA-NEXT: .LBB41_3: # in Loop: Header=BB41_1 Depth=1 3014; RV64IA-NEXT: sc.w a6, a6, (a2) 3015; RV64IA-NEXT: bnez a6, .LBB41_1 3016; RV64IA-NEXT: # %bb.4: 3017; RV64IA-NEXT: srlw a0, a5, a0 3018; RV64IA-NEXT: ret 3019 %1 = atomicrmw min i8* %a, i8 %b acquire 3020 ret i8 %1 3021} 3022 3023define i8 @atomicrmw_min_i8_release(i8 *%a, i8 %b) nounwind { 3024; RV32I-LABEL: atomicrmw_min_i8_release: 3025; RV32I: # %bb.0: 3026; RV32I-NEXT: addi sp, sp, -32 3027; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3028; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3029; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3030; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3031; RV32I-NEXT: mv s0, a0 3032; RV32I-NEXT: lbu a3, 0(a0) 3033; RV32I-NEXT: mv s1, a1 3034; RV32I-NEXT: slli a0, a1, 24 3035; RV32I-NEXT: srai s2, a0, 24 3036; RV32I-NEXT: j .LBB42_2 3037; RV32I-NEXT: .LBB42_1: # %atomicrmw.start 3038; RV32I-NEXT: # in Loop: Header=BB42_2 Depth=1 3039; RV32I-NEXT: sb a3, 15(sp) 3040; RV32I-NEXT: addi a1, sp, 15 3041; RV32I-NEXT: li a3, 3 3042; RV32I-NEXT: mv a0, s0 3043; RV32I-NEXT: li a4, 0 3044; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3045; RV32I-NEXT: lb a3, 15(sp) 3046; RV32I-NEXT: bnez a0, .LBB42_4 3047; RV32I-NEXT: .LBB42_2: # %atomicrmw.start 3048; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3049; RV32I-NEXT: slli a0, a3, 24 3050; RV32I-NEXT: srai a0, a0, 24 3051; RV32I-NEXT: mv a2, a3 3052; RV32I-NEXT: bge s2, a0, .LBB42_1 3053; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3054; RV32I-NEXT: # in Loop: Header=BB42_2 Depth=1 3055; RV32I-NEXT: mv a2, s1 3056; RV32I-NEXT: j .LBB42_1 3057; RV32I-NEXT: .LBB42_4: # %atomicrmw.end 3058; RV32I-NEXT: mv a0, a3 3059; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3060; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3061; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3062; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3063; RV32I-NEXT: addi sp, sp, 32 3064; RV32I-NEXT: ret 3065; 3066; RV32IA-LABEL: atomicrmw_min_i8_release: 3067; RV32IA: # %bb.0: 3068; RV32IA-NEXT: andi a2, a0, -4 3069; RV32IA-NEXT: slli a0, a0, 3 3070; RV32IA-NEXT: andi a3, a0, 24 3071; RV32IA-NEXT: li a4, 255 3072; RV32IA-NEXT: sll a4, a4, a0 3073; RV32IA-NEXT: slli a1, a1, 24 3074; RV32IA-NEXT: srai a1, a1, 24 3075; RV32IA-NEXT: sll a1, a1, a0 3076; RV32IA-NEXT: xori a3, a3, 24 3077; RV32IA-NEXT: .LBB42_1: # =>This Inner Loop Header: Depth=1 3078; RV32IA-NEXT: lr.w a5, (a2) 3079; RV32IA-NEXT: and a7, a5, a4 3080; RV32IA-NEXT: mv a6, a5 3081; RV32IA-NEXT: sll a7, a7, a3 3082; RV32IA-NEXT: sra a7, a7, a3 3083; RV32IA-NEXT: bge a1, a7, .LBB42_3 3084; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB42_1 Depth=1 3085; RV32IA-NEXT: xor a6, a5, a1 3086; RV32IA-NEXT: and a6, a6, a4 3087; RV32IA-NEXT: xor a6, a5, a6 3088; RV32IA-NEXT: .LBB42_3: # in Loop: Header=BB42_1 Depth=1 3089; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 3090; RV32IA-NEXT: bnez a6, .LBB42_1 3091; RV32IA-NEXT: # %bb.4: 3092; RV32IA-NEXT: srl a0, a5, a0 3093; RV32IA-NEXT: ret 3094; 3095; RV64I-LABEL: atomicrmw_min_i8_release: 3096; RV64I: # %bb.0: 3097; RV64I-NEXT: addi sp, sp, -48 3098; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3099; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3100; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3101; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3102; RV64I-NEXT: mv s0, a0 3103; RV64I-NEXT: lbu a3, 0(a0) 3104; RV64I-NEXT: mv s1, a1 3105; RV64I-NEXT: slli a0, a1, 56 3106; RV64I-NEXT: srai s2, a0, 56 3107; RV64I-NEXT: j .LBB42_2 3108; RV64I-NEXT: .LBB42_1: # %atomicrmw.start 3109; RV64I-NEXT: # in Loop: Header=BB42_2 Depth=1 3110; RV64I-NEXT: sb a3, 15(sp) 3111; RV64I-NEXT: addi a1, sp, 15 3112; RV64I-NEXT: li a3, 3 3113; RV64I-NEXT: mv a0, s0 3114; RV64I-NEXT: li a4, 0 3115; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3116; RV64I-NEXT: lb a3, 15(sp) 3117; RV64I-NEXT: bnez a0, .LBB42_4 3118; RV64I-NEXT: .LBB42_2: # %atomicrmw.start 3119; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3120; RV64I-NEXT: slli a0, a3, 56 3121; RV64I-NEXT: srai a0, a0, 56 3122; RV64I-NEXT: mv a2, a3 3123; RV64I-NEXT: bge s2, a0, .LBB42_1 3124; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3125; RV64I-NEXT: # in Loop: Header=BB42_2 Depth=1 3126; RV64I-NEXT: mv a2, s1 3127; RV64I-NEXT: j .LBB42_1 3128; RV64I-NEXT: .LBB42_4: # %atomicrmw.end 3129; RV64I-NEXT: mv a0, a3 3130; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3131; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3132; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3133; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3134; RV64I-NEXT: addi sp, sp, 48 3135; RV64I-NEXT: ret 3136; 3137; RV64IA-LABEL: atomicrmw_min_i8_release: 3138; RV64IA: # %bb.0: 3139; RV64IA-NEXT: andi a2, a0, -4 3140; RV64IA-NEXT: slliw a0, a0, 3 3141; RV64IA-NEXT: andi a3, a0, 24 3142; RV64IA-NEXT: li a4, 255 3143; RV64IA-NEXT: sllw a4, a4, a0 3144; RV64IA-NEXT: slli a1, a1, 56 3145; RV64IA-NEXT: srai a1, a1, 56 3146; RV64IA-NEXT: sllw a1, a1, a0 3147; RV64IA-NEXT: xori a3, a3, 56 3148; RV64IA-NEXT: .LBB42_1: # =>This Inner Loop Header: Depth=1 3149; RV64IA-NEXT: lr.w a5, (a2) 3150; RV64IA-NEXT: and a7, a5, a4 3151; RV64IA-NEXT: mv a6, a5 3152; RV64IA-NEXT: sll a7, a7, a3 3153; RV64IA-NEXT: sra a7, a7, a3 3154; RV64IA-NEXT: bge a1, a7, .LBB42_3 3155; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB42_1 Depth=1 3156; RV64IA-NEXT: xor a6, a5, a1 3157; RV64IA-NEXT: and a6, a6, a4 3158; RV64IA-NEXT: xor a6, a5, a6 3159; RV64IA-NEXT: .LBB42_3: # in Loop: Header=BB42_1 Depth=1 3160; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 3161; RV64IA-NEXT: bnez a6, .LBB42_1 3162; RV64IA-NEXT: # %bb.4: 3163; RV64IA-NEXT: srlw a0, a5, a0 3164; RV64IA-NEXT: ret 3165 %1 = atomicrmw min i8* %a, i8 %b release 3166 ret i8 %1 3167} 3168 3169define i8 @atomicrmw_min_i8_acq_rel(i8 *%a, i8 %b) nounwind { 3170; RV32I-LABEL: atomicrmw_min_i8_acq_rel: 3171; RV32I: # %bb.0: 3172; RV32I-NEXT: addi sp, sp, -32 3173; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3174; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3175; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3176; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3177; RV32I-NEXT: mv s0, a0 3178; RV32I-NEXT: lbu a3, 0(a0) 3179; RV32I-NEXT: mv s1, a1 3180; RV32I-NEXT: slli a0, a1, 24 3181; RV32I-NEXT: srai s2, a0, 24 3182; RV32I-NEXT: j .LBB43_2 3183; RV32I-NEXT: .LBB43_1: # %atomicrmw.start 3184; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3185; RV32I-NEXT: sb a3, 15(sp) 3186; RV32I-NEXT: addi a1, sp, 15 3187; RV32I-NEXT: li a3, 4 3188; RV32I-NEXT: li a4, 2 3189; RV32I-NEXT: mv a0, s0 3190; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3191; RV32I-NEXT: lb a3, 15(sp) 3192; RV32I-NEXT: bnez a0, .LBB43_4 3193; RV32I-NEXT: .LBB43_2: # %atomicrmw.start 3194; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3195; RV32I-NEXT: slli a0, a3, 24 3196; RV32I-NEXT: srai a0, a0, 24 3197; RV32I-NEXT: mv a2, a3 3198; RV32I-NEXT: bge s2, a0, .LBB43_1 3199; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3200; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3201; RV32I-NEXT: mv a2, s1 3202; RV32I-NEXT: j .LBB43_1 3203; RV32I-NEXT: .LBB43_4: # %atomicrmw.end 3204; RV32I-NEXT: mv a0, a3 3205; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3206; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3207; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3208; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3209; RV32I-NEXT: addi sp, sp, 32 3210; RV32I-NEXT: ret 3211; 3212; RV32IA-LABEL: atomicrmw_min_i8_acq_rel: 3213; RV32IA: # %bb.0: 3214; RV32IA-NEXT: andi a2, a0, -4 3215; RV32IA-NEXT: slli a0, a0, 3 3216; RV32IA-NEXT: andi a3, a0, 24 3217; RV32IA-NEXT: li a4, 255 3218; RV32IA-NEXT: sll a4, a4, a0 3219; RV32IA-NEXT: slli a1, a1, 24 3220; RV32IA-NEXT: srai a1, a1, 24 3221; RV32IA-NEXT: sll a1, a1, a0 3222; RV32IA-NEXT: xori a3, a3, 24 3223; RV32IA-NEXT: .LBB43_1: # =>This Inner Loop Header: Depth=1 3224; RV32IA-NEXT: lr.w.aq a5, (a2) 3225; RV32IA-NEXT: and a7, a5, a4 3226; RV32IA-NEXT: mv a6, a5 3227; RV32IA-NEXT: sll a7, a7, a3 3228; RV32IA-NEXT: sra a7, a7, a3 3229; RV32IA-NEXT: bge a1, a7, .LBB43_3 3230; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB43_1 Depth=1 3231; RV32IA-NEXT: xor a6, a5, a1 3232; RV32IA-NEXT: and a6, a6, a4 3233; RV32IA-NEXT: xor a6, a5, a6 3234; RV32IA-NEXT: .LBB43_3: # in Loop: Header=BB43_1 Depth=1 3235; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 3236; RV32IA-NEXT: bnez a6, .LBB43_1 3237; RV32IA-NEXT: # %bb.4: 3238; RV32IA-NEXT: srl a0, a5, a0 3239; RV32IA-NEXT: ret 3240; 3241; RV64I-LABEL: atomicrmw_min_i8_acq_rel: 3242; RV64I: # %bb.0: 3243; RV64I-NEXT: addi sp, sp, -48 3244; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3245; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3246; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3247; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3248; RV64I-NEXT: mv s0, a0 3249; RV64I-NEXT: lbu a3, 0(a0) 3250; RV64I-NEXT: mv s1, a1 3251; RV64I-NEXT: slli a0, a1, 56 3252; RV64I-NEXT: srai s2, a0, 56 3253; RV64I-NEXT: j .LBB43_2 3254; RV64I-NEXT: .LBB43_1: # %atomicrmw.start 3255; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3256; RV64I-NEXT: sb a3, 15(sp) 3257; RV64I-NEXT: addi a1, sp, 15 3258; RV64I-NEXT: li a3, 4 3259; RV64I-NEXT: li a4, 2 3260; RV64I-NEXT: mv a0, s0 3261; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3262; RV64I-NEXT: lb a3, 15(sp) 3263; RV64I-NEXT: bnez a0, .LBB43_4 3264; RV64I-NEXT: .LBB43_2: # %atomicrmw.start 3265; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3266; RV64I-NEXT: slli a0, a3, 56 3267; RV64I-NEXT: srai a0, a0, 56 3268; RV64I-NEXT: mv a2, a3 3269; RV64I-NEXT: bge s2, a0, .LBB43_1 3270; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3271; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3272; RV64I-NEXT: mv a2, s1 3273; RV64I-NEXT: j .LBB43_1 3274; RV64I-NEXT: .LBB43_4: # %atomicrmw.end 3275; RV64I-NEXT: mv a0, a3 3276; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3277; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3278; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3279; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3280; RV64I-NEXT: addi sp, sp, 48 3281; RV64I-NEXT: ret 3282; 3283; RV64IA-LABEL: atomicrmw_min_i8_acq_rel: 3284; RV64IA: # %bb.0: 3285; RV64IA-NEXT: andi a2, a0, -4 3286; RV64IA-NEXT: slliw a0, a0, 3 3287; RV64IA-NEXT: andi a3, a0, 24 3288; RV64IA-NEXT: li a4, 255 3289; RV64IA-NEXT: sllw a4, a4, a0 3290; RV64IA-NEXT: slli a1, a1, 56 3291; RV64IA-NEXT: srai a1, a1, 56 3292; RV64IA-NEXT: sllw a1, a1, a0 3293; RV64IA-NEXT: xori a3, a3, 56 3294; RV64IA-NEXT: .LBB43_1: # =>This Inner Loop Header: Depth=1 3295; RV64IA-NEXT: lr.w.aq a5, (a2) 3296; RV64IA-NEXT: and a7, a5, a4 3297; RV64IA-NEXT: mv a6, a5 3298; RV64IA-NEXT: sll a7, a7, a3 3299; RV64IA-NEXT: sra a7, a7, a3 3300; RV64IA-NEXT: bge a1, a7, .LBB43_3 3301; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB43_1 Depth=1 3302; RV64IA-NEXT: xor a6, a5, a1 3303; RV64IA-NEXT: and a6, a6, a4 3304; RV64IA-NEXT: xor a6, a5, a6 3305; RV64IA-NEXT: .LBB43_3: # in Loop: Header=BB43_1 Depth=1 3306; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 3307; RV64IA-NEXT: bnez a6, .LBB43_1 3308; RV64IA-NEXT: # %bb.4: 3309; RV64IA-NEXT: srlw a0, a5, a0 3310; RV64IA-NEXT: ret 3311 %1 = atomicrmw min i8* %a, i8 %b acq_rel 3312 ret i8 %1 3313} 3314 3315define i8 @atomicrmw_min_i8_seq_cst(i8 *%a, i8 %b) nounwind { 3316; RV32I-LABEL: atomicrmw_min_i8_seq_cst: 3317; RV32I: # %bb.0: 3318; RV32I-NEXT: addi sp, sp, -32 3319; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3320; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3321; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3322; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3323; RV32I-NEXT: mv s0, a0 3324; RV32I-NEXT: lbu a3, 0(a0) 3325; RV32I-NEXT: mv s1, a1 3326; RV32I-NEXT: slli a0, a1, 24 3327; RV32I-NEXT: srai s2, a0, 24 3328; RV32I-NEXT: j .LBB44_2 3329; RV32I-NEXT: .LBB44_1: # %atomicrmw.start 3330; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3331; RV32I-NEXT: sb a3, 15(sp) 3332; RV32I-NEXT: addi a1, sp, 15 3333; RV32I-NEXT: li a3, 5 3334; RV32I-NEXT: li a4, 5 3335; RV32I-NEXT: mv a0, s0 3336; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3337; RV32I-NEXT: lb a3, 15(sp) 3338; RV32I-NEXT: bnez a0, .LBB44_4 3339; RV32I-NEXT: .LBB44_2: # %atomicrmw.start 3340; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3341; RV32I-NEXT: slli a0, a3, 24 3342; RV32I-NEXT: srai a0, a0, 24 3343; RV32I-NEXT: mv a2, a3 3344; RV32I-NEXT: bge s2, a0, .LBB44_1 3345; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3346; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3347; RV32I-NEXT: mv a2, s1 3348; RV32I-NEXT: j .LBB44_1 3349; RV32I-NEXT: .LBB44_4: # %atomicrmw.end 3350; RV32I-NEXT: mv a0, a3 3351; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3352; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3353; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3354; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3355; RV32I-NEXT: addi sp, sp, 32 3356; RV32I-NEXT: ret 3357; 3358; RV32IA-LABEL: atomicrmw_min_i8_seq_cst: 3359; RV32IA: # %bb.0: 3360; RV32IA-NEXT: andi a2, a0, -4 3361; RV32IA-NEXT: slli a0, a0, 3 3362; RV32IA-NEXT: andi a3, a0, 24 3363; RV32IA-NEXT: li a4, 255 3364; RV32IA-NEXT: sll a4, a4, a0 3365; RV32IA-NEXT: slli a1, a1, 24 3366; RV32IA-NEXT: srai a1, a1, 24 3367; RV32IA-NEXT: sll a1, a1, a0 3368; RV32IA-NEXT: xori a3, a3, 24 3369; RV32IA-NEXT: .LBB44_1: # =>This Inner Loop Header: Depth=1 3370; RV32IA-NEXT: lr.w.aqrl a5, (a2) 3371; RV32IA-NEXT: and a7, a5, a4 3372; RV32IA-NEXT: mv a6, a5 3373; RV32IA-NEXT: sll a7, a7, a3 3374; RV32IA-NEXT: sra a7, a7, a3 3375; RV32IA-NEXT: bge a1, a7, .LBB44_3 3376; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB44_1 Depth=1 3377; RV32IA-NEXT: xor a6, a5, a1 3378; RV32IA-NEXT: and a6, a6, a4 3379; RV32IA-NEXT: xor a6, a5, a6 3380; RV32IA-NEXT: .LBB44_3: # in Loop: Header=BB44_1 Depth=1 3381; RV32IA-NEXT: sc.w.aqrl a6, a6, (a2) 3382; RV32IA-NEXT: bnez a6, .LBB44_1 3383; RV32IA-NEXT: # %bb.4: 3384; RV32IA-NEXT: srl a0, a5, a0 3385; RV32IA-NEXT: ret 3386; 3387; RV64I-LABEL: atomicrmw_min_i8_seq_cst: 3388; RV64I: # %bb.0: 3389; RV64I-NEXT: addi sp, sp, -48 3390; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3391; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3392; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3393; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3394; RV64I-NEXT: mv s0, a0 3395; RV64I-NEXT: lbu a3, 0(a0) 3396; RV64I-NEXT: mv s1, a1 3397; RV64I-NEXT: slli a0, a1, 56 3398; RV64I-NEXT: srai s2, a0, 56 3399; RV64I-NEXT: j .LBB44_2 3400; RV64I-NEXT: .LBB44_1: # %atomicrmw.start 3401; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3402; RV64I-NEXT: sb a3, 15(sp) 3403; RV64I-NEXT: addi a1, sp, 15 3404; RV64I-NEXT: li a3, 5 3405; RV64I-NEXT: li a4, 5 3406; RV64I-NEXT: mv a0, s0 3407; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3408; RV64I-NEXT: lb a3, 15(sp) 3409; RV64I-NEXT: bnez a0, .LBB44_4 3410; RV64I-NEXT: .LBB44_2: # %atomicrmw.start 3411; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3412; RV64I-NEXT: slli a0, a3, 56 3413; RV64I-NEXT: srai a0, a0, 56 3414; RV64I-NEXT: mv a2, a3 3415; RV64I-NEXT: bge s2, a0, .LBB44_1 3416; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3417; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3418; RV64I-NEXT: mv a2, s1 3419; RV64I-NEXT: j .LBB44_1 3420; RV64I-NEXT: .LBB44_4: # %atomicrmw.end 3421; RV64I-NEXT: mv a0, a3 3422; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3423; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3424; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3425; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3426; RV64I-NEXT: addi sp, sp, 48 3427; RV64I-NEXT: ret 3428; 3429; RV64IA-LABEL: atomicrmw_min_i8_seq_cst: 3430; RV64IA: # %bb.0: 3431; RV64IA-NEXT: andi a2, a0, -4 3432; RV64IA-NEXT: slliw a0, a0, 3 3433; RV64IA-NEXT: andi a3, a0, 24 3434; RV64IA-NEXT: li a4, 255 3435; RV64IA-NEXT: sllw a4, a4, a0 3436; RV64IA-NEXT: slli a1, a1, 56 3437; RV64IA-NEXT: srai a1, a1, 56 3438; RV64IA-NEXT: sllw a1, a1, a0 3439; RV64IA-NEXT: xori a3, a3, 56 3440; RV64IA-NEXT: .LBB44_1: # =>This Inner Loop Header: Depth=1 3441; RV64IA-NEXT: lr.w.aqrl a5, (a2) 3442; RV64IA-NEXT: and a7, a5, a4 3443; RV64IA-NEXT: mv a6, a5 3444; RV64IA-NEXT: sll a7, a7, a3 3445; RV64IA-NEXT: sra a7, a7, a3 3446; RV64IA-NEXT: bge a1, a7, .LBB44_3 3447; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB44_1 Depth=1 3448; RV64IA-NEXT: xor a6, a5, a1 3449; RV64IA-NEXT: and a6, a6, a4 3450; RV64IA-NEXT: xor a6, a5, a6 3451; RV64IA-NEXT: .LBB44_3: # in Loop: Header=BB44_1 Depth=1 3452; RV64IA-NEXT: sc.w.aqrl a6, a6, (a2) 3453; RV64IA-NEXT: bnez a6, .LBB44_1 3454; RV64IA-NEXT: # %bb.4: 3455; RV64IA-NEXT: srlw a0, a5, a0 3456; RV64IA-NEXT: ret 3457 %1 = atomicrmw min i8* %a, i8 %b seq_cst 3458 ret i8 %1 3459} 3460 3461define i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind { 3462; RV32I-LABEL: atomicrmw_umax_i8_monotonic: 3463; RV32I: # %bb.0: 3464; RV32I-NEXT: addi sp, sp, -32 3465; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3466; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3467; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3468; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3469; RV32I-NEXT: mv s0, a0 3470; RV32I-NEXT: lbu a3, 0(a0) 3471; RV32I-NEXT: mv s1, a1 3472; RV32I-NEXT: andi s2, a1, 255 3473; RV32I-NEXT: j .LBB45_2 3474; RV32I-NEXT: .LBB45_1: # %atomicrmw.start 3475; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3476; RV32I-NEXT: sb a3, 15(sp) 3477; RV32I-NEXT: addi a1, sp, 15 3478; RV32I-NEXT: mv a0, s0 3479; RV32I-NEXT: li a3, 0 3480; RV32I-NEXT: li a4, 0 3481; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3482; RV32I-NEXT: lb a3, 15(sp) 3483; RV32I-NEXT: bnez a0, .LBB45_4 3484; RV32I-NEXT: .LBB45_2: # %atomicrmw.start 3485; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3486; RV32I-NEXT: andi a0, a3, 255 3487; RV32I-NEXT: mv a2, a3 3488; RV32I-NEXT: bltu s2, a0, .LBB45_1 3489; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3490; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3491; RV32I-NEXT: mv a2, s1 3492; RV32I-NEXT: j .LBB45_1 3493; RV32I-NEXT: .LBB45_4: # %atomicrmw.end 3494; RV32I-NEXT: mv a0, a3 3495; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3496; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3497; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3498; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3499; RV32I-NEXT: addi sp, sp, 32 3500; RV32I-NEXT: ret 3501; 3502; RV32IA-LABEL: atomicrmw_umax_i8_monotonic: 3503; RV32IA: # %bb.0: 3504; RV32IA-NEXT: andi a2, a0, -4 3505; RV32IA-NEXT: slli a0, a0, 3 3506; RV32IA-NEXT: li a3, 255 3507; RV32IA-NEXT: sll a3, a3, a0 3508; RV32IA-NEXT: andi a1, a1, 255 3509; RV32IA-NEXT: sll a1, a1, a0 3510; RV32IA-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 3511; RV32IA-NEXT: lr.w a4, (a2) 3512; RV32IA-NEXT: and a6, a4, a3 3513; RV32IA-NEXT: mv a5, a4 3514; RV32IA-NEXT: bgeu a6, a1, .LBB45_3 3515; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 3516; RV32IA-NEXT: xor a5, a4, a1 3517; RV32IA-NEXT: and a5, a5, a3 3518; RV32IA-NEXT: xor a5, a4, a5 3519; RV32IA-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 3520; RV32IA-NEXT: sc.w a5, a5, (a2) 3521; RV32IA-NEXT: bnez a5, .LBB45_1 3522; RV32IA-NEXT: # %bb.4: 3523; RV32IA-NEXT: srl a0, a4, a0 3524; RV32IA-NEXT: ret 3525; 3526; RV64I-LABEL: atomicrmw_umax_i8_monotonic: 3527; RV64I: # %bb.0: 3528; RV64I-NEXT: addi sp, sp, -48 3529; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3530; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3531; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3532; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3533; RV64I-NEXT: mv s0, a0 3534; RV64I-NEXT: lbu a3, 0(a0) 3535; RV64I-NEXT: mv s1, a1 3536; RV64I-NEXT: andi s2, a1, 255 3537; RV64I-NEXT: j .LBB45_2 3538; RV64I-NEXT: .LBB45_1: # %atomicrmw.start 3539; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3540; RV64I-NEXT: sb a3, 15(sp) 3541; RV64I-NEXT: addi a1, sp, 15 3542; RV64I-NEXT: mv a0, s0 3543; RV64I-NEXT: li a3, 0 3544; RV64I-NEXT: li a4, 0 3545; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3546; RV64I-NEXT: lb a3, 15(sp) 3547; RV64I-NEXT: bnez a0, .LBB45_4 3548; RV64I-NEXT: .LBB45_2: # %atomicrmw.start 3549; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3550; RV64I-NEXT: andi a0, a3, 255 3551; RV64I-NEXT: mv a2, a3 3552; RV64I-NEXT: bltu s2, a0, .LBB45_1 3553; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3554; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3555; RV64I-NEXT: mv a2, s1 3556; RV64I-NEXT: j .LBB45_1 3557; RV64I-NEXT: .LBB45_4: # %atomicrmw.end 3558; RV64I-NEXT: mv a0, a3 3559; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3560; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3561; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3562; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3563; RV64I-NEXT: addi sp, sp, 48 3564; RV64I-NEXT: ret 3565; 3566; RV64IA-LABEL: atomicrmw_umax_i8_monotonic: 3567; RV64IA: # %bb.0: 3568; RV64IA-NEXT: andi a2, a0, -4 3569; RV64IA-NEXT: slliw a0, a0, 3 3570; RV64IA-NEXT: li a3, 255 3571; RV64IA-NEXT: sllw a3, a3, a0 3572; RV64IA-NEXT: andi a1, a1, 255 3573; RV64IA-NEXT: sllw a1, a1, a0 3574; RV64IA-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 3575; RV64IA-NEXT: lr.w a4, (a2) 3576; RV64IA-NEXT: and a6, a4, a3 3577; RV64IA-NEXT: mv a5, a4 3578; RV64IA-NEXT: bgeu a6, a1, .LBB45_3 3579; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 3580; RV64IA-NEXT: xor a5, a4, a1 3581; RV64IA-NEXT: and a5, a5, a3 3582; RV64IA-NEXT: xor a5, a4, a5 3583; RV64IA-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 3584; RV64IA-NEXT: sc.w a5, a5, (a2) 3585; RV64IA-NEXT: bnez a5, .LBB45_1 3586; RV64IA-NEXT: # %bb.4: 3587; RV64IA-NEXT: srlw a0, a4, a0 3588; RV64IA-NEXT: ret 3589 %1 = atomicrmw umax i8* %a, i8 %b monotonic 3590 ret i8 %1 3591} 3592 3593define i8 @atomicrmw_umax_i8_acquire(i8 *%a, i8 %b) nounwind { 3594; RV32I-LABEL: atomicrmw_umax_i8_acquire: 3595; RV32I: # %bb.0: 3596; RV32I-NEXT: addi sp, sp, -32 3597; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3598; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3599; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3600; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3601; RV32I-NEXT: mv s0, a0 3602; RV32I-NEXT: lbu a3, 0(a0) 3603; RV32I-NEXT: mv s1, a1 3604; RV32I-NEXT: andi s2, a1, 255 3605; RV32I-NEXT: j .LBB46_2 3606; RV32I-NEXT: .LBB46_1: # %atomicrmw.start 3607; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3608; RV32I-NEXT: sb a3, 15(sp) 3609; RV32I-NEXT: addi a1, sp, 15 3610; RV32I-NEXT: li a3, 2 3611; RV32I-NEXT: li a4, 2 3612; RV32I-NEXT: mv a0, s0 3613; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3614; RV32I-NEXT: lb a3, 15(sp) 3615; RV32I-NEXT: bnez a0, .LBB46_4 3616; RV32I-NEXT: .LBB46_2: # %atomicrmw.start 3617; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3618; RV32I-NEXT: andi a0, a3, 255 3619; RV32I-NEXT: mv a2, a3 3620; RV32I-NEXT: bltu s2, a0, .LBB46_1 3621; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3622; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3623; RV32I-NEXT: mv a2, s1 3624; RV32I-NEXT: j .LBB46_1 3625; RV32I-NEXT: .LBB46_4: # %atomicrmw.end 3626; RV32I-NEXT: mv a0, a3 3627; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3628; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3629; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3630; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3631; RV32I-NEXT: addi sp, sp, 32 3632; RV32I-NEXT: ret 3633; 3634; RV32IA-LABEL: atomicrmw_umax_i8_acquire: 3635; RV32IA: # %bb.0: 3636; RV32IA-NEXT: andi a2, a0, -4 3637; RV32IA-NEXT: slli a0, a0, 3 3638; RV32IA-NEXT: li a3, 255 3639; RV32IA-NEXT: sll a3, a3, a0 3640; RV32IA-NEXT: andi a1, a1, 255 3641; RV32IA-NEXT: sll a1, a1, a0 3642; RV32IA-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 3643; RV32IA-NEXT: lr.w.aq a4, (a2) 3644; RV32IA-NEXT: and a6, a4, a3 3645; RV32IA-NEXT: mv a5, a4 3646; RV32IA-NEXT: bgeu a6, a1, .LBB46_3 3647; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 3648; RV32IA-NEXT: xor a5, a4, a1 3649; RV32IA-NEXT: and a5, a5, a3 3650; RV32IA-NEXT: xor a5, a4, a5 3651; RV32IA-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 3652; RV32IA-NEXT: sc.w a5, a5, (a2) 3653; RV32IA-NEXT: bnez a5, .LBB46_1 3654; RV32IA-NEXT: # %bb.4: 3655; RV32IA-NEXT: srl a0, a4, a0 3656; RV32IA-NEXT: ret 3657; 3658; RV64I-LABEL: atomicrmw_umax_i8_acquire: 3659; RV64I: # %bb.0: 3660; RV64I-NEXT: addi sp, sp, -48 3661; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3662; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3663; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3664; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3665; RV64I-NEXT: mv s0, a0 3666; RV64I-NEXT: lbu a3, 0(a0) 3667; RV64I-NEXT: mv s1, a1 3668; RV64I-NEXT: andi s2, a1, 255 3669; RV64I-NEXT: j .LBB46_2 3670; RV64I-NEXT: .LBB46_1: # %atomicrmw.start 3671; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3672; RV64I-NEXT: sb a3, 15(sp) 3673; RV64I-NEXT: addi a1, sp, 15 3674; RV64I-NEXT: li a3, 2 3675; RV64I-NEXT: li a4, 2 3676; RV64I-NEXT: mv a0, s0 3677; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3678; RV64I-NEXT: lb a3, 15(sp) 3679; RV64I-NEXT: bnez a0, .LBB46_4 3680; RV64I-NEXT: .LBB46_2: # %atomicrmw.start 3681; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3682; RV64I-NEXT: andi a0, a3, 255 3683; RV64I-NEXT: mv a2, a3 3684; RV64I-NEXT: bltu s2, a0, .LBB46_1 3685; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3686; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3687; RV64I-NEXT: mv a2, s1 3688; RV64I-NEXT: j .LBB46_1 3689; RV64I-NEXT: .LBB46_4: # %atomicrmw.end 3690; RV64I-NEXT: mv a0, a3 3691; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3692; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3693; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3694; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3695; RV64I-NEXT: addi sp, sp, 48 3696; RV64I-NEXT: ret 3697; 3698; RV64IA-LABEL: atomicrmw_umax_i8_acquire: 3699; RV64IA: # %bb.0: 3700; RV64IA-NEXT: andi a2, a0, -4 3701; RV64IA-NEXT: slliw a0, a0, 3 3702; RV64IA-NEXT: li a3, 255 3703; RV64IA-NEXT: sllw a3, a3, a0 3704; RV64IA-NEXT: andi a1, a1, 255 3705; RV64IA-NEXT: sllw a1, a1, a0 3706; RV64IA-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 3707; RV64IA-NEXT: lr.w.aq a4, (a2) 3708; RV64IA-NEXT: and a6, a4, a3 3709; RV64IA-NEXT: mv a5, a4 3710; RV64IA-NEXT: bgeu a6, a1, .LBB46_3 3711; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 3712; RV64IA-NEXT: xor a5, a4, a1 3713; RV64IA-NEXT: and a5, a5, a3 3714; RV64IA-NEXT: xor a5, a4, a5 3715; RV64IA-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 3716; RV64IA-NEXT: sc.w a5, a5, (a2) 3717; RV64IA-NEXT: bnez a5, .LBB46_1 3718; RV64IA-NEXT: # %bb.4: 3719; RV64IA-NEXT: srlw a0, a4, a0 3720; RV64IA-NEXT: ret 3721 %1 = atomicrmw umax i8* %a, i8 %b acquire 3722 ret i8 %1 3723} 3724 3725define i8 @atomicrmw_umax_i8_release(i8 *%a, i8 %b) nounwind { 3726; RV32I-LABEL: atomicrmw_umax_i8_release: 3727; RV32I: # %bb.0: 3728; RV32I-NEXT: addi sp, sp, -32 3729; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3730; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3731; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3732; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3733; RV32I-NEXT: mv s0, a0 3734; RV32I-NEXT: lbu a3, 0(a0) 3735; RV32I-NEXT: mv s1, a1 3736; RV32I-NEXT: andi s2, a1, 255 3737; RV32I-NEXT: j .LBB47_2 3738; RV32I-NEXT: .LBB47_1: # %atomicrmw.start 3739; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1 3740; RV32I-NEXT: sb a3, 15(sp) 3741; RV32I-NEXT: addi a1, sp, 15 3742; RV32I-NEXT: li a3, 3 3743; RV32I-NEXT: mv a0, s0 3744; RV32I-NEXT: li a4, 0 3745; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3746; RV32I-NEXT: lb a3, 15(sp) 3747; RV32I-NEXT: bnez a0, .LBB47_4 3748; RV32I-NEXT: .LBB47_2: # %atomicrmw.start 3749; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3750; RV32I-NEXT: andi a0, a3, 255 3751; RV32I-NEXT: mv a2, a3 3752; RV32I-NEXT: bltu s2, a0, .LBB47_1 3753; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3754; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1 3755; RV32I-NEXT: mv a2, s1 3756; RV32I-NEXT: j .LBB47_1 3757; RV32I-NEXT: .LBB47_4: # %atomicrmw.end 3758; RV32I-NEXT: mv a0, a3 3759; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3760; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3761; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3762; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3763; RV32I-NEXT: addi sp, sp, 32 3764; RV32I-NEXT: ret 3765; 3766; RV32IA-LABEL: atomicrmw_umax_i8_release: 3767; RV32IA: # %bb.0: 3768; RV32IA-NEXT: andi a2, a0, -4 3769; RV32IA-NEXT: slli a0, a0, 3 3770; RV32IA-NEXT: li a3, 255 3771; RV32IA-NEXT: sll a3, a3, a0 3772; RV32IA-NEXT: andi a1, a1, 255 3773; RV32IA-NEXT: sll a1, a1, a0 3774; RV32IA-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 3775; RV32IA-NEXT: lr.w a4, (a2) 3776; RV32IA-NEXT: and a6, a4, a3 3777; RV32IA-NEXT: mv a5, a4 3778; RV32IA-NEXT: bgeu a6, a1, .LBB47_3 3779; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 3780; RV32IA-NEXT: xor a5, a4, a1 3781; RV32IA-NEXT: and a5, a5, a3 3782; RV32IA-NEXT: xor a5, a4, a5 3783; RV32IA-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 3784; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 3785; RV32IA-NEXT: bnez a5, .LBB47_1 3786; RV32IA-NEXT: # %bb.4: 3787; RV32IA-NEXT: srl a0, a4, a0 3788; RV32IA-NEXT: ret 3789; 3790; RV64I-LABEL: atomicrmw_umax_i8_release: 3791; RV64I: # %bb.0: 3792; RV64I-NEXT: addi sp, sp, -48 3793; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3794; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3795; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3796; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3797; RV64I-NEXT: mv s0, a0 3798; RV64I-NEXT: lbu a3, 0(a0) 3799; RV64I-NEXT: mv s1, a1 3800; RV64I-NEXT: andi s2, a1, 255 3801; RV64I-NEXT: j .LBB47_2 3802; RV64I-NEXT: .LBB47_1: # %atomicrmw.start 3803; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1 3804; RV64I-NEXT: sb a3, 15(sp) 3805; RV64I-NEXT: addi a1, sp, 15 3806; RV64I-NEXT: li a3, 3 3807; RV64I-NEXT: mv a0, s0 3808; RV64I-NEXT: li a4, 0 3809; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3810; RV64I-NEXT: lb a3, 15(sp) 3811; RV64I-NEXT: bnez a0, .LBB47_4 3812; RV64I-NEXT: .LBB47_2: # %atomicrmw.start 3813; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3814; RV64I-NEXT: andi a0, a3, 255 3815; RV64I-NEXT: mv a2, a3 3816; RV64I-NEXT: bltu s2, a0, .LBB47_1 3817; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3818; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1 3819; RV64I-NEXT: mv a2, s1 3820; RV64I-NEXT: j .LBB47_1 3821; RV64I-NEXT: .LBB47_4: # %atomicrmw.end 3822; RV64I-NEXT: mv a0, a3 3823; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3824; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3825; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3826; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3827; RV64I-NEXT: addi sp, sp, 48 3828; RV64I-NEXT: ret 3829; 3830; RV64IA-LABEL: atomicrmw_umax_i8_release: 3831; RV64IA: # %bb.0: 3832; RV64IA-NEXT: andi a2, a0, -4 3833; RV64IA-NEXT: slliw a0, a0, 3 3834; RV64IA-NEXT: li a3, 255 3835; RV64IA-NEXT: sllw a3, a3, a0 3836; RV64IA-NEXT: andi a1, a1, 255 3837; RV64IA-NEXT: sllw a1, a1, a0 3838; RV64IA-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 3839; RV64IA-NEXT: lr.w a4, (a2) 3840; RV64IA-NEXT: and a6, a4, a3 3841; RV64IA-NEXT: mv a5, a4 3842; RV64IA-NEXT: bgeu a6, a1, .LBB47_3 3843; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 3844; RV64IA-NEXT: xor a5, a4, a1 3845; RV64IA-NEXT: and a5, a5, a3 3846; RV64IA-NEXT: xor a5, a4, a5 3847; RV64IA-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 3848; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 3849; RV64IA-NEXT: bnez a5, .LBB47_1 3850; RV64IA-NEXT: # %bb.4: 3851; RV64IA-NEXT: srlw a0, a4, a0 3852; RV64IA-NEXT: ret 3853 %1 = atomicrmw umax i8* %a, i8 %b release 3854 ret i8 %1 3855} 3856 3857define i8 @atomicrmw_umax_i8_acq_rel(i8 *%a, i8 %b) nounwind { 3858; RV32I-LABEL: atomicrmw_umax_i8_acq_rel: 3859; RV32I: # %bb.0: 3860; RV32I-NEXT: addi sp, sp, -32 3861; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3862; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3863; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3864; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3865; RV32I-NEXT: mv s0, a0 3866; RV32I-NEXT: lbu a3, 0(a0) 3867; RV32I-NEXT: mv s1, a1 3868; RV32I-NEXT: andi s2, a1, 255 3869; RV32I-NEXT: j .LBB48_2 3870; RV32I-NEXT: .LBB48_1: # %atomicrmw.start 3871; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1 3872; RV32I-NEXT: sb a3, 15(sp) 3873; RV32I-NEXT: addi a1, sp, 15 3874; RV32I-NEXT: li a3, 4 3875; RV32I-NEXT: li a4, 2 3876; RV32I-NEXT: mv a0, s0 3877; RV32I-NEXT: call __atomic_compare_exchange_1@plt 3878; RV32I-NEXT: lb a3, 15(sp) 3879; RV32I-NEXT: bnez a0, .LBB48_4 3880; RV32I-NEXT: .LBB48_2: # %atomicrmw.start 3881; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3882; RV32I-NEXT: andi a0, a3, 255 3883; RV32I-NEXT: mv a2, a3 3884; RV32I-NEXT: bltu s2, a0, .LBB48_1 3885; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3886; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1 3887; RV32I-NEXT: mv a2, s1 3888; RV32I-NEXT: j .LBB48_1 3889; RV32I-NEXT: .LBB48_4: # %atomicrmw.end 3890; RV32I-NEXT: mv a0, a3 3891; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3892; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3893; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3894; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3895; RV32I-NEXT: addi sp, sp, 32 3896; RV32I-NEXT: ret 3897; 3898; RV32IA-LABEL: atomicrmw_umax_i8_acq_rel: 3899; RV32IA: # %bb.0: 3900; RV32IA-NEXT: andi a2, a0, -4 3901; RV32IA-NEXT: slli a0, a0, 3 3902; RV32IA-NEXT: li a3, 255 3903; RV32IA-NEXT: sll a3, a3, a0 3904; RV32IA-NEXT: andi a1, a1, 255 3905; RV32IA-NEXT: sll a1, a1, a0 3906; RV32IA-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 3907; RV32IA-NEXT: lr.w.aq a4, (a2) 3908; RV32IA-NEXT: and a6, a4, a3 3909; RV32IA-NEXT: mv a5, a4 3910; RV32IA-NEXT: bgeu a6, a1, .LBB48_3 3911; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 3912; RV32IA-NEXT: xor a5, a4, a1 3913; RV32IA-NEXT: and a5, a5, a3 3914; RV32IA-NEXT: xor a5, a4, a5 3915; RV32IA-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 3916; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 3917; RV32IA-NEXT: bnez a5, .LBB48_1 3918; RV32IA-NEXT: # %bb.4: 3919; RV32IA-NEXT: srl a0, a4, a0 3920; RV32IA-NEXT: ret 3921; 3922; RV64I-LABEL: atomicrmw_umax_i8_acq_rel: 3923; RV64I: # %bb.0: 3924; RV64I-NEXT: addi sp, sp, -48 3925; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 3926; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 3927; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 3928; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 3929; RV64I-NEXT: mv s0, a0 3930; RV64I-NEXT: lbu a3, 0(a0) 3931; RV64I-NEXT: mv s1, a1 3932; RV64I-NEXT: andi s2, a1, 255 3933; RV64I-NEXT: j .LBB48_2 3934; RV64I-NEXT: .LBB48_1: # %atomicrmw.start 3935; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1 3936; RV64I-NEXT: sb a3, 15(sp) 3937; RV64I-NEXT: addi a1, sp, 15 3938; RV64I-NEXT: li a3, 4 3939; RV64I-NEXT: li a4, 2 3940; RV64I-NEXT: mv a0, s0 3941; RV64I-NEXT: call __atomic_compare_exchange_1@plt 3942; RV64I-NEXT: lb a3, 15(sp) 3943; RV64I-NEXT: bnez a0, .LBB48_4 3944; RV64I-NEXT: .LBB48_2: # %atomicrmw.start 3945; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3946; RV64I-NEXT: andi a0, a3, 255 3947; RV64I-NEXT: mv a2, a3 3948; RV64I-NEXT: bltu s2, a0, .LBB48_1 3949; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3950; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1 3951; RV64I-NEXT: mv a2, s1 3952; RV64I-NEXT: j .LBB48_1 3953; RV64I-NEXT: .LBB48_4: # %atomicrmw.end 3954; RV64I-NEXT: mv a0, a3 3955; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3956; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3957; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3958; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3959; RV64I-NEXT: addi sp, sp, 48 3960; RV64I-NEXT: ret 3961; 3962; RV64IA-LABEL: atomicrmw_umax_i8_acq_rel: 3963; RV64IA: # %bb.0: 3964; RV64IA-NEXT: andi a2, a0, -4 3965; RV64IA-NEXT: slliw a0, a0, 3 3966; RV64IA-NEXT: li a3, 255 3967; RV64IA-NEXT: sllw a3, a3, a0 3968; RV64IA-NEXT: andi a1, a1, 255 3969; RV64IA-NEXT: sllw a1, a1, a0 3970; RV64IA-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 3971; RV64IA-NEXT: lr.w.aq a4, (a2) 3972; RV64IA-NEXT: and a6, a4, a3 3973; RV64IA-NEXT: mv a5, a4 3974; RV64IA-NEXT: bgeu a6, a1, .LBB48_3 3975; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 3976; RV64IA-NEXT: xor a5, a4, a1 3977; RV64IA-NEXT: and a5, a5, a3 3978; RV64IA-NEXT: xor a5, a4, a5 3979; RV64IA-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 3980; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 3981; RV64IA-NEXT: bnez a5, .LBB48_1 3982; RV64IA-NEXT: # %bb.4: 3983; RV64IA-NEXT: srlw a0, a4, a0 3984; RV64IA-NEXT: ret 3985 %1 = atomicrmw umax i8* %a, i8 %b acq_rel 3986 ret i8 %1 3987} 3988 3989define i8 @atomicrmw_umax_i8_seq_cst(i8 *%a, i8 %b) nounwind { 3990; RV32I-LABEL: atomicrmw_umax_i8_seq_cst: 3991; RV32I: # %bb.0: 3992; RV32I-NEXT: addi sp, sp, -32 3993; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3994; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3995; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3996; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3997; RV32I-NEXT: mv s0, a0 3998; RV32I-NEXT: lbu a3, 0(a0) 3999; RV32I-NEXT: mv s1, a1 4000; RV32I-NEXT: andi s2, a1, 255 4001; RV32I-NEXT: j .LBB49_2 4002; RV32I-NEXT: .LBB49_1: # %atomicrmw.start 4003; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1 4004; RV32I-NEXT: sb a3, 15(sp) 4005; RV32I-NEXT: addi a1, sp, 15 4006; RV32I-NEXT: li a3, 5 4007; RV32I-NEXT: li a4, 5 4008; RV32I-NEXT: mv a0, s0 4009; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4010; RV32I-NEXT: lb a3, 15(sp) 4011; RV32I-NEXT: bnez a0, .LBB49_4 4012; RV32I-NEXT: .LBB49_2: # %atomicrmw.start 4013; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4014; RV32I-NEXT: andi a0, a3, 255 4015; RV32I-NEXT: mv a2, a3 4016; RV32I-NEXT: bltu s2, a0, .LBB49_1 4017; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4018; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1 4019; RV32I-NEXT: mv a2, s1 4020; RV32I-NEXT: j .LBB49_1 4021; RV32I-NEXT: .LBB49_4: # %atomicrmw.end 4022; RV32I-NEXT: mv a0, a3 4023; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4024; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4025; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4026; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4027; RV32I-NEXT: addi sp, sp, 32 4028; RV32I-NEXT: ret 4029; 4030; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst: 4031; RV32IA: # %bb.0: 4032; RV32IA-NEXT: andi a2, a0, -4 4033; RV32IA-NEXT: slli a0, a0, 3 4034; RV32IA-NEXT: li a3, 255 4035; RV32IA-NEXT: sll a3, a3, a0 4036; RV32IA-NEXT: andi a1, a1, 255 4037; RV32IA-NEXT: sll a1, a1, a0 4038; RV32IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 4039; RV32IA-NEXT: lr.w.aqrl a4, (a2) 4040; RV32IA-NEXT: and a6, a4, a3 4041; RV32IA-NEXT: mv a5, a4 4042; RV32IA-NEXT: bgeu a6, a1, .LBB49_3 4043; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 4044; RV32IA-NEXT: xor a5, a4, a1 4045; RV32IA-NEXT: and a5, a5, a3 4046; RV32IA-NEXT: xor a5, a4, a5 4047; RV32IA-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 4048; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 4049; RV32IA-NEXT: bnez a5, .LBB49_1 4050; RV32IA-NEXT: # %bb.4: 4051; RV32IA-NEXT: srl a0, a4, a0 4052; RV32IA-NEXT: ret 4053; 4054; RV64I-LABEL: atomicrmw_umax_i8_seq_cst: 4055; RV64I: # %bb.0: 4056; RV64I-NEXT: addi sp, sp, -48 4057; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4058; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4059; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4060; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4061; RV64I-NEXT: mv s0, a0 4062; RV64I-NEXT: lbu a3, 0(a0) 4063; RV64I-NEXT: mv s1, a1 4064; RV64I-NEXT: andi s2, a1, 255 4065; RV64I-NEXT: j .LBB49_2 4066; RV64I-NEXT: .LBB49_1: # %atomicrmw.start 4067; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1 4068; RV64I-NEXT: sb a3, 15(sp) 4069; RV64I-NEXT: addi a1, sp, 15 4070; RV64I-NEXT: li a3, 5 4071; RV64I-NEXT: li a4, 5 4072; RV64I-NEXT: mv a0, s0 4073; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4074; RV64I-NEXT: lb a3, 15(sp) 4075; RV64I-NEXT: bnez a0, .LBB49_4 4076; RV64I-NEXT: .LBB49_2: # %atomicrmw.start 4077; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4078; RV64I-NEXT: andi a0, a3, 255 4079; RV64I-NEXT: mv a2, a3 4080; RV64I-NEXT: bltu s2, a0, .LBB49_1 4081; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4082; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1 4083; RV64I-NEXT: mv a2, s1 4084; RV64I-NEXT: j .LBB49_1 4085; RV64I-NEXT: .LBB49_4: # %atomicrmw.end 4086; RV64I-NEXT: mv a0, a3 4087; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4088; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4089; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4090; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4091; RV64I-NEXT: addi sp, sp, 48 4092; RV64I-NEXT: ret 4093; 4094; RV64IA-LABEL: atomicrmw_umax_i8_seq_cst: 4095; RV64IA: # %bb.0: 4096; RV64IA-NEXT: andi a2, a0, -4 4097; RV64IA-NEXT: slliw a0, a0, 3 4098; RV64IA-NEXT: li a3, 255 4099; RV64IA-NEXT: sllw a3, a3, a0 4100; RV64IA-NEXT: andi a1, a1, 255 4101; RV64IA-NEXT: sllw a1, a1, a0 4102; RV64IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 4103; RV64IA-NEXT: lr.w.aqrl a4, (a2) 4104; RV64IA-NEXT: and a6, a4, a3 4105; RV64IA-NEXT: mv a5, a4 4106; RV64IA-NEXT: bgeu a6, a1, .LBB49_3 4107; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 4108; RV64IA-NEXT: xor a5, a4, a1 4109; RV64IA-NEXT: and a5, a5, a3 4110; RV64IA-NEXT: xor a5, a4, a5 4111; RV64IA-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 4112; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 4113; RV64IA-NEXT: bnez a5, .LBB49_1 4114; RV64IA-NEXT: # %bb.4: 4115; RV64IA-NEXT: srlw a0, a4, a0 4116; RV64IA-NEXT: ret 4117 %1 = atomicrmw umax i8* %a, i8 %b seq_cst 4118 ret i8 %1 4119} 4120 4121define i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind { 4122; RV32I-LABEL: atomicrmw_umin_i8_monotonic: 4123; RV32I: # %bb.0: 4124; RV32I-NEXT: addi sp, sp, -32 4125; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4126; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4127; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4128; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4129; RV32I-NEXT: mv s0, a0 4130; RV32I-NEXT: lbu a3, 0(a0) 4131; RV32I-NEXT: mv s1, a1 4132; RV32I-NEXT: andi s2, a1, 255 4133; RV32I-NEXT: j .LBB50_2 4134; RV32I-NEXT: .LBB50_1: # %atomicrmw.start 4135; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1 4136; RV32I-NEXT: sb a3, 15(sp) 4137; RV32I-NEXT: addi a1, sp, 15 4138; RV32I-NEXT: mv a0, s0 4139; RV32I-NEXT: li a3, 0 4140; RV32I-NEXT: li a4, 0 4141; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4142; RV32I-NEXT: lb a3, 15(sp) 4143; RV32I-NEXT: bnez a0, .LBB50_4 4144; RV32I-NEXT: .LBB50_2: # %atomicrmw.start 4145; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4146; RV32I-NEXT: andi a0, a3, 255 4147; RV32I-NEXT: mv a2, a3 4148; RV32I-NEXT: bgeu s2, a0, .LBB50_1 4149; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4150; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1 4151; RV32I-NEXT: mv a2, s1 4152; RV32I-NEXT: j .LBB50_1 4153; RV32I-NEXT: .LBB50_4: # %atomicrmw.end 4154; RV32I-NEXT: mv a0, a3 4155; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4156; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4157; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4158; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4159; RV32I-NEXT: addi sp, sp, 32 4160; RV32I-NEXT: ret 4161; 4162; RV32IA-LABEL: atomicrmw_umin_i8_monotonic: 4163; RV32IA: # %bb.0: 4164; RV32IA-NEXT: andi a2, a0, -4 4165; RV32IA-NEXT: slli a0, a0, 3 4166; RV32IA-NEXT: li a3, 255 4167; RV32IA-NEXT: sll a3, a3, a0 4168; RV32IA-NEXT: andi a1, a1, 255 4169; RV32IA-NEXT: sll a1, a1, a0 4170; RV32IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 4171; RV32IA-NEXT: lr.w a4, (a2) 4172; RV32IA-NEXT: and a6, a4, a3 4173; RV32IA-NEXT: mv a5, a4 4174; RV32IA-NEXT: bgeu a1, a6, .LBB50_3 4175; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 4176; RV32IA-NEXT: xor a5, a4, a1 4177; RV32IA-NEXT: and a5, a5, a3 4178; RV32IA-NEXT: xor a5, a4, a5 4179; RV32IA-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 4180; RV32IA-NEXT: sc.w a5, a5, (a2) 4181; RV32IA-NEXT: bnez a5, .LBB50_1 4182; RV32IA-NEXT: # %bb.4: 4183; RV32IA-NEXT: srl a0, a4, a0 4184; RV32IA-NEXT: ret 4185; 4186; RV64I-LABEL: atomicrmw_umin_i8_monotonic: 4187; RV64I: # %bb.0: 4188; RV64I-NEXT: addi sp, sp, -48 4189; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4190; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4191; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4192; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4193; RV64I-NEXT: mv s0, a0 4194; RV64I-NEXT: lbu a3, 0(a0) 4195; RV64I-NEXT: mv s1, a1 4196; RV64I-NEXT: andi s2, a1, 255 4197; RV64I-NEXT: j .LBB50_2 4198; RV64I-NEXT: .LBB50_1: # %atomicrmw.start 4199; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1 4200; RV64I-NEXT: sb a3, 15(sp) 4201; RV64I-NEXT: addi a1, sp, 15 4202; RV64I-NEXT: mv a0, s0 4203; RV64I-NEXT: li a3, 0 4204; RV64I-NEXT: li a4, 0 4205; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4206; RV64I-NEXT: lb a3, 15(sp) 4207; RV64I-NEXT: bnez a0, .LBB50_4 4208; RV64I-NEXT: .LBB50_2: # %atomicrmw.start 4209; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4210; RV64I-NEXT: andi a0, a3, 255 4211; RV64I-NEXT: mv a2, a3 4212; RV64I-NEXT: bgeu s2, a0, .LBB50_1 4213; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4214; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1 4215; RV64I-NEXT: mv a2, s1 4216; RV64I-NEXT: j .LBB50_1 4217; RV64I-NEXT: .LBB50_4: # %atomicrmw.end 4218; RV64I-NEXT: mv a0, a3 4219; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4220; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4221; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4222; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4223; RV64I-NEXT: addi sp, sp, 48 4224; RV64I-NEXT: ret 4225; 4226; RV64IA-LABEL: atomicrmw_umin_i8_monotonic: 4227; RV64IA: # %bb.0: 4228; RV64IA-NEXT: andi a2, a0, -4 4229; RV64IA-NEXT: slliw a0, a0, 3 4230; RV64IA-NEXT: li a3, 255 4231; RV64IA-NEXT: sllw a3, a3, a0 4232; RV64IA-NEXT: andi a1, a1, 255 4233; RV64IA-NEXT: sllw a1, a1, a0 4234; RV64IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 4235; RV64IA-NEXT: lr.w a4, (a2) 4236; RV64IA-NEXT: and a6, a4, a3 4237; RV64IA-NEXT: mv a5, a4 4238; RV64IA-NEXT: bgeu a1, a6, .LBB50_3 4239; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 4240; RV64IA-NEXT: xor a5, a4, a1 4241; RV64IA-NEXT: and a5, a5, a3 4242; RV64IA-NEXT: xor a5, a4, a5 4243; RV64IA-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 4244; RV64IA-NEXT: sc.w a5, a5, (a2) 4245; RV64IA-NEXT: bnez a5, .LBB50_1 4246; RV64IA-NEXT: # %bb.4: 4247; RV64IA-NEXT: srlw a0, a4, a0 4248; RV64IA-NEXT: ret 4249 %1 = atomicrmw umin i8* %a, i8 %b monotonic 4250 ret i8 %1 4251} 4252 4253define i8 @atomicrmw_umin_i8_acquire(i8 *%a, i8 %b) nounwind { 4254; RV32I-LABEL: atomicrmw_umin_i8_acquire: 4255; RV32I: # %bb.0: 4256; RV32I-NEXT: addi sp, sp, -32 4257; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4258; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4259; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4260; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4261; RV32I-NEXT: mv s0, a0 4262; RV32I-NEXT: lbu a3, 0(a0) 4263; RV32I-NEXT: mv s1, a1 4264; RV32I-NEXT: andi s2, a1, 255 4265; RV32I-NEXT: j .LBB51_2 4266; RV32I-NEXT: .LBB51_1: # %atomicrmw.start 4267; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1 4268; RV32I-NEXT: sb a3, 15(sp) 4269; RV32I-NEXT: addi a1, sp, 15 4270; RV32I-NEXT: li a3, 2 4271; RV32I-NEXT: li a4, 2 4272; RV32I-NEXT: mv a0, s0 4273; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4274; RV32I-NEXT: lb a3, 15(sp) 4275; RV32I-NEXT: bnez a0, .LBB51_4 4276; RV32I-NEXT: .LBB51_2: # %atomicrmw.start 4277; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4278; RV32I-NEXT: andi a0, a3, 255 4279; RV32I-NEXT: mv a2, a3 4280; RV32I-NEXT: bgeu s2, a0, .LBB51_1 4281; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4282; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1 4283; RV32I-NEXT: mv a2, s1 4284; RV32I-NEXT: j .LBB51_1 4285; RV32I-NEXT: .LBB51_4: # %atomicrmw.end 4286; RV32I-NEXT: mv a0, a3 4287; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4288; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4289; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4290; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4291; RV32I-NEXT: addi sp, sp, 32 4292; RV32I-NEXT: ret 4293; 4294; RV32IA-LABEL: atomicrmw_umin_i8_acquire: 4295; RV32IA: # %bb.0: 4296; RV32IA-NEXT: andi a2, a0, -4 4297; RV32IA-NEXT: slli a0, a0, 3 4298; RV32IA-NEXT: li a3, 255 4299; RV32IA-NEXT: sll a3, a3, a0 4300; RV32IA-NEXT: andi a1, a1, 255 4301; RV32IA-NEXT: sll a1, a1, a0 4302; RV32IA-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 4303; RV32IA-NEXT: lr.w.aq a4, (a2) 4304; RV32IA-NEXT: and a6, a4, a3 4305; RV32IA-NEXT: mv a5, a4 4306; RV32IA-NEXT: bgeu a1, a6, .LBB51_3 4307; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 4308; RV32IA-NEXT: xor a5, a4, a1 4309; RV32IA-NEXT: and a5, a5, a3 4310; RV32IA-NEXT: xor a5, a4, a5 4311; RV32IA-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 4312; RV32IA-NEXT: sc.w a5, a5, (a2) 4313; RV32IA-NEXT: bnez a5, .LBB51_1 4314; RV32IA-NEXT: # %bb.4: 4315; RV32IA-NEXT: srl a0, a4, a0 4316; RV32IA-NEXT: ret 4317; 4318; RV64I-LABEL: atomicrmw_umin_i8_acquire: 4319; RV64I: # %bb.0: 4320; RV64I-NEXT: addi sp, sp, -48 4321; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4322; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4323; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4324; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4325; RV64I-NEXT: mv s0, a0 4326; RV64I-NEXT: lbu a3, 0(a0) 4327; RV64I-NEXT: mv s1, a1 4328; RV64I-NEXT: andi s2, a1, 255 4329; RV64I-NEXT: j .LBB51_2 4330; RV64I-NEXT: .LBB51_1: # %atomicrmw.start 4331; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1 4332; RV64I-NEXT: sb a3, 15(sp) 4333; RV64I-NEXT: addi a1, sp, 15 4334; RV64I-NEXT: li a3, 2 4335; RV64I-NEXT: li a4, 2 4336; RV64I-NEXT: mv a0, s0 4337; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4338; RV64I-NEXT: lb a3, 15(sp) 4339; RV64I-NEXT: bnez a0, .LBB51_4 4340; RV64I-NEXT: .LBB51_2: # %atomicrmw.start 4341; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4342; RV64I-NEXT: andi a0, a3, 255 4343; RV64I-NEXT: mv a2, a3 4344; RV64I-NEXT: bgeu s2, a0, .LBB51_1 4345; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4346; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1 4347; RV64I-NEXT: mv a2, s1 4348; RV64I-NEXT: j .LBB51_1 4349; RV64I-NEXT: .LBB51_4: # %atomicrmw.end 4350; RV64I-NEXT: mv a0, a3 4351; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4352; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4353; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4354; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4355; RV64I-NEXT: addi sp, sp, 48 4356; RV64I-NEXT: ret 4357; 4358; RV64IA-LABEL: atomicrmw_umin_i8_acquire: 4359; RV64IA: # %bb.0: 4360; RV64IA-NEXT: andi a2, a0, -4 4361; RV64IA-NEXT: slliw a0, a0, 3 4362; RV64IA-NEXT: li a3, 255 4363; RV64IA-NEXT: sllw a3, a3, a0 4364; RV64IA-NEXT: andi a1, a1, 255 4365; RV64IA-NEXT: sllw a1, a1, a0 4366; RV64IA-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 4367; RV64IA-NEXT: lr.w.aq a4, (a2) 4368; RV64IA-NEXT: and a6, a4, a3 4369; RV64IA-NEXT: mv a5, a4 4370; RV64IA-NEXT: bgeu a1, a6, .LBB51_3 4371; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 4372; RV64IA-NEXT: xor a5, a4, a1 4373; RV64IA-NEXT: and a5, a5, a3 4374; RV64IA-NEXT: xor a5, a4, a5 4375; RV64IA-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 4376; RV64IA-NEXT: sc.w a5, a5, (a2) 4377; RV64IA-NEXT: bnez a5, .LBB51_1 4378; RV64IA-NEXT: # %bb.4: 4379; RV64IA-NEXT: srlw a0, a4, a0 4380; RV64IA-NEXT: ret 4381 %1 = atomicrmw umin i8* %a, i8 %b acquire 4382 ret i8 %1 4383} 4384 4385define i8 @atomicrmw_umin_i8_release(i8 *%a, i8 %b) nounwind { 4386; RV32I-LABEL: atomicrmw_umin_i8_release: 4387; RV32I: # %bb.0: 4388; RV32I-NEXT: addi sp, sp, -32 4389; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4390; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4391; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4392; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4393; RV32I-NEXT: mv s0, a0 4394; RV32I-NEXT: lbu a3, 0(a0) 4395; RV32I-NEXT: mv s1, a1 4396; RV32I-NEXT: andi s2, a1, 255 4397; RV32I-NEXT: j .LBB52_2 4398; RV32I-NEXT: .LBB52_1: # %atomicrmw.start 4399; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1 4400; RV32I-NEXT: sb a3, 15(sp) 4401; RV32I-NEXT: addi a1, sp, 15 4402; RV32I-NEXT: li a3, 3 4403; RV32I-NEXT: mv a0, s0 4404; RV32I-NEXT: li a4, 0 4405; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4406; RV32I-NEXT: lb a3, 15(sp) 4407; RV32I-NEXT: bnez a0, .LBB52_4 4408; RV32I-NEXT: .LBB52_2: # %atomicrmw.start 4409; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4410; RV32I-NEXT: andi a0, a3, 255 4411; RV32I-NEXT: mv a2, a3 4412; RV32I-NEXT: bgeu s2, a0, .LBB52_1 4413; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4414; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1 4415; RV32I-NEXT: mv a2, s1 4416; RV32I-NEXT: j .LBB52_1 4417; RV32I-NEXT: .LBB52_4: # %atomicrmw.end 4418; RV32I-NEXT: mv a0, a3 4419; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4420; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4421; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4422; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4423; RV32I-NEXT: addi sp, sp, 32 4424; RV32I-NEXT: ret 4425; 4426; RV32IA-LABEL: atomicrmw_umin_i8_release: 4427; RV32IA: # %bb.0: 4428; RV32IA-NEXT: andi a2, a0, -4 4429; RV32IA-NEXT: slli a0, a0, 3 4430; RV32IA-NEXT: li a3, 255 4431; RV32IA-NEXT: sll a3, a3, a0 4432; RV32IA-NEXT: andi a1, a1, 255 4433; RV32IA-NEXT: sll a1, a1, a0 4434; RV32IA-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 4435; RV32IA-NEXT: lr.w a4, (a2) 4436; RV32IA-NEXT: and a6, a4, a3 4437; RV32IA-NEXT: mv a5, a4 4438; RV32IA-NEXT: bgeu a1, a6, .LBB52_3 4439; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 4440; RV32IA-NEXT: xor a5, a4, a1 4441; RV32IA-NEXT: and a5, a5, a3 4442; RV32IA-NEXT: xor a5, a4, a5 4443; RV32IA-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 4444; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 4445; RV32IA-NEXT: bnez a5, .LBB52_1 4446; RV32IA-NEXT: # %bb.4: 4447; RV32IA-NEXT: srl a0, a4, a0 4448; RV32IA-NEXT: ret 4449; 4450; RV64I-LABEL: atomicrmw_umin_i8_release: 4451; RV64I: # %bb.0: 4452; RV64I-NEXT: addi sp, sp, -48 4453; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4454; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4455; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4456; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4457; RV64I-NEXT: mv s0, a0 4458; RV64I-NEXT: lbu a3, 0(a0) 4459; RV64I-NEXT: mv s1, a1 4460; RV64I-NEXT: andi s2, a1, 255 4461; RV64I-NEXT: j .LBB52_2 4462; RV64I-NEXT: .LBB52_1: # %atomicrmw.start 4463; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1 4464; RV64I-NEXT: sb a3, 15(sp) 4465; RV64I-NEXT: addi a1, sp, 15 4466; RV64I-NEXT: li a3, 3 4467; RV64I-NEXT: mv a0, s0 4468; RV64I-NEXT: li a4, 0 4469; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4470; RV64I-NEXT: lb a3, 15(sp) 4471; RV64I-NEXT: bnez a0, .LBB52_4 4472; RV64I-NEXT: .LBB52_2: # %atomicrmw.start 4473; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4474; RV64I-NEXT: andi a0, a3, 255 4475; RV64I-NEXT: mv a2, a3 4476; RV64I-NEXT: bgeu s2, a0, .LBB52_1 4477; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4478; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1 4479; RV64I-NEXT: mv a2, s1 4480; RV64I-NEXT: j .LBB52_1 4481; RV64I-NEXT: .LBB52_4: # %atomicrmw.end 4482; RV64I-NEXT: mv a0, a3 4483; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4484; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4485; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4486; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4487; RV64I-NEXT: addi sp, sp, 48 4488; RV64I-NEXT: ret 4489; 4490; RV64IA-LABEL: atomicrmw_umin_i8_release: 4491; RV64IA: # %bb.0: 4492; RV64IA-NEXT: andi a2, a0, -4 4493; RV64IA-NEXT: slliw a0, a0, 3 4494; RV64IA-NEXT: li a3, 255 4495; RV64IA-NEXT: sllw a3, a3, a0 4496; RV64IA-NEXT: andi a1, a1, 255 4497; RV64IA-NEXT: sllw a1, a1, a0 4498; RV64IA-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 4499; RV64IA-NEXT: lr.w a4, (a2) 4500; RV64IA-NEXT: and a6, a4, a3 4501; RV64IA-NEXT: mv a5, a4 4502; RV64IA-NEXT: bgeu a1, a6, .LBB52_3 4503; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 4504; RV64IA-NEXT: xor a5, a4, a1 4505; RV64IA-NEXT: and a5, a5, a3 4506; RV64IA-NEXT: xor a5, a4, a5 4507; RV64IA-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 4508; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 4509; RV64IA-NEXT: bnez a5, .LBB52_1 4510; RV64IA-NEXT: # %bb.4: 4511; RV64IA-NEXT: srlw a0, a4, a0 4512; RV64IA-NEXT: ret 4513 %1 = atomicrmw umin i8* %a, i8 %b release 4514 ret i8 %1 4515} 4516 4517define i8 @atomicrmw_umin_i8_acq_rel(i8 *%a, i8 %b) nounwind { 4518; RV32I-LABEL: atomicrmw_umin_i8_acq_rel: 4519; RV32I: # %bb.0: 4520; RV32I-NEXT: addi sp, sp, -32 4521; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4522; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4523; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4524; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4525; RV32I-NEXT: mv s0, a0 4526; RV32I-NEXT: lbu a3, 0(a0) 4527; RV32I-NEXT: mv s1, a1 4528; RV32I-NEXT: andi s2, a1, 255 4529; RV32I-NEXT: j .LBB53_2 4530; RV32I-NEXT: .LBB53_1: # %atomicrmw.start 4531; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1 4532; RV32I-NEXT: sb a3, 15(sp) 4533; RV32I-NEXT: addi a1, sp, 15 4534; RV32I-NEXT: li a3, 4 4535; RV32I-NEXT: li a4, 2 4536; RV32I-NEXT: mv a0, s0 4537; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4538; RV32I-NEXT: lb a3, 15(sp) 4539; RV32I-NEXT: bnez a0, .LBB53_4 4540; RV32I-NEXT: .LBB53_2: # %atomicrmw.start 4541; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4542; RV32I-NEXT: andi a0, a3, 255 4543; RV32I-NEXT: mv a2, a3 4544; RV32I-NEXT: bgeu s2, a0, .LBB53_1 4545; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4546; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1 4547; RV32I-NEXT: mv a2, s1 4548; RV32I-NEXT: j .LBB53_1 4549; RV32I-NEXT: .LBB53_4: # %atomicrmw.end 4550; RV32I-NEXT: mv a0, a3 4551; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4552; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4553; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4554; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4555; RV32I-NEXT: addi sp, sp, 32 4556; RV32I-NEXT: ret 4557; 4558; RV32IA-LABEL: atomicrmw_umin_i8_acq_rel: 4559; RV32IA: # %bb.0: 4560; RV32IA-NEXT: andi a2, a0, -4 4561; RV32IA-NEXT: slli a0, a0, 3 4562; RV32IA-NEXT: li a3, 255 4563; RV32IA-NEXT: sll a3, a3, a0 4564; RV32IA-NEXT: andi a1, a1, 255 4565; RV32IA-NEXT: sll a1, a1, a0 4566; RV32IA-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 4567; RV32IA-NEXT: lr.w.aq a4, (a2) 4568; RV32IA-NEXT: and a6, a4, a3 4569; RV32IA-NEXT: mv a5, a4 4570; RV32IA-NEXT: bgeu a1, a6, .LBB53_3 4571; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 4572; RV32IA-NEXT: xor a5, a4, a1 4573; RV32IA-NEXT: and a5, a5, a3 4574; RV32IA-NEXT: xor a5, a4, a5 4575; RV32IA-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 4576; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 4577; RV32IA-NEXT: bnez a5, .LBB53_1 4578; RV32IA-NEXT: # %bb.4: 4579; RV32IA-NEXT: srl a0, a4, a0 4580; RV32IA-NEXT: ret 4581; 4582; RV64I-LABEL: atomicrmw_umin_i8_acq_rel: 4583; RV64I: # %bb.0: 4584; RV64I-NEXT: addi sp, sp, -48 4585; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4586; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4587; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4588; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4589; RV64I-NEXT: mv s0, a0 4590; RV64I-NEXT: lbu a3, 0(a0) 4591; RV64I-NEXT: mv s1, a1 4592; RV64I-NEXT: andi s2, a1, 255 4593; RV64I-NEXT: j .LBB53_2 4594; RV64I-NEXT: .LBB53_1: # %atomicrmw.start 4595; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1 4596; RV64I-NEXT: sb a3, 15(sp) 4597; RV64I-NEXT: addi a1, sp, 15 4598; RV64I-NEXT: li a3, 4 4599; RV64I-NEXT: li a4, 2 4600; RV64I-NEXT: mv a0, s0 4601; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4602; RV64I-NEXT: lb a3, 15(sp) 4603; RV64I-NEXT: bnez a0, .LBB53_4 4604; RV64I-NEXT: .LBB53_2: # %atomicrmw.start 4605; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4606; RV64I-NEXT: andi a0, a3, 255 4607; RV64I-NEXT: mv a2, a3 4608; RV64I-NEXT: bgeu s2, a0, .LBB53_1 4609; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4610; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1 4611; RV64I-NEXT: mv a2, s1 4612; RV64I-NEXT: j .LBB53_1 4613; RV64I-NEXT: .LBB53_4: # %atomicrmw.end 4614; RV64I-NEXT: mv a0, a3 4615; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4616; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4617; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4618; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4619; RV64I-NEXT: addi sp, sp, 48 4620; RV64I-NEXT: ret 4621; 4622; RV64IA-LABEL: atomicrmw_umin_i8_acq_rel: 4623; RV64IA: # %bb.0: 4624; RV64IA-NEXT: andi a2, a0, -4 4625; RV64IA-NEXT: slliw a0, a0, 3 4626; RV64IA-NEXT: li a3, 255 4627; RV64IA-NEXT: sllw a3, a3, a0 4628; RV64IA-NEXT: andi a1, a1, 255 4629; RV64IA-NEXT: sllw a1, a1, a0 4630; RV64IA-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 4631; RV64IA-NEXT: lr.w.aq a4, (a2) 4632; RV64IA-NEXT: and a6, a4, a3 4633; RV64IA-NEXT: mv a5, a4 4634; RV64IA-NEXT: bgeu a1, a6, .LBB53_3 4635; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 4636; RV64IA-NEXT: xor a5, a4, a1 4637; RV64IA-NEXT: and a5, a5, a3 4638; RV64IA-NEXT: xor a5, a4, a5 4639; RV64IA-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 4640; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 4641; RV64IA-NEXT: bnez a5, .LBB53_1 4642; RV64IA-NEXT: # %bb.4: 4643; RV64IA-NEXT: srlw a0, a4, a0 4644; RV64IA-NEXT: ret 4645 %1 = atomicrmw umin i8* %a, i8 %b acq_rel 4646 ret i8 %1 4647} 4648 4649define i8 @atomicrmw_umin_i8_seq_cst(i8 *%a, i8 %b) nounwind { 4650; RV32I-LABEL: atomicrmw_umin_i8_seq_cst: 4651; RV32I: # %bb.0: 4652; RV32I-NEXT: addi sp, sp, -32 4653; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 4654; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 4655; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 4656; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 4657; RV32I-NEXT: mv s0, a0 4658; RV32I-NEXT: lbu a3, 0(a0) 4659; RV32I-NEXT: mv s1, a1 4660; RV32I-NEXT: andi s2, a1, 255 4661; RV32I-NEXT: j .LBB54_2 4662; RV32I-NEXT: .LBB54_1: # %atomicrmw.start 4663; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1 4664; RV32I-NEXT: sb a3, 15(sp) 4665; RV32I-NEXT: addi a1, sp, 15 4666; RV32I-NEXT: li a3, 5 4667; RV32I-NEXT: li a4, 5 4668; RV32I-NEXT: mv a0, s0 4669; RV32I-NEXT: call __atomic_compare_exchange_1@plt 4670; RV32I-NEXT: lb a3, 15(sp) 4671; RV32I-NEXT: bnez a0, .LBB54_4 4672; RV32I-NEXT: .LBB54_2: # %atomicrmw.start 4673; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4674; RV32I-NEXT: andi a0, a3, 255 4675; RV32I-NEXT: mv a2, a3 4676; RV32I-NEXT: bgeu s2, a0, .LBB54_1 4677; RV32I-NEXT: # %bb.3: # %atomicrmw.start 4678; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1 4679; RV32I-NEXT: mv a2, s1 4680; RV32I-NEXT: j .LBB54_1 4681; RV32I-NEXT: .LBB54_4: # %atomicrmw.end 4682; RV32I-NEXT: mv a0, a3 4683; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 4684; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 4685; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 4686; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 4687; RV32I-NEXT: addi sp, sp, 32 4688; RV32I-NEXT: ret 4689; 4690; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst: 4691; RV32IA: # %bb.0: 4692; RV32IA-NEXT: andi a2, a0, -4 4693; RV32IA-NEXT: slli a0, a0, 3 4694; RV32IA-NEXT: li a3, 255 4695; RV32IA-NEXT: sll a3, a3, a0 4696; RV32IA-NEXT: andi a1, a1, 255 4697; RV32IA-NEXT: sll a1, a1, a0 4698; RV32IA-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 4699; RV32IA-NEXT: lr.w.aqrl a4, (a2) 4700; RV32IA-NEXT: and a6, a4, a3 4701; RV32IA-NEXT: mv a5, a4 4702; RV32IA-NEXT: bgeu a1, a6, .LBB54_3 4703; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 4704; RV32IA-NEXT: xor a5, a4, a1 4705; RV32IA-NEXT: and a5, a5, a3 4706; RV32IA-NEXT: xor a5, a4, a5 4707; RV32IA-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 4708; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 4709; RV32IA-NEXT: bnez a5, .LBB54_1 4710; RV32IA-NEXT: # %bb.4: 4711; RV32IA-NEXT: srl a0, a4, a0 4712; RV32IA-NEXT: ret 4713; 4714; RV64I-LABEL: atomicrmw_umin_i8_seq_cst: 4715; RV64I: # %bb.0: 4716; RV64I-NEXT: addi sp, sp, -48 4717; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4718; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4719; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4720; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4721; RV64I-NEXT: mv s0, a0 4722; RV64I-NEXT: lbu a3, 0(a0) 4723; RV64I-NEXT: mv s1, a1 4724; RV64I-NEXT: andi s2, a1, 255 4725; RV64I-NEXT: j .LBB54_2 4726; RV64I-NEXT: .LBB54_1: # %atomicrmw.start 4727; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1 4728; RV64I-NEXT: sb a3, 15(sp) 4729; RV64I-NEXT: addi a1, sp, 15 4730; RV64I-NEXT: li a3, 5 4731; RV64I-NEXT: li a4, 5 4732; RV64I-NEXT: mv a0, s0 4733; RV64I-NEXT: call __atomic_compare_exchange_1@plt 4734; RV64I-NEXT: lb a3, 15(sp) 4735; RV64I-NEXT: bnez a0, .LBB54_4 4736; RV64I-NEXT: .LBB54_2: # %atomicrmw.start 4737; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4738; RV64I-NEXT: andi a0, a3, 255 4739; RV64I-NEXT: mv a2, a3 4740; RV64I-NEXT: bgeu s2, a0, .LBB54_1 4741; RV64I-NEXT: # %bb.3: # %atomicrmw.start 4742; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1 4743; RV64I-NEXT: mv a2, s1 4744; RV64I-NEXT: j .LBB54_1 4745; RV64I-NEXT: .LBB54_4: # %atomicrmw.end 4746; RV64I-NEXT: mv a0, a3 4747; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4748; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4749; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4750; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 4751; RV64I-NEXT: addi sp, sp, 48 4752; RV64I-NEXT: ret 4753; 4754; RV64IA-LABEL: atomicrmw_umin_i8_seq_cst: 4755; RV64IA: # %bb.0: 4756; RV64IA-NEXT: andi a2, a0, -4 4757; RV64IA-NEXT: slliw a0, a0, 3 4758; RV64IA-NEXT: li a3, 255 4759; RV64IA-NEXT: sllw a3, a3, a0 4760; RV64IA-NEXT: andi a1, a1, 255 4761; RV64IA-NEXT: sllw a1, a1, a0 4762; RV64IA-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 4763; RV64IA-NEXT: lr.w.aqrl a4, (a2) 4764; RV64IA-NEXT: and a6, a4, a3 4765; RV64IA-NEXT: mv a5, a4 4766; RV64IA-NEXT: bgeu a1, a6, .LBB54_3 4767; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 4768; RV64IA-NEXT: xor a5, a4, a1 4769; RV64IA-NEXT: and a5, a5, a3 4770; RV64IA-NEXT: xor a5, a4, a5 4771; RV64IA-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 4772; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 4773; RV64IA-NEXT: bnez a5, .LBB54_1 4774; RV64IA-NEXT: # %bb.4: 4775; RV64IA-NEXT: srlw a0, a4, a0 4776; RV64IA-NEXT: ret 4777 %1 = atomicrmw umin i8* %a, i8 %b seq_cst 4778 ret i8 %1 4779} 4780 4781define i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind { 4782; RV32I-LABEL: atomicrmw_xchg_i16_monotonic: 4783; RV32I: # %bb.0: 4784; RV32I-NEXT: addi sp, sp, -16 4785; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4786; RV32I-NEXT: li a2, 0 4787; RV32I-NEXT: call __atomic_exchange_2@plt 4788; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4789; RV32I-NEXT: addi sp, sp, 16 4790; RV32I-NEXT: ret 4791; 4792; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic: 4793; RV32IA: # %bb.0: 4794; RV32IA-NEXT: andi a2, a0, -4 4795; RV32IA-NEXT: slli a0, a0, 3 4796; RV32IA-NEXT: lui a3, 16 4797; RV32IA-NEXT: addi a3, a3, -1 4798; RV32IA-NEXT: sll a4, a3, a0 4799; RV32IA-NEXT: and a1, a1, a3 4800; RV32IA-NEXT: sll a1, a1, a0 4801; RV32IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 4802; RV32IA-NEXT: lr.w a3, (a2) 4803; RV32IA-NEXT: mv a5, a1 4804; RV32IA-NEXT: xor a5, a3, a5 4805; RV32IA-NEXT: and a5, a5, a4 4806; RV32IA-NEXT: xor a5, a3, a5 4807; RV32IA-NEXT: sc.w a5, a5, (a2) 4808; RV32IA-NEXT: bnez a5, .LBB55_1 4809; RV32IA-NEXT: # %bb.2: 4810; RV32IA-NEXT: srl a0, a3, a0 4811; RV32IA-NEXT: ret 4812; 4813; RV64I-LABEL: atomicrmw_xchg_i16_monotonic: 4814; RV64I: # %bb.0: 4815; RV64I-NEXT: addi sp, sp, -16 4816; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4817; RV64I-NEXT: li a2, 0 4818; RV64I-NEXT: call __atomic_exchange_2@plt 4819; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4820; RV64I-NEXT: addi sp, sp, 16 4821; RV64I-NEXT: ret 4822; 4823; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic: 4824; RV64IA: # %bb.0: 4825; RV64IA-NEXT: andi a2, a0, -4 4826; RV64IA-NEXT: slliw a0, a0, 3 4827; RV64IA-NEXT: lui a3, 16 4828; RV64IA-NEXT: addiw a3, a3, -1 4829; RV64IA-NEXT: sllw a4, a3, a0 4830; RV64IA-NEXT: and a1, a1, a3 4831; RV64IA-NEXT: sllw a1, a1, a0 4832; RV64IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 4833; RV64IA-NEXT: lr.w a3, (a2) 4834; RV64IA-NEXT: mv a5, a1 4835; RV64IA-NEXT: xor a5, a3, a5 4836; RV64IA-NEXT: and a5, a5, a4 4837; RV64IA-NEXT: xor a5, a3, a5 4838; RV64IA-NEXT: sc.w a5, a5, (a2) 4839; RV64IA-NEXT: bnez a5, .LBB55_1 4840; RV64IA-NEXT: # %bb.2: 4841; RV64IA-NEXT: srlw a0, a3, a0 4842; RV64IA-NEXT: ret 4843 %1 = atomicrmw xchg i16* %a, i16 %b monotonic 4844 ret i16 %1 4845} 4846 4847define i16 @atomicrmw_xchg_i16_acquire(i16* %a, i16 %b) nounwind { 4848; RV32I-LABEL: atomicrmw_xchg_i16_acquire: 4849; RV32I: # %bb.0: 4850; RV32I-NEXT: addi sp, sp, -16 4851; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4852; RV32I-NEXT: li a2, 2 4853; RV32I-NEXT: call __atomic_exchange_2@plt 4854; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4855; RV32I-NEXT: addi sp, sp, 16 4856; RV32I-NEXT: ret 4857; 4858; RV32IA-LABEL: atomicrmw_xchg_i16_acquire: 4859; RV32IA: # %bb.0: 4860; RV32IA-NEXT: andi a2, a0, -4 4861; RV32IA-NEXT: slli a0, a0, 3 4862; RV32IA-NEXT: lui a3, 16 4863; RV32IA-NEXT: addi a3, a3, -1 4864; RV32IA-NEXT: sll a4, a3, a0 4865; RV32IA-NEXT: and a1, a1, a3 4866; RV32IA-NEXT: sll a1, a1, a0 4867; RV32IA-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 4868; RV32IA-NEXT: lr.w.aq a3, (a2) 4869; RV32IA-NEXT: mv a5, a1 4870; RV32IA-NEXT: xor a5, a3, a5 4871; RV32IA-NEXT: and a5, a5, a4 4872; RV32IA-NEXT: xor a5, a3, a5 4873; RV32IA-NEXT: sc.w a5, a5, (a2) 4874; RV32IA-NEXT: bnez a5, .LBB56_1 4875; RV32IA-NEXT: # %bb.2: 4876; RV32IA-NEXT: srl a0, a3, a0 4877; RV32IA-NEXT: ret 4878; 4879; RV64I-LABEL: atomicrmw_xchg_i16_acquire: 4880; RV64I: # %bb.0: 4881; RV64I-NEXT: addi sp, sp, -16 4882; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4883; RV64I-NEXT: li a2, 2 4884; RV64I-NEXT: call __atomic_exchange_2@plt 4885; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4886; RV64I-NEXT: addi sp, sp, 16 4887; RV64I-NEXT: ret 4888; 4889; RV64IA-LABEL: atomicrmw_xchg_i16_acquire: 4890; RV64IA: # %bb.0: 4891; RV64IA-NEXT: andi a2, a0, -4 4892; RV64IA-NEXT: slliw a0, a0, 3 4893; RV64IA-NEXT: lui a3, 16 4894; RV64IA-NEXT: addiw a3, a3, -1 4895; RV64IA-NEXT: sllw a4, a3, a0 4896; RV64IA-NEXT: and a1, a1, a3 4897; RV64IA-NEXT: sllw a1, a1, a0 4898; RV64IA-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 4899; RV64IA-NEXT: lr.w.aq a3, (a2) 4900; RV64IA-NEXT: mv a5, a1 4901; RV64IA-NEXT: xor a5, a3, a5 4902; RV64IA-NEXT: and a5, a5, a4 4903; RV64IA-NEXT: xor a5, a3, a5 4904; RV64IA-NEXT: sc.w a5, a5, (a2) 4905; RV64IA-NEXT: bnez a5, .LBB56_1 4906; RV64IA-NEXT: # %bb.2: 4907; RV64IA-NEXT: srlw a0, a3, a0 4908; RV64IA-NEXT: ret 4909 %1 = atomicrmw xchg i16* %a, i16 %b acquire 4910 ret i16 %1 4911} 4912 4913define i16 @atomicrmw_xchg_i16_release(i16* %a, i16 %b) nounwind { 4914; RV32I-LABEL: atomicrmw_xchg_i16_release: 4915; RV32I: # %bb.0: 4916; RV32I-NEXT: addi sp, sp, -16 4917; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4918; RV32I-NEXT: li a2, 3 4919; RV32I-NEXT: call __atomic_exchange_2@plt 4920; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4921; RV32I-NEXT: addi sp, sp, 16 4922; RV32I-NEXT: ret 4923; 4924; RV32IA-LABEL: atomicrmw_xchg_i16_release: 4925; RV32IA: # %bb.0: 4926; RV32IA-NEXT: andi a2, a0, -4 4927; RV32IA-NEXT: slli a0, a0, 3 4928; RV32IA-NEXT: lui a3, 16 4929; RV32IA-NEXT: addi a3, a3, -1 4930; RV32IA-NEXT: sll a4, a3, a0 4931; RV32IA-NEXT: and a1, a1, a3 4932; RV32IA-NEXT: sll a1, a1, a0 4933; RV32IA-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 4934; RV32IA-NEXT: lr.w a3, (a2) 4935; RV32IA-NEXT: mv a5, a1 4936; RV32IA-NEXT: xor a5, a3, a5 4937; RV32IA-NEXT: and a5, a5, a4 4938; RV32IA-NEXT: xor a5, a3, a5 4939; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 4940; RV32IA-NEXT: bnez a5, .LBB57_1 4941; RV32IA-NEXT: # %bb.2: 4942; RV32IA-NEXT: srl a0, a3, a0 4943; RV32IA-NEXT: ret 4944; 4945; RV64I-LABEL: atomicrmw_xchg_i16_release: 4946; RV64I: # %bb.0: 4947; RV64I-NEXT: addi sp, sp, -16 4948; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4949; RV64I-NEXT: li a2, 3 4950; RV64I-NEXT: call __atomic_exchange_2@plt 4951; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4952; RV64I-NEXT: addi sp, sp, 16 4953; RV64I-NEXT: ret 4954; 4955; RV64IA-LABEL: atomicrmw_xchg_i16_release: 4956; RV64IA: # %bb.0: 4957; RV64IA-NEXT: andi a2, a0, -4 4958; RV64IA-NEXT: slliw a0, a0, 3 4959; RV64IA-NEXT: lui a3, 16 4960; RV64IA-NEXT: addiw a3, a3, -1 4961; RV64IA-NEXT: sllw a4, a3, a0 4962; RV64IA-NEXT: and a1, a1, a3 4963; RV64IA-NEXT: sllw a1, a1, a0 4964; RV64IA-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 4965; RV64IA-NEXT: lr.w a3, (a2) 4966; RV64IA-NEXT: mv a5, a1 4967; RV64IA-NEXT: xor a5, a3, a5 4968; RV64IA-NEXT: and a5, a5, a4 4969; RV64IA-NEXT: xor a5, a3, a5 4970; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 4971; RV64IA-NEXT: bnez a5, .LBB57_1 4972; RV64IA-NEXT: # %bb.2: 4973; RV64IA-NEXT: srlw a0, a3, a0 4974; RV64IA-NEXT: ret 4975 %1 = atomicrmw xchg i16* %a, i16 %b release 4976 ret i16 %1 4977} 4978 4979define i16 @atomicrmw_xchg_i16_acq_rel(i16* %a, i16 %b) nounwind { 4980; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel: 4981; RV32I: # %bb.0: 4982; RV32I-NEXT: addi sp, sp, -16 4983; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4984; RV32I-NEXT: li a2, 4 4985; RV32I-NEXT: call __atomic_exchange_2@plt 4986; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4987; RV32I-NEXT: addi sp, sp, 16 4988; RV32I-NEXT: ret 4989; 4990; RV32IA-LABEL: atomicrmw_xchg_i16_acq_rel: 4991; RV32IA: # %bb.0: 4992; RV32IA-NEXT: andi a2, a0, -4 4993; RV32IA-NEXT: slli a0, a0, 3 4994; RV32IA-NEXT: lui a3, 16 4995; RV32IA-NEXT: addi a3, a3, -1 4996; RV32IA-NEXT: sll a4, a3, a0 4997; RV32IA-NEXT: and a1, a1, a3 4998; RV32IA-NEXT: sll a1, a1, a0 4999; RV32IA-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 5000; RV32IA-NEXT: lr.w.aq a3, (a2) 5001; RV32IA-NEXT: mv a5, a1 5002; RV32IA-NEXT: xor a5, a3, a5 5003; RV32IA-NEXT: and a5, a5, a4 5004; RV32IA-NEXT: xor a5, a3, a5 5005; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5006; RV32IA-NEXT: bnez a5, .LBB58_1 5007; RV32IA-NEXT: # %bb.2: 5008; RV32IA-NEXT: srl a0, a3, a0 5009; RV32IA-NEXT: ret 5010; 5011; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel: 5012; RV64I: # %bb.0: 5013; RV64I-NEXT: addi sp, sp, -16 5014; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5015; RV64I-NEXT: li a2, 4 5016; RV64I-NEXT: call __atomic_exchange_2@plt 5017; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5018; RV64I-NEXT: addi sp, sp, 16 5019; RV64I-NEXT: ret 5020; 5021; RV64IA-LABEL: atomicrmw_xchg_i16_acq_rel: 5022; RV64IA: # %bb.0: 5023; RV64IA-NEXT: andi a2, a0, -4 5024; RV64IA-NEXT: slliw a0, a0, 3 5025; RV64IA-NEXT: lui a3, 16 5026; RV64IA-NEXT: addiw a3, a3, -1 5027; RV64IA-NEXT: sllw a4, a3, a0 5028; RV64IA-NEXT: and a1, a1, a3 5029; RV64IA-NEXT: sllw a1, a1, a0 5030; RV64IA-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 5031; RV64IA-NEXT: lr.w.aq a3, (a2) 5032; RV64IA-NEXT: mv a5, a1 5033; RV64IA-NEXT: xor a5, a3, a5 5034; RV64IA-NEXT: and a5, a5, a4 5035; RV64IA-NEXT: xor a5, a3, a5 5036; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5037; RV64IA-NEXT: bnez a5, .LBB58_1 5038; RV64IA-NEXT: # %bb.2: 5039; RV64IA-NEXT: srlw a0, a3, a0 5040; RV64IA-NEXT: ret 5041 %1 = atomicrmw xchg i16* %a, i16 %b acq_rel 5042 ret i16 %1 5043} 5044 5045define i16 @atomicrmw_xchg_i16_seq_cst(i16* %a, i16 %b) nounwind { 5046; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst: 5047; RV32I: # %bb.0: 5048; RV32I-NEXT: addi sp, sp, -16 5049; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5050; RV32I-NEXT: li a2, 5 5051; RV32I-NEXT: call __atomic_exchange_2@plt 5052; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5053; RV32I-NEXT: addi sp, sp, 16 5054; RV32I-NEXT: ret 5055; 5056; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst: 5057; RV32IA: # %bb.0: 5058; RV32IA-NEXT: andi a2, a0, -4 5059; RV32IA-NEXT: slli a0, a0, 3 5060; RV32IA-NEXT: lui a3, 16 5061; RV32IA-NEXT: addi a3, a3, -1 5062; RV32IA-NEXT: sll a4, a3, a0 5063; RV32IA-NEXT: and a1, a1, a3 5064; RV32IA-NEXT: sll a1, a1, a0 5065; RV32IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 5066; RV32IA-NEXT: lr.w.aqrl a3, (a2) 5067; RV32IA-NEXT: mv a5, a1 5068; RV32IA-NEXT: xor a5, a3, a5 5069; RV32IA-NEXT: and a5, a5, a4 5070; RV32IA-NEXT: xor a5, a3, a5 5071; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 5072; RV32IA-NEXT: bnez a5, .LBB59_1 5073; RV32IA-NEXT: # %bb.2: 5074; RV32IA-NEXT: srl a0, a3, a0 5075; RV32IA-NEXT: ret 5076; 5077; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst: 5078; RV64I: # %bb.0: 5079; RV64I-NEXT: addi sp, sp, -16 5080; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5081; RV64I-NEXT: li a2, 5 5082; RV64I-NEXT: call __atomic_exchange_2@plt 5083; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5084; RV64I-NEXT: addi sp, sp, 16 5085; RV64I-NEXT: ret 5086; 5087; RV64IA-LABEL: atomicrmw_xchg_i16_seq_cst: 5088; RV64IA: # %bb.0: 5089; RV64IA-NEXT: andi a2, a0, -4 5090; RV64IA-NEXT: slliw a0, a0, 3 5091; RV64IA-NEXT: lui a3, 16 5092; RV64IA-NEXT: addiw a3, a3, -1 5093; RV64IA-NEXT: sllw a4, a3, a0 5094; RV64IA-NEXT: and a1, a1, a3 5095; RV64IA-NEXT: sllw a1, a1, a0 5096; RV64IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 5097; RV64IA-NEXT: lr.w.aqrl a3, (a2) 5098; RV64IA-NEXT: mv a5, a1 5099; RV64IA-NEXT: xor a5, a3, a5 5100; RV64IA-NEXT: and a5, a5, a4 5101; RV64IA-NEXT: xor a5, a3, a5 5102; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 5103; RV64IA-NEXT: bnez a5, .LBB59_1 5104; RV64IA-NEXT: # %bb.2: 5105; RV64IA-NEXT: srlw a0, a3, a0 5106; RV64IA-NEXT: ret 5107 %1 = atomicrmw xchg i16* %a, i16 %b seq_cst 5108 ret i16 %1 5109} 5110 5111define i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind { 5112; RV32I-LABEL: atomicrmw_add_i16_monotonic: 5113; RV32I: # %bb.0: 5114; RV32I-NEXT: addi sp, sp, -16 5115; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5116; RV32I-NEXT: li a2, 0 5117; RV32I-NEXT: call __atomic_fetch_add_2@plt 5118; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5119; RV32I-NEXT: addi sp, sp, 16 5120; RV32I-NEXT: ret 5121; 5122; RV32IA-LABEL: atomicrmw_add_i16_monotonic: 5123; RV32IA: # %bb.0: 5124; RV32IA-NEXT: andi a2, a0, -4 5125; RV32IA-NEXT: slli a0, a0, 3 5126; RV32IA-NEXT: lui a3, 16 5127; RV32IA-NEXT: addi a3, a3, -1 5128; RV32IA-NEXT: sll a4, a3, a0 5129; RV32IA-NEXT: and a1, a1, a3 5130; RV32IA-NEXT: sll a1, a1, a0 5131; RV32IA-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 5132; RV32IA-NEXT: lr.w a3, (a2) 5133; RV32IA-NEXT: add a5, a3, a1 5134; RV32IA-NEXT: xor a5, a3, a5 5135; RV32IA-NEXT: and a5, a5, a4 5136; RV32IA-NEXT: xor a5, a3, a5 5137; RV32IA-NEXT: sc.w a5, a5, (a2) 5138; RV32IA-NEXT: bnez a5, .LBB60_1 5139; RV32IA-NEXT: # %bb.2: 5140; RV32IA-NEXT: srl a0, a3, a0 5141; RV32IA-NEXT: ret 5142; 5143; RV64I-LABEL: atomicrmw_add_i16_monotonic: 5144; RV64I: # %bb.0: 5145; RV64I-NEXT: addi sp, sp, -16 5146; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5147; RV64I-NEXT: li a2, 0 5148; RV64I-NEXT: call __atomic_fetch_add_2@plt 5149; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5150; RV64I-NEXT: addi sp, sp, 16 5151; RV64I-NEXT: ret 5152; 5153; RV64IA-LABEL: atomicrmw_add_i16_monotonic: 5154; RV64IA: # %bb.0: 5155; RV64IA-NEXT: andi a2, a0, -4 5156; RV64IA-NEXT: slliw a0, a0, 3 5157; RV64IA-NEXT: lui a3, 16 5158; RV64IA-NEXT: addiw a3, a3, -1 5159; RV64IA-NEXT: sllw a4, a3, a0 5160; RV64IA-NEXT: and a1, a1, a3 5161; RV64IA-NEXT: sllw a1, a1, a0 5162; RV64IA-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 5163; RV64IA-NEXT: lr.w a3, (a2) 5164; RV64IA-NEXT: add a5, a3, a1 5165; RV64IA-NEXT: xor a5, a3, a5 5166; RV64IA-NEXT: and a5, a5, a4 5167; RV64IA-NEXT: xor a5, a3, a5 5168; RV64IA-NEXT: sc.w a5, a5, (a2) 5169; RV64IA-NEXT: bnez a5, .LBB60_1 5170; RV64IA-NEXT: # %bb.2: 5171; RV64IA-NEXT: srlw a0, a3, a0 5172; RV64IA-NEXT: ret 5173 %1 = atomicrmw add i16* %a, i16 %b monotonic 5174 ret i16 %1 5175} 5176 5177define i16 @atomicrmw_add_i16_acquire(i16 *%a, i16 %b) nounwind { 5178; RV32I-LABEL: atomicrmw_add_i16_acquire: 5179; RV32I: # %bb.0: 5180; RV32I-NEXT: addi sp, sp, -16 5181; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5182; RV32I-NEXT: li a2, 2 5183; RV32I-NEXT: call __atomic_fetch_add_2@plt 5184; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5185; RV32I-NEXT: addi sp, sp, 16 5186; RV32I-NEXT: ret 5187; 5188; RV32IA-LABEL: atomicrmw_add_i16_acquire: 5189; RV32IA: # %bb.0: 5190; RV32IA-NEXT: andi a2, a0, -4 5191; RV32IA-NEXT: slli a0, a0, 3 5192; RV32IA-NEXT: lui a3, 16 5193; RV32IA-NEXT: addi a3, a3, -1 5194; RV32IA-NEXT: sll a4, a3, a0 5195; RV32IA-NEXT: and a1, a1, a3 5196; RV32IA-NEXT: sll a1, a1, a0 5197; RV32IA-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 5198; RV32IA-NEXT: lr.w.aq a3, (a2) 5199; RV32IA-NEXT: add a5, a3, a1 5200; RV32IA-NEXT: xor a5, a3, a5 5201; RV32IA-NEXT: and a5, a5, a4 5202; RV32IA-NEXT: xor a5, a3, a5 5203; RV32IA-NEXT: sc.w a5, a5, (a2) 5204; RV32IA-NEXT: bnez a5, .LBB61_1 5205; RV32IA-NEXT: # %bb.2: 5206; RV32IA-NEXT: srl a0, a3, a0 5207; RV32IA-NEXT: ret 5208; 5209; RV64I-LABEL: atomicrmw_add_i16_acquire: 5210; RV64I: # %bb.0: 5211; RV64I-NEXT: addi sp, sp, -16 5212; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5213; RV64I-NEXT: li a2, 2 5214; RV64I-NEXT: call __atomic_fetch_add_2@plt 5215; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5216; RV64I-NEXT: addi sp, sp, 16 5217; RV64I-NEXT: ret 5218; 5219; RV64IA-LABEL: atomicrmw_add_i16_acquire: 5220; RV64IA: # %bb.0: 5221; RV64IA-NEXT: andi a2, a0, -4 5222; RV64IA-NEXT: slliw a0, a0, 3 5223; RV64IA-NEXT: lui a3, 16 5224; RV64IA-NEXT: addiw a3, a3, -1 5225; RV64IA-NEXT: sllw a4, a3, a0 5226; RV64IA-NEXT: and a1, a1, a3 5227; RV64IA-NEXT: sllw a1, a1, a0 5228; RV64IA-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 5229; RV64IA-NEXT: lr.w.aq a3, (a2) 5230; RV64IA-NEXT: add a5, a3, a1 5231; RV64IA-NEXT: xor a5, a3, a5 5232; RV64IA-NEXT: and a5, a5, a4 5233; RV64IA-NEXT: xor a5, a3, a5 5234; RV64IA-NEXT: sc.w a5, a5, (a2) 5235; RV64IA-NEXT: bnez a5, .LBB61_1 5236; RV64IA-NEXT: # %bb.2: 5237; RV64IA-NEXT: srlw a0, a3, a0 5238; RV64IA-NEXT: ret 5239 %1 = atomicrmw add i16* %a, i16 %b acquire 5240 ret i16 %1 5241} 5242 5243define i16 @atomicrmw_add_i16_release(i16 *%a, i16 %b) nounwind { 5244; RV32I-LABEL: atomicrmw_add_i16_release: 5245; RV32I: # %bb.0: 5246; RV32I-NEXT: addi sp, sp, -16 5247; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5248; RV32I-NEXT: li a2, 3 5249; RV32I-NEXT: call __atomic_fetch_add_2@plt 5250; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5251; RV32I-NEXT: addi sp, sp, 16 5252; RV32I-NEXT: ret 5253; 5254; RV32IA-LABEL: atomicrmw_add_i16_release: 5255; RV32IA: # %bb.0: 5256; RV32IA-NEXT: andi a2, a0, -4 5257; RV32IA-NEXT: slli a0, a0, 3 5258; RV32IA-NEXT: lui a3, 16 5259; RV32IA-NEXT: addi a3, a3, -1 5260; RV32IA-NEXT: sll a4, a3, a0 5261; RV32IA-NEXT: and a1, a1, a3 5262; RV32IA-NEXT: sll a1, a1, a0 5263; RV32IA-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 5264; RV32IA-NEXT: lr.w a3, (a2) 5265; RV32IA-NEXT: add a5, a3, a1 5266; RV32IA-NEXT: xor a5, a3, a5 5267; RV32IA-NEXT: and a5, a5, a4 5268; RV32IA-NEXT: xor a5, a3, a5 5269; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5270; RV32IA-NEXT: bnez a5, .LBB62_1 5271; RV32IA-NEXT: # %bb.2: 5272; RV32IA-NEXT: srl a0, a3, a0 5273; RV32IA-NEXT: ret 5274; 5275; RV64I-LABEL: atomicrmw_add_i16_release: 5276; RV64I: # %bb.0: 5277; RV64I-NEXT: addi sp, sp, -16 5278; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5279; RV64I-NEXT: li a2, 3 5280; RV64I-NEXT: call __atomic_fetch_add_2@plt 5281; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5282; RV64I-NEXT: addi sp, sp, 16 5283; RV64I-NEXT: ret 5284; 5285; RV64IA-LABEL: atomicrmw_add_i16_release: 5286; RV64IA: # %bb.0: 5287; RV64IA-NEXT: andi a2, a0, -4 5288; RV64IA-NEXT: slliw a0, a0, 3 5289; RV64IA-NEXT: lui a3, 16 5290; RV64IA-NEXT: addiw a3, a3, -1 5291; RV64IA-NEXT: sllw a4, a3, a0 5292; RV64IA-NEXT: and a1, a1, a3 5293; RV64IA-NEXT: sllw a1, a1, a0 5294; RV64IA-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 5295; RV64IA-NEXT: lr.w a3, (a2) 5296; RV64IA-NEXT: add a5, a3, a1 5297; RV64IA-NEXT: xor a5, a3, a5 5298; RV64IA-NEXT: and a5, a5, a4 5299; RV64IA-NEXT: xor a5, a3, a5 5300; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5301; RV64IA-NEXT: bnez a5, .LBB62_1 5302; RV64IA-NEXT: # %bb.2: 5303; RV64IA-NEXT: srlw a0, a3, a0 5304; RV64IA-NEXT: ret 5305 %1 = atomicrmw add i16* %a, i16 %b release 5306 ret i16 %1 5307} 5308 5309define i16 @atomicrmw_add_i16_acq_rel(i16 *%a, i16 %b) nounwind { 5310; RV32I-LABEL: atomicrmw_add_i16_acq_rel: 5311; RV32I: # %bb.0: 5312; RV32I-NEXT: addi sp, sp, -16 5313; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5314; RV32I-NEXT: li a2, 4 5315; RV32I-NEXT: call __atomic_fetch_add_2@plt 5316; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5317; RV32I-NEXT: addi sp, sp, 16 5318; RV32I-NEXT: ret 5319; 5320; RV32IA-LABEL: atomicrmw_add_i16_acq_rel: 5321; RV32IA: # %bb.0: 5322; RV32IA-NEXT: andi a2, a0, -4 5323; RV32IA-NEXT: slli a0, a0, 3 5324; RV32IA-NEXT: lui a3, 16 5325; RV32IA-NEXT: addi a3, a3, -1 5326; RV32IA-NEXT: sll a4, a3, a0 5327; RV32IA-NEXT: and a1, a1, a3 5328; RV32IA-NEXT: sll a1, a1, a0 5329; RV32IA-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 5330; RV32IA-NEXT: lr.w.aq a3, (a2) 5331; RV32IA-NEXT: add a5, a3, a1 5332; RV32IA-NEXT: xor a5, a3, a5 5333; RV32IA-NEXT: and a5, a5, a4 5334; RV32IA-NEXT: xor a5, a3, a5 5335; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5336; RV32IA-NEXT: bnez a5, .LBB63_1 5337; RV32IA-NEXT: # %bb.2: 5338; RV32IA-NEXT: srl a0, a3, a0 5339; RV32IA-NEXT: ret 5340; 5341; RV64I-LABEL: atomicrmw_add_i16_acq_rel: 5342; RV64I: # %bb.0: 5343; RV64I-NEXT: addi sp, sp, -16 5344; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5345; RV64I-NEXT: li a2, 4 5346; RV64I-NEXT: call __atomic_fetch_add_2@plt 5347; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5348; RV64I-NEXT: addi sp, sp, 16 5349; RV64I-NEXT: ret 5350; 5351; RV64IA-LABEL: atomicrmw_add_i16_acq_rel: 5352; RV64IA: # %bb.0: 5353; RV64IA-NEXT: andi a2, a0, -4 5354; RV64IA-NEXT: slliw a0, a0, 3 5355; RV64IA-NEXT: lui a3, 16 5356; RV64IA-NEXT: addiw a3, a3, -1 5357; RV64IA-NEXT: sllw a4, a3, a0 5358; RV64IA-NEXT: and a1, a1, a3 5359; RV64IA-NEXT: sllw a1, a1, a0 5360; RV64IA-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 5361; RV64IA-NEXT: lr.w.aq a3, (a2) 5362; RV64IA-NEXT: add a5, a3, a1 5363; RV64IA-NEXT: xor a5, a3, a5 5364; RV64IA-NEXT: and a5, a5, a4 5365; RV64IA-NEXT: xor a5, a3, a5 5366; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5367; RV64IA-NEXT: bnez a5, .LBB63_1 5368; RV64IA-NEXT: # %bb.2: 5369; RV64IA-NEXT: srlw a0, a3, a0 5370; RV64IA-NEXT: ret 5371 %1 = atomicrmw add i16* %a, i16 %b acq_rel 5372 ret i16 %1 5373} 5374 5375define i16 @atomicrmw_add_i16_seq_cst(i16 *%a, i16 %b) nounwind { 5376; RV32I-LABEL: atomicrmw_add_i16_seq_cst: 5377; RV32I: # %bb.0: 5378; RV32I-NEXT: addi sp, sp, -16 5379; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5380; RV32I-NEXT: li a2, 5 5381; RV32I-NEXT: call __atomic_fetch_add_2@plt 5382; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5383; RV32I-NEXT: addi sp, sp, 16 5384; RV32I-NEXT: ret 5385; 5386; RV32IA-LABEL: atomicrmw_add_i16_seq_cst: 5387; RV32IA: # %bb.0: 5388; RV32IA-NEXT: andi a2, a0, -4 5389; RV32IA-NEXT: slli a0, a0, 3 5390; RV32IA-NEXT: lui a3, 16 5391; RV32IA-NEXT: addi a3, a3, -1 5392; RV32IA-NEXT: sll a4, a3, a0 5393; RV32IA-NEXT: and a1, a1, a3 5394; RV32IA-NEXT: sll a1, a1, a0 5395; RV32IA-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 5396; RV32IA-NEXT: lr.w.aqrl a3, (a2) 5397; RV32IA-NEXT: add a5, a3, a1 5398; RV32IA-NEXT: xor a5, a3, a5 5399; RV32IA-NEXT: and a5, a5, a4 5400; RV32IA-NEXT: xor a5, a3, a5 5401; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 5402; RV32IA-NEXT: bnez a5, .LBB64_1 5403; RV32IA-NEXT: # %bb.2: 5404; RV32IA-NEXT: srl a0, a3, a0 5405; RV32IA-NEXT: ret 5406; 5407; RV64I-LABEL: atomicrmw_add_i16_seq_cst: 5408; RV64I: # %bb.0: 5409; RV64I-NEXT: addi sp, sp, -16 5410; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5411; RV64I-NEXT: li a2, 5 5412; RV64I-NEXT: call __atomic_fetch_add_2@plt 5413; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5414; RV64I-NEXT: addi sp, sp, 16 5415; RV64I-NEXT: ret 5416; 5417; RV64IA-LABEL: atomicrmw_add_i16_seq_cst: 5418; RV64IA: # %bb.0: 5419; RV64IA-NEXT: andi a2, a0, -4 5420; RV64IA-NEXT: slliw a0, a0, 3 5421; RV64IA-NEXT: lui a3, 16 5422; RV64IA-NEXT: addiw a3, a3, -1 5423; RV64IA-NEXT: sllw a4, a3, a0 5424; RV64IA-NEXT: and a1, a1, a3 5425; RV64IA-NEXT: sllw a1, a1, a0 5426; RV64IA-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 5427; RV64IA-NEXT: lr.w.aqrl a3, (a2) 5428; RV64IA-NEXT: add a5, a3, a1 5429; RV64IA-NEXT: xor a5, a3, a5 5430; RV64IA-NEXT: and a5, a5, a4 5431; RV64IA-NEXT: xor a5, a3, a5 5432; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 5433; RV64IA-NEXT: bnez a5, .LBB64_1 5434; RV64IA-NEXT: # %bb.2: 5435; RV64IA-NEXT: srlw a0, a3, a0 5436; RV64IA-NEXT: ret 5437 %1 = atomicrmw add i16* %a, i16 %b seq_cst 5438 ret i16 %1 5439} 5440 5441define i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind { 5442; RV32I-LABEL: atomicrmw_sub_i16_monotonic: 5443; RV32I: # %bb.0: 5444; RV32I-NEXT: addi sp, sp, -16 5445; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5446; RV32I-NEXT: li a2, 0 5447; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5448; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5449; RV32I-NEXT: addi sp, sp, 16 5450; RV32I-NEXT: ret 5451; 5452; RV32IA-LABEL: atomicrmw_sub_i16_monotonic: 5453; RV32IA: # %bb.0: 5454; RV32IA-NEXT: andi a2, a0, -4 5455; RV32IA-NEXT: slli a0, a0, 3 5456; RV32IA-NEXT: lui a3, 16 5457; RV32IA-NEXT: addi a3, a3, -1 5458; RV32IA-NEXT: sll a4, a3, a0 5459; RV32IA-NEXT: and a1, a1, a3 5460; RV32IA-NEXT: sll a1, a1, a0 5461; RV32IA-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 5462; RV32IA-NEXT: lr.w a3, (a2) 5463; RV32IA-NEXT: sub a5, a3, a1 5464; RV32IA-NEXT: xor a5, a3, a5 5465; RV32IA-NEXT: and a5, a5, a4 5466; RV32IA-NEXT: xor a5, a3, a5 5467; RV32IA-NEXT: sc.w a5, a5, (a2) 5468; RV32IA-NEXT: bnez a5, .LBB65_1 5469; RV32IA-NEXT: # %bb.2: 5470; RV32IA-NEXT: srl a0, a3, a0 5471; RV32IA-NEXT: ret 5472; 5473; RV64I-LABEL: atomicrmw_sub_i16_monotonic: 5474; RV64I: # %bb.0: 5475; RV64I-NEXT: addi sp, sp, -16 5476; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5477; RV64I-NEXT: li a2, 0 5478; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5479; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5480; RV64I-NEXT: addi sp, sp, 16 5481; RV64I-NEXT: ret 5482; 5483; RV64IA-LABEL: atomicrmw_sub_i16_monotonic: 5484; RV64IA: # %bb.0: 5485; RV64IA-NEXT: andi a2, a0, -4 5486; RV64IA-NEXT: slliw a0, a0, 3 5487; RV64IA-NEXT: lui a3, 16 5488; RV64IA-NEXT: addiw a3, a3, -1 5489; RV64IA-NEXT: sllw a4, a3, a0 5490; RV64IA-NEXT: and a1, a1, a3 5491; RV64IA-NEXT: sllw a1, a1, a0 5492; RV64IA-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 5493; RV64IA-NEXT: lr.w a3, (a2) 5494; RV64IA-NEXT: sub a5, a3, a1 5495; RV64IA-NEXT: xor a5, a3, a5 5496; RV64IA-NEXT: and a5, a5, a4 5497; RV64IA-NEXT: xor a5, a3, a5 5498; RV64IA-NEXT: sc.w a5, a5, (a2) 5499; RV64IA-NEXT: bnez a5, .LBB65_1 5500; RV64IA-NEXT: # %bb.2: 5501; RV64IA-NEXT: srlw a0, a3, a0 5502; RV64IA-NEXT: ret 5503 %1 = atomicrmw sub i16* %a, i16 %b monotonic 5504 ret i16 %1 5505} 5506 5507define i16 @atomicrmw_sub_i16_acquire(i16* %a, i16 %b) nounwind { 5508; RV32I-LABEL: atomicrmw_sub_i16_acquire: 5509; RV32I: # %bb.0: 5510; RV32I-NEXT: addi sp, sp, -16 5511; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5512; RV32I-NEXT: li a2, 2 5513; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5514; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5515; RV32I-NEXT: addi sp, sp, 16 5516; RV32I-NEXT: ret 5517; 5518; RV32IA-LABEL: atomicrmw_sub_i16_acquire: 5519; RV32IA: # %bb.0: 5520; RV32IA-NEXT: andi a2, a0, -4 5521; RV32IA-NEXT: slli a0, a0, 3 5522; RV32IA-NEXT: lui a3, 16 5523; RV32IA-NEXT: addi a3, a3, -1 5524; RV32IA-NEXT: sll a4, a3, a0 5525; RV32IA-NEXT: and a1, a1, a3 5526; RV32IA-NEXT: sll a1, a1, a0 5527; RV32IA-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 5528; RV32IA-NEXT: lr.w.aq a3, (a2) 5529; RV32IA-NEXT: sub a5, a3, a1 5530; RV32IA-NEXT: xor a5, a3, a5 5531; RV32IA-NEXT: and a5, a5, a4 5532; RV32IA-NEXT: xor a5, a3, a5 5533; RV32IA-NEXT: sc.w a5, a5, (a2) 5534; RV32IA-NEXT: bnez a5, .LBB66_1 5535; RV32IA-NEXT: # %bb.2: 5536; RV32IA-NEXT: srl a0, a3, a0 5537; RV32IA-NEXT: ret 5538; 5539; RV64I-LABEL: atomicrmw_sub_i16_acquire: 5540; RV64I: # %bb.0: 5541; RV64I-NEXT: addi sp, sp, -16 5542; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5543; RV64I-NEXT: li a2, 2 5544; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5545; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5546; RV64I-NEXT: addi sp, sp, 16 5547; RV64I-NEXT: ret 5548; 5549; RV64IA-LABEL: atomicrmw_sub_i16_acquire: 5550; RV64IA: # %bb.0: 5551; RV64IA-NEXT: andi a2, a0, -4 5552; RV64IA-NEXT: slliw a0, a0, 3 5553; RV64IA-NEXT: lui a3, 16 5554; RV64IA-NEXT: addiw a3, a3, -1 5555; RV64IA-NEXT: sllw a4, a3, a0 5556; RV64IA-NEXT: and a1, a1, a3 5557; RV64IA-NEXT: sllw a1, a1, a0 5558; RV64IA-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 5559; RV64IA-NEXT: lr.w.aq a3, (a2) 5560; RV64IA-NEXT: sub a5, a3, a1 5561; RV64IA-NEXT: xor a5, a3, a5 5562; RV64IA-NEXT: and a5, a5, a4 5563; RV64IA-NEXT: xor a5, a3, a5 5564; RV64IA-NEXT: sc.w a5, a5, (a2) 5565; RV64IA-NEXT: bnez a5, .LBB66_1 5566; RV64IA-NEXT: # %bb.2: 5567; RV64IA-NEXT: srlw a0, a3, a0 5568; RV64IA-NEXT: ret 5569 %1 = atomicrmw sub i16* %a, i16 %b acquire 5570 ret i16 %1 5571} 5572 5573define i16 @atomicrmw_sub_i16_release(i16* %a, i16 %b) nounwind { 5574; RV32I-LABEL: atomicrmw_sub_i16_release: 5575; RV32I: # %bb.0: 5576; RV32I-NEXT: addi sp, sp, -16 5577; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5578; RV32I-NEXT: li a2, 3 5579; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5580; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5581; RV32I-NEXT: addi sp, sp, 16 5582; RV32I-NEXT: ret 5583; 5584; RV32IA-LABEL: atomicrmw_sub_i16_release: 5585; RV32IA: # %bb.0: 5586; RV32IA-NEXT: andi a2, a0, -4 5587; RV32IA-NEXT: slli a0, a0, 3 5588; RV32IA-NEXT: lui a3, 16 5589; RV32IA-NEXT: addi a3, a3, -1 5590; RV32IA-NEXT: sll a4, a3, a0 5591; RV32IA-NEXT: and a1, a1, a3 5592; RV32IA-NEXT: sll a1, a1, a0 5593; RV32IA-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 5594; RV32IA-NEXT: lr.w a3, (a2) 5595; RV32IA-NEXT: sub a5, a3, a1 5596; RV32IA-NEXT: xor a5, a3, a5 5597; RV32IA-NEXT: and a5, a5, a4 5598; RV32IA-NEXT: xor a5, a3, a5 5599; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5600; RV32IA-NEXT: bnez a5, .LBB67_1 5601; RV32IA-NEXT: # %bb.2: 5602; RV32IA-NEXT: srl a0, a3, a0 5603; RV32IA-NEXT: ret 5604; 5605; RV64I-LABEL: atomicrmw_sub_i16_release: 5606; RV64I: # %bb.0: 5607; RV64I-NEXT: addi sp, sp, -16 5608; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5609; RV64I-NEXT: li a2, 3 5610; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5611; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5612; RV64I-NEXT: addi sp, sp, 16 5613; RV64I-NEXT: ret 5614; 5615; RV64IA-LABEL: atomicrmw_sub_i16_release: 5616; RV64IA: # %bb.0: 5617; RV64IA-NEXT: andi a2, a0, -4 5618; RV64IA-NEXT: slliw a0, a0, 3 5619; RV64IA-NEXT: lui a3, 16 5620; RV64IA-NEXT: addiw a3, a3, -1 5621; RV64IA-NEXT: sllw a4, a3, a0 5622; RV64IA-NEXT: and a1, a1, a3 5623; RV64IA-NEXT: sllw a1, a1, a0 5624; RV64IA-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 5625; RV64IA-NEXT: lr.w a3, (a2) 5626; RV64IA-NEXT: sub a5, a3, a1 5627; RV64IA-NEXT: xor a5, a3, a5 5628; RV64IA-NEXT: and a5, a5, a4 5629; RV64IA-NEXT: xor a5, a3, a5 5630; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5631; RV64IA-NEXT: bnez a5, .LBB67_1 5632; RV64IA-NEXT: # %bb.2: 5633; RV64IA-NEXT: srlw a0, a3, a0 5634; RV64IA-NEXT: ret 5635 %1 = atomicrmw sub i16* %a, i16 %b release 5636 ret i16 %1 5637} 5638 5639define i16 @atomicrmw_sub_i16_acq_rel(i16* %a, i16 %b) nounwind { 5640; RV32I-LABEL: atomicrmw_sub_i16_acq_rel: 5641; RV32I: # %bb.0: 5642; RV32I-NEXT: addi sp, sp, -16 5643; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5644; RV32I-NEXT: li a2, 4 5645; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5646; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5647; RV32I-NEXT: addi sp, sp, 16 5648; RV32I-NEXT: ret 5649; 5650; RV32IA-LABEL: atomicrmw_sub_i16_acq_rel: 5651; RV32IA: # %bb.0: 5652; RV32IA-NEXT: andi a2, a0, -4 5653; RV32IA-NEXT: slli a0, a0, 3 5654; RV32IA-NEXT: lui a3, 16 5655; RV32IA-NEXT: addi a3, a3, -1 5656; RV32IA-NEXT: sll a4, a3, a0 5657; RV32IA-NEXT: and a1, a1, a3 5658; RV32IA-NEXT: sll a1, a1, a0 5659; RV32IA-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 5660; RV32IA-NEXT: lr.w.aq a3, (a2) 5661; RV32IA-NEXT: sub a5, a3, a1 5662; RV32IA-NEXT: xor a5, a3, a5 5663; RV32IA-NEXT: and a5, a5, a4 5664; RV32IA-NEXT: xor a5, a3, a5 5665; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 5666; RV32IA-NEXT: bnez a5, .LBB68_1 5667; RV32IA-NEXT: # %bb.2: 5668; RV32IA-NEXT: srl a0, a3, a0 5669; RV32IA-NEXT: ret 5670; 5671; RV64I-LABEL: atomicrmw_sub_i16_acq_rel: 5672; RV64I: # %bb.0: 5673; RV64I-NEXT: addi sp, sp, -16 5674; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5675; RV64I-NEXT: li a2, 4 5676; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5677; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5678; RV64I-NEXT: addi sp, sp, 16 5679; RV64I-NEXT: ret 5680; 5681; RV64IA-LABEL: atomicrmw_sub_i16_acq_rel: 5682; RV64IA: # %bb.0: 5683; RV64IA-NEXT: andi a2, a0, -4 5684; RV64IA-NEXT: slliw a0, a0, 3 5685; RV64IA-NEXT: lui a3, 16 5686; RV64IA-NEXT: addiw a3, a3, -1 5687; RV64IA-NEXT: sllw a4, a3, a0 5688; RV64IA-NEXT: and a1, a1, a3 5689; RV64IA-NEXT: sllw a1, a1, a0 5690; RV64IA-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 5691; RV64IA-NEXT: lr.w.aq a3, (a2) 5692; RV64IA-NEXT: sub a5, a3, a1 5693; RV64IA-NEXT: xor a5, a3, a5 5694; RV64IA-NEXT: and a5, a5, a4 5695; RV64IA-NEXT: xor a5, a3, a5 5696; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 5697; RV64IA-NEXT: bnez a5, .LBB68_1 5698; RV64IA-NEXT: # %bb.2: 5699; RV64IA-NEXT: srlw a0, a3, a0 5700; RV64IA-NEXT: ret 5701 %1 = atomicrmw sub i16* %a, i16 %b acq_rel 5702 ret i16 %1 5703} 5704 5705define i16 @atomicrmw_sub_i16_seq_cst(i16* %a, i16 %b) nounwind { 5706; RV32I-LABEL: atomicrmw_sub_i16_seq_cst: 5707; RV32I: # %bb.0: 5708; RV32I-NEXT: addi sp, sp, -16 5709; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5710; RV32I-NEXT: li a2, 5 5711; RV32I-NEXT: call __atomic_fetch_sub_2@plt 5712; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5713; RV32I-NEXT: addi sp, sp, 16 5714; RV32I-NEXT: ret 5715; 5716; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst: 5717; RV32IA: # %bb.0: 5718; RV32IA-NEXT: andi a2, a0, -4 5719; RV32IA-NEXT: slli a0, a0, 3 5720; RV32IA-NEXT: lui a3, 16 5721; RV32IA-NEXT: addi a3, a3, -1 5722; RV32IA-NEXT: sll a4, a3, a0 5723; RV32IA-NEXT: and a1, a1, a3 5724; RV32IA-NEXT: sll a1, a1, a0 5725; RV32IA-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 5726; RV32IA-NEXT: lr.w.aqrl a3, (a2) 5727; RV32IA-NEXT: sub a5, a3, a1 5728; RV32IA-NEXT: xor a5, a3, a5 5729; RV32IA-NEXT: and a5, a5, a4 5730; RV32IA-NEXT: xor a5, a3, a5 5731; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 5732; RV32IA-NEXT: bnez a5, .LBB69_1 5733; RV32IA-NEXT: # %bb.2: 5734; RV32IA-NEXT: srl a0, a3, a0 5735; RV32IA-NEXT: ret 5736; 5737; RV64I-LABEL: atomicrmw_sub_i16_seq_cst: 5738; RV64I: # %bb.0: 5739; RV64I-NEXT: addi sp, sp, -16 5740; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5741; RV64I-NEXT: li a2, 5 5742; RV64I-NEXT: call __atomic_fetch_sub_2@plt 5743; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5744; RV64I-NEXT: addi sp, sp, 16 5745; RV64I-NEXT: ret 5746; 5747; RV64IA-LABEL: atomicrmw_sub_i16_seq_cst: 5748; RV64IA: # %bb.0: 5749; RV64IA-NEXT: andi a2, a0, -4 5750; RV64IA-NEXT: slliw a0, a0, 3 5751; RV64IA-NEXT: lui a3, 16 5752; RV64IA-NEXT: addiw a3, a3, -1 5753; RV64IA-NEXT: sllw a4, a3, a0 5754; RV64IA-NEXT: and a1, a1, a3 5755; RV64IA-NEXT: sllw a1, a1, a0 5756; RV64IA-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 5757; RV64IA-NEXT: lr.w.aqrl a3, (a2) 5758; RV64IA-NEXT: sub a5, a3, a1 5759; RV64IA-NEXT: xor a5, a3, a5 5760; RV64IA-NEXT: and a5, a5, a4 5761; RV64IA-NEXT: xor a5, a3, a5 5762; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 5763; RV64IA-NEXT: bnez a5, .LBB69_1 5764; RV64IA-NEXT: # %bb.2: 5765; RV64IA-NEXT: srlw a0, a3, a0 5766; RV64IA-NEXT: ret 5767 %1 = atomicrmw sub i16* %a, i16 %b seq_cst 5768 ret i16 %1 5769} 5770 5771define i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind { 5772; RV32I-LABEL: atomicrmw_and_i16_monotonic: 5773; RV32I: # %bb.0: 5774; RV32I-NEXT: addi sp, sp, -16 5775; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5776; RV32I-NEXT: li a2, 0 5777; RV32I-NEXT: call __atomic_fetch_and_2@plt 5778; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5779; RV32I-NEXT: addi sp, sp, 16 5780; RV32I-NEXT: ret 5781; 5782; RV32IA-LABEL: atomicrmw_and_i16_monotonic: 5783; RV32IA: # %bb.0: 5784; RV32IA-NEXT: andi a2, a0, -4 5785; RV32IA-NEXT: slli a0, a0, 3 5786; RV32IA-NEXT: lui a3, 16 5787; RV32IA-NEXT: addi a3, a3, -1 5788; RV32IA-NEXT: sll a4, a3, a0 5789; RV32IA-NEXT: not a4, a4 5790; RV32IA-NEXT: and a1, a1, a3 5791; RV32IA-NEXT: sll a1, a1, a0 5792; RV32IA-NEXT: or a1, a4, a1 5793; RV32IA-NEXT: amoand.w a1, a1, (a2) 5794; RV32IA-NEXT: srl a0, a1, a0 5795; RV32IA-NEXT: ret 5796; 5797; RV64I-LABEL: atomicrmw_and_i16_monotonic: 5798; RV64I: # %bb.0: 5799; RV64I-NEXT: addi sp, sp, -16 5800; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5801; RV64I-NEXT: li a2, 0 5802; RV64I-NEXT: call __atomic_fetch_and_2@plt 5803; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5804; RV64I-NEXT: addi sp, sp, 16 5805; RV64I-NEXT: ret 5806; 5807; RV64IA-LABEL: atomicrmw_and_i16_monotonic: 5808; RV64IA: # %bb.0: 5809; RV64IA-NEXT: andi a2, a0, -4 5810; RV64IA-NEXT: slliw a0, a0, 3 5811; RV64IA-NEXT: lui a3, 16 5812; RV64IA-NEXT: addiw a3, a3, -1 5813; RV64IA-NEXT: sllw a4, a3, a0 5814; RV64IA-NEXT: not a4, a4 5815; RV64IA-NEXT: and a1, a1, a3 5816; RV64IA-NEXT: sllw a1, a1, a0 5817; RV64IA-NEXT: or a1, a4, a1 5818; RV64IA-NEXT: amoand.w a1, a1, (a2) 5819; RV64IA-NEXT: srlw a0, a1, a0 5820; RV64IA-NEXT: ret 5821 %1 = atomicrmw and i16* %a, i16 %b monotonic 5822 ret i16 %1 5823} 5824 5825define i16 @atomicrmw_and_i16_acquire(i16 *%a, i16 %b) nounwind { 5826; RV32I-LABEL: atomicrmw_and_i16_acquire: 5827; RV32I: # %bb.0: 5828; RV32I-NEXT: addi sp, sp, -16 5829; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5830; RV32I-NEXT: li a2, 2 5831; RV32I-NEXT: call __atomic_fetch_and_2@plt 5832; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5833; RV32I-NEXT: addi sp, sp, 16 5834; RV32I-NEXT: ret 5835; 5836; RV32IA-LABEL: atomicrmw_and_i16_acquire: 5837; RV32IA: # %bb.0: 5838; RV32IA-NEXT: andi a2, a0, -4 5839; RV32IA-NEXT: slli a0, a0, 3 5840; RV32IA-NEXT: lui a3, 16 5841; RV32IA-NEXT: addi a3, a3, -1 5842; RV32IA-NEXT: sll a4, a3, a0 5843; RV32IA-NEXT: not a4, a4 5844; RV32IA-NEXT: and a1, a1, a3 5845; RV32IA-NEXT: sll a1, a1, a0 5846; RV32IA-NEXT: or a1, a4, a1 5847; RV32IA-NEXT: amoand.w.aq a1, a1, (a2) 5848; RV32IA-NEXT: srl a0, a1, a0 5849; RV32IA-NEXT: ret 5850; 5851; RV64I-LABEL: atomicrmw_and_i16_acquire: 5852; RV64I: # %bb.0: 5853; RV64I-NEXT: addi sp, sp, -16 5854; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5855; RV64I-NEXT: li a2, 2 5856; RV64I-NEXT: call __atomic_fetch_and_2@plt 5857; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5858; RV64I-NEXT: addi sp, sp, 16 5859; RV64I-NEXT: ret 5860; 5861; RV64IA-LABEL: atomicrmw_and_i16_acquire: 5862; RV64IA: # %bb.0: 5863; RV64IA-NEXT: andi a2, a0, -4 5864; RV64IA-NEXT: slliw a0, a0, 3 5865; RV64IA-NEXT: lui a3, 16 5866; RV64IA-NEXT: addiw a3, a3, -1 5867; RV64IA-NEXT: sllw a4, a3, a0 5868; RV64IA-NEXT: not a4, a4 5869; RV64IA-NEXT: and a1, a1, a3 5870; RV64IA-NEXT: sllw a1, a1, a0 5871; RV64IA-NEXT: or a1, a4, a1 5872; RV64IA-NEXT: amoand.w.aq a1, a1, (a2) 5873; RV64IA-NEXT: srlw a0, a1, a0 5874; RV64IA-NEXT: ret 5875 %1 = atomicrmw and i16* %a, i16 %b acquire 5876 ret i16 %1 5877} 5878 5879define i16 @atomicrmw_and_i16_release(i16 *%a, i16 %b) nounwind { 5880; RV32I-LABEL: atomicrmw_and_i16_release: 5881; RV32I: # %bb.0: 5882; RV32I-NEXT: addi sp, sp, -16 5883; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5884; RV32I-NEXT: li a2, 3 5885; RV32I-NEXT: call __atomic_fetch_and_2@plt 5886; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5887; RV32I-NEXT: addi sp, sp, 16 5888; RV32I-NEXT: ret 5889; 5890; RV32IA-LABEL: atomicrmw_and_i16_release: 5891; RV32IA: # %bb.0: 5892; RV32IA-NEXT: andi a2, a0, -4 5893; RV32IA-NEXT: slli a0, a0, 3 5894; RV32IA-NEXT: lui a3, 16 5895; RV32IA-NEXT: addi a3, a3, -1 5896; RV32IA-NEXT: sll a4, a3, a0 5897; RV32IA-NEXT: not a4, a4 5898; RV32IA-NEXT: and a1, a1, a3 5899; RV32IA-NEXT: sll a1, a1, a0 5900; RV32IA-NEXT: or a1, a4, a1 5901; RV32IA-NEXT: amoand.w.rl a1, a1, (a2) 5902; RV32IA-NEXT: srl a0, a1, a0 5903; RV32IA-NEXT: ret 5904; 5905; RV64I-LABEL: atomicrmw_and_i16_release: 5906; RV64I: # %bb.0: 5907; RV64I-NEXT: addi sp, sp, -16 5908; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5909; RV64I-NEXT: li a2, 3 5910; RV64I-NEXT: call __atomic_fetch_and_2@plt 5911; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5912; RV64I-NEXT: addi sp, sp, 16 5913; RV64I-NEXT: ret 5914; 5915; RV64IA-LABEL: atomicrmw_and_i16_release: 5916; RV64IA: # %bb.0: 5917; RV64IA-NEXT: andi a2, a0, -4 5918; RV64IA-NEXT: slliw a0, a0, 3 5919; RV64IA-NEXT: lui a3, 16 5920; RV64IA-NEXT: addiw a3, a3, -1 5921; RV64IA-NEXT: sllw a4, a3, a0 5922; RV64IA-NEXT: not a4, a4 5923; RV64IA-NEXT: and a1, a1, a3 5924; RV64IA-NEXT: sllw a1, a1, a0 5925; RV64IA-NEXT: or a1, a4, a1 5926; RV64IA-NEXT: amoand.w.rl a1, a1, (a2) 5927; RV64IA-NEXT: srlw a0, a1, a0 5928; RV64IA-NEXT: ret 5929 %1 = atomicrmw and i16* %a, i16 %b release 5930 ret i16 %1 5931} 5932 5933define i16 @atomicrmw_and_i16_acq_rel(i16 *%a, i16 %b) nounwind { 5934; RV32I-LABEL: atomicrmw_and_i16_acq_rel: 5935; RV32I: # %bb.0: 5936; RV32I-NEXT: addi sp, sp, -16 5937; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5938; RV32I-NEXT: li a2, 4 5939; RV32I-NEXT: call __atomic_fetch_and_2@plt 5940; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5941; RV32I-NEXT: addi sp, sp, 16 5942; RV32I-NEXT: ret 5943; 5944; RV32IA-LABEL: atomicrmw_and_i16_acq_rel: 5945; RV32IA: # %bb.0: 5946; RV32IA-NEXT: andi a2, a0, -4 5947; RV32IA-NEXT: slli a0, a0, 3 5948; RV32IA-NEXT: lui a3, 16 5949; RV32IA-NEXT: addi a3, a3, -1 5950; RV32IA-NEXT: sll a4, a3, a0 5951; RV32IA-NEXT: not a4, a4 5952; RV32IA-NEXT: and a1, a1, a3 5953; RV32IA-NEXT: sll a1, a1, a0 5954; RV32IA-NEXT: or a1, a4, a1 5955; RV32IA-NEXT: amoand.w.aqrl a1, a1, (a2) 5956; RV32IA-NEXT: srl a0, a1, a0 5957; RV32IA-NEXT: ret 5958; 5959; RV64I-LABEL: atomicrmw_and_i16_acq_rel: 5960; RV64I: # %bb.0: 5961; RV64I-NEXT: addi sp, sp, -16 5962; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5963; RV64I-NEXT: li a2, 4 5964; RV64I-NEXT: call __atomic_fetch_and_2@plt 5965; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5966; RV64I-NEXT: addi sp, sp, 16 5967; RV64I-NEXT: ret 5968; 5969; RV64IA-LABEL: atomicrmw_and_i16_acq_rel: 5970; RV64IA: # %bb.0: 5971; RV64IA-NEXT: andi a2, a0, -4 5972; RV64IA-NEXT: slliw a0, a0, 3 5973; RV64IA-NEXT: lui a3, 16 5974; RV64IA-NEXT: addiw a3, a3, -1 5975; RV64IA-NEXT: sllw a4, a3, a0 5976; RV64IA-NEXT: not a4, a4 5977; RV64IA-NEXT: and a1, a1, a3 5978; RV64IA-NEXT: sllw a1, a1, a0 5979; RV64IA-NEXT: or a1, a4, a1 5980; RV64IA-NEXT: amoand.w.aqrl a1, a1, (a2) 5981; RV64IA-NEXT: srlw a0, a1, a0 5982; RV64IA-NEXT: ret 5983 %1 = atomicrmw and i16* %a, i16 %b acq_rel 5984 ret i16 %1 5985} 5986 5987define i16 @atomicrmw_and_i16_seq_cst(i16 *%a, i16 %b) nounwind { 5988; RV32I-LABEL: atomicrmw_and_i16_seq_cst: 5989; RV32I: # %bb.0: 5990; RV32I-NEXT: addi sp, sp, -16 5991; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5992; RV32I-NEXT: li a2, 5 5993; RV32I-NEXT: call __atomic_fetch_and_2@plt 5994; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5995; RV32I-NEXT: addi sp, sp, 16 5996; RV32I-NEXT: ret 5997; 5998; RV32IA-LABEL: atomicrmw_and_i16_seq_cst: 5999; RV32IA: # %bb.0: 6000; RV32IA-NEXT: andi a2, a0, -4 6001; RV32IA-NEXT: slli a0, a0, 3 6002; RV32IA-NEXT: lui a3, 16 6003; RV32IA-NEXT: addi a3, a3, -1 6004; RV32IA-NEXT: sll a4, a3, a0 6005; RV32IA-NEXT: not a4, a4 6006; RV32IA-NEXT: and a1, a1, a3 6007; RV32IA-NEXT: sll a1, a1, a0 6008; RV32IA-NEXT: or a1, a4, a1 6009; RV32IA-NEXT: amoand.w.aqrl a1, a1, (a2) 6010; RV32IA-NEXT: srl a0, a1, a0 6011; RV32IA-NEXT: ret 6012; 6013; RV64I-LABEL: atomicrmw_and_i16_seq_cst: 6014; RV64I: # %bb.0: 6015; RV64I-NEXT: addi sp, sp, -16 6016; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6017; RV64I-NEXT: li a2, 5 6018; RV64I-NEXT: call __atomic_fetch_and_2@plt 6019; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6020; RV64I-NEXT: addi sp, sp, 16 6021; RV64I-NEXT: ret 6022; 6023; RV64IA-LABEL: atomicrmw_and_i16_seq_cst: 6024; RV64IA: # %bb.0: 6025; RV64IA-NEXT: andi a2, a0, -4 6026; RV64IA-NEXT: slliw a0, a0, 3 6027; RV64IA-NEXT: lui a3, 16 6028; RV64IA-NEXT: addiw a3, a3, -1 6029; RV64IA-NEXT: sllw a4, a3, a0 6030; RV64IA-NEXT: not a4, a4 6031; RV64IA-NEXT: and a1, a1, a3 6032; RV64IA-NEXT: sllw a1, a1, a0 6033; RV64IA-NEXT: or a1, a4, a1 6034; RV64IA-NEXT: amoand.w.aqrl a1, a1, (a2) 6035; RV64IA-NEXT: srlw a0, a1, a0 6036; RV64IA-NEXT: ret 6037 %1 = atomicrmw and i16* %a, i16 %b seq_cst 6038 ret i16 %1 6039} 6040 6041define i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind { 6042; RV32I-LABEL: atomicrmw_nand_i16_monotonic: 6043; RV32I: # %bb.0: 6044; RV32I-NEXT: addi sp, sp, -16 6045; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6046; RV32I-NEXT: li a2, 0 6047; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6048; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6049; RV32I-NEXT: addi sp, sp, 16 6050; RV32I-NEXT: ret 6051; 6052; RV32IA-LABEL: atomicrmw_nand_i16_monotonic: 6053; RV32IA: # %bb.0: 6054; RV32IA-NEXT: andi a2, a0, -4 6055; RV32IA-NEXT: slli a0, a0, 3 6056; RV32IA-NEXT: lui a3, 16 6057; RV32IA-NEXT: addi a3, a3, -1 6058; RV32IA-NEXT: sll a4, a3, a0 6059; RV32IA-NEXT: and a1, a1, a3 6060; RV32IA-NEXT: sll a1, a1, a0 6061; RV32IA-NEXT: .LBB75_1: # =>This Inner Loop Header: Depth=1 6062; RV32IA-NEXT: lr.w a3, (a2) 6063; RV32IA-NEXT: and a5, a3, a1 6064; RV32IA-NEXT: not a5, a5 6065; RV32IA-NEXT: xor a5, a3, a5 6066; RV32IA-NEXT: and a5, a5, a4 6067; RV32IA-NEXT: xor a5, a3, a5 6068; RV32IA-NEXT: sc.w a5, a5, (a2) 6069; RV32IA-NEXT: bnez a5, .LBB75_1 6070; RV32IA-NEXT: # %bb.2: 6071; RV32IA-NEXT: srl a0, a3, a0 6072; RV32IA-NEXT: ret 6073; 6074; RV64I-LABEL: atomicrmw_nand_i16_monotonic: 6075; RV64I: # %bb.0: 6076; RV64I-NEXT: addi sp, sp, -16 6077; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6078; RV64I-NEXT: li a2, 0 6079; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6080; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6081; RV64I-NEXT: addi sp, sp, 16 6082; RV64I-NEXT: ret 6083; 6084; RV64IA-LABEL: atomicrmw_nand_i16_monotonic: 6085; RV64IA: # %bb.0: 6086; RV64IA-NEXT: andi a2, a0, -4 6087; RV64IA-NEXT: slliw a0, a0, 3 6088; RV64IA-NEXT: lui a3, 16 6089; RV64IA-NEXT: addiw a3, a3, -1 6090; RV64IA-NEXT: sllw a4, a3, a0 6091; RV64IA-NEXT: and a1, a1, a3 6092; RV64IA-NEXT: sllw a1, a1, a0 6093; RV64IA-NEXT: .LBB75_1: # =>This Inner Loop Header: Depth=1 6094; RV64IA-NEXT: lr.w a3, (a2) 6095; RV64IA-NEXT: and a5, a3, a1 6096; RV64IA-NEXT: not a5, a5 6097; RV64IA-NEXT: xor a5, a3, a5 6098; RV64IA-NEXT: and a5, a5, a4 6099; RV64IA-NEXT: xor a5, a3, a5 6100; RV64IA-NEXT: sc.w a5, a5, (a2) 6101; RV64IA-NEXT: bnez a5, .LBB75_1 6102; RV64IA-NEXT: # %bb.2: 6103; RV64IA-NEXT: srlw a0, a3, a0 6104; RV64IA-NEXT: ret 6105 %1 = atomicrmw nand i16* %a, i16 %b monotonic 6106 ret i16 %1 6107} 6108 6109define i16 @atomicrmw_nand_i16_acquire(i16* %a, i16 %b) nounwind { 6110; RV32I-LABEL: atomicrmw_nand_i16_acquire: 6111; RV32I: # %bb.0: 6112; RV32I-NEXT: addi sp, sp, -16 6113; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6114; RV32I-NEXT: li a2, 2 6115; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6116; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6117; RV32I-NEXT: addi sp, sp, 16 6118; RV32I-NEXT: ret 6119; 6120; RV32IA-LABEL: atomicrmw_nand_i16_acquire: 6121; RV32IA: # %bb.0: 6122; RV32IA-NEXT: andi a2, a0, -4 6123; RV32IA-NEXT: slli a0, a0, 3 6124; RV32IA-NEXT: lui a3, 16 6125; RV32IA-NEXT: addi a3, a3, -1 6126; RV32IA-NEXT: sll a4, a3, a0 6127; RV32IA-NEXT: and a1, a1, a3 6128; RV32IA-NEXT: sll a1, a1, a0 6129; RV32IA-NEXT: .LBB76_1: # =>This Inner Loop Header: Depth=1 6130; RV32IA-NEXT: lr.w.aq a3, (a2) 6131; RV32IA-NEXT: and a5, a3, a1 6132; RV32IA-NEXT: not a5, a5 6133; RV32IA-NEXT: xor a5, a3, a5 6134; RV32IA-NEXT: and a5, a5, a4 6135; RV32IA-NEXT: xor a5, a3, a5 6136; RV32IA-NEXT: sc.w a5, a5, (a2) 6137; RV32IA-NEXT: bnez a5, .LBB76_1 6138; RV32IA-NEXT: # %bb.2: 6139; RV32IA-NEXT: srl a0, a3, a0 6140; RV32IA-NEXT: ret 6141; 6142; RV64I-LABEL: atomicrmw_nand_i16_acquire: 6143; RV64I: # %bb.0: 6144; RV64I-NEXT: addi sp, sp, -16 6145; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6146; RV64I-NEXT: li a2, 2 6147; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6148; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6149; RV64I-NEXT: addi sp, sp, 16 6150; RV64I-NEXT: ret 6151; 6152; RV64IA-LABEL: atomicrmw_nand_i16_acquire: 6153; RV64IA: # %bb.0: 6154; RV64IA-NEXT: andi a2, a0, -4 6155; RV64IA-NEXT: slliw a0, a0, 3 6156; RV64IA-NEXT: lui a3, 16 6157; RV64IA-NEXT: addiw a3, a3, -1 6158; RV64IA-NEXT: sllw a4, a3, a0 6159; RV64IA-NEXT: and a1, a1, a3 6160; RV64IA-NEXT: sllw a1, a1, a0 6161; RV64IA-NEXT: .LBB76_1: # =>This Inner Loop Header: Depth=1 6162; RV64IA-NEXT: lr.w.aq a3, (a2) 6163; RV64IA-NEXT: and a5, a3, a1 6164; RV64IA-NEXT: not a5, a5 6165; RV64IA-NEXT: xor a5, a3, a5 6166; RV64IA-NEXT: and a5, a5, a4 6167; RV64IA-NEXT: xor a5, a3, a5 6168; RV64IA-NEXT: sc.w a5, a5, (a2) 6169; RV64IA-NEXT: bnez a5, .LBB76_1 6170; RV64IA-NEXT: # %bb.2: 6171; RV64IA-NEXT: srlw a0, a3, a0 6172; RV64IA-NEXT: ret 6173 %1 = atomicrmw nand i16* %a, i16 %b acquire 6174 ret i16 %1 6175} 6176 6177define i16 @atomicrmw_nand_i16_release(i16* %a, i16 %b) nounwind { 6178; RV32I-LABEL: atomicrmw_nand_i16_release: 6179; RV32I: # %bb.0: 6180; RV32I-NEXT: addi sp, sp, -16 6181; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6182; RV32I-NEXT: li a2, 3 6183; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6184; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6185; RV32I-NEXT: addi sp, sp, 16 6186; RV32I-NEXT: ret 6187; 6188; RV32IA-LABEL: atomicrmw_nand_i16_release: 6189; RV32IA: # %bb.0: 6190; RV32IA-NEXT: andi a2, a0, -4 6191; RV32IA-NEXT: slli a0, a0, 3 6192; RV32IA-NEXT: lui a3, 16 6193; RV32IA-NEXT: addi a3, a3, -1 6194; RV32IA-NEXT: sll a4, a3, a0 6195; RV32IA-NEXT: and a1, a1, a3 6196; RV32IA-NEXT: sll a1, a1, a0 6197; RV32IA-NEXT: .LBB77_1: # =>This Inner Loop Header: Depth=1 6198; RV32IA-NEXT: lr.w a3, (a2) 6199; RV32IA-NEXT: and a5, a3, a1 6200; RV32IA-NEXT: not a5, a5 6201; RV32IA-NEXT: xor a5, a3, a5 6202; RV32IA-NEXT: and a5, a5, a4 6203; RV32IA-NEXT: xor a5, a3, a5 6204; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 6205; RV32IA-NEXT: bnez a5, .LBB77_1 6206; RV32IA-NEXT: # %bb.2: 6207; RV32IA-NEXT: srl a0, a3, a0 6208; RV32IA-NEXT: ret 6209; 6210; RV64I-LABEL: atomicrmw_nand_i16_release: 6211; RV64I: # %bb.0: 6212; RV64I-NEXT: addi sp, sp, -16 6213; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6214; RV64I-NEXT: li a2, 3 6215; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6216; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6217; RV64I-NEXT: addi sp, sp, 16 6218; RV64I-NEXT: ret 6219; 6220; RV64IA-LABEL: atomicrmw_nand_i16_release: 6221; RV64IA: # %bb.0: 6222; RV64IA-NEXT: andi a2, a0, -4 6223; RV64IA-NEXT: slliw a0, a0, 3 6224; RV64IA-NEXT: lui a3, 16 6225; RV64IA-NEXT: addiw a3, a3, -1 6226; RV64IA-NEXT: sllw a4, a3, a0 6227; RV64IA-NEXT: and a1, a1, a3 6228; RV64IA-NEXT: sllw a1, a1, a0 6229; RV64IA-NEXT: .LBB77_1: # =>This Inner Loop Header: Depth=1 6230; RV64IA-NEXT: lr.w a3, (a2) 6231; RV64IA-NEXT: and a5, a3, a1 6232; RV64IA-NEXT: not a5, a5 6233; RV64IA-NEXT: xor a5, a3, a5 6234; RV64IA-NEXT: and a5, a5, a4 6235; RV64IA-NEXT: xor a5, a3, a5 6236; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 6237; RV64IA-NEXT: bnez a5, .LBB77_1 6238; RV64IA-NEXT: # %bb.2: 6239; RV64IA-NEXT: srlw a0, a3, a0 6240; RV64IA-NEXT: ret 6241 %1 = atomicrmw nand i16* %a, i16 %b release 6242 ret i16 %1 6243} 6244 6245define i16 @atomicrmw_nand_i16_acq_rel(i16* %a, i16 %b) nounwind { 6246; RV32I-LABEL: atomicrmw_nand_i16_acq_rel: 6247; RV32I: # %bb.0: 6248; RV32I-NEXT: addi sp, sp, -16 6249; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6250; RV32I-NEXT: li a2, 4 6251; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6252; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6253; RV32I-NEXT: addi sp, sp, 16 6254; RV32I-NEXT: ret 6255; 6256; RV32IA-LABEL: atomicrmw_nand_i16_acq_rel: 6257; RV32IA: # %bb.0: 6258; RV32IA-NEXT: andi a2, a0, -4 6259; RV32IA-NEXT: slli a0, a0, 3 6260; RV32IA-NEXT: lui a3, 16 6261; RV32IA-NEXT: addi a3, a3, -1 6262; RV32IA-NEXT: sll a4, a3, a0 6263; RV32IA-NEXT: and a1, a1, a3 6264; RV32IA-NEXT: sll a1, a1, a0 6265; RV32IA-NEXT: .LBB78_1: # =>This Inner Loop Header: Depth=1 6266; RV32IA-NEXT: lr.w.aq a3, (a2) 6267; RV32IA-NEXT: and a5, a3, a1 6268; RV32IA-NEXT: not a5, a5 6269; RV32IA-NEXT: xor a5, a3, a5 6270; RV32IA-NEXT: and a5, a5, a4 6271; RV32IA-NEXT: xor a5, a3, a5 6272; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 6273; RV32IA-NEXT: bnez a5, .LBB78_1 6274; RV32IA-NEXT: # %bb.2: 6275; RV32IA-NEXT: srl a0, a3, a0 6276; RV32IA-NEXT: ret 6277; 6278; RV64I-LABEL: atomicrmw_nand_i16_acq_rel: 6279; RV64I: # %bb.0: 6280; RV64I-NEXT: addi sp, sp, -16 6281; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6282; RV64I-NEXT: li a2, 4 6283; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6284; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6285; RV64I-NEXT: addi sp, sp, 16 6286; RV64I-NEXT: ret 6287; 6288; RV64IA-LABEL: atomicrmw_nand_i16_acq_rel: 6289; RV64IA: # %bb.0: 6290; RV64IA-NEXT: andi a2, a0, -4 6291; RV64IA-NEXT: slliw a0, a0, 3 6292; RV64IA-NEXT: lui a3, 16 6293; RV64IA-NEXT: addiw a3, a3, -1 6294; RV64IA-NEXT: sllw a4, a3, a0 6295; RV64IA-NEXT: and a1, a1, a3 6296; RV64IA-NEXT: sllw a1, a1, a0 6297; RV64IA-NEXT: .LBB78_1: # =>This Inner Loop Header: Depth=1 6298; RV64IA-NEXT: lr.w.aq a3, (a2) 6299; RV64IA-NEXT: and a5, a3, a1 6300; RV64IA-NEXT: not a5, a5 6301; RV64IA-NEXT: xor a5, a3, a5 6302; RV64IA-NEXT: and a5, a5, a4 6303; RV64IA-NEXT: xor a5, a3, a5 6304; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 6305; RV64IA-NEXT: bnez a5, .LBB78_1 6306; RV64IA-NEXT: # %bb.2: 6307; RV64IA-NEXT: srlw a0, a3, a0 6308; RV64IA-NEXT: ret 6309 %1 = atomicrmw nand i16* %a, i16 %b acq_rel 6310 ret i16 %1 6311} 6312 6313define i16 @atomicrmw_nand_i16_seq_cst(i16* %a, i16 %b) nounwind { 6314; RV32I-LABEL: atomicrmw_nand_i16_seq_cst: 6315; RV32I: # %bb.0: 6316; RV32I-NEXT: addi sp, sp, -16 6317; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6318; RV32I-NEXT: li a2, 5 6319; RV32I-NEXT: call __atomic_fetch_nand_2@plt 6320; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6321; RV32I-NEXT: addi sp, sp, 16 6322; RV32I-NEXT: ret 6323; 6324; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst: 6325; RV32IA: # %bb.0: 6326; RV32IA-NEXT: andi a2, a0, -4 6327; RV32IA-NEXT: slli a0, a0, 3 6328; RV32IA-NEXT: lui a3, 16 6329; RV32IA-NEXT: addi a3, a3, -1 6330; RV32IA-NEXT: sll a4, a3, a0 6331; RV32IA-NEXT: and a1, a1, a3 6332; RV32IA-NEXT: sll a1, a1, a0 6333; RV32IA-NEXT: .LBB79_1: # =>This Inner Loop Header: Depth=1 6334; RV32IA-NEXT: lr.w.aqrl a3, (a2) 6335; RV32IA-NEXT: and a5, a3, a1 6336; RV32IA-NEXT: not a5, a5 6337; RV32IA-NEXT: xor a5, a3, a5 6338; RV32IA-NEXT: and a5, a5, a4 6339; RV32IA-NEXT: xor a5, a3, a5 6340; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 6341; RV32IA-NEXT: bnez a5, .LBB79_1 6342; RV32IA-NEXT: # %bb.2: 6343; RV32IA-NEXT: srl a0, a3, a0 6344; RV32IA-NEXT: ret 6345; 6346; RV64I-LABEL: atomicrmw_nand_i16_seq_cst: 6347; RV64I: # %bb.0: 6348; RV64I-NEXT: addi sp, sp, -16 6349; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6350; RV64I-NEXT: li a2, 5 6351; RV64I-NEXT: call __atomic_fetch_nand_2@plt 6352; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6353; RV64I-NEXT: addi sp, sp, 16 6354; RV64I-NEXT: ret 6355; 6356; RV64IA-LABEL: atomicrmw_nand_i16_seq_cst: 6357; RV64IA: # %bb.0: 6358; RV64IA-NEXT: andi a2, a0, -4 6359; RV64IA-NEXT: slliw a0, a0, 3 6360; RV64IA-NEXT: lui a3, 16 6361; RV64IA-NEXT: addiw a3, a3, -1 6362; RV64IA-NEXT: sllw a4, a3, a0 6363; RV64IA-NEXT: and a1, a1, a3 6364; RV64IA-NEXT: sllw a1, a1, a0 6365; RV64IA-NEXT: .LBB79_1: # =>This Inner Loop Header: Depth=1 6366; RV64IA-NEXT: lr.w.aqrl a3, (a2) 6367; RV64IA-NEXT: and a5, a3, a1 6368; RV64IA-NEXT: not a5, a5 6369; RV64IA-NEXT: xor a5, a3, a5 6370; RV64IA-NEXT: and a5, a5, a4 6371; RV64IA-NEXT: xor a5, a3, a5 6372; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 6373; RV64IA-NEXT: bnez a5, .LBB79_1 6374; RV64IA-NEXT: # %bb.2: 6375; RV64IA-NEXT: srlw a0, a3, a0 6376; RV64IA-NEXT: ret 6377 %1 = atomicrmw nand i16* %a, i16 %b seq_cst 6378 ret i16 %1 6379} 6380 6381define i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind { 6382; RV32I-LABEL: atomicrmw_or_i16_monotonic: 6383; RV32I: # %bb.0: 6384; RV32I-NEXT: addi sp, sp, -16 6385; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6386; RV32I-NEXT: li a2, 0 6387; RV32I-NEXT: call __atomic_fetch_or_2@plt 6388; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6389; RV32I-NEXT: addi sp, sp, 16 6390; RV32I-NEXT: ret 6391; 6392; RV32IA-LABEL: atomicrmw_or_i16_monotonic: 6393; RV32IA: # %bb.0: 6394; RV32IA-NEXT: andi a2, a0, -4 6395; RV32IA-NEXT: slli a0, a0, 3 6396; RV32IA-NEXT: slli a1, a1, 16 6397; RV32IA-NEXT: srli a1, a1, 16 6398; RV32IA-NEXT: sll a1, a1, a0 6399; RV32IA-NEXT: amoor.w a1, a1, (a2) 6400; RV32IA-NEXT: srl a0, a1, a0 6401; RV32IA-NEXT: ret 6402; 6403; RV64I-LABEL: atomicrmw_or_i16_monotonic: 6404; RV64I: # %bb.0: 6405; RV64I-NEXT: addi sp, sp, -16 6406; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6407; RV64I-NEXT: li a2, 0 6408; RV64I-NEXT: call __atomic_fetch_or_2@plt 6409; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6410; RV64I-NEXT: addi sp, sp, 16 6411; RV64I-NEXT: ret 6412; 6413; RV64IA-LABEL: atomicrmw_or_i16_monotonic: 6414; RV64IA: # %bb.0: 6415; RV64IA-NEXT: andi a2, a0, -4 6416; RV64IA-NEXT: slliw a0, a0, 3 6417; RV64IA-NEXT: slli a1, a1, 48 6418; RV64IA-NEXT: srli a1, a1, 48 6419; RV64IA-NEXT: sllw a1, a1, a0 6420; RV64IA-NEXT: amoor.w a1, a1, (a2) 6421; RV64IA-NEXT: srlw a0, a1, a0 6422; RV64IA-NEXT: ret 6423 %1 = atomicrmw or i16* %a, i16 %b monotonic 6424 ret i16 %1 6425} 6426 6427define i16 @atomicrmw_or_i16_acquire(i16 *%a, i16 %b) nounwind { 6428; RV32I-LABEL: atomicrmw_or_i16_acquire: 6429; RV32I: # %bb.0: 6430; RV32I-NEXT: addi sp, sp, -16 6431; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6432; RV32I-NEXT: li a2, 2 6433; RV32I-NEXT: call __atomic_fetch_or_2@plt 6434; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6435; RV32I-NEXT: addi sp, sp, 16 6436; RV32I-NEXT: ret 6437; 6438; RV32IA-LABEL: atomicrmw_or_i16_acquire: 6439; RV32IA: # %bb.0: 6440; RV32IA-NEXT: andi a2, a0, -4 6441; RV32IA-NEXT: slli a0, a0, 3 6442; RV32IA-NEXT: slli a1, a1, 16 6443; RV32IA-NEXT: srli a1, a1, 16 6444; RV32IA-NEXT: sll a1, a1, a0 6445; RV32IA-NEXT: amoor.w.aq a1, a1, (a2) 6446; RV32IA-NEXT: srl a0, a1, a0 6447; RV32IA-NEXT: ret 6448; 6449; RV64I-LABEL: atomicrmw_or_i16_acquire: 6450; RV64I: # %bb.0: 6451; RV64I-NEXT: addi sp, sp, -16 6452; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6453; RV64I-NEXT: li a2, 2 6454; RV64I-NEXT: call __atomic_fetch_or_2@plt 6455; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6456; RV64I-NEXT: addi sp, sp, 16 6457; RV64I-NEXT: ret 6458; 6459; RV64IA-LABEL: atomicrmw_or_i16_acquire: 6460; RV64IA: # %bb.0: 6461; RV64IA-NEXT: andi a2, a0, -4 6462; RV64IA-NEXT: slliw a0, a0, 3 6463; RV64IA-NEXT: slli a1, a1, 48 6464; RV64IA-NEXT: srli a1, a1, 48 6465; RV64IA-NEXT: sllw a1, a1, a0 6466; RV64IA-NEXT: amoor.w.aq a1, a1, (a2) 6467; RV64IA-NEXT: srlw a0, a1, a0 6468; RV64IA-NEXT: ret 6469 %1 = atomicrmw or i16* %a, i16 %b acquire 6470 ret i16 %1 6471} 6472 6473define i16 @atomicrmw_or_i16_release(i16 *%a, i16 %b) nounwind { 6474; RV32I-LABEL: atomicrmw_or_i16_release: 6475; RV32I: # %bb.0: 6476; RV32I-NEXT: addi sp, sp, -16 6477; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6478; RV32I-NEXT: li a2, 3 6479; RV32I-NEXT: call __atomic_fetch_or_2@plt 6480; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6481; RV32I-NEXT: addi sp, sp, 16 6482; RV32I-NEXT: ret 6483; 6484; RV32IA-LABEL: atomicrmw_or_i16_release: 6485; RV32IA: # %bb.0: 6486; RV32IA-NEXT: andi a2, a0, -4 6487; RV32IA-NEXT: slli a0, a0, 3 6488; RV32IA-NEXT: slli a1, a1, 16 6489; RV32IA-NEXT: srli a1, a1, 16 6490; RV32IA-NEXT: sll a1, a1, a0 6491; RV32IA-NEXT: amoor.w.rl a1, a1, (a2) 6492; RV32IA-NEXT: srl a0, a1, a0 6493; RV32IA-NEXT: ret 6494; 6495; RV64I-LABEL: atomicrmw_or_i16_release: 6496; RV64I: # %bb.0: 6497; RV64I-NEXT: addi sp, sp, -16 6498; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6499; RV64I-NEXT: li a2, 3 6500; RV64I-NEXT: call __atomic_fetch_or_2@plt 6501; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6502; RV64I-NEXT: addi sp, sp, 16 6503; RV64I-NEXT: ret 6504; 6505; RV64IA-LABEL: atomicrmw_or_i16_release: 6506; RV64IA: # %bb.0: 6507; RV64IA-NEXT: andi a2, a0, -4 6508; RV64IA-NEXT: slliw a0, a0, 3 6509; RV64IA-NEXT: slli a1, a1, 48 6510; RV64IA-NEXT: srli a1, a1, 48 6511; RV64IA-NEXT: sllw a1, a1, a0 6512; RV64IA-NEXT: amoor.w.rl a1, a1, (a2) 6513; RV64IA-NEXT: srlw a0, a1, a0 6514; RV64IA-NEXT: ret 6515 %1 = atomicrmw or i16* %a, i16 %b release 6516 ret i16 %1 6517} 6518 6519define i16 @atomicrmw_or_i16_acq_rel(i16 *%a, i16 %b) nounwind { 6520; RV32I-LABEL: atomicrmw_or_i16_acq_rel: 6521; RV32I: # %bb.0: 6522; RV32I-NEXT: addi sp, sp, -16 6523; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6524; RV32I-NEXT: li a2, 4 6525; RV32I-NEXT: call __atomic_fetch_or_2@plt 6526; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6527; RV32I-NEXT: addi sp, sp, 16 6528; RV32I-NEXT: ret 6529; 6530; RV32IA-LABEL: atomicrmw_or_i16_acq_rel: 6531; RV32IA: # %bb.0: 6532; RV32IA-NEXT: andi a2, a0, -4 6533; RV32IA-NEXT: slli a0, a0, 3 6534; RV32IA-NEXT: slli a1, a1, 16 6535; RV32IA-NEXT: srli a1, a1, 16 6536; RV32IA-NEXT: sll a1, a1, a0 6537; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6538; RV32IA-NEXT: srl a0, a1, a0 6539; RV32IA-NEXT: ret 6540; 6541; RV64I-LABEL: atomicrmw_or_i16_acq_rel: 6542; RV64I: # %bb.0: 6543; RV64I-NEXT: addi sp, sp, -16 6544; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6545; RV64I-NEXT: li a2, 4 6546; RV64I-NEXT: call __atomic_fetch_or_2@plt 6547; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6548; RV64I-NEXT: addi sp, sp, 16 6549; RV64I-NEXT: ret 6550; 6551; RV64IA-LABEL: atomicrmw_or_i16_acq_rel: 6552; RV64IA: # %bb.0: 6553; RV64IA-NEXT: andi a2, a0, -4 6554; RV64IA-NEXT: slliw a0, a0, 3 6555; RV64IA-NEXT: slli a1, a1, 48 6556; RV64IA-NEXT: srli a1, a1, 48 6557; RV64IA-NEXT: sllw a1, a1, a0 6558; RV64IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6559; RV64IA-NEXT: srlw a0, a1, a0 6560; RV64IA-NEXT: ret 6561 %1 = atomicrmw or i16* %a, i16 %b acq_rel 6562 ret i16 %1 6563} 6564 6565define i16 @atomicrmw_or_i16_seq_cst(i16 *%a, i16 %b) nounwind { 6566; RV32I-LABEL: atomicrmw_or_i16_seq_cst: 6567; RV32I: # %bb.0: 6568; RV32I-NEXT: addi sp, sp, -16 6569; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6570; RV32I-NEXT: li a2, 5 6571; RV32I-NEXT: call __atomic_fetch_or_2@plt 6572; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6573; RV32I-NEXT: addi sp, sp, 16 6574; RV32I-NEXT: ret 6575; 6576; RV32IA-LABEL: atomicrmw_or_i16_seq_cst: 6577; RV32IA: # %bb.0: 6578; RV32IA-NEXT: andi a2, a0, -4 6579; RV32IA-NEXT: slli a0, a0, 3 6580; RV32IA-NEXT: slli a1, a1, 16 6581; RV32IA-NEXT: srli a1, a1, 16 6582; RV32IA-NEXT: sll a1, a1, a0 6583; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6584; RV32IA-NEXT: srl a0, a1, a0 6585; RV32IA-NEXT: ret 6586; 6587; RV64I-LABEL: atomicrmw_or_i16_seq_cst: 6588; RV64I: # %bb.0: 6589; RV64I-NEXT: addi sp, sp, -16 6590; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6591; RV64I-NEXT: li a2, 5 6592; RV64I-NEXT: call __atomic_fetch_or_2@plt 6593; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6594; RV64I-NEXT: addi sp, sp, 16 6595; RV64I-NEXT: ret 6596; 6597; RV64IA-LABEL: atomicrmw_or_i16_seq_cst: 6598; RV64IA: # %bb.0: 6599; RV64IA-NEXT: andi a2, a0, -4 6600; RV64IA-NEXT: slliw a0, a0, 3 6601; RV64IA-NEXT: slli a1, a1, 48 6602; RV64IA-NEXT: srli a1, a1, 48 6603; RV64IA-NEXT: sllw a1, a1, a0 6604; RV64IA-NEXT: amoor.w.aqrl a1, a1, (a2) 6605; RV64IA-NEXT: srlw a0, a1, a0 6606; RV64IA-NEXT: ret 6607 %1 = atomicrmw or i16* %a, i16 %b seq_cst 6608 ret i16 %1 6609} 6610 6611define i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind { 6612; RV32I-LABEL: atomicrmw_xor_i16_monotonic: 6613; RV32I: # %bb.0: 6614; RV32I-NEXT: addi sp, sp, -16 6615; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6616; RV32I-NEXT: li a2, 0 6617; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6618; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6619; RV32I-NEXT: addi sp, sp, 16 6620; RV32I-NEXT: ret 6621; 6622; RV32IA-LABEL: atomicrmw_xor_i16_monotonic: 6623; RV32IA: # %bb.0: 6624; RV32IA-NEXT: andi a2, a0, -4 6625; RV32IA-NEXT: slli a0, a0, 3 6626; RV32IA-NEXT: slli a1, a1, 16 6627; RV32IA-NEXT: srli a1, a1, 16 6628; RV32IA-NEXT: sll a1, a1, a0 6629; RV32IA-NEXT: amoxor.w a1, a1, (a2) 6630; RV32IA-NEXT: srl a0, a1, a0 6631; RV32IA-NEXT: ret 6632; 6633; RV64I-LABEL: atomicrmw_xor_i16_monotonic: 6634; RV64I: # %bb.0: 6635; RV64I-NEXT: addi sp, sp, -16 6636; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6637; RV64I-NEXT: li a2, 0 6638; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6639; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6640; RV64I-NEXT: addi sp, sp, 16 6641; RV64I-NEXT: ret 6642; 6643; RV64IA-LABEL: atomicrmw_xor_i16_monotonic: 6644; RV64IA: # %bb.0: 6645; RV64IA-NEXT: andi a2, a0, -4 6646; RV64IA-NEXT: slliw a0, a0, 3 6647; RV64IA-NEXT: slli a1, a1, 48 6648; RV64IA-NEXT: srli a1, a1, 48 6649; RV64IA-NEXT: sllw a1, a1, a0 6650; RV64IA-NEXT: amoxor.w a1, a1, (a2) 6651; RV64IA-NEXT: srlw a0, a1, a0 6652; RV64IA-NEXT: ret 6653 %1 = atomicrmw xor i16* %a, i16 %b monotonic 6654 ret i16 %1 6655} 6656 6657define i16 @atomicrmw_xor_i16_acquire(i16 *%a, i16 %b) nounwind { 6658; RV32I-LABEL: atomicrmw_xor_i16_acquire: 6659; RV32I: # %bb.0: 6660; RV32I-NEXT: addi sp, sp, -16 6661; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6662; RV32I-NEXT: li a2, 2 6663; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6664; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6665; RV32I-NEXT: addi sp, sp, 16 6666; RV32I-NEXT: ret 6667; 6668; RV32IA-LABEL: atomicrmw_xor_i16_acquire: 6669; RV32IA: # %bb.0: 6670; RV32IA-NEXT: andi a2, a0, -4 6671; RV32IA-NEXT: slli a0, a0, 3 6672; RV32IA-NEXT: slli a1, a1, 16 6673; RV32IA-NEXT: srli a1, a1, 16 6674; RV32IA-NEXT: sll a1, a1, a0 6675; RV32IA-NEXT: amoxor.w.aq a1, a1, (a2) 6676; RV32IA-NEXT: srl a0, a1, a0 6677; RV32IA-NEXT: ret 6678; 6679; RV64I-LABEL: atomicrmw_xor_i16_acquire: 6680; RV64I: # %bb.0: 6681; RV64I-NEXT: addi sp, sp, -16 6682; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6683; RV64I-NEXT: li a2, 2 6684; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6685; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6686; RV64I-NEXT: addi sp, sp, 16 6687; RV64I-NEXT: ret 6688; 6689; RV64IA-LABEL: atomicrmw_xor_i16_acquire: 6690; RV64IA: # %bb.0: 6691; RV64IA-NEXT: andi a2, a0, -4 6692; RV64IA-NEXT: slliw a0, a0, 3 6693; RV64IA-NEXT: slli a1, a1, 48 6694; RV64IA-NEXT: srli a1, a1, 48 6695; RV64IA-NEXT: sllw a1, a1, a0 6696; RV64IA-NEXT: amoxor.w.aq a1, a1, (a2) 6697; RV64IA-NEXT: srlw a0, a1, a0 6698; RV64IA-NEXT: ret 6699 %1 = atomicrmw xor i16* %a, i16 %b acquire 6700 ret i16 %1 6701} 6702 6703define i16 @atomicrmw_xor_i16_release(i16 *%a, i16 %b) nounwind { 6704; RV32I-LABEL: atomicrmw_xor_i16_release: 6705; RV32I: # %bb.0: 6706; RV32I-NEXT: addi sp, sp, -16 6707; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6708; RV32I-NEXT: li a2, 3 6709; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6710; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6711; RV32I-NEXT: addi sp, sp, 16 6712; RV32I-NEXT: ret 6713; 6714; RV32IA-LABEL: atomicrmw_xor_i16_release: 6715; RV32IA: # %bb.0: 6716; RV32IA-NEXT: andi a2, a0, -4 6717; RV32IA-NEXT: slli a0, a0, 3 6718; RV32IA-NEXT: slli a1, a1, 16 6719; RV32IA-NEXT: srli a1, a1, 16 6720; RV32IA-NEXT: sll a1, a1, a0 6721; RV32IA-NEXT: amoxor.w.rl a1, a1, (a2) 6722; RV32IA-NEXT: srl a0, a1, a0 6723; RV32IA-NEXT: ret 6724; 6725; RV64I-LABEL: atomicrmw_xor_i16_release: 6726; RV64I: # %bb.0: 6727; RV64I-NEXT: addi sp, sp, -16 6728; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6729; RV64I-NEXT: li a2, 3 6730; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6731; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6732; RV64I-NEXT: addi sp, sp, 16 6733; RV64I-NEXT: ret 6734; 6735; RV64IA-LABEL: atomicrmw_xor_i16_release: 6736; RV64IA: # %bb.0: 6737; RV64IA-NEXT: andi a2, a0, -4 6738; RV64IA-NEXT: slliw a0, a0, 3 6739; RV64IA-NEXT: slli a1, a1, 48 6740; RV64IA-NEXT: srli a1, a1, 48 6741; RV64IA-NEXT: sllw a1, a1, a0 6742; RV64IA-NEXT: amoxor.w.rl a1, a1, (a2) 6743; RV64IA-NEXT: srlw a0, a1, a0 6744; RV64IA-NEXT: ret 6745 %1 = atomicrmw xor i16* %a, i16 %b release 6746 ret i16 %1 6747} 6748 6749define i16 @atomicrmw_xor_i16_acq_rel(i16 *%a, i16 %b) nounwind { 6750; RV32I-LABEL: atomicrmw_xor_i16_acq_rel: 6751; RV32I: # %bb.0: 6752; RV32I-NEXT: addi sp, sp, -16 6753; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6754; RV32I-NEXT: li a2, 4 6755; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6756; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6757; RV32I-NEXT: addi sp, sp, 16 6758; RV32I-NEXT: ret 6759; 6760; RV32IA-LABEL: atomicrmw_xor_i16_acq_rel: 6761; RV32IA: # %bb.0: 6762; RV32IA-NEXT: andi a2, a0, -4 6763; RV32IA-NEXT: slli a0, a0, 3 6764; RV32IA-NEXT: slli a1, a1, 16 6765; RV32IA-NEXT: srli a1, a1, 16 6766; RV32IA-NEXT: sll a1, a1, a0 6767; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6768; RV32IA-NEXT: srl a0, a1, a0 6769; RV32IA-NEXT: ret 6770; 6771; RV64I-LABEL: atomicrmw_xor_i16_acq_rel: 6772; RV64I: # %bb.0: 6773; RV64I-NEXT: addi sp, sp, -16 6774; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6775; RV64I-NEXT: li a2, 4 6776; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6777; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6778; RV64I-NEXT: addi sp, sp, 16 6779; RV64I-NEXT: ret 6780; 6781; RV64IA-LABEL: atomicrmw_xor_i16_acq_rel: 6782; RV64IA: # %bb.0: 6783; RV64IA-NEXT: andi a2, a0, -4 6784; RV64IA-NEXT: slliw a0, a0, 3 6785; RV64IA-NEXT: slli a1, a1, 48 6786; RV64IA-NEXT: srli a1, a1, 48 6787; RV64IA-NEXT: sllw a1, a1, a0 6788; RV64IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6789; RV64IA-NEXT: srlw a0, a1, a0 6790; RV64IA-NEXT: ret 6791 %1 = atomicrmw xor i16* %a, i16 %b acq_rel 6792 ret i16 %1 6793} 6794 6795define i16 @atomicrmw_xor_i16_seq_cst(i16 *%a, i16 %b) nounwind { 6796; RV32I-LABEL: atomicrmw_xor_i16_seq_cst: 6797; RV32I: # %bb.0: 6798; RV32I-NEXT: addi sp, sp, -16 6799; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 6800; RV32I-NEXT: li a2, 5 6801; RV32I-NEXT: call __atomic_fetch_xor_2@plt 6802; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 6803; RV32I-NEXT: addi sp, sp, 16 6804; RV32I-NEXT: ret 6805; 6806; RV32IA-LABEL: atomicrmw_xor_i16_seq_cst: 6807; RV32IA: # %bb.0: 6808; RV32IA-NEXT: andi a2, a0, -4 6809; RV32IA-NEXT: slli a0, a0, 3 6810; RV32IA-NEXT: slli a1, a1, 16 6811; RV32IA-NEXT: srli a1, a1, 16 6812; RV32IA-NEXT: sll a1, a1, a0 6813; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6814; RV32IA-NEXT: srl a0, a1, a0 6815; RV32IA-NEXT: ret 6816; 6817; RV64I-LABEL: atomicrmw_xor_i16_seq_cst: 6818; RV64I: # %bb.0: 6819; RV64I-NEXT: addi sp, sp, -16 6820; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 6821; RV64I-NEXT: li a2, 5 6822; RV64I-NEXT: call __atomic_fetch_xor_2@plt 6823; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 6824; RV64I-NEXT: addi sp, sp, 16 6825; RV64I-NEXT: ret 6826; 6827; RV64IA-LABEL: atomicrmw_xor_i16_seq_cst: 6828; RV64IA: # %bb.0: 6829; RV64IA-NEXT: andi a2, a0, -4 6830; RV64IA-NEXT: slliw a0, a0, 3 6831; RV64IA-NEXT: slli a1, a1, 48 6832; RV64IA-NEXT: srli a1, a1, 48 6833; RV64IA-NEXT: sllw a1, a1, a0 6834; RV64IA-NEXT: amoxor.w.aqrl a1, a1, (a2) 6835; RV64IA-NEXT: srlw a0, a1, a0 6836; RV64IA-NEXT: ret 6837 %1 = atomicrmw xor i16* %a, i16 %b seq_cst 6838 ret i16 %1 6839} 6840 6841define i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind { 6842; RV32I-LABEL: atomicrmw_max_i16_monotonic: 6843; RV32I: # %bb.0: 6844; RV32I-NEXT: addi sp, sp, -32 6845; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6846; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6847; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6848; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6849; RV32I-NEXT: mv s0, a0 6850; RV32I-NEXT: lhu a3, 0(a0) 6851; RV32I-NEXT: mv s1, a1 6852; RV32I-NEXT: slli a0, a1, 16 6853; RV32I-NEXT: srai s2, a0, 16 6854; RV32I-NEXT: j .LBB90_2 6855; RV32I-NEXT: .LBB90_1: # %atomicrmw.start 6856; RV32I-NEXT: # in Loop: Header=BB90_2 Depth=1 6857; RV32I-NEXT: sh a3, 14(sp) 6858; RV32I-NEXT: addi a1, sp, 14 6859; RV32I-NEXT: mv a0, s0 6860; RV32I-NEXT: li a3, 0 6861; RV32I-NEXT: li a4, 0 6862; RV32I-NEXT: call __atomic_compare_exchange_2@plt 6863; RV32I-NEXT: lh a3, 14(sp) 6864; RV32I-NEXT: bnez a0, .LBB90_4 6865; RV32I-NEXT: .LBB90_2: # %atomicrmw.start 6866; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 6867; RV32I-NEXT: slli a0, a3, 16 6868; RV32I-NEXT: srai a0, a0, 16 6869; RV32I-NEXT: mv a2, a3 6870; RV32I-NEXT: blt s2, a0, .LBB90_1 6871; RV32I-NEXT: # %bb.3: # %atomicrmw.start 6872; RV32I-NEXT: # in Loop: Header=BB90_2 Depth=1 6873; RV32I-NEXT: mv a2, s1 6874; RV32I-NEXT: j .LBB90_1 6875; RV32I-NEXT: .LBB90_4: # %atomicrmw.end 6876; RV32I-NEXT: mv a0, a3 6877; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6878; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6879; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6880; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6881; RV32I-NEXT: addi sp, sp, 32 6882; RV32I-NEXT: ret 6883; 6884; RV32IA-LABEL: atomicrmw_max_i16_monotonic: 6885; RV32IA: # %bb.0: 6886; RV32IA-NEXT: andi a2, a0, -4 6887; RV32IA-NEXT: slli a0, a0, 3 6888; RV32IA-NEXT: andi a3, a0, 24 6889; RV32IA-NEXT: lui a4, 16 6890; RV32IA-NEXT: addi a4, a4, -1 6891; RV32IA-NEXT: sll a4, a4, a0 6892; RV32IA-NEXT: slli a1, a1, 16 6893; RV32IA-NEXT: srai a1, a1, 16 6894; RV32IA-NEXT: sll a1, a1, a0 6895; RV32IA-NEXT: li a5, 16 6896; RV32IA-NEXT: sub a3, a5, a3 6897; RV32IA-NEXT: .LBB90_1: # =>This Inner Loop Header: Depth=1 6898; RV32IA-NEXT: lr.w a5, (a2) 6899; RV32IA-NEXT: and a7, a5, a4 6900; RV32IA-NEXT: mv a6, a5 6901; RV32IA-NEXT: sll a7, a7, a3 6902; RV32IA-NEXT: sra a7, a7, a3 6903; RV32IA-NEXT: bge a7, a1, .LBB90_3 6904; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB90_1 Depth=1 6905; RV32IA-NEXT: xor a6, a5, a1 6906; RV32IA-NEXT: and a6, a6, a4 6907; RV32IA-NEXT: xor a6, a5, a6 6908; RV32IA-NEXT: .LBB90_3: # in Loop: Header=BB90_1 Depth=1 6909; RV32IA-NEXT: sc.w a6, a6, (a2) 6910; RV32IA-NEXT: bnez a6, .LBB90_1 6911; RV32IA-NEXT: # %bb.4: 6912; RV32IA-NEXT: srl a0, a5, a0 6913; RV32IA-NEXT: ret 6914; 6915; RV64I-LABEL: atomicrmw_max_i16_monotonic: 6916; RV64I: # %bb.0: 6917; RV64I-NEXT: addi sp, sp, -48 6918; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6919; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6920; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6921; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6922; RV64I-NEXT: mv s0, a0 6923; RV64I-NEXT: lhu a3, 0(a0) 6924; RV64I-NEXT: mv s1, a1 6925; RV64I-NEXT: slli a0, a1, 48 6926; RV64I-NEXT: srai s2, a0, 48 6927; RV64I-NEXT: j .LBB90_2 6928; RV64I-NEXT: .LBB90_1: # %atomicrmw.start 6929; RV64I-NEXT: # in Loop: Header=BB90_2 Depth=1 6930; RV64I-NEXT: sh a3, 14(sp) 6931; RV64I-NEXT: addi a1, sp, 14 6932; RV64I-NEXT: mv a0, s0 6933; RV64I-NEXT: li a3, 0 6934; RV64I-NEXT: li a4, 0 6935; RV64I-NEXT: call __atomic_compare_exchange_2@plt 6936; RV64I-NEXT: lh a3, 14(sp) 6937; RV64I-NEXT: bnez a0, .LBB90_4 6938; RV64I-NEXT: .LBB90_2: # %atomicrmw.start 6939; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6940; RV64I-NEXT: slli a0, a3, 48 6941; RV64I-NEXT: srai a0, a0, 48 6942; RV64I-NEXT: mv a2, a3 6943; RV64I-NEXT: blt s2, a0, .LBB90_1 6944; RV64I-NEXT: # %bb.3: # %atomicrmw.start 6945; RV64I-NEXT: # in Loop: Header=BB90_2 Depth=1 6946; RV64I-NEXT: mv a2, s1 6947; RV64I-NEXT: j .LBB90_1 6948; RV64I-NEXT: .LBB90_4: # %atomicrmw.end 6949; RV64I-NEXT: mv a0, a3 6950; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6951; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6952; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6953; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6954; RV64I-NEXT: addi sp, sp, 48 6955; RV64I-NEXT: ret 6956; 6957; RV64IA-LABEL: atomicrmw_max_i16_monotonic: 6958; RV64IA: # %bb.0: 6959; RV64IA-NEXT: andi a2, a0, -4 6960; RV64IA-NEXT: slliw a0, a0, 3 6961; RV64IA-NEXT: andi a3, a0, 24 6962; RV64IA-NEXT: lui a4, 16 6963; RV64IA-NEXT: addiw a4, a4, -1 6964; RV64IA-NEXT: sllw a4, a4, a0 6965; RV64IA-NEXT: slli a1, a1, 48 6966; RV64IA-NEXT: srai a1, a1, 48 6967; RV64IA-NEXT: sllw a1, a1, a0 6968; RV64IA-NEXT: li a5, 48 6969; RV64IA-NEXT: sub a3, a5, a3 6970; RV64IA-NEXT: .LBB90_1: # =>This Inner Loop Header: Depth=1 6971; RV64IA-NEXT: lr.w a5, (a2) 6972; RV64IA-NEXT: and a7, a5, a4 6973; RV64IA-NEXT: mv a6, a5 6974; RV64IA-NEXT: sll a7, a7, a3 6975; RV64IA-NEXT: sra a7, a7, a3 6976; RV64IA-NEXT: bge a7, a1, .LBB90_3 6977; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB90_1 Depth=1 6978; RV64IA-NEXT: xor a6, a5, a1 6979; RV64IA-NEXT: and a6, a6, a4 6980; RV64IA-NEXT: xor a6, a5, a6 6981; RV64IA-NEXT: .LBB90_3: # in Loop: Header=BB90_1 Depth=1 6982; RV64IA-NEXT: sc.w a6, a6, (a2) 6983; RV64IA-NEXT: bnez a6, .LBB90_1 6984; RV64IA-NEXT: # %bb.4: 6985; RV64IA-NEXT: srlw a0, a5, a0 6986; RV64IA-NEXT: ret 6987 %1 = atomicrmw max i16* %a, i16 %b monotonic 6988 ret i16 %1 6989} 6990 6991define i16 @atomicrmw_max_i16_acquire(i16 *%a, i16 %b) nounwind { 6992; RV32I-LABEL: atomicrmw_max_i16_acquire: 6993; RV32I: # %bb.0: 6994; RV32I-NEXT: addi sp, sp, -32 6995; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6996; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6997; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6998; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6999; RV32I-NEXT: mv s0, a0 7000; RV32I-NEXT: lhu a3, 0(a0) 7001; RV32I-NEXT: mv s1, a1 7002; RV32I-NEXT: slli a0, a1, 16 7003; RV32I-NEXT: srai s2, a0, 16 7004; RV32I-NEXT: j .LBB91_2 7005; RV32I-NEXT: .LBB91_1: # %atomicrmw.start 7006; RV32I-NEXT: # in Loop: Header=BB91_2 Depth=1 7007; RV32I-NEXT: sh a3, 14(sp) 7008; RV32I-NEXT: addi a1, sp, 14 7009; RV32I-NEXT: li a3, 2 7010; RV32I-NEXT: li a4, 2 7011; RV32I-NEXT: mv a0, s0 7012; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7013; RV32I-NEXT: lh a3, 14(sp) 7014; RV32I-NEXT: bnez a0, .LBB91_4 7015; RV32I-NEXT: .LBB91_2: # %atomicrmw.start 7016; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7017; RV32I-NEXT: slli a0, a3, 16 7018; RV32I-NEXT: srai a0, a0, 16 7019; RV32I-NEXT: mv a2, a3 7020; RV32I-NEXT: blt s2, a0, .LBB91_1 7021; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7022; RV32I-NEXT: # in Loop: Header=BB91_2 Depth=1 7023; RV32I-NEXT: mv a2, s1 7024; RV32I-NEXT: j .LBB91_1 7025; RV32I-NEXT: .LBB91_4: # %atomicrmw.end 7026; RV32I-NEXT: mv a0, a3 7027; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7028; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7029; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7030; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7031; RV32I-NEXT: addi sp, sp, 32 7032; RV32I-NEXT: ret 7033; 7034; RV32IA-LABEL: atomicrmw_max_i16_acquire: 7035; RV32IA: # %bb.0: 7036; RV32IA-NEXT: andi a2, a0, -4 7037; RV32IA-NEXT: slli a0, a0, 3 7038; RV32IA-NEXT: andi a3, a0, 24 7039; RV32IA-NEXT: lui a4, 16 7040; RV32IA-NEXT: addi a4, a4, -1 7041; RV32IA-NEXT: sll a4, a4, a0 7042; RV32IA-NEXT: slli a1, a1, 16 7043; RV32IA-NEXT: srai a1, a1, 16 7044; RV32IA-NEXT: sll a1, a1, a0 7045; RV32IA-NEXT: li a5, 16 7046; RV32IA-NEXT: sub a3, a5, a3 7047; RV32IA-NEXT: .LBB91_1: # =>This Inner Loop Header: Depth=1 7048; RV32IA-NEXT: lr.w.aq a5, (a2) 7049; RV32IA-NEXT: and a7, a5, a4 7050; RV32IA-NEXT: mv a6, a5 7051; RV32IA-NEXT: sll a7, a7, a3 7052; RV32IA-NEXT: sra a7, a7, a3 7053; RV32IA-NEXT: bge a7, a1, .LBB91_3 7054; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB91_1 Depth=1 7055; RV32IA-NEXT: xor a6, a5, a1 7056; RV32IA-NEXT: and a6, a6, a4 7057; RV32IA-NEXT: xor a6, a5, a6 7058; RV32IA-NEXT: .LBB91_3: # in Loop: Header=BB91_1 Depth=1 7059; RV32IA-NEXT: sc.w a6, a6, (a2) 7060; RV32IA-NEXT: bnez a6, .LBB91_1 7061; RV32IA-NEXT: # %bb.4: 7062; RV32IA-NEXT: srl a0, a5, a0 7063; RV32IA-NEXT: ret 7064; 7065; RV64I-LABEL: atomicrmw_max_i16_acquire: 7066; RV64I: # %bb.0: 7067; RV64I-NEXT: addi sp, sp, -48 7068; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7069; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7070; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7071; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7072; RV64I-NEXT: mv s0, a0 7073; RV64I-NEXT: lhu a3, 0(a0) 7074; RV64I-NEXT: mv s1, a1 7075; RV64I-NEXT: slli a0, a1, 48 7076; RV64I-NEXT: srai s2, a0, 48 7077; RV64I-NEXT: j .LBB91_2 7078; RV64I-NEXT: .LBB91_1: # %atomicrmw.start 7079; RV64I-NEXT: # in Loop: Header=BB91_2 Depth=1 7080; RV64I-NEXT: sh a3, 14(sp) 7081; RV64I-NEXT: addi a1, sp, 14 7082; RV64I-NEXT: li a3, 2 7083; RV64I-NEXT: li a4, 2 7084; RV64I-NEXT: mv a0, s0 7085; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7086; RV64I-NEXT: lh a3, 14(sp) 7087; RV64I-NEXT: bnez a0, .LBB91_4 7088; RV64I-NEXT: .LBB91_2: # %atomicrmw.start 7089; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7090; RV64I-NEXT: slli a0, a3, 48 7091; RV64I-NEXT: srai a0, a0, 48 7092; RV64I-NEXT: mv a2, a3 7093; RV64I-NEXT: blt s2, a0, .LBB91_1 7094; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7095; RV64I-NEXT: # in Loop: Header=BB91_2 Depth=1 7096; RV64I-NEXT: mv a2, s1 7097; RV64I-NEXT: j .LBB91_1 7098; RV64I-NEXT: .LBB91_4: # %atomicrmw.end 7099; RV64I-NEXT: mv a0, a3 7100; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7101; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7102; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7103; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7104; RV64I-NEXT: addi sp, sp, 48 7105; RV64I-NEXT: ret 7106; 7107; RV64IA-LABEL: atomicrmw_max_i16_acquire: 7108; RV64IA: # %bb.0: 7109; RV64IA-NEXT: andi a2, a0, -4 7110; RV64IA-NEXT: slliw a0, a0, 3 7111; RV64IA-NEXT: andi a3, a0, 24 7112; RV64IA-NEXT: lui a4, 16 7113; RV64IA-NEXT: addiw a4, a4, -1 7114; RV64IA-NEXT: sllw a4, a4, a0 7115; RV64IA-NEXT: slli a1, a1, 48 7116; RV64IA-NEXT: srai a1, a1, 48 7117; RV64IA-NEXT: sllw a1, a1, a0 7118; RV64IA-NEXT: li a5, 48 7119; RV64IA-NEXT: sub a3, a5, a3 7120; RV64IA-NEXT: .LBB91_1: # =>This Inner Loop Header: Depth=1 7121; RV64IA-NEXT: lr.w.aq a5, (a2) 7122; RV64IA-NEXT: and a7, a5, a4 7123; RV64IA-NEXT: mv a6, a5 7124; RV64IA-NEXT: sll a7, a7, a3 7125; RV64IA-NEXT: sra a7, a7, a3 7126; RV64IA-NEXT: bge a7, a1, .LBB91_3 7127; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB91_1 Depth=1 7128; RV64IA-NEXT: xor a6, a5, a1 7129; RV64IA-NEXT: and a6, a6, a4 7130; RV64IA-NEXT: xor a6, a5, a6 7131; RV64IA-NEXT: .LBB91_3: # in Loop: Header=BB91_1 Depth=1 7132; RV64IA-NEXT: sc.w a6, a6, (a2) 7133; RV64IA-NEXT: bnez a6, .LBB91_1 7134; RV64IA-NEXT: # %bb.4: 7135; RV64IA-NEXT: srlw a0, a5, a0 7136; RV64IA-NEXT: ret 7137 %1 = atomicrmw max i16* %a, i16 %b acquire 7138 ret i16 %1 7139} 7140 7141define i16 @atomicrmw_max_i16_release(i16 *%a, i16 %b) nounwind { 7142; RV32I-LABEL: atomicrmw_max_i16_release: 7143; RV32I: # %bb.0: 7144; RV32I-NEXT: addi sp, sp, -32 7145; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7146; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7147; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7148; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7149; RV32I-NEXT: mv s0, a0 7150; RV32I-NEXT: lhu a3, 0(a0) 7151; RV32I-NEXT: mv s1, a1 7152; RV32I-NEXT: slli a0, a1, 16 7153; RV32I-NEXT: srai s2, a0, 16 7154; RV32I-NEXT: j .LBB92_2 7155; RV32I-NEXT: .LBB92_1: # %atomicrmw.start 7156; RV32I-NEXT: # in Loop: Header=BB92_2 Depth=1 7157; RV32I-NEXT: sh a3, 14(sp) 7158; RV32I-NEXT: addi a1, sp, 14 7159; RV32I-NEXT: li a3, 3 7160; RV32I-NEXT: mv a0, s0 7161; RV32I-NEXT: li a4, 0 7162; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7163; RV32I-NEXT: lh a3, 14(sp) 7164; RV32I-NEXT: bnez a0, .LBB92_4 7165; RV32I-NEXT: .LBB92_2: # %atomicrmw.start 7166; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7167; RV32I-NEXT: slli a0, a3, 16 7168; RV32I-NEXT: srai a0, a0, 16 7169; RV32I-NEXT: mv a2, a3 7170; RV32I-NEXT: blt s2, a0, .LBB92_1 7171; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7172; RV32I-NEXT: # in Loop: Header=BB92_2 Depth=1 7173; RV32I-NEXT: mv a2, s1 7174; RV32I-NEXT: j .LBB92_1 7175; RV32I-NEXT: .LBB92_4: # %atomicrmw.end 7176; RV32I-NEXT: mv a0, a3 7177; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7178; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7179; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7180; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7181; RV32I-NEXT: addi sp, sp, 32 7182; RV32I-NEXT: ret 7183; 7184; RV32IA-LABEL: atomicrmw_max_i16_release: 7185; RV32IA: # %bb.0: 7186; RV32IA-NEXT: andi a2, a0, -4 7187; RV32IA-NEXT: slli a0, a0, 3 7188; RV32IA-NEXT: andi a3, a0, 24 7189; RV32IA-NEXT: lui a4, 16 7190; RV32IA-NEXT: addi a4, a4, -1 7191; RV32IA-NEXT: sll a4, a4, a0 7192; RV32IA-NEXT: slli a1, a1, 16 7193; RV32IA-NEXT: srai a1, a1, 16 7194; RV32IA-NEXT: sll a1, a1, a0 7195; RV32IA-NEXT: li a5, 16 7196; RV32IA-NEXT: sub a3, a5, a3 7197; RV32IA-NEXT: .LBB92_1: # =>This Inner Loop Header: Depth=1 7198; RV32IA-NEXT: lr.w a5, (a2) 7199; RV32IA-NEXT: and a7, a5, a4 7200; RV32IA-NEXT: mv a6, a5 7201; RV32IA-NEXT: sll a7, a7, a3 7202; RV32IA-NEXT: sra a7, a7, a3 7203; RV32IA-NEXT: bge a7, a1, .LBB92_3 7204; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB92_1 Depth=1 7205; RV32IA-NEXT: xor a6, a5, a1 7206; RV32IA-NEXT: and a6, a6, a4 7207; RV32IA-NEXT: xor a6, a5, a6 7208; RV32IA-NEXT: .LBB92_3: # in Loop: Header=BB92_1 Depth=1 7209; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 7210; RV32IA-NEXT: bnez a6, .LBB92_1 7211; RV32IA-NEXT: # %bb.4: 7212; RV32IA-NEXT: srl a0, a5, a0 7213; RV32IA-NEXT: ret 7214; 7215; RV64I-LABEL: atomicrmw_max_i16_release: 7216; RV64I: # %bb.0: 7217; RV64I-NEXT: addi sp, sp, -48 7218; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7219; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7220; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7221; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7222; RV64I-NEXT: mv s0, a0 7223; RV64I-NEXT: lhu a3, 0(a0) 7224; RV64I-NEXT: mv s1, a1 7225; RV64I-NEXT: slli a0, a1, 48 7226; RV64I-NEXT: srai s2, a0, 48 7227; RV64I-NEXT: j .LBB92_2 7228; RV64I-NEXT: .LBB92_1: # %atomicrmw.start 7229; RV64I-NEXT: # in Loop: Header=BB92_2 Depth=1 7230; RV64I-NEXT: sh a3, 14(sp) 7231; RV64I-NEXT: addi a1, sp, 14 7232; RV64I-NEXT: li a3, 3 7233; RV64I-NEXT: mv a0, s0 7234; RV64I-NEXT: li a4, 0 7235; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7236; RV64I-NEXT: lh a3, 14(sp) 7237; RV64I-NEXT: bnez a0, .LBB92_4 7238; RV64I-NEXT: .LBB92_2: # %atomicrmw.start 7239; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7240; RV64I-NEXT: slli a0, a3, 48 7241; RV64I-NEXT: srai a0, a0, 48 7242; RV64I-NEXT: mv a2, a3 7243; RV64I-NEXT: blt s2, a0, .LBB92_1 7244; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7245; RV64I-NEXT: # in Loop: Header=BB92_2 Depth=1 7246; RV64I-NEXT: mv a2, s1 7247; RV64I-NEXT: j .LBB92_1 7248; RV64I-NEXT: .LBB92_4: # %atomicrmw.end 7249; RV64I-NEXT: mv a0, a3 7250; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7251; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7252; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7253; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7254; RV64I-NEXT: addi sp, sp, 48 7255; RV64I-NEXT: ret 7256; 7257; RV64IA-LABEL: atomicrmw_max_i16_release: 7258; RV64IA: # %bb.0: 7259; RV64IA-NEXT: andi a2, a0, -4 7260; RV64IA-NEXT: slliw a0, a0, 3 7261; RV64IA-NEXT: andi a3, a0, 24 7262; RV64IA-NEXT: lui a4, 16 7263; RV64IA-NEXT: addiw a4, a4, -1 7264; RV64IA-NEXT: sllw a4, a4, a0 7265; RV64IA-NEXT: slli a1, a1, 48 7266; RV64IA-NEXT: srai a1, a1, 48 7267; RV64IA-NEXT: sllw a1, a1, a0 7268; RV64IA-NEXT: li a5, 48 7269; RV64IA-NEXT: sub a3, a5, a3 7270; RV64IA-NEXT: .LBB92_1: # =>This Inner Loop Header: Depth=1 7271; RV64IA-NEXT: lr.w a5, (a2) 7272; RV64IA-NEXT: and a7, a5, a4 7273; RV64IA-NEXT: mv a6, a5 7274; RV64IA-NEXT: sll a7, a7, a3 7275; RV64IA-NEXT: sra a7, a7, a3 7276; RV64IA-NEXT: bge a7, a1, .LBB92_3 7277; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB92_1 Depth=1 7278; RV64IA-NEXT: xor a6, a5, a1 7279; RV64IA-NEXT: and a6, a6, a4 7280; RV64IA-NEXT: xor a6, a5, a6 7281; RV64IA-NEXT: .LBB92_3: # in Loop: Header=BB92_1 Depth=1 7282; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 7283; RV64IA-NEXT: bnez a6, .LBB92_1 7284; RV64IA-NEXT: # %bb.4: 7285; RV64IA-NEXT: srlw a0, a5, a0 7286; RV64IA-NEXT: ret 7287 %1 = atomicrmw max i16* %a, i16 %b release 7288 ret i16 %1 7289} 7290 7291define i16 @atomicrmw_max_i16_acq_rel(i16 *%a, i16 %b) nounwind { 7292; RV32I-LABEL: atomicrmw_max_i16_acq_rel: 7293; RV32I: # %bb.0: 7294; RV32I-NEXT: addi sp, sp, -32 7295; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7296; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7297; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7298; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7299; RV32I-NEXT: mv s0, a0 7300; RV32I-NEXT: lhu a3, 0(a0) 7301; RV32I-NEXT: mv s1, a1 7302; RV32I-NEXT: slli a0, a1, 16 7303; RV32I-NEXT: srai s2, a0, 16 7304; RV32I-NEXT: j .LBB93_2 7305; RV32I-NEXT: .LBB93_1: # %atomicrmw.start 7306; RV32I-NEXT: # in Loop: Header=BB93_2 Depth=1 7307; RV32I-NEXT: sh a3, 14(sp) 7308; RV32I-NEXT: addi a1, sp, 14 7309; RV32I-NEXT: li a3, 4 7310; RV32I-NEXT: li a4, 2 7311; RV32I-NEXT: mv a0, s0 7312; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7313; RV32I-NEXT: lh a3, 14(sp) 7314; RV32I-NEXT: bnez a0, .LBB93_4 7315; RV32I-NEXT: .LBB93_2: # %atomicrmw.start 7316; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7317; RV32I-NEXT: slli a0, a3, 16 7318; RV32I-NEXT: srai a0, a0, 16 7319; RV32I-NEXT: mv a2, a3 7320; RV32I-NEXT: blt s2, a0, .LBB93_1 7321; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7322; RV32I-NEXT: # in Loop: Header=BB93_2 Depth=1 7323; RV32I-NEXT: mv a2, s1 7324; RV32I-NEXT: j .LBB93_1 7325; RV32I-NEXT: .LBB93_4: # %atomicrmw.end 7326; RV32I-NEXT: mv a0, a3 7327; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7328; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7329; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7330; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7331; RV32I-NEXT: addi sp, sp, 32 7332; RV32I-NEXT: ret 7333; 7334; RV32IA-LABEL: atomicrmw_max_i16_acq_rel: 7335; RV32IA: # %bb.0: 7336; RV32IA-NEXT: andi a2, a0, -4 7337; RV32IA-NEXT: slli a0, a0, 3 7338; RV32IA-NEXT: andi a3, a0, 24 7339; RV32IA-NEXT: lui a4, 16 7340; RV32IA-NEXT: addi a4, a4, -1 7341; RV32IA-NEXT: sll a4, a4, a0 7342; RV32IA-NEXT: slli a1, a1, 16 7343; RV32IA-NEXT: srai a1, a1, 16 7344; RV32IA-NEXT: sll a1, a1, a0 7345; RV32IA-NEXT: li a5, 16 7346; RV32IA-NEXT: sub a3, a5, a3 7347; RV32IA-NEXT: .LBB93_1: # =>This Inner Loop Header: Depth=1 7348; RV32IA-NEXT: lr.w.aq a5, (a2) 7349; RV32IA-NEXT: and a7, a5, a4 7350; RV32IA-NEXT: mv a6, a5 7351; RV32IA-NEXT: sll a7, a7, a3 7352; RV32IA-NEXT: sra a7, a7, a3 7353; RV32IA-NEXT: bge a7, a1, .LBB93_3 7354; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB93_1 Depth=1 7355; RV32IA-NEXT: xor a6, a5, a1 7356; RV32IA-NEXT: and a6, a6, a4 7357; RV32IA-NEXT: xor a6, a5, a6 7358; RV32IA-NEXT: .LBB93_3: # in Loop: Header=BB93_1 Depth=1 7359; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 7360; RV32IA-NEXT: bnez a6, .LBB93_1 7361; RV32IA-NEXT: # %bb.4: 7362; RV32IA-NEXT: srl a0, a5, a0 7363; RV32IA-NEXT: ret 7364; 7365; RV64I-LABEL: atomicrmw_max_i16_acq_rel: 7366; RV64I: # %bb.0: 7367; RV64I-NEXT: addi sp, sp, -48 7368; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7369; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7370; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7371; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7372; RV64I-NEXT: mv s0, a0 7373; RV64I-NEXT: lhu a3, 0(a0) 7374; RV64I-NEXT: mv s1, a1 7375; RV64I-NEXT: slli a0, a1, 48 7376; RV64I-NEXT: srai s2, a0, 48 7377; RV64I-NEXT: j .LBB93_2 7378; RV64I-NEXT: .LBB93_1: # %atomicrmw.start 7379; RV64I-NEXT: # in Loop: Header=BB93_2 Depth=1 7380; RV64I-NEXT: sh a3, 14(sp) 7381; RV64I-NEXT: addi a1, sp, 14 7382; RV64I-NEXT: li a3, 4 7383; RV64I-NEXT: li a4, 2 7384; RV64I-NEXT: mv a0, s0 7385; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7386; RV64I-NEXT: lh a3, 14(sp) 7387; RV64I-NEXT: bnez a0, .LBB93_4 7388; RV64I-NEXT: .LBB93_2: # %atomicrmw.start 7389; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7390; RV64I-NEXT: slli a0, a3, 48 7391; RV64I-NEXT: srai a0, a0, 48 7392; RV64I-NEXT: mv a2, a3 7393; RV64I-NEXT: blt s2, a0, .LBB93_1 7394; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7395; RV64I-NEXT: # in Loop: Header=BB93_2 Depth=1 7396; RV64I-NEXT: mv a2, s1 7397; RV64I-NEXT: j .LBB93_1 7398; RV64I-NEXT: .LBB93_4: # %atomicrmw.end 7399; RV64I-NEXT: mv a0, a3 7400; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7401; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7402; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7403; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7404; RV64I-NEXT: addi sp, sp, 48 7405; RV64I-NEXT: ret 7406; 7407; RV64IA-LABEL: atomicrmw_max_i16_acq_rel: 7408; RV64IA: # %bb.0: 7409; RV64IA-NEXT: andi a2, a0, -4 7410; RV64IA-NEXT: slliw a0, a0, 3 7411; RV64IA-NEXT: andi a3, a0, 24 7412; RV64IA-NEXT: lui a4, 16 7413; RV64IA-NEXT: addiw a4, a4, -1 7414; RV64IA-NEXT: sllw a4, a4, a0 7415; RV64IA-NEXT: slli a1, a1, 48 7416; RV64IA-NEXT: srai a1, a1, 48 7417; RV64IA-NEXT: sllw a1, a1, a0 7418; RV64IA-NEXT: li a5, 48 7419; RV64IA-NEXT: sub a3, a5, a3 7420; RV64IA-NEXT: .LBB93_1: # =>This Inner Loop Header: Depth=1 7421; RV64IA-NEXT: lr.w.aq a5, (a2) 7422; RV64IA-NEXT: and a7, a5, a4 7423; RV64IA-NEXT: mv a6, a5 7424; RV64IA-NEXT: sll a7, a7, a3 7425; RV64IA-NEXT: sra a7, a7, a3 7426; RV64IA-NEXT: bge a7, a1, .LBB93_3 7427; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB93_1 Depth=1 7428; RV64IA-NEXT: xor a6, a5, a1 7429; RV64IA-NEXT: and a6, a6, a4 7430; RV64IA-NEXT: xor a6, a5, a6 7431; RV64IA-NEXT: .LBB93_3: # in Loop: Header=BB93_1 Depth=1 7432; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 7433; RV64IA-NEXT: bnez a6, .LBB93_1 7434; RV64IA-NEXT: # %bb.4: 7435; RV64IA-NEXT: srlw a0, a5, a0 7436; RV64IA-NEXT: ret 7437 %1 = atomicrmw max i16* %a, i16 %b acq_rel 7438 ret i16 %1 7439} 7440 7441define i16 @atomicrmw_max_i16_seq_cst(i16 *%a, i16 %b) nounwind { 7442; RV32I-LABEL: atomicrmw_max_i16_seq_cst: 7443; RV32I: # %bb.0: 7444; RV32I-NEXT: addi sp, sp, -32 7445; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7446; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7447; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7448; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7449; RV32I-NEXT: mv s0, a0 7450; RV32I-NEXT: lhu a3, 0(a0) 7451; RV32I-NEXT: mv s1, a1 7452; RV32I-NEXT: slli a0, a1, 16 7453; RV32I-NEXT: srai s2, a0, 16 7454; RV32I-NEXT: j .LBB94_2 7455; RV32I-NEXT: .LBB94_1: # %atomicrmw.start 7456; RV32I-NEXT: # in Loop: Header=BB94_2 Depth=1 7457; RV32I-NEXT: sh a3, 14(sp) 7458; RV32I-NEXT: addi a1, sp, 14 7459; RV32I-NEXT: li a3, 5 7460; RV32I-NEXT: li a4, 5 7461; RV32I-NEXT: mv a0, s0 7462; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7463; RV32I-NEXT: lh a3, 14(sp) 7464; RV32I-NEXT: bnez a0, .LBB94_4 7465; RV32I-NEXT: .LBB94_2: # %atomicrmw.start 7466; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7467; RV32I-NEXT: slli a0, a3, 16 7468; RV32I-NEXT: srai a0, a0, 16 7469; RV32I-NEXT: mv a2, a3 7470; RV32I-NEXT: blt s2, a0, .LBB94_1 7471; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7472; RV32I-NEXT: # in Loop: Header=BB94_2 Depth=1 7473; RV32I-NEXT: mv a2, s1 7474; RV32I-NEXT: j .LBB94_1 7475; RV32I-NEXT: .LBB94_4: # %atomicrmw.end 7476; RV32I-NEXT: mv a0, a3 7477; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7478; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7479; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7480; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7481; RV32I-NEXT: addi sp, sp, 32 7482; RV32I-NEXT: ret 7483; 7484; RV32IA-LABEL: atomicrmw_max_i16_seq_cst: 7485; RV32IA: # %bb.0: 7486; RV32IA-NEXT: andi a2, a0, -4 7487; RV32IA-NEXT: slli a0, a0, 3 7488; RV32IA-NEXT: andi a3, a0, 24 7489; RV32IA-NEXT: lui a4, 16 7490; RV32IA-NEXT: addi a4, a4, -1 7491; RV32IA-NEXT: sll a4, a4, a0 7492; RV32IA-NEXT: slli a1, a1, 16 7493; RV32IA-NEXT: srai a1, a1, 16 7494; RV32IA-NEXT: sll a1, a1, a0 7495; RV32IA-NEXT: li a5, 16 7496; RV32IA-NEXT: sub a3, a5, a3 7497; RV32IA-NEXT: .LBB94_1: # =>This Inner Loop Header: Depth=1 7498; RV32IA-NEXT: lr.w.aqrl a5, (a2) 7499; RV32IA-NEXT: and a7, a5, a4 7500; RV32IA-NEXT: mv a6, a5 7501; RV32IA-NEXT: sll a7, a7, a3 7502; RV32IA-NEXT: sra a7, a7, a3 7503; RV32IA-NEXT: bge a7, a1, .LBB94_3 7504; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB94_1 Depth=1 7505; RV32IA-NEXT: xor a6, a5, a1 7506; RV32IA-NEXT: and a6, a6, a4 7507; RV32IA-NEXT: xor a6, a5, a6 7508; RV32IA-NEXT: .LBB94_3: # in Loop: Header=BB94_1 Depth=1 7509; RV32IA-NEXT: sc.w.aqrl a6, a6, (a2) 7510; RV32IA-NEXT: bnez a6, .LBB94_1 7511; RV32IA-NEXT: # %bb.4: 7512; RV32IA-NEXT: srl a0, a5, a0 7513; RV32IA-NEXT: ret 7514; 7515; RV64I-LABEL: atomicrmw_max_i16_seq_cst: 7516; RV64I: # %bb.0: 7517; RV64I-NEXT: addi sp, sp, -48 7518; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7519; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7520; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7521; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7522; RV64I-NEXT: mv s0, a0 7523; RV64I-NEXT: lhu a3, 0(a0) 7524; RV64I-NEXT: mv s1, a1 7525; RV64I-NEXT: slli a0, a1, 48 7526; RV64I-NEXT: srai s2, a0, 48 7527; RV64I-NEXT: j .LBB94_2 7528; RV64I-NEXT: .LBB94_1: # %atomicrmw.start 7529; RV64I-NEXT: # in Loop: Header=BB94_2 Depth=1 7530; RV64I-NEXT: sh a3, 14(sp) 7531; RV64I-NEXT: addi a1, sp, 14 7532; RV64I-NEXT: li a3, 5 7533; RV64I-NEXT: li a4, 5 7534; RV64I-NEXT: mv a0, s0 7535; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7536; RV64I-NEXT: lh a3, 14(sp) 7537; RV64I-NEXT: bnez a0, .LBB94_4 7538; RV64I-NEXT: .LBB94_2: # %atomicrmw.start 7539; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7540; RV64I-NEXT: slli a0, a3, 48 7541; RV64I-NEXT: srai a0, a0, 48 7542; RV64I-NEXT: mv a2, a3 7543; RV64I-NEXT: blt s2, a0, .LBB94_1 7544; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7545; RV64I-NEXT: # in Loop: Header=BB94_2 Depth=1 7546; RV64I-NEXT: mv a2, s1 7547; RV64I-NEXT: j .LBB94_1 7548; RV64I-NEXT: .LBB94_4: # %atomicrmw.end 7549; RV64I-NEXT: mv a0, a3 7550; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7551; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7552; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7553; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7554; RV64I-NEXT: addi sp, sp, 48 7555; RV64I-NEXT: ret 7556; 7557; RV64IA-LABEL: atomicrmw_max_i16_seq_cst: 7558; RV64IA: # %bb.0: 7559; RV64IA-NEXT: andi a2, a0, -4 7560; RV64IA-NEXT: slliw a0, a0, 3 7561; RV64IA-NEXT: andi a3, a0, 24 7562; RV64IA-NEXT: lui a4, 16 7563; RV64IA-NEXT: addiw a4, a4, -1 7564; RV64IA-NEXT: sllw a4, a4, a0 7565; RV64IA-NEXT: slli a1, a1, 48 7566; RV64IA-NEXT: srai a1, a1, 48 7567; RV64IA-NEXT: sllw a1, a1, a0 7568; RV64IA-NEXT: li a5, 48 7569; RV64IA-NEXT: sub a3, a5, a3 7570; RV64IA-NEXT: .LBB94_1: # =>This Inner Loop Header: Depth=1 7571; RV64IA-NEXT: lr.w.aqrl a5, (a2) 7572; RV64IA-NEXT: and a7, a5, a4 7573; RV64IA-NEXT: mv a6, a5 7574; RV64IA-NEXT: sll a7, a7, a3 7575; RV64IA-NEXT: sra a7, a7, a3 7576; RV64IA-NEXT: bge a7, a1, .LBB94_3 7577; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB94_1 Depth=1 7578; RV64IA-NEXT: xor a6, a5, a1 7579; RV64IA-NEXT: and a6, a6, a4 7580; RV64IA-NEXT: xor a6, a5, a6 7581; RV64IA-NEXT: .LBB94_3: # in Loop: Header=BB94_1 Depth=1 7582; RV64IA-NEXT: sc.w.aqrl a6, a6, (a2) 7583; RV64IA-NEXT: bnez a6, .LBB94_1 7584; RV64IA-NEXT: # %bb.4: 7585; RV64IA-NEXT: srlw a0, a5, a0 7586; RV64IA-NEXT: ret 7587 %1 = atomicrmw max i16* %a, i16 %b seq_cst 7588 ret i16 %1 7589} 7590 7591define i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind { 7592; RV32I-LABEL: atomicrmw_min_i16_monotonic: 7593; RV32I: # %bb.0: 7594; RV32I-NEXT: addi sp, sp, -32 7595; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7596; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7597; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7598; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7599; RV32I-NEXT: mv s0, a0 7600; RV32I-NEXT: lhu a3, 0(a0) 7601; RV32I-NEXT: mv s1, a1 7602; RV32I-NEXT: slli a0, a1, 16 7603; RV32I-NEXT: srai s2, a0, 16 7604; RV32I-NEXT: j .LBB95_2 7605; RV32I-NEXT: .LBB95_1: # %atomicrmw.start 7606; RV32I-NEXT: # in Loop: Header=BB95_2 Depth=1 7607; RV32I-NEXT: sh a3, 14(sp) 7608; RV32I-NEXT: addi a1, sp, 14 7609; RV32I-NEXT: mv a0, s0 7610; RV32I-NEXT: li a3, 0 7611; RV32I-NEXT: li a4, 0 7612; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7613; RV32I-NEXT: lh a3, 14(sp) 7614; RV32I-NEXT: bnez a0, .LBB95_4 7615; RV32I-NEXT: .LBB95_2: # %atomicrmw.start 7616; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7617; RV32I-NEXT: slli a0, a3, 16 7618; RV32I-NEXT: srai a0, a0, 16 7619; RV32I-NEXT: mv a2, a3 7620; RV32I-NEXT: bge s2, a0, .LBB95_1 7621; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7622; RV32I-NEXT: # in Loop: Header=BB95_2 Depth=1 7623; RV32I-NEXT: mv a2, s1 7624; RV32I-NEXT: j .LBB95_1 7625; RV32I-NEXT: .LBB95_4: # %atomicrmw.end 7626; RV32I-NEXT: mv a0, a3 7627; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7628; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7629; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7630; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7631; RV32I-NEXT: addi sp, sp, 32 7632; RV32I-NEXT: ret 7633; 7634; RV32IA-LABEL: atomicrmw_min_i16_monotonic: 7635; RV32IA: # %bb.0: 7636; RV32IA-NEXT: andi a2, a0, -4 7637; RV32IA-NEXT: slli a0, a0, 3 7638; RV32IA-NEXT: andi a3, a0, 24 7639; RV32IA-NEXT: lui a4, 16 7640; RV32IA-NEXT: addi a4, a4, -1 7641; RV32IA-NEXT: sll a4, a4, a0 7642; RV32IA-NEXT: slli a1, a1, 16 7643; RV32IA-NEXT: srai a1, a1, 16 7644; RV32IA-NEXT: sll a1, a1, a0 7645; RV32IA-NEXT: li a5, 16 7646; RV32IA-NEXT: sub a3, a5, a3 7647; RV32IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 7648; RV32IA-NEXT: lr.w a5, (a2) 7649; RV32IA-NEXT: and a7, a5, a4 7650; RV32IA-NEXT: mv a6, a5 7651; RV32IA-NEXT: sll a7, a7, a3 7652; RV32IA-NEXT: sra a7, a7, a3 7653; RV32IA-NEXT: bge a1, a7, .LBB95_3 7654; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB95_1 Depth=1 7655; RV32IA-NEXT: xor a6, a5, a1 7656; RV32IA-NEXT: and a6, a6, a4 7657; RV32IA-NEXT: xor a6, a5, a6 7658; RV32IA-NEXT: .LBB95_3: # in Loop: Header=BB95_1 Depth=1 7659; RV32IA-NEXT: sc.w a6, a6, (a2) 7660; RV32IA-NEXT: bnez a6, .LBB95_1 7661; RV32IA-NEXT: # %bb.4: 7662; RV32IA-NEXT: srl a0, a5, a0 7663; RV32IA-NEXT: ret 7664; 7665; RV64I-LABEL: atomicrmw_min_i16_monotonic: 7666; RV64I: # %bb.0: 7667; RV64I-NEXT: addi sp, sp, -48 7668; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7669; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7670; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7671; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7672; RV64I-NEXT: mv s0, a0 7673; RV64I-NEXT: lhu a3, 0(a0) 7674; RV64I-NEXT: mv s1, a1 7675; RV64I-NEXT: slli a0, a1, 48 7676; RV64I-NEXT: srai s2, a0, 48 7677; RV64I-NEXT: j .LBB95_2 7678; RV64I-NEXT: .LBB95_1: # %atomicrmw.start 7679; RV64I-NEXT: # in Loop: Header=BB95_2 Depth=1 7680; RV64I-NEXT: sh a3, 14(sp) 7681; RV64I-NEXT: addi a1, sp, 14 7682; RV64I-NEXT: mv a0, s0 7683; RV64I-NEXT: li a3, 0 7684; RV64I-NEXT: li a4, 0 7685; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7686; RV64I-NEXT: lh a3, 14(sp) 7687; RV64I-NEXT: bnez a0, .LBB95_4 7688; RV64I-NEXT: .LBB95_2: # %atomicrmw.start 7689; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7690; RV64I-NEXT: slli a0, a3, 48 7691; RV64I-NEXT: srai a0, a0, 48 7692; RV64I-NEXT: mv a2, a3 7693; RV64I-NEXT: bge s2, a0, .LBB95_1 7694; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7695; RV64I-NEXT: # in Loop: Header=BB95_2 Depth=1 7696; RV64I-NEXT: mv a2, s1 7697; RV64I-NEXT: j .LBB95_1 7698; RV64I-NEXT: .LBB95_4: # %atomicrmw.end 7699; RV64I-NEXT: mv a0, a3 7700; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7701; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7702; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7703; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7704; RV64I-NEXT: addi sp, sp, 48 7705; RV64I-NEXT: ret 7706; 7707; RV64IA-LABEL: atomicrmw_min_i16_monotonic: 7708; RV64IA: # %bb.0: 7709; RV64IA-NEXT: andi a2, a0, -4 7710; RV64IA-NEXT: slliw a0, a0, 3 7711; RV64IA-NEXT: andi a3, a0, 24 7712; RV64IA-NEXT: lui a4, 16 7713; RV64IA-NEXT: addiw a4, a4, -1 7714; RV64IA-NEXT: sllw a4, a4, a0 7715; RV64IA-NEXT: slli a1, a1, 48 7716; RV64IA-NEXT: srai a1, a1, 48 7717; RV64IA-NEXT: sllw a1, a1, a0 7718; RV64IA-NEXT: li a5, 48 7719; RV64IA-NEXT: sub a3, a5, a3 7720; RV64IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 7721; RV64IA-NEXT: lr.w a5, (a2) 7722; RV64IA-NEXT: and a7, a5, a4 7723; RV64IA-NEXT: mv a6, a5 7724; RV64IA-NEXT: sll a7, a7, a3 7725; RV64IA-NEXT: sra a7, a7, a3 7726; RV64IA-NEXT: bge a1, a7, .LBB95_3 7727; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB95_1 Depth=1 7728; RV64IA-NEXT: xor a6, a5, a1 7729; RV64IA-NEXT: and a6, a6, a4 7730; RV64IA-NEXT: xor a6, a5, a6 7731; RV64IA-NEXT: .LBB95_3: # in Loop: Header=BB95_1 Depth=1 7732; RV64IA-NEXT: sc.w a6, a6, (a2) 7733; RV64IA-NEXT: bnez a6, .LBB95_1 7734; RV64IA-NEXT: # %bb.4: 7735; RV64IA-NEXT: srlw a0, a5, a0 7736; RV64IA-NEXT: ret 7737 %1 = atomicrmw min i16* %a, i16 %b monotonic 7738 ret i16 %1 7739} 7740 7741define i16 @atomicrmw_min_i16_acquire(i16 *%a, i16 %b) nounwind { 7742; RV32I-LABEL: atomicrmw_min_i16_acquire: 7743; RV32I: # %bb.0: 7744; RV32I-NEXT: addi sp, sp, -32 7745; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7746; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7747; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7748; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7749; RV32I-NEXT: mv s0, a0 7750; RV32I-NEXT: lhu a3, 0(a0) 7751; RV32I-NEXT: mv s1, a1 7752; RV32I-NEXT: slli a0, a1, 16 7753; RV32I-NEXT: srai s2, a0, 16 7754; RV32I-NEXT: j .LBB96_2 7755; RV32I-NEXT: .LBB96_1: # %atomicrmw.start 7756; RV32I-NEXT: # in Loop: Header=BB96_2 Depth=1 7757; RV32I-NEXT: sh a3, 14(sp) 7758; RV32I-NEXT: addi a1, sp, 14 7759; RV32I-NEXT: li a3, 2 7760; RV32I-NEXT: li a4, 2 7761; RV32I-NEXT: mv a0, s0 7762; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7763; RV32I-NEXT: lh a3, 14(sp) 7764; RV32I-NEXT: bnez a0, .LBB96_4 7765; RV32I-NEXT: .LBB96_2: # %atomicrmw.start 7766; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7767; RV32I-NEXT: slli a0, a3, 16 7768; RV32I-NEXT: srai a0, a0, 16 7769; RV32I-NEXT: mv a2, a3 7770; RV32I-NEXT: bge s2, a0, .LBB96_1 7771; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7772; RV32I-NEXT: # in Loop: Header=BB96_2 Depth=1 7773; RV32I-NEXT: mv a2, s1 7774; RV32I-NEXT: j .LBB96_1 7775; RV32I-NEXT: .LBB96_4: # %atomicrmw.end 7776; RV32I-NEXT: mv a0, a3 7777; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7778; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7779; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7780; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7781; RV32I-NEXT: addi sp, sp, 32 7782; RV32I-NEXT: ret 7783; 7784; RV32IA-LABEL: atomicrmw_min_i16_acquire: 7785; RV32IA: # %bb.0: 7786; RV32IA-NEXT: andi a2, a0, -4 7787; RV32IA-NEXT: slli a0, a0, 3 7788; RV32IA-NEXT: andi a3, a0, 24 7789; RV32IA-NEXT: lui a4, 16 7790; RV32IA-NEXT: addi a4, a4, -1 7791; RV32IA-NEXT: sll a4, a4, a0 7792; RV32IA-NEXT: slli a1, a1, 16 7793; RV32IA-NEXT: srai a1, a1, 16 7794; RV32IA-NEXT: sll a1, a1, a0 7795; RV32IA-NEXT: li a5, 16 7796; RV32IA-NEXT: sub a3, a5, a3 7797; RV32IA-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 7798; RV32IA-NEXT: lr.w.aq a5, (a2) 7799; RV32IA-NEXT: and a7, a5, a4 7800; RV32IA-NEXT: mv a6, a5 7801; RV32IA-NEXT: sll a7, a7, a3 7802; RV32IA-NEXT: sra a7, a7, a3 7803; RV32IA-NEXT: bge a1, a7, .LBB96_3 7804; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB96_1 Depth=1 7805; RV32IA-NEXT: xor a6, a5, a1 7806; RV32IA-NEXT: and a6, a6, a4 7807; RV32IA-NEXT: xor a6, a5, a6 7808; RV32IA-NEXT: .LBB96_3: # in Loop: Header=BB96_1 Depth=1 7809; RV32IA-NEXT: sc.w a6, a6, (a2) 7810; RV32IA-NEXT: bnez a6, .LBB96_1 7811; RV32IA-NEXT: # %bb.4: 7812; RV32IA-NEXT: srl a0, a5, a0 7813; RV32IA-NEXT: ret 7814; 7815; RV64I-LABEL: atomicrmw_min_i16_acquire: 7816; RV64I: # %bb.0: 7817; RV64I-NEXT: addi sp, sp, -48 7818; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7819; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7820; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7821; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7822; RV64I-NEXT: mv s0, a0 7823; RV64I-NEXT: lhu a3, 0(a0) 7824; RV64I-NEXT: mv s1, a1 7825; RV64I-NEXT: slli a0, a1, 48 7826; RV64I-NEXT: srai s2, a0, 48 7827; RV64I-NEXT: j .LBB96_2 7828; RV64I-NEXT: .LBB96_1: # %atomicrmw.start 7829; RV64I-NEXT: # in Loop: Header=BB96_2 Depth=1 7830; RV64I-NEXT: sh a3, 14(sp) 7831; RV64I-NEXT: addi a1, sp, 14 7832; RV64I-NEXT: li a3, 2 7833; RV64I-NEXT: li a4, 2 7834; RV64I-NEXT: mv a0, s0 7835; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7836; RV64I-NEXT: lh a3, 14(sp) 7837; RV64I-NEXT: bnez a0, .LBB96_4 7838; RV64I-NEXT: .LBB96_2: # %atomicrmw.start 7839; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7840; RV64I-NEXT: slli a0, a3, 48 7841; RV64I-NEXT: srai a0, a0, 48 7842; RV64I-NEXT: mv a2, a3 7843; RV64I-NEXT: bge s2, a0, .LBB96_1 7844; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7845; RV64I-NEXT: # in Loop: Header=BB96_2 Depth=1 7846; RV64I-NEXT: mv a2, s1 7847; RV64I-NEXT: j .LBB96_1 7848; RV64I-NEXT: .LBB96_4: # %atomicrmw.end 7849; RV64I-NEXT: mv a0, a3 7850; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7851; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7852; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7853; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7854; RV64I-NEXT: addi sp, sp, 48 7855; RV64I-NEXT: ret 7856; 7857; RV64IA-LABEL: atomicrmw_min_i16_acquire: 7858; RV64IA: # %bb.0: 7859; RV64IA-NEXT: andi a2, a0, -4 7860; RV64IA-NEXT: slliw a0, a0, 3 7861; RV64IA-NEXT: andi a3, a0, 24 7862; RV64IA-NEXT: lui a4, 16 7863; RV64IA-NEXT: addiw a4, a4, -1 7864; RV64IA-NEXT: sllw a4, a4, a0 7865; RV64IA-NEXT: slli a1, a1, 48 7866; RV64IA-NEXT: srai a1, a1, 48 7867; RV64IA-NEXT: sllw a1, a1, a0 7868; RV64IA-NEXT: li a5, 48 7869; RV64IA-NEXT: sub a3, a5, a3 7870; RV64IA-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 7871; RV64IA-NEXT: lr.w.aq a5, (a2) 7872; RV64IA-NEXT: and a7, a5, a4 7873; RV64IA-NEXT: mv a6, a5 7874; RV64IA-NEXT: sll a7, a7, a3 7875; RV64IA-NEXT: sra a7, a7, a3 7876; RV64IA-NEXT: bge a1, a7, .LBB96_3 7877; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB96_1 Depth=1 7878; RV64IA-NEXT: xor a6, a5, a1 7879; RV64IA-NEXT: and a6, a6, a4 7880; RV64IA-NEXT: xor a6, a5, a6 7881; RV64IA-NEXT: .LBB96_3: # in Loop: Header=BB96_1 Depth=1 7882; RV64IA-NEXT: sc.w a6, a6, (a2) 7883; RV64IA-NEXT: bnez a6, .LBB96_1 7884; RV64IA-NEXT: # %bb.4: 7885; RV64IA-NEXT: srlw a0, a5, a0 7886; RV64IA-NEXT: ret 7887 %1 = atomicrmw min i16* %a, i16 %b acquire 7888 ret i16 %1 7889} 7890 7891define i16 @atomicrmw_min_i16_release(i16 *%a, i16 %b) nounwind { 7892; RV32I-LABEL: atomicrmw_min_i16_release: 7893; RV32I: # %bb.0: 7894; RV32I-NEXT: addi sp, sp, -32 7895; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7896; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7897; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7898; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7899; RV32I-NEXT: mv s0, a0 7900; RV32I-NEXT: lhu a3, 0(a0) 7901; RV32I-NEXT: mv s1, a1 7902; RV32I-NEXT: slli a0, a1, 16 7903; RV32I-NEXT: srai s2, a0, 16 7904; RV32I-NEXT: j .LBB97_2 7905; RV32I-NEXT: .LBB97_1: # %atomicrmw.start 7906; RV32I-NEXT: # in Loop: Header=BB97_2 Depth=1 7907; RV32I-NEXT: sh a3, 14(sp) 7908; RV32I-NEXT: addi a1, sp, 14 7909; RV32I-NEXT: li a3, 3 7910; RV32I-NEXT: mv a0, s0 7911; RV32I-NEXT: li a4, 0 7912; RV32I-NEXT: call __atomic_compare_exchange_2@plt 7913; RV32I-NEXT: lh a3, 14(sp) 7914; RV32I-NEXT: bnez a0, .LBB97_4 7915; RV32I-NEXT: .LBB97_2: # %atomicrmw.start 7916; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7917; RV32I-NEXT: slli a0, a3, 16 7918; RV32I-NEXT: srai a0, a0, 16 7919; RV32I-NEXT: mv a2, a3 7920; RV32I-NEXT: bge s2, a0, .LBB97_1 7921; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7922; RV32I-NEXT: # in Loop: Header=BB97_2 Depth=1 7923; RV32I-NEXT: mv a2, s1 7924; RV32I-NEXT: j .LBB97_1 7925; RV32I-NEXT: .LBB97_4: # %atomicrmw.end 7926; RV32I-NEXT: mv a0, a3 7927; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7928; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7929; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7930; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7931; RV32I-NEXT: addi sp, sp, 32 7932; RV32I-NEXT: ret 7933; 7934; RV32IA-LABEL: atomicrmw_min_i16_release: 7935; RV32IA: # %bb.0: 7936; RV32IA-NEXT: andi a2, a0, -4 7937; RV32IA-NEXT: slli a0, a0, 3 7938; RV32IA-NEXT: andi a3, a0, 24 7939; RV32IA-NEXT: lui a4, 16 7940; RV32IA-NEXT: addi a4, a4, -1 7941; RV32IA-NEXT: sll a4, a4, a0 7942; RV32IA-NEXT: slli a1, a1, 16 7943; RV32IA-NEXT: srai a1, a1, 16 7944; RV32IA-NEXT: sll a1, a1, a0 7945; RV32IA-NEXT: li a5, 16 7946; RV32IA-NEXT: sub a3, a5, a3 7947; RV32IA-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 7948; RV32IA-NEXT: lr.w a5, (a2) 7949; RV32IA-NEXT: and a7, a5, a4 7950; RV32IA-NEXT: mv a6, a5 7951; RV32IA-NEXT: sll a7, a7, a3 7952; RV32IA-NEXT: sra a7, a7, a3 7953; RV32IA-NEXT: bge a1, a7, .LBB97_3 7954; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB97_1 Depth=1 7955; RV32IA-NEXT: xor a6, a5, a1 7956; RV32IA-NEXT: and a6, a6, a4 7957; RV32IA-NEXT: xor a6, a5, a6 7958; RV32IA-NEXT: .LBB97_3: # in Loop: Header=BB97_1 Depth=1 7959; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 7960; RV32IA-NEXT: bnez a6, .LBB97_1 7961; RV32IA-NEXT: # %bb.4: 7962; RV32IA-NEXT: srl a0, a5, a0 7963; RV32IA-NEXT: ret 7964; 7965; RV64I-LABEL: atomicrmw_min_i16_release: 7966; RV64I: # %bb.0: 7967; RV64I-NEXT: addi sp, sp, -48 7968; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7969; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7970; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7971; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7972; RV64I-NEXT: mv s0, a0 7973; RV64I-NEXT: lhu a3, 0(a0) 7974; RV64I-NEXT: mv s1, a1 7975; RV64I-NEXT: slli a0, a1, 48 7976; RV64I-NEXT: srai s2, a0, 48 7977; RV64I-NEXT: j .LBB97_2 7978; RV64I-NEXT: .LBB97_1: # %atomicrmw.start 7979; RV64I-NEXT: # in Loop: Header=BB97_2 Depth=1 7980; RV64I-NEXT: sh a3, 14(sp) 7981; RV64I-NEXT: addi a1, sp, 14 7982; RV64I-NEXT: li a3, 3 7983; RV64I-NEXT: mv a0, s0 7984; RV64I-NEXT: li a4, 0 7985; RV64I-NEXT: call __atomic_compare_exchange_2@plt 7986; RV64I-NEXT: lh a3, 14(sp) 7987; RV64I-NEXT: bnez a0, .LBB97_4 7988; RV64I-NEXT: .LBB97_2: # %atomicrmw.start 7989; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7990; RV64I-NEXT: slli a0, a3, 48 7991; RV64I-NEXT: srai a0, a0, 48 7992; RV64I-NEXT: mv a2, a3 7993; RV64I-NEXT: bge s2, a0, .LBB97_1 7994; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7995; RV64I-NEXT: # in Loop: Header=BB97_2 Depth=1 7996; RV64I-NEXT: mv a2, s1 7997; RV64I-NEXT: j .LBB97_1 7998; RV64I-NEXT: .LBB97_4: # %atomicrmw.end 7999; RV64I-NEXT: mv a0, a3 8000; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8001; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8002; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8003; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8004; RV64I-NEXT: addi sp, sp, 48 8005; RV64I-NEXT: ret 8006; 8007; RV64IA-LABEL: atomicrmw_min_i16_release: 8008; RV64IA: # %bb.0: 8009; RV64IA-NEXT: andi a2, a0, -4 8010; RV64IA-NEXT: slliw a0, a0, 3 8011; RV64IA-NEXT: andi a3, a0, 24 8012; RV64IA-NEXT: lui a4, 16 8013; RV64IA-NEXT: addiw a4, a4, -1 8014; RV64IA-NEXT: sllw a4, a4, a0 8015; RV64IA-NEXT: slli a1, a1, 48 8016; RV64IA-NEXT: srai a1, a1, 48 8017; RV64IA-NEXT: sllw a1, a1, a0 8018; RV64IA-NEXT: li a5, 48 8019; RV64IA-NEXT: sub a3, a5, a3 8020; RV64IA-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 8021; RV64IA-NEXT: lr.w a5, (a2) 8022; RV64IA-NEXT: and a7, a5, a4 8023; RV64IA-NEXT: mv a6, a5 8024; RV64IA-NEXT: sll a7, a7, a3 8025; RV64IA-NEXT: sra a7, a7, a3 8026; RV64IA-NEXT: bge a1, a7, .LBB97_3 8027; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB97_1 Depth=1 8028; RV64IA-NEXT: xor a6, a5, a1 8029; RV64IA-NEXT: and a6, a6, a4 8030; RV64IA-NEXT: xor a6, a5, a6 8031; RV64IA-NEXT: .LBB97_3: # in Loop: Header=BB97_1 Depth=1 8032; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 8033; RV64IA-NEXT: bnez a6, .LBB97_1 8034; RV64IA-NEXT: # %bb.4: 8035; RV64IA-NEXT: srlw a0, a5, a0 8036; RV64IA-NEXT: ret 8037 %1 = atomicrmw min i16* %a, i16 %b release 8038 ret i16 %1 8039} 8040 8041define i16 @atomicrmw_min_i16_acq_rel(i16 *%a, i16 %b) nounwind { 8042; RV32I-LABEL: atomicrmw_min_i16_acq_rel: 8043; RV32I: # %bb.0: 8044; RV32I-NEXT: addi sp, sp, -32 8045; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8046; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8047; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8048; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8049; RV32I-NEXT: mv s0, a0 8050; RV32I-NEXT: lhu a3, 0(a0) 8051; RV32I-NEXT: mv s1, a1 8052; RV32I-NEXT: slli a0, a1, 16 8053; RV32I-NEXT: srai s2, a0, 16 8054; RV32I-NEXT: j .LBB98_2 8055; RV32I-NEXT: .LBB98_1: # %atomicrmw.start 8056; RV32I-NEXT: # in Loop: Header=BB98_2 Depth=1 8057; RV32I-NEXT: sh a3, 14(sp) 8058; RV32I-NEXT: addi a1, sp, 14 8059; RV32I-NEXT: li a3, 4 8060; RV32I-NEXT: li a4, 2 8061; RV32I-NEXT: mv a0, s0 8062; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8063; RV32I-NEXT: lh a3, 14(sp) 8064; RV32I-NEXT: bnez a0, .LBB98_4 8065; RV32I-NEXT: .LBB98_2: # %atomicrmw.start 8066; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8067; RV32I-NEXT: slli a0, a3, 16 8068; RV32I-NEXT: srai a0, a0, 16 8069; RV32I-NEXT: mv a2, a3 8070; RV32I-NEXT: bge s2, a0, .LBB98_1 8071; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8072; RV32I-NEXT: # in Loop: Header=BB98_2 Depth=1 8073; RV32I-NEXT: mv a2, s1 8074; RV32I-NEXT: j .LBB98_1 8075; RV32I-NEXT: .LBB98_4: # %atomicrmw.end 8076; RV32I-NEXT: mv a0, a3 8077; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8078; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8079; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8080; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8081; RV32I-NEXT: addi sp, sp, 32 8082; RV32I-NEXT: ret 8083; 8084; RV32IA-LABEL: atomicrmw_min_i16_acq_rel: 8085; RV32IA: # %bb.0: 8086; RV32IA-NEXT: andi a2, a0, -4 8087; RV32IA-NEXT: slli a0, a0, 3 8088; RV32IA-NEXT: andi a3, a0, 24 8089; RV32IA-NEXT: lui a4, 16 8090; RV32IA-NEXT: addi a4, a4, -1 8091; RV32IA-NEXT: sll a4, a4, a0 8092; RV32IA-NEXT: slli a1, a1, 16 8093; RV32IA-NEXT: srai a1, a1, 16 8094; RV32IA-NEXT: sll a1, a1, a0 8095; RV32IA-NEXT: li a5, 16 8096; RV32IA-NEXT: sub a3, a5, a3 8097; RV32IA-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 8098; RV32IA-NEXT: lr.w.aq a5, (a2) 8099; RV32IA-NEXT: and a7, a5, a4 8100; RV32IA-NEXT: mv a6, a5 8101; RV32IA-NEXT: sll a7, a7, a3 8102; RV32IA-NEXT: sra a7, a7, a3 8103; RV32IA-NEXT: bge a1, a7, .LBB98_3 8104; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB98_1 Depth=1 8105; RV32IA-NEXT: xor a6, a5, a1 8106; RV32IA-NEXT: and a6, a6, a4 8107; RV32IA-NEXT: xor a6, a5, a6 8108; RV32IA-NEXT: .LBB98_3: # in Loop: Header=BB98_1 Depth=1 8109; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 8110; RV32IA-NEXT: bnez a6, .LBB98_1 8111; RV32IA-NEXT: # %bb.4: 8112; RV32IA-NEXT: srl a0, a5, a0 8113; RV32IA-NEXT: ret 8114; 8115; RV64I-LABEL: atomicrmw_min_i16_acq_rel: 8116; RV64I: # %bb.0: 8117; RV64I-NEXT: addi sp, sp, -48 8118; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8119; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8120; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8121; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8122; RV64I-NEXT: mv s0, a0 8123; RV64I-NEXT: lhu a3, 0(a0) 8124; RV64I-NEXT: mv s1, a1 8125; RV64I-NEXT: slli a0, a1, 48 8126; RV64I-NEXT: srai s2, a0, 48 8127; RV64I-NEXT: j .LBB98_2 8128; RV64I-NEXT: .LBB98_1: # %atomicrmw.start 8129; RV64I-NEXT: # in Loop: Header=BB98_2 Depth=1 8130; RV64I-NEXT: sh a3, 14(sp) 8131; RV64I-NEXT: addi a1, sp, 14 8132; RV64I-NEXT: li a3, 4 8133; RV64I-NEXT: li a4, 2 8134; RV64I-NEXT: mv a0, s0 8135; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8136; RV64I-NEXT: lh a3, 14(sp) 8137; RV64I-NEXT: bnez a0, .LBB98_4 8138; RV64I-NEXT: .LBB98_2: # %atomicrmw.start 8139; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8140; RV64I-NEXT: slli a0, a3, 48 8141; RV64I-NEXT: srai a0, a0, 48 8142; RV64I-NEXT: mv a2, a3 8143; RV64I-NEXT: bge s2, a0, .LBB98_1 8144; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8145; RV64I-NEXT: # in Loop: Header=BB98_2 Depth=1 8146; RV64I-NEXT: mv a2, s1 8147; RV64I-NEXT: j .LBB98_1 8148; RV64I-NEXT: .LBB98_4: # %atomicrmw.end 8149; RV64I-NEXT: mv a0, a3 8150; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8151; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8152; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8153; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8154; RV64I-NEXT: addi sp, sp, 48 8155; RV64I-NEXT: ret 8156; 8157; RV64IA-LABEL: atomicrmw_min_i16_acq_rel: 8158; RV64IA: # %bb.0: 8159; RV64IA-NEXT: andi a2, a0, -4 8160; RV64IA-NEXT: slliw a0, a0, 3 8161; RV64IA-NEXT: andi a3, a0, 24 8162; RV64IA-NEXT: lui a4, 16 8163; RV64IA-NEXT: addiw a4, a4, -1 8164; RV64IA-NEXT: sllw a4, a4, a0 8165; RV64IA-NEXT: slli a1, a1, 48 8166; RV64IA-NEXT: srai a1, a1, 48 8167; RV64IA-NEXT: sllw a1, a1, a0 8168; RV64IA-NEXT: li a5, 48 8169; RV64IA-NEXT: sub a3, a5, a3 8170; RV64IA-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 8171; RV64IA-NEXT: lr.w.aq a5, (a2) 8172; RV64IA-NEXT: and a7, a5, a4 8173; RV64IA-NEXT: mv a6, a5 8174; RV64IA-NEXT: sll a7, a7, a3 8175; RV64IA-NEXT: sra a7, a7, a3 8176; RV64IA-NEXT: bge a1, a7, .LBB98_3 8177; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB98_1 Depth=1 8178; RV64IA-NEXT: xor a6, a5, a1 8179; RV64IA-NEXT: and a6, a6, a4 8180; RV64IA-NEXT: xor a6, a5, a6 8181; RV64IA-NEXT: .LBB98_3: # in Loop: Header=BB98_1 Depth=1 8182; RV64IA-NEXT: sc.w.rl a6, a6, (a2) 8183; RV64IA-NEXT: bnez a6, .LBB98_1 8184; RV64IA-NEXT: # %bb.4: 8185; RV64IA-NEXT: srlw a0, a5, a0 8186; RV64IA-NEXT: ret 8187 %1 = atomicrmw min i16* %a, i16 %b acq_rel 8188 ret i16 %1 8189} 8190 8191define i16 @atomicrmw_min_i16_seq_cst(i16 *%a, i16 %b) nounwind { 8192; RV32I-LABEL: atomicrmw_min_i16_seq_cst: 8193; RV32I: # %bb.0: 8194; RV32I-NEXT: addi sp, sp, -32 8195; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8196; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8197; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8198; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8199; RV32I-NEXT: mv s0, a0 8200; RV32I-NEXT: lhu a3, 0(a0) 8201; RV32I-NEXT: mv s1, a1 8202; RV32I-NEXT: slli a0, a1, 16 8203; RV32I-NEXT: srai s2, a0, 16 8204; RV32I-NEXT: j .LBB99_2 8205; RV32I-NEXT: .LBB99_1: # %atomicrmw.start 8206; RV32I-NEXT: # in Loop: Header=BB99_2 Depth=1 8207; RV32I-NEXT: sh a3, 14(sp) 8208; RV32I-NEXT: addi a1, sp, 14 8209; RV32I-NEXT: li a3, 5 8210; RV32I-NEXT: li a4, 5 8211; RV32I-NEXT: mv a0, s0 8212; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8213; RV32I-NEXT: lh a3, 14(sp) 8214; RV32I-NEXT: bnez a0, .LBB99_4 8215; RV32I-NEXT: .LBB99_2: # %atomicrmw.start 8216; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8217; RV32I-NEXT: slli a0, a3, 16 8218; RV32I-NEXT: srai a0, a0, 16 8219; RV32I-NEXT: mv a2, a3 8220; RV32I-NEXT: bge s2, a0, .LBB99_1 8221; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8222; RV32I-NEXT: # in Loop: Header=BB99_2 Depth=1 8223; RV32I-NEXT: mv a2, s1 8224; RV32I-NEXT: j .LBB99_1 8225; RV32I-NEXT: .LBB99_4: # %atomicrmw.end 8226; RV32I-NEXT: mv a0, a3 8227; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8228; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8229; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8230; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8231; RV32I-NEXT: addi sp, sp, 32 8232; RV32I-NEXT: ret 8233; 8234; RV32IA-LABEL: atomicrmw_min_i16_seq_cst: 8235; RV32IA: # %bb.0: 8236; RV32IA-NEXT: andi a2, a0, -4 8237; RV32IA-NEXT: slli a0, a0, 3 8238; RV32IA-NEXT: andi a3, a0, 24 8239; RV32IA-NEXT: lui a4, 16 8240; RV32IA-NEXT: addi a4, a4, -1 8241; RV32IA-NEXT: sll a4, a4, a0 8242; RV32IA-NEXT: slli a1, a1, 16 8243; RV32IA-NEXT: srai a1, a1, 16 8244; RV32IA-NEXT: sll a1, a1, a0 8245; RV32IA-NEXT: li a5, 16 8246; RV32IA-NEXT: sub a3, a5, a3 8247; RV32IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 8248; RV32IA-NEXT: lr.w.aqrl a5, (a2) 8249; RV32IA-NEXT: and a7, a5, a4 8250; RV32IA-NEXT: mv a6, a5 8251; RV32IA-NEXT: sll a7, a7, a3 8252; RV32IA-NEXT: sra a7, a7, a3 8253; RV32IA-NEXT: bge a1, a7, .LBB99_3 8254; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB99_1 Depth=1 8255; RV32IA-NEXT: xor a6, a5, a1 8256; RV32IA-NEXT: and a6, a6, a4 8257; RV32IA-NEXT: xor a6, a5, a6 8258; RV32IA-NEXT: .LBB99_3: # in Loop: Header=BB99_1 Depth=1 8259; RV32IA-NEXT: sc.w.aqrl a6, a6, (a2) 8260; RV32IA-NEXT: bnez a6, .LBB99_1 8261; RV32IA-NEXT: # %bb.4: 8262; RV32IA-NEXT: srl a0, a5, a0 8263; RV32IA-NEXT: ret 8264; 8265; RV64I-LABEL: atomicrmw_min_i16_seq_cst: 8266; RV64I: # %bb.0: 8267; RV64I-NEXT: addi sp, sp, -48 8268; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8269; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8270; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8271; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8272; RV64I-NEXT: mv s0, a0 8273; RV64I-NEXT: lhu a3, 0(a0) 8274; RV64I-NEXT: mv s1, a1 8275; RV64I-NEXT: slli a0, a1, 48 8276; RV64I-NEXT: srai s2, a0, 48 8277; RV64I-NEXT: j .LBB99_2 8278; RV64I-NEXT: .LBB99_1: # %atomicrmw.start 8279; RV64I-NEXT: # in Loop: Header=BB99_2 Depth=1 8280; RV64I-NEXT: sh a3, 14(sp) 8281; RV64I-NEXT: addi a1, sp, 14 8282; RV64I-NEXT: li a3, 5 8283; RV64I-NEXT: li a4, 5 8284; RV64I-NEXT: mv a0, s0 8285; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8286; RV64I-NEXT: lh a3, 14(sp) 8287; RV64I-NEXT: bnez a0, .LBB99_4 8288; RV64I-NEXT: .LBB99_2: # %atomicrmw.start 8289; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8290; RV64I-NEXT: slli a0, a3, 48 8291; RV64I-NEXT: srai a0, a0, 48 8292; RV64I-NEXT: mv a2, a3 8293; RV64I-NEXT: bge s2, a0, .LBB99_1 8294; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8295; RV64I-NEXT: # in Loop: Header=BB99_2 Depth=1 8296; RV64I-NEXT: mv a2, s1 8297; RV64I-NEXT: j .LBB99_1 8298; RV64I-NEXT: .LBB99_4: # %atomicrmw.end 8299; RV64I-NEXT: mv a0, a3 8300; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8301; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8302; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8303; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8304; RV64I-NEXT: addi sp, sp, 48 8305; RV64I-NEXT: ret 8306; 8307; RV64IA-LABEL: atomicrmw_min_i16_seq_cst: 8308; RV64IA: # %bb.0: 8309; RV64IA-NEXT: andi a2, a0, -4 8310; RV64IA-NEXT: slliw a0, a0, 3 8311; RV64IA-NEXT: andi a3, a0, 24 8312; RV64IA-NEXT: lui a4, 16 8313; RV64IA-NEXT: addiw a4, a4, -1 8314; RV64IA-NEXT: sllw a4, a4, a0 8315; RV64IA-NEXT: slli a1, a1, 48 8316; RV64IA-NEXT: srai a1, a1, 48 8317; RV64IA-NEXT: sllw a1, a1, a0 8318; RV64IA-NEXT: li a5, 48 8319; RV64IA-NEXT: sub a3, a5, a3 8320; RV64IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 8321; RV64IA-NEXT: lr.w.aqrl a5, (a2) 8322; RV64IA-NEXT: and a7, a5, a4 8323; RV64IA-NEXT: mv a6, a5 8324; RV64IA-NEXT: sll a7, a7, a3 8325; RV64IA-NEXT: sra a7, a7, a3 8326; RV64IA-NEXT: bge a1, a7, .LBB99_3 8327; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB99_1 Depth=1 8328; RV64IA-NEXT: xor a6, a5, a1 8329; RV64IA-NEXT: and a6, a6, a4 8330; RV64IA-NEXT: xor a6, a5, a6 8331; RV64IA-NEXT: .LBB99_3: # in Loop: Header=BB99_1 Depth=1 8332; RV64IA-NEXT: sc.w.aqrl a6, a6, (a2) 8333; RV64IA-NEXT: bnez a6, .LBB99_1 8334; RV64IA-NEXT: # %bb.4: 8335; RV64IA-NEXT: srlw a0, a5, a0 8336; RV64IA-NEXT: ret 8337 %1 = atomicrmw min i16* %a, i16 %b seq_cst 8338 ret i16 %1 8339} 8340 8341define i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind { 8342; RV32I-LABEL: atomicrmw_umax_i16_monotonic: 8343; RV32I: # %bb.0: 8344; RV32I-NEXT: addi sp, sp, -32 8345; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8346; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8347; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8348; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8349; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8350; RV32I-NEXT: mv s0, a1 8351; RV32I-NEXT: mv s1, a0 8352; RV32I-NEXT: lhu a1, 0(a0) 8353; RV32I-NEXT: lui a0, 16 8354; RV32I-NEXT: addi s2, a0, -1 8355; RV32I-NEXT: and s3, s0, s2 8356; RV32I-NEXT: j .LBB100_2 8357; RV32I-NEXT: .LBB100_1: # %atomicrmw.start 8358; RV32I-NEXT: # in Loop: Header=BB100_2 Depth=1 8359; RV32I-NEXT: sh a1, 10(sp) 8360; RV32I-NEXT: addi a1, sp, 10 8361; RV32I-NEXT: mv a0, s1 8362; RV32I-NEXT: li a3, 0 8363; RV32I-NEXT: li a4, 0 8364; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8365; RV32I-NEXT: lh a1, 10(sp) 8366; RV32I-NEXT: bnez a0, .LBB100_4 8367; RV32I-NEXT: .LBB100_2: # %atomicrmw.start 8368; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8369; RV32I-NEXT: and a0, a1, s2 8370; RV32I-NEXT: mv a2, a1 8371; RV32I-NEXT: bltu s3, a0, .LBB100_1 8372; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8373; RV32I-NEXT: # in Loop: Header=BB100_2 Depth=1 8374; RV32I-NEXT: mv a2, s0 8375; RV32I-NEXT: j .LBB100_1 8376; RV32I-NEXT: .LBB100_4: # %atomicrmw.end 8377; RV32I-NEXT: mv a0, a1 8378; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8379; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8380; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8381; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8382; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8383; RV32I-NEXT: addi sp, sp, 32 8384; RV32I-NEXT: ret 8385; 8386; RV32IA-LABEL: atomicrmw_umax_i16_monotonic: 8387; RV32IA: # %bb.0: 8388; RV32IA-NEXT: andi a2, a0, -4 8389; RV32IA-NEXT: slli a0, a0, 3 8390; RV32IA-NEXT: lui a3, 16 8391; RV32IA-NEXT: addi a3, a3, -1 8392; RV32IA-NEXT: sll a4, a3, a0 8393; RV32IA-NEXT: and a1, a1, a3 8394; RV32IA-NEXT: sll a1, a1, a0 8395; RV32IA-NEXT: .LBB100_1: # =>This Inner Loop Header: Depth=1 8396; RV32IA-NEXT: lr.w a3, (a2) 8397; RV32IA-NEXT: and a6, a3, a4 8398; RV32IA-NEXT: mv a5, a3 8399; RV32IA-NEXT: bgeu a6, a1, .LBB100_3 8400; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB100_1 Depth=1 8401; RV32IA-NEXT: xor a5, a3, a1 8402; RV32IA-NEXT: and a5, a5, a4 8403; RV32IA-NEXT: xor a5, a3, a5 8404; RV32IA-NEXT: .LBB100_3: # in Loop: Header=BB100_1 Depth=1 8405; RV32IA-NEXT: sc.w a5, a5, (a2) 8406; RV32IA-NEXT: bnez a5, .LBB100_1 8407; RV32IA-NEXT: # %bb.4: 8408; RV32IA-NEXT: srl a0, a3, a0 8409; RV32IA-NEXT: ret 8410; 8411; RV64I-LABEL: atomicrmw_umax_i16_monotonic: 8412; RV64I: # %bb.0: 8413; RV64I-NEXT: addi sp, sp, -48 8414; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8415; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8416; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8417; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8418; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8419; RV64I-NEXT: mv s0, a1 8420; RV64I-NEXT: mv s1, a0 8421; RV64I-NEXT: lhu a1, 0(a0) 8422; RV64I-NEXT: lui a0, 16 8423; RV64I-NEXT: addiw s2, a0, -1 8424; RV64I-NEXT: and s3, s0, s2 8425; RV64I-NEXT: j .LBB100_2 8426; RV64I-NEXT: .LBB100_1: # %atomicrmw.start 8427; RV64I-NEXT: # in Loop: Header=BB100_2 Depth=1 8428; RV64I-NEXT: sh a1, 6(sp) 8429; RV64I-NEXT: addi a1, sp, 6 8430; RV64I-NEXT: mv a0, s1 8431; RV64I-NEXT: li a3, 0 8432; RV64I-NEXT: li a4, 0 8433; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8434; RV64I-NEXT: lh a1, 6(sp) 8435; RV64I-NEXT: bnez a0, .LBB100_4 8436; RV64I-NEXT: .LBB100_2: # %atomicrmw.start 8437; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8438; RV64I-NEXT: and a0, a1, s2 8439; RV64I-NEXT: mv a2, a1 8440; RV64I-NEXT: bltu s3, a0, .LBB100_1 8441; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8442; RV64I-NEXT: # in Loop: Header=BB100_2 Depth=1 8443; RV64I-NEXT: mv a2, s0 8444; RV64I-NEXT: j .LBB100_1 8445; RV64I-NEXT: .LBB100_4: # %atomicrmw.end 8446; RV64I-NEXT: mv a0, a1 8447; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8448; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8449; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8450; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8451; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8452; RV64I-NEXT: addi sp, sp, 48 8453; RV64I-NEXT: ret 8454; 8455; RV64IA-LABEL: atomicrmw_umax_i16_monotonic: 8456; RV64IA: # %bb.0: 8457; RV64IA-NEXT: andi a2, a0, -4 8458; RV64IA-NEXT: slliw a0, a0, 3 8459; RV64IA-NEXT: lui a3, 16 8460; RV64IA-NEXT: addiw a3, a3, -1 8461; RV64IA-NEXT: sllw a4, a3, a0 8462; RV64IA-NEXT: and a1, a1, a3 8463; RV64IA-NEXT: sllw a1, a1, a0 8464; RV64IA-NEXT: .LBB100_1: # =>This Inner Loop Header: Depth=1 8465; RV64IA-NEXT: lr.w a3, (a2) 8466; RV64IA-NEXT: and a6, a3, a4 8467; RV64IA-NEXT: mv a5, a3 8468; RV64IA-NEXT: bgeu a6, a1, .LBB100_3 8469; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB100_1 Depth=1 8470; RV64IA-NEXT: xor a5, a3, a1 8471; RV64IA-NEXT: and a5, a5, a4 8472; RV64IA-NEXT: xor a5, a3, a5 8473; RV64IA-NEXT: .LBB100_3: # in Loop: Header=BB100_1 Depth=1 8474; RV64IA-NEXT: sc.w a5, a5, (a2) 8475; RV64IA-NEXT: bnez a5, .LBB100_1 8476; RV64IA-NEXT: # %bb.4: 8477; RV64IA-NEXT: srlw a0, a3, a0 8478; RV64IA-NEXT: ret 8479 %1 = atomicrmw umax i16* %a, i16 %b monotonic 8480 ret i16 %1 8481} 8482 8483define i16 @atomicrmw_umax_i16_acquire(i16 *%a, i16 %b) nounwind { 8484; RV32I-LABEL: atomicrmw_umax_i16_acquire: 8485; RV32I: # %bb.0: 8486; RV32I-NEXT: addi sp, sp, -32 8487; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8488; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8489; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8490; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8491; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8492; RV32I-NEXT: mv s0, a1 8493; RV32I-NEXT: mv s1, a0 8494; RV32I-NEXT: lhu a1, 0(a0) 8495; RV32I-NEXT: lui a0, 16 8496; RV32I-NEXT: addi s2, a0, -1 8497; RV32I-NEXT: and s3, s0, s2 8498; RV32I-NEXT: j .LBB101_2 8499; RV32I-NEXT: .LBB101_1: # %atomicrmw.start 8500; RV32I-NEXT: # in Loop: Header=BB101_2 Depth=1 8501; RV32I-NEXT: sh a1, 10(sp) 8502; RV32I-NEXT: addi a1, sp, 10 8503; RV32I-NEXT: li a3, 2 8504; RV32I-NEXT: li a4, 2 8505; RV32I-NEXT: mv a0, s1 8506; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8507; RV32I-NEXT: lh a1, 10(sp) 8508; RV32I-NEXT: bnez a0, .LBB101_4 8509; RV32I-NEXT: .LBB101_2: # %atomicrmw.start 8510; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8511; RV32I-NEXT: and a0, a1, s2 8512; RV32I-NEXT: mv a2, a1 8513; RV32I-NEXT: bltu s3, a0, .LBB101_1 8514; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8515; RV32I-NEXT: # in Loop: Header=BB101_2 Depth=1 8516; RV32I-NEXT: mv a2, s0 8517; RV32I-NEXT: j .LBB101_1 8518; RV32I-NEXT: .LBB101_4: # %atomicrmw.end 8519; RV32I-NEXT: mv a0, a1 8520; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8521; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8522; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8523; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8524; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8525; RV32I-NEXT: addi sp, sp, 32 8526; RV32I-NEXT: ret 8527; 8528; RV32IA-LABEL: atomicrmw_umax_i16_acquire: 8529; RV32IA: # %bb.0: 8530; RV32IA-NEXT: andi a2, a0, -4 8531; RV32IA-NEXT: slli a0, a0, 3 8532; RV32IA-NEXT: lui a3, 16 8533; RV32IA-NEXT: addi a3, a3, -1 8534; RV32IA-NEXT: sll a4, a3, a0 8535; RV32IA-NEXT: and a1, a1, a3 8536; RV32IA-NEXT: sll a1, a1, a0 8537; RV32IA-NEXT: .LBB101_1: # =>This Inner Loop Header: Depth=1 8538; RV32IA-NEXT: lr.w.aq a3, (a2) 8539; RV32IA-NEXT: and a6, a3, a4 8540; RV32IA-NEXT: mv a5, a3 8541; RV32IA-NEXT: bgeu a6, a1, .LBB101_3 8542; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB101_1 Depth=1 8543; RV32IA-NEXT: xor a5, a3, a1 8544; RV32IA-NEXT: and a5, a5, a4 8545; RV32IA-NEXT: xor a5, a3, a5 8546; RV32IA-NEXT: .LBB101_3: # in Loop: Header=BB101_1 Depth=1 8547; RV32IA-NEXT: sc.w a5, a5, (a2) 8548; RV32IA-NEXT: bnez a5, .LBB101_1 8549; RV32IA-NEXT: # %bb.4: 8550; RV32IA-NEXT: srl a0, a3, a0 8551; RV32IA-NEXT: ret 8552; 8553; RV64I-LABEL: atomicrmw_umax_i16_acquire: 8554; RV64I: # %bb.0: 8555; RV64I-NEXT: addi sp, sp, -48 8556; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8557; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8558; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8559; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8560; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8561; RV64I-NEXT: mv s0, a1 8562; RV64I-NEXT: mv s1, a0 8563; RV64I-NEXT: lhu a1, 0(a0) 8564; RV64I-NEXT: lui a0, 16 8565; RV64I-NEXT: addiw s2, a0, -1 8566; RV64I-NEXT: and s3, s0, s2 8567; RV64I-NEXT: j .LBB101_2 8568; RV64I-NEXT: .LBB101_1: # %atomicrmw.start 8569; RV64I-NEXT: # in Loop: Header=BB101_2 Depth=1 8570; RV64I-NEXT: sh a1, 6(sp) 8571; RV64I-NEXT: addi a1, sp, 6 8572; RV64I-NEXT: li a3, 2 8573; RV64I-NEXT: li a4, 2 8574; RV64I-NEXT: mv a0, s1 8575; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8576; RV64I-NEXT: lh a1, 6(sp) 8577; RV64I-NEXT: bnez a0, .LBB101_4 8578; RV64I-NEXT: .LBB101_2: # %atomicrmw.start 8579; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8580; RV64I-NEXT: and a0, a1, s2 8581; RV64I-NEXT: mv a2, a1 8582; RV64I-NEXT: bltu s3, a0, .LBB101_1 8583; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8584; RV64I-NEXT: # in Loop: Header=BB101_2 Depth=1 8585; RV64I-NEXT: mv a2, s0 8586; RV64I-NEXT: j .LBB101_1 8587; RV64I-NEXT: .LBB101_4: # %atomicrmw.end 8588; RV64I-NEXT: mv a0, a1 8589; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8590; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8591; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8592; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8593; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8594; RV64I-NEXT: addi sp, sp, 48 8595; RV64I-NEXT: ret 8596; 8597; RV64IA-LABEL: atomicrmw_umax_i16_acquire: 8598; RV64IA: # %bb.0: 8599; RV64IA-NEXT: andi a2, a0, -4 8600; RV64IA-NEXT: slliw a0, a0, 3 8601; RV64IA-NEXT: lui a3, 16 8602; RV64IA-NEXT: addiw a3, a3, -1 8603; RV64IA-NEXT: sllw a4, a3, a0 8604; RV64IA-NEXT: and a1, a1, a3 8605; RV64IA-NEXT: sllw a1, a1, a0 8606; RV64IA-NEXT: .LBB101_1: # =>This Inner Loop Header: Depth=1 8607; RV64IA-NEXT: lr.w.aq a3, (a2) 8608; RV64IA-NEXT: and a6, a3, a4 8609; RV64IA-NEXT: mv a5, a3 8610; RV64IA-NEXT: bgeu a6, a1, .LBB101_3 8611; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB101_1 Depth=1 8612; RV64IA-NEXT: xor a5, a3, a1 8613; RV64IA-NEXT: and a5, a5, a4 8614; RV64IA-NEXT: xor a5, a3, a5 8615; RV64IA-NEXT: .LBB101_3: # in Loop: Header=BB101_1 Depth=1 8616; RV64IA-NEXT: sc.w a5, a5, (a2) 8617; RV64IA-NEXT: bnez a5, .LBB101_1 8618; RV64IA-NEXT: # %bb.4: 8619; RV64IA-NEXT: srlw a0, a3, a0 8620; RV64IA-NEXT: ret 8621 %1 = atomicrmw umax i16* %a, i16 %b acquire 8622 ret i16 %1 8623} 8624 8625define i16 @atomicrmw_umax_i16_release(i16 *%a, i16 %b) nounwind { 8626; RV32I-LABEL: atomicrmw_umax_i16_release: 8627; RV32I: # %bb.0: 8628; RV32I-NEXT: addi sp, sp, -32 8629; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8630; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8631; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8632; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8633; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8634; RV32I-NEXT: mv s0, a1 8635; RV32I-NEXT: mv s1, a0 8636; RV32I-NEXT: lhu a1, 0(a0) 8637; RV32I-NEXT: lui a0, 16 8638; RV32I-NEXT: addi s2, a0, -1 8639; RV32I-NEXT: and s3, s0, s2 8640; RV32I-NEXT: j .LBB102_2 8641; RV32I-NEXT: .LBB102_1: # %atomicrmw.start 8642; RV32I-NEXT: # in Loop: Header=BB102_2 Depth=1 8643; RV32I-NEXT: sh a1, 10(sp) 8644; RV32I-NEXT: addi a1, sp, 10 8645; RV32I-NEXT: li a3, 3 8646; RV32I-NEXT: mv a0, s1 8647; RV32I-NEXT: li a4, 0 8648; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8649; RV32I-NEXT: lh a1, 10(sp) 8650; RV32I-NEXT: bnez a0, .LBB102_4 8651; RV32I-NEXT: .LBB102_2: # %atomicrmw.start 8652; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8653; RV32I-NEXT: and a0, a1, s2 8654; RV32I-NEXT: mv a2, a1 8655; RV32I-NEXT: bltu s3, a0, .LBB102_1 8656; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8657; RV32I-NEXT: # in Loop: Header=BB102_2 Depth=1 8658; RV32I-NEXT: mv a2, s0 8659; RV32I-NEXT: j .LBB102_1 8660; RV32I-NEXT: .LBB102_4: # %atomicrmw.end 8661; RV32I-NEXT: mv a0, a1 8662; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8663; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8664; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8665; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8666; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8667; RV32I-NEXT: addi sp, sp, 32 8668; RV32I-NEXT: ret 8669; 8670; RV32IA-LABEL: atomicrmw_umax_i16_release: 8671; RV32IA: # %bb.0: 8672; RV32IA-NEXT: andi a2, a0, -4 8673; RV32IA-NEXT: slli a0, a0, 3 8674; RV32IA-NEXT: lui a3, 16 8675; RV32IA-NEXT: addi a3, a3, -1 8676; RV32IA-NEXT: sll a4, a3, a0 8677; RV32IA-NEXT: and a1, a1, a3 8678; RV32IA-NEXT: sll a1, a1, a0 8679; RV32IA-NEXT: .LBB102_1: # =>This Inner Loop Header: Depth=1 8680; RV32IA-NEXT: lr.w a3, (a2) 8681; RV32IA-NEXT: and a6, a3, a4 8682; RV32IA-NEXT: mv a5, a3 8683; RV32IA-NEXT: bgeu a6, a1, .LBB102_3 8684; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB102_1 Depth=1 8685; RV32IA-NEXT: xor a5, a3, a1 8686; RV32IA-NEXT: and a5, a5, a4 8687; RV32IA-NEXT: xor a5, a3, a5 8688; RV32IA-NEXT: .LBB102_3: # in Loop: Header=BB102_1 Depth=1 8689; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 8690; RV32IA-NEXT: bnez a5, .LBB102_1 8691; RV32IA-NEXT: # %bb.4: 8692; RV32IA-NEXT: srl a0, a3, a0 8693; RV32IA-NEXT: ret 8694; 8695; RV64I-LABEL: atomicrmw_umax_i16_release: 8696; RV64I: # %bb.0: 8697; RV64I-NEXT: addi sp, sp, -48 8698; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8699; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8700; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8701; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8702; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8703; RV64I-NEXT: mv s0, a1 8704; RV64I-NEXT: mv s1, a0 8705; RV64I-NEXT: lhu a1, 0(a0) 8706; RV64I-NEXT: lui a0, 16 8707; RV64I-NEXT: addiw s2, a0, -1 8708; RV64I-NEXT: and s3, s0, s2 8709; RV64I-NEXT: j .LBB102_2 8710; RV64I-NEXT: .LBB102_1: # %atomicrmw.start 8711; RV64I-NEXT: # in Loop: Header=BB102_2 Depth=1 8712; RV64I-NEXT: sh a1, 6(sp) 8713; RV64I-NEXT: addi a1, sp, 6 8714; RV64I-NEXT: li a3, 3 8715; RV64I-NEXT: mv a0, s1 8716; RV64I-NEXT: li a4, 0 8717; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8718; RV64I-NEXT: lh a1, 6(sp) 8719; RV64I-NEXT: bnez a0, .LBB102_4 8720; RV64I-NEXT: .LBB102_2: # %atomicrmw.start 8721; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8722; RV64I-NEXT: and a0, a1, s2 8723; RV64I-NEXT: mv a2, a1 8724; RV64I-NEXT: bltu s3, a0, .LBB102_1 8725; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8726; RV64I-NEXT: # in Loop: Header=BB102_2 Depth=1 8727; RV64I-NEXT: mv a2, s0 8728; RV64I-NEXT: j .LBB102_1 8729; RV64I-NEXT: .LBB102_4: # %atomicrmw.end 8730; RV64I-NEXT: mv a0, a1 8731; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8732; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8733; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8734; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8735; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8736; RV64I-NEXT: addi sp, sp, 48 8737; RV64I-NEXT: ret 8738; 8739; RV64IA-LABEL: atomicrmw_umax_i16_release: 8740; RV64IA: # %bb.0: 8741; RV64IA-NEXT: andi a2, a0, -4 8742; RV64IA-NEXT: slliw a0, a0, 3 8743; RV64IA-NEXT: lui a3, 16 8744; RV64IA-NEXT: addiw a3, a3, -1 8745; RV64IA-NEXT: sllw a4, a3, a0 8746; RV64IA-NEXT: and a1, a1, a3 8747; RV64IA-NEXT: sllw a1, a1, a0 8748; RV64IA-NEXT: .LBB102_1: # =>This Inner Loop Header: Depth=1 8749; RV64IA-NEXT: lr.w a3, (a2) 8750; RV64IA-NEXT: and a6, a3, a4 8751; RV64IA-NEXT: mv a5, a3 8752; RV64IA-NEXT: bgeu a6, a1, .LBB102_3 8753; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB102_1 Depth=1 8754; RV64IA-NEXT: xor a5, a3, a1 8755; RV64IA-NEXT: and a5, a5, a4 8756; RV64IA-NEXT: xor a5, a3, a5 8757; RV64IA-NEXT: .LBB102_3: # in Loop: Header=BB102_1 Depth=1 8758; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 8759; RV64IA-NEXT: bnez a5, .LBB102_1 8760; RV64IA-NEXT: # %bb.4: 8761; RV64IA-NEXT: srlw a0, a3, a0 8762; RV64IA-NEXT: ret 8763 %1 = atomicrmw umax i16* %a, i16 %b release 8764 ret i16 %1 8765} 8766 8767define i16 @atomicrmw_umax_i16_acq_rel(i16 *%a, i16 %b) nounwind { 8768; RV32I-LABEL: atomicrmw_umax_i16_acq_rel: 8769; RV32I: # %bb.0: 8770; RV32I-NEXT: addi sp, sp, -32 8771; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8772; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8773; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8774; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8775; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8776; RV32I-NEXT: mv s0, a1 8777; RV32I-NEXT: mv s1, a0 8778; RV32I-NEXT: lhu a1, 0(a0) 8779; RV32I-NEXT: lui a0, 16 8780; RV32I-NEXT: addi s2, a0, -1 8781; RV32I-NEXT: and s3, s0, s2 8782; RV32I-NEXT: j .LBB103_2 8783; RV32I-NEXT: .LBB103_1: # %atomicrmw.start 8784; RV32I-NEXT: # in Loop: Header=BB103_2 Depth=1 8785; RV32I-NEXT: sh a1, 10(sp) 8786; RV32I-NEXT: addi a1, sp, 10 8787; RV32I-NEXT: li a3, 4 8788; RV32I-NEXT: li a4, 2 8789; RV32I-NEXT: mv a0, s1 8790; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8791; RV32I-NEXT: lh a1, 10(sp) 8792; RV32I-NEXT: bnez a0, .LBB103_4 8793; RV32I-NEXT: .LBB103_2: # %atomicrmw.start 8794; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8795; RV32I-NEXT: and a0, a1, s2 8796; RV32I-NEXT: mv a2, a1 8797; RV32I-NEXT: bltu s3, a0, .LBB103_1 8798; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8799; RV32I-NEXT: # in Loop: Header=BB103_2 Depth=1 8800; RV32I-NEXT: mv a2, s0 8801; RV32I-NEXT: j .LBB103_1 8802; RV32I-NEXT: .LBB103_4: # %atomicrmw.end 8803; RV32I-NEXT: mv a0, a1 8804; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8805; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8806; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8807; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8808; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8809; RV32I-NEXT: addi sp, sp, 32 8810; RV32I-NEXT: ret 8811; 8812; RV32IA-LABEL: atomicrmw_umax_i16_acq_rel: 8813; RV32IA: # %bb.0: 8814; RV32IA-NEXT: andi a2, a0, -4 8815; RV32IA-NEXT: slli a0, a0, 3 8816; RV32IA-NEXT: lui a3, 16 8817; RV32IA-NEXT: addi a3, a3, -1 8818; RV32IA-NEXT: sll a4, a3, a0 8819; RV32IA-NEXT: and a1, a1, a3 8820; RV32IA-NEXT: sll a1, a1, a0 8821; RV32IA-NEXT: .LBB103_1: # =>This Inner Loop Header: Depth=1 8822; RV32IA-NEXT: lr.w.aq a3, (a2) 8823; RV32IA-NEXT: and a6, a3, a4 8824; RV32IA-NEXT: mv a5, a3 8825; RV32IA-NEXT: bgeu a6, a1, .LBB103_3 8826; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB103_1 Depth=1 8827; RV32IA-NEXT: xor a5, a3, a1 8828; RV32IA-NEXT: and a5, a5, a4 8829; RV32IA-NEXT: xor a5, a3, a5 8830; RV32IA-NEXT: .LBB103_3: # in Loop: Header=BB103_1 Depth=1 8831; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 8832; RV32IA-NEXT: bnez a5, .LBB103_1 8833; RV32IA-NEXT: # %bb.4: 8834; RV32IA-NEXT: srl a0, a3, a0 8835; RV32IA-NEXT: ret 8836; 8837; RV64I-LABEL: atomicrmw_umax_i16_acq_rel: 8838; RV64I: # %bb.0: 8839; RV64I-NEXT: addi sp, sp, -48 8840; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8841; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8842; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8843; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8844; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8845; RV64I-NEXT: mv s0, a1 8846; RV64I-NEXT: mv s1, a0 8847; RV64I-NEXT: lhu a1, 0(a0) 8848; RV64I-NEXT: lui a0, 16 8849; RV64I-NEXT: addiw s2, a0, -1 8850; RV64I-NEXT: and s3, s0, s2 8851; RV64I-NEXT: j .LBB103_2 8852; RV64I-NEXT: .LBB103_1: # %atomicrmw.start 8853; RV64I-NEXT: # in Loop: Header=BB103_2 Depth=1 8854; RV64I-NEXT: sh a1, 6(sp) 8855; RV64I-NEXT: addi a1, sp, 6 8856; RV64I-NEXT: li a3, 4 8857; RV64I-NEXT: li a4, 2 8858; RV64I-NEXT: mv a0, s1 8859; RV64I-NEXT: call __atomic_compare_exchange_2@plt 8860; RV64I-NEXT: lh a1, 6(sp) 8861; RV64I-NEXT: bnez a0, .LBB103_4 8862; RV64I-NEXT: .LBB103_2: # %atomicrmw.start 8863; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8864; RV64I-NEXT: and a0, a1, s2 8865; RV64I-NEXT: mv a2, a1 8866; RV64I-NEXT: bltu s3, a0, .LBB103_1 8867; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8868; RV64I-NEXT: # in Loop: Header=BB103_2 Depth=1 8869; RV64I-NEXT: mv a2, s0 8870; RV64I-NEXT: j .LBB103_1 8871; RV64I-NEXT: .LBB103_4: # %atomicrmw.end 8872; RV64I-NEXT: mv a0, a1 8873; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8874; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8875; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8876; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8877; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 8878; RV64I-NEXT: addi sp, sp, 48 8879; RV64I-NEXT: ret 8880; 8881; RV64IA-LABEL: atomicrmw_umax_i16_acq_rel: 8882; RV64IA: # %bb.0: 8883; RV64IA-NEXT: andi a2, a0, -4 8884; RV64IA-NEXT: slliw a0, a0, 3 8885; RV64IA-NEXT: lui a3, 16 8886; RV64IA-NEXT: addiw a3, a3, -1 8887; RV64IA-NEXT: sllw a4, a3, a0 8888; RV64IA-NEXT: and a1, a1, a3 8889; RV64IA-NEXT: sllw a1, a1, a0 8890; RV64IA-NEXT: .LBB103_1: # =>This Inner Loop Header: Depth=1 8891; RV64IA-NEXT: lr.w.aq a3, (a2) 8892; RV64IA-NEXT: and a6, a3, a4 8893; RV64IA-NEXT: mv a5, a3 8894; RV64IA-NEXT: bgeu a6, a1, .LBB103_3 8895; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB103_1 Depth=1 8896; RV64IA-NEXT: xor a5, a3, a1 8897; RV64IA-NEXT: and a5, a5, a4 8898; RV64IA-NEXT: xor a5, a3, a5 8899; RV64IA-NEXT: .LBB103_3: # in Loop: Header=BB103_1 Depth=1 8900; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 8901; RV64IA-NEXT: bnez a5, .LBB103_1 8902; RV64IA-NEXT: # %bb.4: 8903; RV64IA-NEXT: srlw a0, a3, a0 8904; RV64IA-NEXT: ret 8905 %1 = atomicrmw umax i16* %a, i16 %b acq_rel 8906 ret i16 %1 8907} 8908 8909define i16 @atomicrmw_umax_i16_seq_cst(i16 *%a, i16 %b) nounwind { 8910; RV32I-LABEL: atomicrmw_umax_i16_seq_cst: 8911; RV32I: # %bb.0: 8912; RV32I-NEXT: addi sp, sp, -32 8913; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8914; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8915; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8916; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8917; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 8918; RV32I-NEXT: mv s0, a1 8919; RV32I-NEXT: mv s1, a0 8920; RV32I-NEXT: lhu a1, 0(a0) 8921; RV32I-NEXT: lui a0, 16 8922; RV32I-NEXT: addi s2, a0, -1 8923; RV32I-NEXT: and s3, s0, s2 8924; RV32I-NEXT: j .LBB104_2 8925; RV32I-NEXT: .LBB104_1: # %atomicrmw.start 8926; RV32I-NEXT: # in Loop: Header=BB104_2 Depth=1 8927; RV32I-NEXT: sh a1, 10(sp) 8928; RV32I-NEXT: addi a1, sp, 10 8929; RV32I-NEXT: li a3, 5 8930; RV32I-NEXT: li a4, 5 8931; RV32I-NEXT: mv a0, s1 8932; RV32I-NEXT: call __atomic_compare_exchange_2@plt 8933; RV32I-NEXT: lh a1, 10(sp) 8934; RV32I-NEXT: bnez a0, .LBB104_4 8935; RV32I-NEXT: .LBB104_2: # %atomicrmw.start 8936; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8937; RV32I-NEXT: and a0, a1, s2 8938; RV32I-NEXT: mv a2, a1 8939; RV32I-NEXT: bltu s3, a0, .LBB104_1 8940; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8941; RV32I-NEXT: # in Loop: Header=BB104_2 Depth=1 8942; RV32I-NEXT: mv a2, s0 8943; RV32I-NEXT: j .LBB104_1 8944; RV32I-NEXT: .LBB104_4: # %atomicrmw.end 8945; RV32I-NEXT: mv a0, a1 8946; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8947; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8948; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8949; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8950; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 8951; RV32I-NEXT: addi sp, sp, 32 8952; RV32I-NEXT: ret 8953; 8954; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst: 8955; RV32IA: # %bb.0: 8956; RV32IA-NEXT: andi a2, a0, -4 8957; RV32IA-NEXT: slli a0, a0, 3 8958; RV32IA-NEXT: lui a3, 16 8959; RV32IA-NEXT: addi a3, a3, -1 8960; RV32IA-NEXT: sll a4, a3, a0 8961; RV32IA-NEXT: and a1, a1, a3 8962; RV32IA-NEXT: sll a1, a1, a0 8963; RV32IA-NEXT: .LBB104_1: # =>This Inner Loop Header: Depth=1 8964; RV32IA-NEXT: lr.w.aqrl a3, (a2) 8965; RV32IA-NEXT: and a6, a3, a4 8966; RV32IA-NEXT: mv a5, a3 8967; RV32IA-NEXT: bgeu a6, a1, .LBB104_3 8968; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB104_1 Depth=1 8969; RV32IA-NEXT: xor a5, a3, a1 8970; RV32IA-NEXT: and a5, a5, a4 8971; RV32IA-NEXT: xor a5, a3, a5 8972; RV32IA-NEXT: .LBB104_3: # in Loop: Header=BB104_1 Depth=1 8973; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 8974; RV32IA-NEXT: bnez a5, .LBB104_1 8975; RV32IA-NEXT: # %bb.4: 8976; RV32IA-NEXT: srl a0, a3, a0 8977; RV32IA-NEXT: ret 8978; 8979; RV64I-LABEL: atomicrmw_umax_i16_seq_cst: 8980; RV64I: # %bb.0: 8981; RV64I-NEXT: addi sp, sp, -48 8982; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8983; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8984; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8985; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8986; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 8987; RV64I-NEXT: mv s0, a1 8988; RV64I-NEXT: mv s1, a0 8989; RV64I-NEXT: lhu a1, 0(a0) 8990; RV64I-NEXT: lui a0, 16 8991; RV64I-NEXT: addiw s2, a0, -1 8992; RV64I-NEXT: and s3, s0, s2 8993; RV64I-NEXT: j .LBB104_2 8994; RV64I-NEXT: .LBB104_1: # %atomicrmw.start 8995; RV64I-NEXT: # in Loop: Header=BB104_2 Depth=1 8996; RV64I-NEXT: sh a1, 6(sp) 8997; RV64I-NEXT: addi a1, sp, 6 8998; RV64I-NEXT: li a3, 5 8999; RV64I-NEXT: li a4, 5 9000; RV64I-NEXT: mv a0, s1 9001; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9002; RV64I-NEXT: lh a1, 6(sp) 9003; RV64I-NEXT: bnez a0, .LBB104_4 9004; RV64I-NEXT: .LBB104_2: # %atomicrmw.start 9005; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9006; RV64I-NEXT: and a0, a1, s2 9007; RV64I-NEXT: mv a2, a1 9008; RV64I-NEXT: bltu s3, a0, .LBB104_1 9009; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9010; RV64I-NEXT: # in Loop: Header=BB104_2 Depth=1 9011; RV64I-NEXT: mv a2, s0 9012; RV64I-NEXT: j .LBB104_1 9013; RV64I-NEXT: .LBB104_4: # %atomicrmw.end 9014; RV64I-NEXT: mv a0, a1 9015; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9016; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9017; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9018; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9019; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9020; RV64I-NEXT: addi sp, sp, 48 9021; RV64I-NEXT: ret 9022; 9023; RV64IA-LABEL: atomicrmw_umax_i16_seq_cst: 9024; RV64IA: # %bb.0: 9025; RV64IA-NEXT: andi a2, a0, -4 9026; RV64IA-NEXT: slliw a0, a0, 3 9027; RV64IA-NEXT: lui a3, 16 9028; RV64IA-NEXT: addiw a3, a3, -1 9029; RV64IA-NEXT: sllw a4, a3, a0 9030; RV64IA-NEXT: and a1, a1, a3 9031; RV64IA-NEXT: sllw a1, a1, a0 9032; RV64IA-NEXT: .LBB104_1: # =>This Inner Loop Header: Depth=1 9033; RV64IA-NEXT: lr.w.aqrl a3, (a2) 9034; RV64IA-NEXT: and a6, a3, a4 9035; RV64IA-NEXT: mv a5, a3 9036; RV64IA-NEXT: bgeu a6, a1, .LBB104_3 9037; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB104_1 Depth=1 9038; RV64IA-NEXT: xor a5, a3, a1 9039; RV64IA-NEXT: and a5, a5, a4 9040; RV64IA-NEXT: xor a5, a3, a5 9041; RV64IA-NEXT: .LBB104_3: # in Loop: Header=BB104_1 Depth=1 9042; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 9043; RV64IA-NEXT: bnez a5, .LBB104_1 9044; RV64IA-NEXT: # %bb.4: 9045; RV64IA-NEXT: srlw a0, a3, a0 9046; RV64IA-NEXT: ret 9047 %1 = atomicrmw umax i16* %a, i16 %b seq_cst 9048 ret i16 %1 9049} 9050 9051define i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind { 9052; RV32I-LABEL: atomicrmw_umin_i16_monotonic: 9053; RV32I: # %bb.0: 9054; RV32I-NEXT: addi sp, sp, -32 9055; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9056; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9057; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9058; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9059; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9060; RV32I-NEXT: mv s0, a1 9061; RV32I-NEXT: mv s1, a0 9062; RV32I-NEXT: lhu a1, 0(a0) 9063; RV32I-NEXT: lui a0, 16 9064; RV32I-NEXT: addi s2, a0, -1 9065; RV32I-NEXT: and s3, s0, s2 9066; RV32I-NEXT: j .LBB105_2 9067; RV32I-NEXT: .LBB105_1: # %atomicrmw.start 9068; RV32I-NEXT: # in Loop: Header=BB105_2 Depth=1 9069; RV32I-NEXT: sh a1, 10(sp) 9070; RV32I-NEXT: addi a1, sp, 10 9071; RV32I-NEXT: mv a0, s1 9072; RV32I-NEXT: li a3, 0 9073; RV32I-NEXT: li a4, 0 9074; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9075; RV32I-NEXT: lh a1, 10(sp) 9076; RV32I-NEXT: bnez a0, .LBB105_4 9077; RV32I-NEXT: .LBB105_2: # %atomicrmw.start 9078; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9079; RV32I-NEXT: and a0, a1, s2 9080; RV32I-NEXT: mv a2, a1 9081; RV32I-NEXT: bgeu s3, a0, .LBB105_1 9082; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9083; RV32I-NEXT: # in Loop: Header=BB105_2 Depth=1 9084; RV32I-NEXT: mv a2, s0 9085; RV32I-NEXT: j .LBB105_1 9086; RV32I-NEXT: .LBB105_4: # %atomicrmw.end 9087; RV32I-NEXT: mv a0, a1 9088; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9089; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9090; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9091; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9092; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9093; RV32I-NEXT: addi sp, sp, 32 9094; RV32I-NEXT: ret 9095; 9096; RV32IA-LABEL: atomicrmw_umin_i16_monotonic: 9097; RV32IA: # %bb.0: 9098; RV32IA-NEXT: andi a2, a0, -4 9099; RV32IA-NEXT: slli a0, a0, 3 9100; RV32IA-NEXT: lui a3, 16 9101; RV32IA-NEXT: addi a3, a3, -1 9102; RV32IA-NEXT: sll a4, a3, a0 9103; RV32IA-NEXT: and a1, a1, a3 9104; RV32IA-NEXT: sll a1, a1, a0 9105; RV32IA-NEXT: .LBB105_1: # =>This Inner Loop Header: Depth=1 9106; RV32IA-NEXT: lr.w a3, (a2) 9107; RV32IA-NEXT: and a6, a3, a4 9108; RV32IA-NEXT: mv a5, a3 9109; RV32IA-NEXT: bgeu a1, a6, .LBB105_3 9110; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB105_1 Depth=1 9111; RV32IA-NEXT: xor a5, a3, a1 9112; RV32IA-NEXT: and a5, a5, a4 9113; RV32IA-NEXT: xor a5, a3, a5 9114; RV32IA-NEXT: .LBB105_3: # in Loop: Header=BB105_1 Depth=1 9115; RV32IA-NEXT: sc.w a5, a5, (a2) 9116; RV32IA-NEXT: bnez a5, .LBB105_1 9117; RV32IA-NEXT: # %bb.4: 9118; RV32IA-NEXT: srl a0, a3, a0 9119; RV32IA-NEXT: ret 9120; 9121; RV64I-LABEL: atomicrmw_umin_i16_monotonic: 9122; RV64I: # %bb.0: 9123; RV64I-NEXT: addi sp, sp, -48 9124; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9125; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9126; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9127; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9128; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9129; RV64I-NEXT: mv s0, a1 9130; RV64I-NEXT: mv s1, a0 9131; RV64I-NEXT: lhu a1, 0(a0) 9132; RV64I-NEXT: lui a0, 16 9133; RV64I-NEXT: addiw s2, a0, -1 9134; RV64I-NEXT: and s3, s0, s2 9135; RV64I-NEXT: j .LBB105_2 9136; RV64I-NEXT: .LBB105_1: # %atomicrmw.start 9137; RV64I-NEXT: # in Loop: Header=BB105_2 Depth=1 9138; RV64I-NEXT: sh a1, 6(sp) 9139; RV64I-NEXT: addi a1, sp, 6 9140; RV64I-NEXT: mv a0, s1 9141; RV64I-NEXT: li a3, 0 9142; RV64I-NEXT: li a4, 0 9143; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9144; RV64I-NEXT: lh a1, 6(sp) 9145; RV64I-NEXT: bnez a0, .LBB105_4 9146; RV64I-NEXT: .LBB105_2: # %atomicrmw.start 9147; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9148; RV64I-NEXT: and a0, a1, s2 9149; RV64I-NEXT: mv a2, a1 9150; RV64I-NEXT: bgeu s3, a0, .LBB105_1 9151; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9152; RV64I-NEXT: # in Loop: Header=BB105_2 Depth=1 9153; RV64I-NEXT: mv a2, s0 9154; RV64I-NEXT: j .LBB105_1 9155; RV64I-NEXT: .LBB105_4: # %atomicrmw.end 9156; RV64I-NEXT: mv a0, a1 9157; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9158; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9159; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9160; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9161; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9162; RV64I-NEXT: addi sp, sp, 48 9163; RV64I-NEXT: ret 9164; 9165; RV64IA-LABEL: atomicrmw_umin_i16_monotonic: 9166; RV64IA: # %bb.0: 9167; RV64IA-NEXT: andi a2, a0, -4 9168; RV64IA-NEXT: slliw a0, a0, 3 9169; RV64IA-NEXT: lui a3, 16 9170; RV64IA-NEXT: addiw a3, a3, -1 9171; RV64IA-NEXT: sllw a4, a3, a0 9172; RV64IA-NEXT: and a1, a1, a3 9173; RV64IA-NEXT: sllw a1, a1, a0 9174; RV64IA-NEXT: .LBB105_1: # =>This Inner Loop Header: Depth=1 9175; RV64IA-NEXT: lr.w a3, (a2) 9176; RV64IA-NEXT: and a6, a3, a4 9177; RV64IA-NEXT: mv a5, a3 9178; RV64IA-NEXT: bgeu a1, a6, .LBB105_3 9179; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB105_1 Depth=1 9180; RV64IA-NEXT: xor a5, a3, a1 9181; RV64IA-NEXT: and a5, a5, a4 9182; RV64IA-NEXT: xor a5, a3, a5 9183; RV64IA-NEXT: .LBB105_3: # in Loop: Header=BB105_1 Depth=1 9184; RV64IA-NEXT: sc.w a5, a5, (a2) 9185; RV64IA-NEXT: bnez a5, .LBB105_1 9186; RV64IA-NEXT: # %bb.4: 9187; RV64IA-NEXT: srlw a0, a3, a0 9188; RV64IA-NEXT: ret 9189 %1 = atomicrmw umin i16* %a, i16 %b monotonic 9190 ret i16 %1 9191} 9192 9193define i16 @atomicrmw_umin_i16_acquire(i16 *%a, i16 %b) nounwind { 9194; RV32I-LABEL: atomicrmw_umin_i16_acquire: 9195; RV32I: # %bb.0: 9196; RV32I-NEXT: addi sp, sp, -32 9197; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9198; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9199; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9200; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9201; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9202; RV32I-NEXT: mv s0, a1 9203; RV32I-NEXT: mv s1, a0 9204; RV32I-NEXT: lhu a1, 0(a0) 9205; RV32I-NEXT: lui a0, 16 9206; RV32I-NEXT: addi s2, a0, -1 9207; RV32I-NEXT: and s3, s0, s2 9208; RV32I-NEXT: j .LBB106_2 9209; RV32I-NEXT: .LBB106_1: # %atomicrmw.start 9210; RV32I-NEXT: # in Loop: Header=BB106_2 Depth=1 9211; RV32I-NEXT: sh a1, 10(sp) 9212; RV32I-NEXT: addi a1, sp, 10 9213; RV32I-NEXT: li a3, 2 9214; RV32I-NEXT: li a4, 2 9215; RV32I-NEXT: mv a0, s1 9216; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9217; RV32I-NEXT: lh a1, 10(sp) 9218; RV32I-NEXT: bnez a0, .LBB106_4 9219; RV32I-NEXT: .LBB106_2: # %atomicrmw.start 9220; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9221; RV32I-NEXT: and a0, a1, s2 9222; RV32I-NEXT: mv a2, a1 9223; RV32I-NEXT: bgeu s3, a0, .LBB106_1 9224; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9225; RV32I-NEXT: # in Loop: Header=BB106_2 Depth=1 9226; RV32I-NEXT: mv a2, s0 9227; RV32I-NEXT: j .LBB106_1 9228; RV32I-NEXT: .LBB106_4: # %atomicrmw.end 9229; RV32I-NEXT: mv a0, a1 9230; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9231; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9232; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9233; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9234; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9235; RV32I-NEXT: addi sp, sp, 32 9236; RV32I-NEXT: ret 9237; 9238; RV32IA-LABEL: atomicrmw_umin_i16_acquire: 9239; RV32IA: # %bb.0: 9240; RV32IA-NEXT: andi a2, a0, -4 9241; RV32IA-NEXT: slli a0, a0, 3 9242; RV32IA-NEXT: lui a3, 16 9243; RV32IA-NEXT: addi a3, a3, -1 9244; RV32IA-NEXT: sll a4, a3, a0 9245; RV32IA-NEXT: and a1, a1, a3 9246; RV32IA-NEXT: sll a1, a1, a0 9247; RV32IA-NEXT: .LBB106_1: # =>This Inner Loop Header: Depth=1 9248; RV32IA-NEXT: lr.w.aq a3, (a2) 9249; RV32IA-NEXT: and a6, a3, a4 9250; RV32IA-NEXT: mv a5, a3 9251; RV32IA-NEXT: bgeu a1, a6, .LBB106_3 9252; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB106_1 Depth=1 9253; RV32IA-NEXT: xor a5, a3, a1 9254; RV32IA-NEXT: and a5, a5, a4 9255; RV32IA-NEXT: xor a5, a3, a5 9256; RV32IA-NEXT: .LBB106_3: # in Loop: Header=BB106_1 Depth=1 9257; RV32IA-NEXT: sc.w a5, a5, (a2) 9258; RV32IA-NEXT: bnez a5, .LBB106_1 9259; RV32IA-NEXT: # %bb.4: 9260; RV32IA-NEXT: srl a0, a3, a0 9261; RV32IA-NEXT: ret 9262; 9263; RV64I-LABEL: atomicrmw_umin_i16_acquire: 9264; RV64I: # %bb.0: 9265; RV64I-NEXT: addi sp, sp, -48 9266; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9267; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9268; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9269; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9270; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9271; RV64I-NEXT: mv s0, a1 9272; RV64I-NEXT: mv s1, a0 9273; RV64I-NEXT: lhu a1, 0(a0) 9274; RV64I-NEXT: lui a0, 16 9275; RV64I-NEXT: addiw s2, a0, -1 9276; RV64I-NEXT: and s3, s0, s2 9277; RV64I-NEXT: j .LBB106_2 9278; RV64I-NEXT: .LBB106_1: # %atomicrmw.start 9279; RV64I-NEXT: # in Loop: Header=BB106_2 Depth=1 9280; RV64I-NEXT: sh a1, 6(sp) 9281; RV64I-NEXT: addi a1, sp, 6 9282; RV64I-NEXT: li a3, 2 9283; RV64I-NEXT: li a4, 2 9284; RV64I-NEXT: mv a0, s1 9285; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9286; RV64I-NEXT: lh a1, 6(sp) 9287; RV64I-NEXT: bnez a0, .LBB106_4 9288; RV64I-NEXT: .LBB106_2: # %atomicrmw.start 9289; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9290; RV64I-NEXT: and a0, a1, s2 9291; RV64I-NEXT: mv a2, a1 9292; RV64I-NEXT: bgeu s3, a0, .LBB106_1 9293; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9294; RV64I-NEXT: # in Loop: Header=BB106_2 Depth=1 9295; RV64I-NEXT: mv a2, s0 9296; RV64I-NEXT: j .LBB106_1 9297; RV64I-NEXT: .LBB106_4: # %atomicrmw.end 9298; RV64I-NEXT: mv a0, a1 9299; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9300; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9301; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9302; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9303; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9304; RV64I-NEXT: addi sp, sp, 48 9305; RV64I-NEXT: ret 9306; 9307; RV64IA-LABEL: atomicrmw_umin_i16_acquire: 9308; RV64IA: # %bb.0: 9309; RV64IA-NEXT: andi a2, a0, -4 9310; RV64IA-NEXT: slliw a0, a0, 3 9311; RV64IA-NEXT: lui a3, 16 9312; RV64IA-NEXT: addiw a3, a3, -1 9313; RV64IA-NEXT: sllw a4, a3, a0 9314; RV64IA-NEXT: and a1, a1, a3 9315; RV64IA-NEXT: sllw a1, a1, a0 9316; RV64IA-NEXT: .LBB106_1: # =>This Inner Loop Header: Depth=1 9317; RV64IA-NEXT: lr.w.aq a3, (a2) 9318; RV64IA-NEXT: and a6, a3, a4 9319; RV64IA-NEXT: mv a5, a3 9320; RV64IA-NEXT: bgeu a1, a6, .LBB106_3 9321; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB106_1 Depth=1 9322; RV64IA-NEXT: xor a5, a3, a1 9323; RV64IA-NEXT: and a5, a5, a4 9324; RV64IA-NEXT: xor a5, a3, a5 9325; RV64IA-NEXT: .LBB106_3: # in Loop: Header=BB106_1 Depth=1 9326; RV64IA-NEXT: sc.w a5, a5, (a2) 9327; RV64IA-NEXT: bnez a5, .LBB106_1 9328; RV64IA-NEXT: # %bb.4: 9329; RV64IA-NEXT: srlw a0, a3, a0 9330; RV64IA-NEXT: ret 9331 %1 = atomicrmw umin i16* %a, i16 %b acquire 9332 ret i16 %1 9333} 9334 9335define i16 @atomicrmw_umin_i16_release(i16 *%a, i16 %b) nounwind { 9336; RV32I-LABEL: atomicrmw_umin_i16_release: 9337; RV32I: # %bb.0: 9338; RV32I-NEXT: addi sp, sp, -32 9339; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9340; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9341; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9342; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9343; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9344; RV32I-NEXT: mv s0, a1 9345; RV32I-NEXT: mv s1, a0 9346; RV32I-NEXT: lhu a1, 0(a0) 9347; RV32I-NEXT: lui a0, 16 9348; RV32I-NEXT: addi s2, a0, -1 9349; RV32I-NEXT: and s3, s0, s2 9350; RV32I-NEXT: j .LBB107_2 9351; RV32I-NEXT: .LBB107_1: # %atomicrmw.start 9352; RV32I-NEXT: # in Loop: Header=BB107_2 Depth=1 9353; RV32I-NEXT: sh a1, 10(sp) 9354; RV32I-NEXT: addi a1, sp, 10 9355; RV32I-NEXT: li a3, 3 9356; RV32I-NEXT: mv a0, s1 9357; RV32I-NEXT: li a4, 0 9358; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9359; RV32I-NEXT: lh a1, 10(sp) 9360; RV32I-NEXT: bnez a0, .LBB107_4 9361; RV32I-NEXT: .LBB107_2: # %atomicrmw.start 9362; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9363; RV32I-NEXT: and a0, a1, s2 9364; RV32I-NEXT: mv a2, a1 9365; RV32I-NEXT: bgeu s3, a0, .LBB107_1 9366; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9367; RV32I-NEXT: # in Loop: Header=BB107_2 Depth=1 9368; RV32I-NEXT: mv a2, s0 9369; RV32I-NEXT: j .LBB107_1 9370; RV32I-NEXT: .LBB107_4: # %atomicrmw.end 9371; RV32I-NEXT: mv a0, a1 9372; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9373; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9374; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9375; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9376; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9377; RV32I-NEXT: addi sp, sp, 32 9378; RV32I-NEXT: ret 9379; 9380; RV32IA-LABEL: atomicrmw_umin_i16_release: 9381; RV32IA: # %bb.0: 9382; RV32IA-NEXT: andi a2, a0, -4 9383; RV32IA-NEXT: slli a0, a0, 3 9384; RV32IA-NEXT: lui a3, 16 9385; RV32IA-NEXT: addi a3, a3, -1 9386; RV32IA-NEXT: sll a4, a3, a0 9387; RV32IA-NEXT: and a1, a1, a3 9388; RV32IA-NEXT: sll a1, a1, a0 9389; RV32IA-NEXT: .LBB107_1: # =>This Inner Loop Header: Depth=1 9390; RV32IA-NEXT: lr.w a3, (a2) 9391; RV32IA-NEXT: and a6, a3, a4 9392; RV32IA-NEXT: mv a5, a3 9393; RV32IA-NEXT: bgeu a1, a6, .LBB107_3 9394; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB107_1 Depth=1 9395; RV32IA-NEXT: xor a5, a3, a1 9396; RV32IA-NEXT: and a5, a5, a4 9397; RV32IA-NEXT: xor a5, a3, a5 9398; RV32IA-NEXT: .LBB107_3: # in Loop: Header=BB107_1 Depth=1 9399; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 9400; RV32IA-NEXT: bnez a5, .LBB107_1 9401; RV32IA-NEXT: # %bb.4: 9402; RV32IA-NEXT: srl a0, a3, a0 9403; RV32IA-NEXT: ret 9404; 9405; RV64I-LABEL: atomicrmw_umin_i16_release: 9406; RV64I: # %bb.0: 9407; RV64I-NEXT: addi sp, sp, -48 9408; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9409; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9410; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9411; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9412; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9413; RV64I-NEXT: mv s0, a1 9414; RV64I-NEXT: mv s1, a0 9415; RV64I-NEXT: lhu a1, 0(a0) 9416; RV64I-NEXT: lui a0, 16 9417; RV64I-NEXT: addiw s2, a0, -1 9418; RV64I-NEXT: and s3, s0, s2 9419; RV64I-NEXT: j .LBB107_2 9420; RV64I-NEXT: .LBB107_1: # %atomicrmw.start 9421; RV64I-NEXT: # in Loop: Header=BB107_2 Depth=1 9422; RV64I-NEXT: sh a1, 6(sp) 9423; RV64I-NEXT: addi a1, sp, 6 9424; RV64I-NEXT: li a3, 3 9425; RV64I-NEXT: mv a0, s1 9426; RV64I-NEXT: li a4, 0 9427; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9428; RV64I-NEXT: lh a1, 6(sp) 9429; RV64I-NEXT: bnez a0, .LBB107_4 9430; RV64I-NEXT: .LBB107_2: # %atomicrmw.start 9431; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9432; RV64I-NEXT: and a0, a1, s2 9433; RV64I-NEXT: mv a2, a1 9434; RV64I-NEXT: bgeu s3, a0, .LBB107_1 9435; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9436; RV64I-NEXT: # in Loop: Header=BB107_2 Depth=1 9437; RV64I-NEXT: mv a2, s0 9438; RV64I-NEXT: j .LBB107_1 9439; RV64I-NEXT: .LBB107_4: # %atomicrmw.end 9440; RV64I-NEXT: mv a0, a1 9441; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9442; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9443; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9444; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9445; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9446; RV64I-NEXT: addi sp, sp, 48 9447; RV64I-NEXT: ret 9448; 9449; RV64IA-LABEL: atomicrmw_umin_i16_release: 9450; RV64IA: # %bb.0: 9451; RV64IA-NEXT: andi a2, a0, -4 9452; RV64IA-NEXT: slliw a0, a0, 3 9453; RV64IA-NEXT: lui a3, 16 9454; RV64IA-NEXT: addiw a3, a3, -1 9455; RV64IA-NEXT: sllw a4, a3, a0 9456; RV64IA-NEXT: and a1, a1, a3 9457; RV64IA-NEXT: sllw a1, a1, a0 9458; RV64IA-NEXT: .LBB107_1: # =>This Inner Loop Header: Depth=1 9459; RV64IA-NEXT: lr.w a3, (a2) 9460; RV64IA-NEXT: and a6, a3, a4 9461; RV64IA-NEXT: mv a5, a3 9462; RV64IA-NEXT: bgeu a1, a6, .LBB107_3 9463; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB107_1 Depth=1 9464; RV64IA-NEXT: xor a5, a3, a1 9465; RV64IA-NEXT: and a5, a5, a4 9466; RV64IA-NEXT: xor a5, a3, a5 9467; RV64IA-NEXT: .LBB107_3: # in Loop: Header=BB107_1 Depth=1 9468; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 9469; RV64IA-NEXT: bnez a5, .LBB107_1 9470; RV64IA-NEXT: # %bb.4: 9471; RV64IA-NEXT: srlw a0, a3, a0 9472; RV64IA-NEXT: ret 9473 %1 = atomicrmw umin i16* %a, i16 %b release 9474 ret i16 %1 9475} 9476 9477define i16 @atomicrmw_umin_i16_acq_rel(i16 *%a, i16 %b) nounwind { 9478; RV32I-LABEL: atomicrmw_umin_i16_acq_rel: 9479; RV32I: # %bb.0: 9480; RV32I-NEXT: addi sp, sp, -32 9481; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9482; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9483; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9484; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9485; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9486; RV32I-NEXT: mv s0, a1 9487; RV32I-NEXT: mv s1, a0 9488; RV32I-NEXT: lhu a1, 0(a0) 9489; RV32I-NEXT: lui a0, 16 9490; RV32I-NEXT: addi s2, a0, -1 9491; RV32I-NEXT: and s3, s0, s2 9492; RV32I-NEXT: j .LBB108_2 9493; RV32I-NEXT: .LBB108_1: # %atomicrmw.start 9494; RV32I-NEXT: # in Loop: Header=BB108_2 Depth=1 9495; RV32I-NEXT: sh a1, 10(sp) 9496; RV32I-NEXT: addi a1, sp, 10 9497; RV32I-NEXT: li a3, 4 9498; RV32I-NEXT: li a4, 2 9499; RV32I-NEXT: mv a0, s1 9500; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9501; RV32I-NEXT: lh a1, 10(sp) 9502; RV32I-NEXT: bnez a0, .LBB108_4 9503; RV32I-NEXT: .LBB108_2: # %atomicrmw.start 9504; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9505; RV32I-NEXT: and a0, a1, s2 9506; RV32I-NEXT: mv a2, a1 9507; RV32I-NEXT: bgeu s3, a0, .LBB108_1 9508; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9509; RV32I-NEXT: # in Loop: Header=BB108_2 Depth=1 9510; RV32I-NEXT: mv a2, s0 9511; RV32I-NEXT: j .LBB108_1 9512; RV32I-NEXT: .LBB108_4: # %atomicrmw.end 9513; RV32I-NEXT: mv a0, a1 9514; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9515; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9516; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9517; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9518; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9519; RV32I-NEXT: addi sp, sp, 32 9520; RV32I-NEXT: ret 9521; 9522; RV32IA-LABEL: atomicrmw_umin_i16_acq_rel: 9523; RV32IA: # %bb.0: 9524; RV32IA-NEXT: andi a2, a0, -4 9525; RV32IA-NEXT: slli a0, a0, 3 9526; RV32IA-NEXT: lui a3, 16 9527; RV32IA-NEXT: addi a3, a3, -1 9528; RV32IA-NEXT: sll a4, a3, a0 9529; RV32IA-NEXT: and a1, a1, a3 9530; RV32IA-NEXT: sll a1, a1, a0 9531; RV32IA-NEXT: .LBB108_1: # =>This Inner Loop Header: Depth=1 9532; RV32IA-NEXT: lr.w.aq a3, (a2) 9533; RV32IA-NEXT: and a6, a3, a4 9534; RV32IA-NEXT: mv a5, a3 9535; RV32IA-NEXT: bgeu a1, a6, .LBB108_3 9536; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB108_1 Depth=1 9537; RV32IA-NEXT: xor a5, a3, a1 9538; RV32IA-NEXT: and a5, a5, a4 9539; RV32IA-NEXT: xor a5, a3, a5 9540; RV32IA-NEXT: .LBB108_3: # in Loop: Header=BB108_1 Depth=1 9541; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 9542; RV32IA-NEXT: bnez a5, .LBB108_1 9543; RV32IA-NEXT: # %bb.4: 9544; RV32IA-NEXT: srl a0, a3, a0 9545; RV32IA-NEXT: ret 9546; 9547; RV64I-LABEL: atomicrmw_umin_i16_acq_rel: 9548; RV64I: # %bb.0: 9549; RV64I-NEXT: addi sp, sp, -48 9550; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9551; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9552; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9553; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9554; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9555; RV64I-NEXT: mv s0, a1 9556; RV64I-NEXT: mv s1, a0 9557; RV64I-NEXT: lhu a1, 0(a0) 9558; RV64I-NEXT: lui a0, 16 9559; RV64I-NEXT: addiw s2, a0, -1 9560; RV64I-NEXT: and s3, s0, s2 9561; RV64I-NEXT: j .LBB108_2 9562; RV64I-NEXT: .LBB108_1: # %atomicrmw.start 9563; RV64I-NEXT: # in Loop: Header=BB108_2 Depth=1 9564; RV64I-NEXT: sh a1, 6(sp) 9565; RV64I-NEXT: addi a1, sp, 6 9566; RV64I-NEXT: li a3, 4 9567; RV64I-NEXT: li a4, 2 9568; RV64I-NEXT: mv a0, s1 9569; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9570; RV64I-NEXT: lh a1, 6(sp) 9571; RV64I-NEXT: bnez a0, .LBB108_4 9572; RV64I-NEXT: .LBB108_2: # %atomicrmw.start 9573; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9574; RV64I-NEXT: and a0, a1, s2 9575; RV64I-NEXT: mv a2, a1 9576; RV64I-NEXT: bgeu s3, a0, .LBB108_1 9577; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9578; RV64I-NEXT: # in Loop: Header=BB108_2 Depth=1 9579; RV64I-NEXT: mv a2, s0 9580; RV64I-NEXT: j .LBB108_1 9581; RV64I-NEXT: .LBB108_4: # %atomicrmw.end 9582; RV64I-NEXT: mv a0, a1 9583; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9584; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9585; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9586; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9587; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9588; RV64I-NEXT: addi sp, sp, 48 9589; RV64I-NEXT: ret 9590; 9591; RV64IA-LABEL: atomicrmw_umin_i16_acq_rel: 9592; RV64IA: # %bb.0: 9593; RV64IA-NEXT: andi a2, a0, -4 9594; RV64IA-NEXT: slliw a0, a0, 3 9595; RV64IA-NEXT: lui a3, 16 9596; RV64IA-NEXT: addiw a3, a3, -1 9597; RV64IA-NEXT: sllw a4, a3, a0 9598; RV64IA-NEXT: and a1, a1, a3 9599; RV64IA-NEXT: sllw a1, a1, a0 9600; RV64IA-NEXT: .LBB108_1: # =>This Inner Loop Header: Depth=1 9601; RV64IA-NEXT: lr.w.aq a3, (a2) 9602; RV64IA-NEXT: and a6, a3, a4 9603; RV64IA-NEXT: mv a5, a3 9604; RV64IA-NEXT: bgeu a1, a6, .LBB108_3 9605; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB108_1 Depth=1 9606; RV64IA-NEXT: xor a5, a3, a1 9607; RV64IA-NEXT: and a5, a5, a4 9608; RV64IA-NEXT: xor a5, a3, a5 9609; RV64IA-NEXT: .LBB108_3: # in Loop: Header=BB108_1 Depth=1 9610; RV64IA-NEXT: sc.w.rl a5, a5, (a2) 9611; RV64IA-NEXT: bnez a5, .LBB108_1 9612; RV64IA-NEXT: # %bb.4: 9613; RV64IA-NEXT: srlw a0, a3, a0 9614; RV64IA-NEXT: ret 9615 %1 = atomicrmw umin i16* %a, i16 %b acq_rel 9616 ret i16 %1 9617} 9618 9619define i16 @atomicrmw_umin_i16_seq_cst(i16 *%a, i16 %b) nounwind { 9620; RV32I-LABEL: atomicrmw_umin_i16_seq_cst: 9621; RV32I: # %bb.0: 9622; RV32I-NEXT: addi sp, sp, -32 9623; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9624; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9625; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9626; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9627; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 9628; RV32I-NEXT: mv s0, a1 9629; RV32I-NEXT: mv s1, a0 9630; RV32I-NEXT: lhu a1, 0(a0) 9631; RV32I-NEXT: lui a0, 16 9632; RV32I-NEXT: addi s2, a0, -1 9633; RV32I-NEXT: and s3, s0, s2 9634; RV32I-NEXT: j .LBB109_2 9635; RV32I-NEXT: .LBB109_1: # %atomicrmw.start 9636; RV32I-NEXT: # in Loop: Header=BB109_2 Depth=1 9637; RV32I-NEXT: sh a1, 10(sp) 9638; RV32I-NEXT: addi a1, sp, 10 9639; RV32I-NEXT: li a3, 5 9640; RV32I-NEXT: li a4, 5 9641; RV32I-NEXT: mv a0, s1 9642; RV32I-NEXT: call __atomic_compare_exchange_2@plt 9643; RV32I-NEXT: lh a1, 10(sp) 9644; RV32I-NEXT: bnez a0, .LBB109_4 9645; RV32I-NEXT: .LBB109_2: # %atomicrmw.start 9646; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9647; RV32I-NEXT: and a0, a1, s2 9648; RV32I-NEXT: mv a2, a1 9649; RV32I-NEXT: bgeu s3, a0, .LBB109_1 9650; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9651; RV32I-NEXT: # in Loop: Header=BB109_2 Depth=1 9652; RV32I-NEXT: mv a2, s0 9653; RV32I-NEXT: j .LBB109_1 9654; RV32I-NEXT: .LBB109_4: # %atomicrmw.end 9655; RV32I-NEXT: mv a0, a1 9656; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9657; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9658; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9659; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9660; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 9661; RV32I-NEXT: addi sp, sp, 32 9662; RV32I-NEXT: ret 9663; 9664; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst: 9665; RV32IA: # %bb.0: 9666; RV32IA-NEXT: andi a2, a0, -4 9667; RV32IA-NEXT: slli a0, a0, 3 9668; RV32IA-NEXT: lui a3, 16 9669; RV32IA-NEXT: addi a3, a3, -1 9670; RV32IA-NEXT: sll a4, a3, a0 9671; RV32IA-NEXT: and a1, a1, a3 9672; RV32IA-NEXT: sll a1, a1, a0 9673; RV32IA-NEXT: .LBB109_1: # =>This Inner Loop Header: Depth=1 9674; RV32IA-NEXT: lr.w.aqrl a3, (a2) 9675; RV32IA-NEXT: and a6, a3, a4 9676; RV32IA-NEXT: mv a5, a3 9677; RV32IA-NEXT: bgeu a1, a6, .LBB109_3 9678; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB109_1 Depth=1 9679; RV32IA-NEXT: xor a5, a3, a1 9680; RV32IA-NEXT: and a5, a5, a4 9681; RV32IA-NEXT: xor a5, a3, a5 9682; RV32IA-NEXT: .LBB109_3: # in Loop: Header=BB109_1 Depth=1 9683; RV32IA-NEXT: sc.w.aqrl a5, a5, (a2) 9684; RV32IA-NEXT: bnez a5, .LBB109_1 9685; RV32IA-NEXT: # %bb.4: 9686; RV32IA-NEXT: srl a0, a3, a0 9687; RV32IA-NEXT: ret 9688; 9689; RV64I-LABEL: atomicrmw_umin_i16_seq_cst: 9690; RV64I: # %bb.0: 9691; RV64I-NEXT: addi sp, sp, -48 9692; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9693; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9694; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9695; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9696; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 9697; RV64I-NEXT: mv s0, a1 9698; RV64I-NEXT: mv s1, a0 9699; RV64I-NEXT: lhu a1, 0(a0) 9700; RV64I-NEXT: lui a0, 16 9701; RV64I-NEXT: addiw s2, a0, -1 9702; RV64I-NEXT: and s3, s0, s2 9703; RV64I-NEXT: j .LBB109_2 9704; RV64I-NEXT: .LBB109_1: # %atomicrmw.start 9705; RV64I-NEXT: # in Loop: Header=BB109_2 Depth=1 9706; RV64I-NEXT: sh a1, 6(sp) 9707; RV64I-NEXT: addi a1, sp, 6 9708; RV64I-NEXT: li a3, 5 9709; RV64I-NEXT: li a4, 5 9710; RV64I-NEXT: mv a0, s1 9711; RV64I-NEXT: call __atomic_compare_exchange_2@plt 9712; RV64I-NEXT: lh a1, 6(sp) 9713; RV64I-NEXT: bnez a0, .LBB109_4 9714; RV64I-NEXT: .LBB109_2: # %atomicrmw.start 9715; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9716; RV64I-NEXT: and a0, a1, s2 9717; RV64I-NEXT: mv a2, a1 9718; RV64I-NEXT: bgeu s3, a0, .LBB109_1 9719; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9720; RV64I-NEXT: # in Loop: Header=BB109_2 Depth=1 9721; RV64I-NEXT: mv a2, s0 9722; RV64I-NEXT: j .LBB109_1 9723; RV64I-NEXT: .LBB109_4: # %atomicrmw.end 9724; RV64I-NEXT: mv a0, a1 9725; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9726; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9727; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9728; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9729; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 9730; RV64I-NEXT: addi sp, sp, 48 9731; RV64I-NEXT: ret 9732; 9733; RV64IA-LABEL: atomicrmw_umin_i16_seq_cst: 9734; RV64IA: # %bb.0: 9735; RV64IA-NEXT: andi a2, a0, -4 9736; RV64IA-NEXT: slliw a0, a0, 3 9737; RV64IA-NEXT: lui a3, 16 9738; RV64IA-NEXT: addiw a3, a3, -1 9739; RV64IA-NEXT: sllw a4, a3, a0 9740; RV64IA-NEXT: and a1, a1, a3 9741; RV64IA-NEXT: sllw a1, a1, a0 9742; RV64IA-NEXT: .LBB109_1: # =>This Inner Loop Header: Depth=1 9743; RV64IA-NEXT: lr.w.aqrl a3, (a2) 9744; RV64IA-NEXT: and a6, a3, a4 9745; RV64IA-NEXT: mv a5, a3 9746; RV64IA-NEXT: bgeu a1, a6, .LBB109_3 9747; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB109_1 Depth=1 9748; RV64IA-NEXT: xor a5, a3, a1 9749; RV64IA-NEXT: and a5, a5, a4 9750; RV64IA-NEXT: xor a5, a3, a5 9751; RV64IA-NEXT: .LBB109_3: # in Loop: Header=BB109_1 Depth=1 9752; RV64IA-NEXT: sc.w.aqrl a5, a5, (a2) 9753; RV64IA-NEXT: bnez a5, .LBB109_1 9754; RV64IA-NEXT: # %bb.4: 9755; RV64IA-NEXT: srlw a0, a3, a0 9756; RV64IA-NEXT: ret 9757 %1 = atomicrmw umin i16* %a, i16 %b seq_cst 9758 ret i16 %1 9759} 9760 9761define i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind { 9762; RV32I-LABEL: atomicrmw_xchg_i32_monotonic: 9763; RV32I: # %bb.0: 9764; RV32I-NEXT: addi sp, sp, -16 9765; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9766; RV32I-NEXT: li a2, 0 9767; RV32I-NEXT: call __atomic_exchange_4@plt 9768; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9769; RV32I-NEXT: addi sp, sp, 16 9770; RV32I-NEXT: ret 9771; 9772; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic: 9773; RV32IA: # %bb.0: 9774; RV32IA-NEXT: amoswap.w a0, a1, (a0) 9775; RV32IA-NEXT: ret 9776; 9777; RV64I-LABEL: atomicrmw_xchg_i32_monotonic: 9778; RV64I: # %bb.0: 9779; RV64I-NEXT: addi sp, sp, -16 9780; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9781; RV64I-NEXT: li a2, 0 9782; RV64I-NEXT: call __atomic_exchange_4@plt 9783; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9784; RV64I-NEXT: addi sp, sp, 16 9785; RV64I-NEXT: ret 9786; 9787; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic: 9788; RV64IA: # %bb.0: 9789; RV64IA-NEXT: amoswap.w a0, a1, (a0) 9790; RV64IA-NEXT: ret 9791 %1 = atomicrmw xchg i32* %a, i32 %b monotonic 9792 ret i32 %1 9793} 9794 9795define i32 @atomicrmw_xchg_i32_acquire(i32* %a, i32 %b) nounwind { 9796; RV32I-LABEL: atomicrmw_xchg_i32_acquire: 9797; RV32I: # %bb.0: 9798; RV32I-NEXT: addi sp, sp, -16 9799; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9800; RV32I-NEXT: li a2, 2 9801; RV32I-NEXT: call __atomic_exchange_4@plt 9802; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9803; RV32I-NEXT: addi sp, sp, 16 9804; RV32I-NEXT: ret 9805; 9806; RV32IA-LABEL: atomicrmw_xchg_i32_acquire: 9807; RV32IA: # %bb.0: 9808; RV32IA-NEXT: amoswap.w.aq a0, a1, (a0) 9809; RV32IA-NEXT: ret 9810; 9811; RV64I-LABEL: atomicrmw_xchg_i32_acquire: 9812; RV64I: # %bb.0: 9813; RV64I-NEXT: addi sp, sp, -16 9814; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9815; RV64I-NEXT: li a2, 2 9816; RV64I-NEXT: call __atomic_exchange_4@plt 9817; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9818; RV64I-NEXT: addi sp, sp, 16 9819; RV64I-NEXT: ret 9820; 9821; RV64IA-LABEL: atomicrmw_xchg_i32_acquire: 9822; RV64IA: # %bb.0: 9823; RV64IA-NEXT: amoswap.w.aq a0, a1, (a0) 9824; RV64IA-NEXT: ret 9825 %1 = atomicrmw xchg i32* %a, i32 %b acquire 9826 ret i32 %1 9827} 9828 9829define i32 @atomicrmw_xchg_i32_release(i32* %a, i32 %b) nounwind { 9830; RV32I-LABEL: atomicrmw_xchg_i32_release: 9831; RV32I: # %bb.0: 9832; RV32I-NEXT: addi sp, sp, -16 9833; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9834; RV32I-NEXT: li a2, 3 9835; RV32I-NEXT: call __atomic_exchange_4@plt 9836; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9837; RV32I-NEXT: addi sp, sp, 16 9838; RV32I-NEXT: ret 9839; 9840; RV32IA-LABEL: atomicrmw_xchg_i32_release: 9841; RV32IA: # %bb.0: 9842; RV32IA-NEXT: amoswap.w.rl a0, a1, (a0) 9843; RV32IA-NEXT: ret 9844; 9845; RV64I-LABEL: atomicrmw_xchg_i32_release: 9846; RV64I: # %bb.0: 9847; RV64I-NEXT: addi sp, sp, -16 9848; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9849; RV64I-NEXT: li a2, 3 9850; RV64I-NEXT: call __atomic_exchange_4@plt 9851; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9852; RV64I-NEXT: addi sp, sp, 16 9853; RV64I-NEXT: ret 9854; 9855; RV64IA-LABEL: atomicrmw_xchg_i32_release: 9856; RV64IA: # %bb.0: 9857; RV64IA-NEXT: amoswap.w.rl a0, a1, (a0) 9858; RV64IA-NEXT: ret 9859 %1 = atomicrmw xchg i32* %a, i32 %b release 9860 ret i32 %1 9861} 9862 9863define i32 @atomicrmw_xchg_i32_acq_rel(i32* %a, i32 %b) nounwind { 9864; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel: 9865; RV32I: # %bb.0: 9866; RV32I-NEXT: addi sp, sp, -16 9867; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9868; RV32I-NEXT: li a2, 4 9869; RV32I-NEXT: call __atomic_exchange_4@plt 9870; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9871; RV32I-NEXT: addi sp, sp, 16 9872; RV32I-NEXT: ret 9873; 9874; RV32IA-LABEL: atomicrmw_xchg_i32_acq_rel: 9875; RV32IA: # %bb.0: 9876; RV32IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9877; RV32IA-NEXT: ret 9878; 9879; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel: 9880; RV64I: # %bb.0: 9881; RV64I-NEXT: addi sp, sp, -16 9882; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9883; RV64I-NEXT: li a2, 4 9884; RV64I-NEXT: call __atomic_exchange_4@plt 9885; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9886; RV64I-NEXT: addi sp, sp, 16 9887; RV64I-NEXT: ret 9888; 9889; RV64IA-LABEL: atomicrmw_xchg_i32_acq_rel: 9890; RV64IA: # %bb.0: 9891; RV64IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9892; RV64IA-NEXT: ret 9893 %1 = atomicrmw xchg i32* %a, i32 %b acq_rel 9894 ret i32 %1 9895} 9896 9897define i32 @atomicrmw_xchg_i32_seq_cst(i32* %a, i32 %b) nounwind { 9898; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst: 9899; RV32I: # %bb.0: 9900; RV32I-NEXT: addi sp, sp, -16 9901; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9902; RV32I-NEXT: li a2, 5 9903; RV32I-NEXT: call __atomic_exchange_4@plt 9904; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9905; RV32I-NEXT: addi sp, sp, 16 9906; RV32I-NEXT: ret 9907; 9908; RV32IA-LABEL: atomicrmw_xchg_i32_seq_cst: 9909; RV32IA: # %bb.0: 9910; RV32IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9911; RV32IA-NEXT: ret 9912; 9913; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst: 9914; RV64I: # %bb.0: 9915; RV64I-NEXT: addi sp, sp, -16 9916; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9917; RV64I-NEXT: li a2, 5 9918; RV64I-NEXT: call __atomic_exchange_4@plt 9919; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9920; RV64I-NEXT: addi sp, sp, 16 9921; RV64I-NEXT: ret 9922; 9923; RV64IA-LABEL: atomicrmw_xchg_i32_seq_cst: 9924; RV64IA: # %bb.0: 9925; RV64IA-NEXT: amoswap.w.aqrl a0, a1, (a0) 9926; RV64IA-NEXT: ret 9927 %1 = atomicrmw xchg i32* %a, i32 %b seq_cst 9928 ret i32 %1 9929} 9930 9931define i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind { 9932; RV32I-LABEL: atomicrmw_add_i32_monotonic: 9933; RV32I: # %bb.0: 9934; RV32I-NEXT: addi sp, sp, -16 9935; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9936; RV32I-NEXT: li a2, 0 9937; RV32I-NEXT: call __atomic_fetch_add_4@plt 9938; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9939; RV32I-NEXT: addi sp, sp, 16 9940; RV32I-NEXT: ret 9941; 9942; RV32IA-LABEL: atomicrmw_add_i32_monotonic: 9943; RV32IA: # %bb.0: 9944; RV32IA-NEXT: amoadd.w a0, a1, (a0) 9945; RV32IA-NEXT: ret 9946; 9947; RV64I-LABEL: atomicrmw_add_i32_monotonic: 9948; RV64I: # %bb.0: 9949; RV64I-NEXT: addi sp, sp, -16 9950; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9951; RV64I-NEXT: li a2, 0 9952; RV64I-NEXT: call __atomic_fetch_add_4@plt 9953; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9954; RV64I-NEXT: addi sp, sp, 16 9955; RV64I-NEXT: ret 9956; 9957; RV64IA-LABEL: atomicrmw_add_i32_monotonic: 9958; RV64IA: # %bb.0: 9959; RV64IA-NEXT: amoadd.w a0, a1, (a0) 9960; RV64IA-NEXT: ret 9961 %1 = atomicrmw add i32* %a, i32 %b monotonic 9962 ret i32 %1 9963} 9964 9965define i32 @atomicrmw_add_i32_acquire(i32 *%a, i32 %b) nounwind { 9966; RV32I-LABEL: atomicrmw_add_i32_acquire: 9967; RV32I: # %bb.0: 9968; RV32I-NEXT: addi sp, sp, -16 9969; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9970; RV32I-NEXT: li a2, 2 9971; RV32I-NEXT: call __atomic_fetch_add_4@plt 9972; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9973; RV32I-NEXT: addi sp, sp, 16 9974; RV32I-NEXT: ret 9975; 9976; RV32IA-LABEL: atomicrmw_add_i32_acquire: 9977; RV32IA: # %bb.0: 9978; RV32IA-NEXT: amoadd.w.aq a0, a1, (a0) 9979; RV32IA-NEXT: ret 9980; 9981; RV64I-LABEL: atomicrmw_add_i32_acquire: 9982; RV64I: # %bb.0: 9983; RV64I-NEXT: addi sp, sp, -16 9984; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9985; RV64I-NEXT: li a2, 2 9986; RV64I-NEXT: call __atomic_fetch_add_4@plt 9987; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9988; RV64I-NEXT: addi sp, sp, 16 9989; RV64I-NEXT: ret 9990; 9991; RV64IA-LABEL: atomicrmw_add_i32_acquire: 9992; RV64IA: # %bb.0: 9993; RV64IA-NEXT: amoadd.w.aq a0, a1, (a0) 9994; RV64IA-NEXT: ret 9995 %1 = atomicrmw add i32* %a, i32 %b acquire 9996 ret i32 %1 9997} 9998 9999define i32 @atomicrmw_add_i32_release(i32 *%a, i32 %b) nounwind { 10000; RV32I-LABEL: atomicrmw_add_i32_release: 10001; RV32I: # %bb.0: 10002; RV32I-NEXT: addi sp, sp, -16 10003; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10004; RV32I-NEXT: li a2, 3 10005; RV32I-NEXT: call __atomic_fetch_add_4@plt 10006; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10007; RV32I-NEXT: addi sp, sp, 16 10008; RV32I-NEXT: ret 10009; 10010; RV32IA-LABEL: atomicrmw_add_i32_release: 10011; RV32IA: # %bb.0: 10012; RV32IA-NEXT: amoadd.w.rl a0, a1, (a0) 10013; RV32IA-NEXT: ret 10014; 10015; RV64I-LABEL: atomicrmw_add_i32_release: 10016; RV64I: # %bb.0: 10017; RV64I-NEXT: addi sp, sp, -16 10018; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10019; RV64I-NEXT: li a2, 3 10020; RV64I-NEXT: call __atomic_fetch_add_4@plt 10021; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10022; RV64I-NEXT: addi sp, sp, 16 10023; RV64I-NEXT: ret 10024; 10025; RV64IA-LABEL: atomicrmw_add_i32_release: 10026; RV64IA: # %bb.0: 10027; RV64IA-NEXT: amoadd.w.rl a0, a1, (a0) 10028; RV64IA-NEXT: ret 10029 %1 = atomicrmw add i32* %a, i32 %b release 10030 ret i32 %1 10031} 10032 10033define i32 @atomicrmw_add_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10034; RV32I-LABEL: atomicrmw_add_i32_acq_rel: 10035; RV32I: # %bb.0: 10036; RV32I-NEXT: addi sp, sp, -16 10037; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10038; RV32I-NEXT: li a2, 4 10039; RV32I-NEXT: call __atomic_fetch_add_4@plt 10040; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10041; RV32I-NEXT: addi sp, sp, 16 10042; RV32I-NEXT: ret 10043; 10044; RV32IA-LABEL: atomicrmw_add_i32_acq_rel: 10045; RV32IA: # %bb.0: 10046; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10047; RV32IA-NEXT: ret 10048; 10049; RV64I-LABEL: atomicrmw_add_i32_acq_rel: 10050; RV64I: # %bb.0: 10051; RV64I-NEXT: addi sp, sp, -16 10052; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10053; RV64I-NEXT: li a2, 4 10054; RV64I-NEXT: call __atomic_fetch_add_4@plt 10055; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10056; RV64I-NEXT: addi sp, sp, 16 10057; RV64I-NEXT: ret 10058; 10059; RV64IA-LABEL: atomicrmw_add_i32_acq_rel: 10060; RV64IA: # %bb.0: 10061; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10062; RV64IA-NEXT: ret 10063 %1 = atomicrmw add i32* %a, i32 %b acq_rel 10064 ret i32 %1 10065} 10066 10067define i32 @atomicrmw_add_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10068; RV32I-LABEL: atomicrmw_add_i32_seq_cst: 10069; RV32I: # %bb.0: 10070; RV32I-NEXT: addi sp, sp, -16 10071; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10072; RV32I-NEXT: li a2, 5 10073; RV32I-NEXT: call __atomic_fetch_add_4@plt 10074; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10075; RV32I-NEXT: addi sp, sp, 16 10076; RV32I-NEXT: ret 10077; 10078; RV32IA-LABEL: atomicrmw_add_i32_seq_cst: 10079; RV32IA: # %bb.0: 10080; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10081; RV32IA-NEXT: ret 10082; 10083; RV64I-LABEL: atomicrmw_add_i32_seq_cst: 10084; RV64I: # %bb.0: 10085; RV64I-NEXT: addi sp, sp, -16 10086; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10087; RV64I-NEXT: li a2, 5 10088; RV64I-NEXT: call __atomic_fetch_add_4@plt 10089; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10090; RV64I-NEXT: addi sp, sp, 16 10091; RV64I-NEXT: ret 10092; 10093; RV64IA-LABEL: atomicrmw_add_i32_seq_cst: 10094; RV64IA: # %bb.0: 10095; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10096; RV64IA-NEXT: ret 10097 %1 = atomicrmw add i32* %a, i32 %b seq_cst 10098 ret i32 %1 10099} 10100 10101define i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind { 10102; RV32I-LABEL: atomicrmw_sub_i32_monotonic: 10103; RV32I: # %bb.0: 10104; RV32I-NEXT: addi sp, sp, -16 10105; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10106; RV32I-NEXT: li a2, 0 10107; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10108; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10109; RV32I-NEXT: addi sp, sp, 16 10110; RV32I-NEXT: ret 10111; 10112; RV32IA-LABEL: atomicrmw_sub_i32_monotonic: 10113; RV32IA: # %bb.0: 10114; RV32IA-NEXT: neg a1, a1 10115; RV32IA-NEXT: amoadd.w a0, a1, (a0) 10116; RV32IA-NEXT: ret 10117; 10118; RV64I-LABEL: atomicrmw_sub_i32_monotonic: 10119; RV64I: # %bb.0: 10120; RV64I-NEXT: addi sp, sp, -16 10121; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10122; RV64I-NEXT: li a2, 0 10123; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10124; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10125; RV64I-NEXT: addi sp, sp, 16 10126; RV64I-NEXT: ret 10127; 10128; RV64IA-LABEL: atomicrmw_sub_i32_monotonic: 10129; RV64IA: # %bb.0: 10130; RV64IA-NEXT: neg a1, a1 10131; RV64IA-NEXT: amoadd.w a0, a1, (a0) 10132; RV64IA-NEXT: ret 10133 %1 = atomicrmw sub i32* %a, i32 %b monotonic 10134 ret i32 %1 10135} 10136 10137define i32 @atomicrmw_sub_i32_acquire(i32* %a, i32 %b) nounwind { 10138; RV32I-LABEL: atomicrmw_sub_i32_acquire: 10139; RV32I: # %bb.0: 10140; RV32I-NEXT: addi sp, sp, -16 10141; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10142; RV32I-NEXT: li a2, 2 10143; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10144; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10145; RV32I-NEXT: addi sp, sp, 16 10146; RV32I-NEXT: ret 10147; 10148; RV32IA-LABEL: atomicrmw_sub_i32_acquire: 10149; RV32IA: # %bb.0: 10150; RV32IA-NEXT: neg a1, a1 10151; RV32IA-NEXT: amoadd.w.aq a0, a1, (a0) 10152; RV32IA-NEXT: ret 10153; 10154; RV64I-LABEL: atomicrmw_sub_i32_acquire: 10155; RV64I: # %bb.0: 10156; RV64I-NEXT: addi sp, sp, -16 10157; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10158; RV64I-NEXT: li a2, 2 10159; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10160; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10161; RV64I-NEXT: addi sp, sp, 16 10162; RV64I-NEXT: ret 10163; 10164; RV64IA-LABEL: atomicrmw_sub_i32_acquire: 10165; RV64IA: # %bb.0: 10166; RV64IA-NEXT: neg a1, a1 10167; RV64IA-NEXT: amoadd.w.aq a0, a1, (a0) 10168; RV64IA-NEXT: ret 10169 %1 = atomicrmw sub i32* %a, i32 %b acquire 10170 ret i32 %1 10171} 10172 10173define i32 @atomicrmw_sub_i32_release(i32* %a, i32 %b) nounwind { 10174; RV32I-LABEL: atomicrmw_sub_i32_release: 10175; RV32I: # %bb.0: 10176; RV32I-NEXT: addi sp, sp, -16 10177; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10178; RV32I-NEXT: li a2, 3 10179; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10180; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10181; RV32I-NEXT: addi sp, sp, 16 10182; RV32I-NEXT: ret 10183; 10184; RV32IA-LABEL: atomicrmw_sub_i32_release: 10185; RV32IA: # %bb.0: 10186; RV32IA-NEXT: neg a1, a1 10187; RV32IA-NEXT: amoadd.w.rl a0, a1, (a0) 10188; RV32IA-NEXT: ret 10189; 10190; RV64I-LABEL: atomicrmw_sub_i32_release: 10191; RV64I: # %bb.0: 10192; RV64I-NEXT: addi sp, sp, -16 10193; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10194; RV64I-NEXT: li a2, 3 10195; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10196; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10197; RV64I-NEXT: addi sp, sp, 16 10198; RV64I-NEXT: ret 10199; 10200; RV64IA-LABEL: atomicrmw_sub_i32_release: 10201; RV64IA: # %bb.0: 10202; RV64IA-NEXT: neg a1, a1 10203; RV64IA-NEXT: amoadd.w.rl a0, a1, (a0) 10204; RV64IA-NEXT: ret 10205 %1 = atomicrmw sub i32* %a, i32 %b release 10206 ret i32 %1 10207} 10208 10209define i32 @atomicrmw_sub_i32_acq_rel(i32* %a, i32 %b) nounwind { 10210; RV32I-LABEL: atomicrmw_sub_i32_acq_rel: 10211; RV32I: # %bb.0: 10212; RV32I-NEXT: addi sp, sp, -16 10213; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10214; RV32I-NEXT: li a2, 4 10215; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10216; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10217; RV32I-NEXT: addi sp, sp, 16 10218; RV32I-NEXT: ret 10219; 10220; RV32IA-LABEL: atomicrmw_sub_i32_acq_rel: 10221; RV32IA: # %bb.0: 10222; RV32IA-NEXT: neg a1, a1 10223; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10224; RV32IA-NEXT: ret 10225; 10226; RV64I-LABEL: atomicrmw_sub_i32_acq_rel: 10227; RV64I: # %bb.0: 10228; RV64I-NEXT: addi sp, sp, -16 10229; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10230; RV64I-NEXT: li a2, 4 10231; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10232; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10233; RV64I-NEXT: addi sp, sp, 16 10234; RV64I-NEXT: ret 10235; 10236; RV64IA-LABEL: atomicrmw_sub_i32_acq_rel: 10237; RV64IA: # %bb.0: 10238; RV64IA-NEXT: neg a1, a1 10239; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10240; RV64IA-NEXT: ret 10241 %1 = atomicrmw sub i32* %a, i32 %b acq_rel 10242 ret i32 %1 10243} 10244 10245define i32 @atomicrmw_sub_i32_seq_cst(i32* %a, i32 %b) nounwind { 10246; RV32I-LABEL: atomicrmw_sub_i32_seq_cst: 10247; RV32I: # %bb.0: 10248; RV32I-NEXT: addi sp, sp, -16 10249; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10250; RV32I-NEXT: li a2, 5 10251; RV32I-NEXT: call __atomic_fetch_sub_4@plt 10252; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10253; RV32I-NEXT: addi sp, sp, 16 10254; RV32I-NEXT: ret 10255; 10256; RV32IA-LABEL: atomicrmw_sub_i32_seq_cst: 10257; RV32IA: # %bb.0: 10258; RV32IA-NEXT: neg a1, a1 10259; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10260; RV32IA-NEXT: ret 10261; 10262; RV64I-LABEL: atomicrmw_sub_i32_seq_cst: 10263; RV64I: # %bb.0: 10264; RV64I-NEXT: addi sp, sp, -16 10265; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10266; RV64I-NEXT: li a2, 5 10267; RV64I-NEXT: call __atomic_fetch_sub_4@plt 10268; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10269; RV64I-NEXT: addi sp, sp, 16 10270; RV64I-NEXT: ret 10271; 10272; RV64IA-LABEL: atomicrmw_sub_i32_seq_cst: 10273; RV64IA: # %bb.0: 10274; RV64IA-NEXT: neg a1, a1 10275; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0) 10276; RV64IA-NEXT: ret 10277 %1 = atomicrmw sub i32* %a, i32 %b seq_cst 10278 ret i32 %1 10279} 10280 10281define i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind { 10282; RV32I-LABEL: atomicrmw_and_i32_monotonic: 10283; RV32I: # %bb.0: 10284; RV32I-NEXT: addi sp, sp, -16 10285; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10286; RV32I-NEXT: li a2, 0 10287; RV32I-NEXT: call __atomic_fetch_and_4@plt 10288; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10289; RV32I-NEXT: addi sp, sp, 16 10290; RV32I-NEXT: ret 10291; 10292; RV32IA-LABEL: atomicrmw_and_i32_monotonic: 10293; RV32IA: # %bb.0: 10294; RV32IA-NEXT: amoand.w a0, a1, (a0) 10295; RV32IA-NEXT: ret 10296; 10297; RV64I-LABEL: atomicrmw_and_i32_monotonic: 10298; RV64I: # %bb.0: 10299; RV64I-NEXT: addi sp, sp, -16 10300; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10301; RV64I-NEXT: li a2, 0 10302; RV64I-NEXT: call __atomic_fetch_and_4@plt 10303; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10304; RV64I-NEXT: addi sp, sp, 16 10305; RV64I-NEXT: ret 10306; 10307; RV64IA-LABEL: atomicrmw_and_i32_monotonic: 10308; RV64IA: # %bb.0: 10309; RV64IA-NEXT: amoand.w a0, a1, (a0) 10310; RV64IA-NEXT: ret 10311 %1 = atomicrmw and i32* %a, i32 %b monotonic 10312 ret i32 %1 10313} 10314 10315define i32 @atomicrmw_and_i32_acquire(i32 *%a, i32 %b) nounwind { 10316; RV32I-LABEL: atomicrmw_and_i32_acquire: 10317; RV32I: # %bb.0: 10318; RV32I-NEXT: addi sp, sp, -16 10319; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10320; RV32I-NEXT: li a2, 2 10321; RV32I-NEXT: call __atomic_fetch_and_4@plt 10322; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10323; RV32I-NEXT: addi sp, sp, 16 10324; RV32I-NEXT: ret 10325; 10326; RV32IA-LABEL: atomicrmw_and_i32_acquire: 10327; RV32IA: # %bb.0: 10328; RV32IA-NEXT: amoand.w.aq a0, a1, (a0) 10329; RV32IA-NEXT: ret 10330; 10331; RV64I-LABEL: atomicrmw_and_i32_acquire: 10332; RV64I: # %bb.0: 10333; RV64I-NEXT: addi sp, sp, -16 10334; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10335; RV64I-NEXT: li a2, 2 10336; RV64I-NEXT: call __atomic_fetch_and_4@plt 10337; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10338; RV64I-NEXT: addi sp, sp, 16 10339; RV64I-NEXT: ret 10340; 10341; RV64IA-LABEL: atomicrmw_and_i32_acquire: 10342; RV64IA: # %bb.0: 10343; RV64IA-NEXT: amoand.w.aq a0, a1, (a0) 10344; RV64IA-NEXT: ret 10345 %1 = atomicrmw and i32* %a, i32 %b acquire 10346 ret i32 %1 10347} 10348 10349define i32 @atomicrmw_and_i32_release(i32 *%a, i32 %b) nounwind { 10350; RV32I-LABEL: atomicrmw_and_i32_release: 10351; RV32I: # %bb.0: 10352; RV32I-NEXT: addi sp, sp, -16 10353; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10354; RV32I-NEXT: li a2, 3 10355; RV32I-NEXT: call __atomic_fetch_and_4@plt 10356; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10357; RV32I-NEXT: addi sp, sp, 16 10358; RV32I-NEXT: ret 10359; 10360; RV32IA-LABEL: atomicrmw_and_i32_release: 10361; RV32IA: # %bb.0: 10362; RV32IA-NEXT: amoand.w.rl a0, a1, (a0) 10363; RV32IA-NEXT: ret 10364; 10365; RV64I-LABEL: atomicrmw_and_i32_release: 10366; RV64I: # %bb.0: 10367; RV64I-NEXT: addi sp, sp, -16 10368; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10369; RV64I-NEXT: li a2, 3 10370; RV64I-NEXT: call __atomic_fetch_and_4@plt 10371; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10372; RV64I-NEXT: addi sp, sp, 16 10373; RV64I-NEXT: ret 10374; 10375; RV64IA-LABEL: atomicrmw_and_i32_release: 10376; RV64IA: # %bb.0: 10377; RV64IA-NEXT: amoand.w.rl a0, a1, (a0) 10378; RV64IA-NEXT: ret 10379 %1 = atomicrmw and i32* %a, i32 %b release 10380 ret i32 %1 10381} 10382 10383define i32 @atomicrmw_and_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10384; RV32I-LABEL: atomicrmw_and_i32_acq_rel: 10385; RV32I: # %bb.0: 10386; RV32I-NEXT: addi sp, sp, -16 10387; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10388; RV32I-NEXT: li a2, 4 10389; RV32I-NEXT: call __atomic_fetch_and_4@plt 10390; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10391; RV32I-NEXT: addi sp, sp, 16 10392; RV32I-NEXT: ret 10393; 10394; RV32IA-LABEL: atomicrmw_and_i32_acq_rel: 10395; RV32IA: # %bb.0: 10396; RV32IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10397; RV32IA-NEXT: ret 10398; 10399; RV64I-LABEL: atomicrmw_and_i32_acq_rel: 10400; RV64I: # %bb.0: 10401; RV64I-NEXT: addi sp, sp, -16 10402; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10403; RV64I-NEXT: li a2, 4 10404; RV64I-NEXT: call __atomic_fetch_and_4@plt 10405; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10406; RV64I-NEXT: addi sp, sp, 16 10407; RV64I-NEXT: ret 10408; 10409; RV64IA-LABEL: atomicrmw_and_i32_acq_rel: 10410; RV64IA: # %bb.0: 10411; RV64IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10412; RV64IA-NEXT: ret 10413 %1 = atomicrmw and i32* %a, i32 %b acq_rel 10414 ret i32 %1 10415} 10416 10417define i32 @atomicrmw_and_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10418; RV32I-LABEL: atomicrmw_and_i32_seq_cst: 10419; RV32I: # %bb.0: 10420; RV32I-NEXT: addi sp, sp, -16 10421; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10422; RV32I-NEXT: li a2, 5 10423; RV32I-NEXT: call __atomic_fetch_and_4@plt 10424; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10425; RV32I-NEXT: addi sp, sp, 16 10426; RV32I-NEXT: ret 10427; 10428; RV32IA-LABEL: atomicrmw_and_i32_seq_cst: 10429; RV32IA: # %bb.0: 10430; RV32IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10431; RV32IA-NEXT: ret 10432; 10433; RV64I-LABEL: atomicrmw_and_i32_seq_cst: 10434; RV64I: # %bb.0: 10435; RV64I-NEXT: addi sp, sp, -16 10436; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10437; RV64I-NEXT: li a2, 5 10438; RV64I-NEXT: call __atomic_fetch_and_4@plt 10439; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10440; RV64I-NEXT: addi sp, sp, 16 10441; RV64I-NEXT: ret 10442; 10443; RV64IA-LABEL: atomicrmw_and_i32_seq_cst: 10444; RV64IA: # %bb.0: 10445; RV64IA-NEXT: amoand.w.aqrl a0, a1, (a0) 10446; RV64IA-NEXT: ret 10447 %1 = atomicrmw and i32* %a, i32 %b seq_cst 10448 ret i32 %1 10449} 10450 10451define i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind { 10452; RV32I-LABEL: atomicrmw_nand_i32_monotonic: 10453; RV32I: # %bb.0: 10454; RV32I-NEXT: addi sp, sp, -16 10455; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10456; RV32I-NEXT: li a2, 0 10457; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10458; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10459; RV32I-NEXT: addi sp, sp, 16 10460; RV32I-NEXT: ret 10461; 10462; RV32IA-LABEL: atomicrmw_nand_i32_monotonic: 10463; RV32IA: # %bb.0: 10464; RV32IA-NEXT: .LBB130_1: # =>This Inner Loop Header: Depth=1 10465; RV32IA-NEXT: lr.w a2, (a0) 10466; RV32IA-NEXT: and a3, a2, a1 10467; RV32IA-NEXT: not a3, a3 10468; RV32IA-NEXT: sc.w a3, a3, (a0) 10469; RV32IA-NEXT: bnez a3, .LBB130_1 10470; RV32IA-NEXT: # %bb.2: 10471; RV32IA-NEXT: mv a0, a2 10472; RV32IA-NEXT: ret 10473; 10474; RV64I-LABEL: atomicrmw_nand_i32_monotonic: 10475; RV64I: # %bb.0: 10476; RV64I-NEXT: addi sp, sp, -16 10477; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10478; RV64I-NEXT: li a2, 0 10479; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10480; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10481; RV64I-NEXT: addi sp, sp, 16 10482; RV64I-NEXT: ret 10483; 10484; RV64IA-LABEL: atomicrmw_nand_i32_monotonic: 10485; RV64IA: # %bb.0: 10486; RV64IA-NEXT: .LBB130_1: # =>This Inner Loop Header: Depth=1 10487; RV64IA-NEXT: lr.w a2, (a0) 10488; RV64IA-NEXT: and a3, a2, a1 10489; RV64IA-NEXT: not a3, a3 10490; RV64IA-NEXT: sc.w a3, a3, (a0) 10491; RV64IA-NEXT: bnez a3, .LBB130_1 10492; RV64IA-NEXT: # %bb.2: 10493; RV64IA-NEXT: mv a0, a2 10494; RV64IA-NEXT: ret 10495 %1 = atomicrmw nand i32* %a, i32 %b monotonic 10496 ret i32 %1 10497} 10498 10499define i32 @atomicrmw_nand_i32_acquire(i32* %a, i32 %b) nounwind { 10500; RV32I-LABEL: atomicrmw_nand_i32_acquire: 10501; RV32I: # %bb.0: 10502; RV32I-NEXT: addi sp, sp, -16 10503; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10504; RV32I-NEXT: li a2, 2 10505; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10506; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10507; RV32I-NEXT: addi sp, sp, 16 10508; RV32I-NEXT: ret 10509; 10510; RV32IA-LABEL: atomicrmw_nand_i32_acquire: 10511; RV32IA: # %bb.0: 10512; RV32IA-NEXT: .LBB131_1: # =>This Inner Loop Header: Depth=1 10513; RV32IA-NEXT: lr.w.aq a2, (a0) 10514; RV32IA-NEXT: and a3, a2, a1 10515; RV32IA-NEXT: not a3, a3 10516; RV32IA-NEXT: sc.w a3, a3, (a0) 10517; RV32IA-NEXT: bnez a3, .LBB131_1 10518; RV32IA-NEXT: # %bb.2: 10519; RV32IA-NEXT: mv a0, a2 10520; RV32IA-NEXT: ret 10521; 10522; RV64I-LABEL: atomicrmw_nand_i32_acquire: 10523; RV64I: # %bb.0: 10524; RV64I-NEXT: addi sp, sp, -16 10525; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10526; RV64I-NEXT: li a2, 2 10527; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10528; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10529; RV64I-NEXT: addi sp, sp, 16 10530; RV64I-NEXT: ret 10531; 10532; RV64IA-LABEL: atomicrmw_nand_i32_acquire: 10533; RV64IA: # %bb.0: 10534; RV64IA-NEXT: .LBB131_1: # =>This Inner Loop Header: Depth=1 10535; RV64IA-NEXT: lr.w.aq a2, (a0) 10536; RV64IA-NEXT: and a3, a2, a1 10537; RV64IA-NEXT: not a3, a3 10538; RV64IA-NEXT: sc.w a3, a3, (a0) 10539; RV64IA-NEXT: bnez a3, .LBB131_1 10540; RV64IA-NEXT: # %bb.2: 10541; RV64IA-NEXT: mv a0, a2 10542; RV64IA-NEXT: ret 10543 %1 = atomicrmw nand i32* %a, i32 %b acquire 10544 ret i32 %1 10545} 10546 10547define i32 @atomicrmw_nand_i32_release(i32* %a, i32 %b) nounwind { 10548; RV32I-LABEL: atomicrmw_nand_i32_release: 10549; RV32I: # %bb.0: 10550; RV32I-NEXT: addi sp, sp, -16 10551; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10552; RV32I-NEXT: li a2, 3 10553; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10554; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10555; RV32I-NEXT: addi sp, sp, 16 10556; RV32I-NEXT: ret 10557; 10558; RV32IA-LABEL: atomicrmw_nand_i32_release: 10559; RV32IA: # %bb.0: 10560; RV32IA-NEXT: .LBB132_1: # =>This Inner Loop Header: Depth=1 10561; RV32IA-NEXT: lr.w a2, (a0) 10562; RV32IA-NEXT: and a3, a2, a1 10563; RV32IA-NEXT: not a3, a3 10564; RV32IA-NEXT: sc.w.rl a3, a3, (a0) 10565; RV32IA-NEXT: bnez a3, .LBB132_1 10566; RV32IA-NEXT: # %bb.2: 10567; RV32IA-NEXT: mv a0, a2 10568; RV32IA-NEXT: ret 10569; 10570; RV64I-LABEL: atomicrmw_nand_i32_release: 10571; RV64I: # %bb.0: 10572; RV64I-NEXT: addi sp, sp, -16 10573; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10574; RV64I-NEXT: li a2, 3 10575; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10576; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10577; RV64I-NEXT: addi sp, sp, 16 10578; RV64I-NEXT: ret 10579; 10580; RV64IA-LABEL: atomicrmw_nand_i32_release: 10581; RV64IA: # %bb.0: 10582; RV64IA-NEXT: .LBB132_1: # =>This Inner Loop Header: Depth=1 10583; RV64IA-NEXT: lr.w a2, (a0) 10584; RV64IA-NEXT: and a3, a2, a1 10585; RV64IA-NEXT: not a3, a3 10586; RV64IA-NEXT: sc.w.rl a3, a3, (a0) 10587; RV64IA-NEXT: bnez a3, .LBB132_1 10588; RV64IA-NEXT: # %bb.2: 10589; RV64IA-NEXT: mv a0, a2 10590; RV64IA-NEXT: ret 10591 %1 = atomicrmw nand i32* %a, i32 %b release 10592 ret i32 %1 10593} 10594 10595define i32 @atomicrmw_nand_i32_acq_rel(i32* %a, i32 %b) nounwind { 10596; RV32I-LABEL: atomicrmw_nand_i32_acq_rel: 10597; RV32I: # %bb.0: 10598; RV32I-NEXT: addi sp, sp, -16 10599; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10600; RV32I-NEXT: li a2, 4 10601; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10602; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10603; RV32I-NEXT: addi sp, sp, 16 10604; RV32I-NEXT: ret 10605; 10606; RV32IA-LABEL: atomicrmw_nand_i32_acq_rel: 10607; RV32IA: # %bb.0: 10608; RV32IA-NEXT: .LBB133_1: # =>This Inner Loop Header: Depth=1 10609; RV32IA-NEXT: lr.w.aq a2, (a0) 10610; RV32IA-NEXT: and a3, a2, a1 10611; RV32IA-NEXT: not a3, a3 10612; RV32IA-NEXT: sc.w.rl a3, a3, (a0) 10613; RV32IA-NEXT: bnez a3, .LBB133_1 10614; RV32IA-NEXT: # %bb.2: 10615; RV32IA-NEXT: mv a0, a2 10616; RV32IA-NEXT: ret 10617; 10618; RV64I-LABEL: atomicrmw_nand_i32_acq_rel: 10619; RV64I: # %bb.0: 10620; RV64I-NEXT: addi sp, sp, -16 10621; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10622; RV64I-NEXT: li a2, 4 10623; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10624; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10625; RV64I-NEXT: addi sp, sp, 16 10626; RV64I-NEXT: ret 10627; 10628; RV64IA-LABEL: atomicrmw_nand_i32_acq_rel: 10629; RV64IA: # %bb.0: 10630; RV64IA-NEXT: .LBB133_1: # =>This Inner Loop Header: Depth=1 10631; RV64IA-NEXT: lr.w.aq a2, (a0) 10632; RV64IA-NEXT: and a3, a2, a1 10633; RV64IA-NEXT: not a3, a3 10634; RV64IA-NEXT: sc.w.rl a3, a3, (a0) 10635; RV64IA-NEXT: bnez a3, .LBB133_1 10636; RV64IA-NEXT: # %bb.2: 10637; RV64IA-NEXT: mv a0, a2 10638; RV64IA-NEXT: ret 10639 %1 = atomicrmw nand i32* %a, i32 %b acq_rel 10640 ret i32 %1 10641} 10642 10643define i32 @atomicrmw_nand_i32_seq_cst(i32* %a, i32 %b) nounwind { 10644; RV32I-LABEL: atomicrmw_nand_i32_seq_cst: 10645; RV32I: # %bb.0: 10646; RV32I-NEXT: addi sp, sp, -16 10647; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10648; RV32I-NEXT: li a2, 5 10649; RV32I-NEXT: call __atomic_fetch_nand_4@plt 10650; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10651; RV32I-NEXT: addi sp, sp, 16 10652; RV32I-NEXT: ret 10653; 10654; RV32IA-LABEL: atomicrmw_nand_i32_seq_cst: 10655; RV32IA: # %bb.0: 10656; RV32IA-NEXT: .LBB134_1: # =>This Inner Loop Header: Depth=1 10657; RV32IA-NEXT: lr.w.aqrl a2, (a0) 10658; RV32IA-NEXT: and a3, a2, a1 10659; RV32IA-NEXT: not a3, a3 10660; RV32IA-NEXT: sc.w.aqrl a3, a3, (a0) 10661; RV32IA-NEXT: bnez a3, .LBB134_1 10662; RV32IA-NEXT: # %bb.2: 10663; RV32IA-NEXT: mv a0, a2 10664; RV32IA-NEXT: ret 10665; 10666; RV64I-LABEL: atomicrmw_nand_i32_seq_cst: 10667; RV64I: # %bb.0: 10668; RV64I-NEXT: addi sp, sp, -16 10669; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10670; RV64I-NEXT: li a2, 5 10671; RV64I-NEXT: call __atomic_fetch_nand_4@plt 10672; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10673; RV64I-NEXT: addi sp, sp, 16 10674; RV64I-NEXT: ret 10675; 10676; RV64IA-LABEL: atomicrmw_nand_i32_seq_cst: 10677; RV64IA: # %bb.0: 10678; RV64IA-NEXT: .LBB134_1: # =>This Inner Loop Header: Depth=1 10679; RV64IA-NEXT: lr.w.aqrl a2, (a0) 10680; RV64IA-NEXT: and a3, a2, a1 10681; RV64IA-NEXT: not a3, a3 10682; RV64IA-NEXT: sc.w.aqrl a3, a3, (a0) 10683; RV64IA-NEXT: bnez a3, .LBB134_1 10684; RV64IA-NEXT: # %bb.2: 10685; RV64IA-NEXT: mv a0, a2 10686; RV64IA-NEXT: ret 10687 %1 = atomicrmw nand i32* %a, i32 %b seq_cst 10688 ret i32 %1 10689} 10690 10691define i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind { 10692; RV32I-LABEL: atomicrmw_or_i32_monotonic: 10693; RV32I: # %bb.0: 10694; RV32I-NEXT: addi sp, sp, -16 10695; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10696; RV32I-NEXT: li a2, 0 10697; RV32I-NEXT: call __atomic_fetch_or_4@plt 10698; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10699; RV32I-NEXT: addi sp, sp, 16 10700; RV32I-NEXT: ret 10701; 10702; RV32IA-LABEL: atomicrmw_or_i32_monotonic: 10703; RV32IA: # %bb.0: 10704; RV32IA-NEXT: amoor.w a0, a1, (a0) 10705; RV32IA-NEXT: ret 10706; 10707; RV64I-LABEL: atomicrmw_or_i32_monotonic: 10708; RV64I: # %bb.0: 10709; RV64I-NEXT: addi sp, sp, -16 10710; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10711; RV64I-NEXT: li a2, 0 10712; RV64I-NEXT: call __atomic_fetch_or_4@plt 10713; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10714; RV64I-NEXT: addi sp, sp, 16 10715; RV64I-NEXT: ret 10716; 10717; RV64IA-LABEL: atomicrmw_or_i32_monotonic: 10718; RV64IA: # %bb.0: 10719; RV64IA-NEXT: amoor.w a0, a1, (a0) 10720; RV64IA-NEXT: ret 10721 %1 = atomicrmw or i32* %a, i32 %b monotonic 10722 ret i32 %1 10723} 10724 10725define i32 @atomicrmw_or_i32_acquire(i32 *%a, i32 %b) nounwind { 10726; RV32I-LABEL: atomicrmw_or_i32_acquire: 10727; RV32I: # %bb.0: 10728; RV32I-NEXT: addi sp, sp, -16 10729; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10730; RV32I-NEXT: li a2, 2 10731; RV32I-NEXT: call __atomic_fetch_or_4@plt 10732; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10733; RV32I-NEXT: addi sp, sp, 16 10734; RV32I-NEXT: ret 10735; 10736; RV32IA-LABEL: atomicrmw_or_i32_acquire: 10737; RV32IA: # %bb.0: 10738; RV32IA-NEXT: amoor.w.aq a0, a1, (a0) 10739; RV32IA-NEXT: ret 10740; 10741; RV64I-LABEL: atomicrmw_or_i32_acquire: 10742; RV64I: # %bb.0: 10743; RV64I-NEXT: addi sp, sp, -16 10744; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10745; RV64I-NEXT: li a2, 2 10746; RV64I-NEXT: call __atomic_fetch_or_4@plt 10747; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10748; RV64I-NEXT: addi sp, sp, 16 10749; RV64I-NEXT: ret 10750; 10751; RV64IA-LABEL: atomicrmw_or_i32_acquire: 10752; RV64IA: # %bb.0: 10753; RV64IA-NEXT: amoor.w.aq a0, a1, (a0) 10754; RV64IA-NEXT: ret 10755 %1 = atomicrmw or i32* %a, i32 %b acquire 10756 ret i32 %1 10757} 10758 10759define i32 @atomicrmw_or_i32_release(i32 *%a, i32 %b) nounwind { 10760; RV32I-LABEL: atomicrmw_or_i32_release: 10761; RV32I: # %bb.0: 10762; RV32I-NEXT: addi sp, sp, -16 10763; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10764; RV32I-NEXT: li a2, 3 10765; RV32I-NEXT: call __atomic_fetch_or_4@plt 10766; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10767; RV32I-NEXT: addi sp, sp, 16 10768; RV32I-NEXT: ret 10769; 10770; RV32IA-LABEL: atomicrmw_or_i32_release: 10771; RV32IA: # %bb.0: 10772; RV32IA-NEXT: amoor.w.rl a0, a1, (a0) 10773; RV32IA-NEXT: ret 10774; 10775; RV64I-LABEL: atomicrmw_or_i32_release: 10776; RV64I: # %bb.0: 10777; RV64I-NEXT: addi sp, sp, -16 10778; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10779; RV64I-NEXT: li a2, 3 10780; RV64I-NEXT: call __atomic_fetch_or_4@plt 10781; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10782; RV64I-NEXT: addi sp, sp, 16 10783; RV64I-NEXT: ret 10784; 10785; RV64IA-LABEL: atomicrmw_or_i32_release: 10786; RV64IA: # %bb.0: 10787; RV64IA-NEXT: amoor.w.rl a0, a1, (a0) 10788; RV64IA-NEXT: ret 10789 %1 = atomicrmw or i32* %a, i32 %b release 10790 ret i32 %1 10791} 10792 10793define i32 @atomicrmw_or_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10794; RV32I-LABEL: atomicrmw_or_i32_acq_rel: 10795; RV32I: # %bb.0: 10796; RV32I-NEXT: addi sp, sp, -16 10797; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10798; RV32I-NEXT: li a2, 4 10799; RV32I-NEXT: call __atomic_fetch_or_4@plt 10800; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10801; RV32I-NEXT: addi sp, sp, 16 10802; RV32I-NEXT: ret 10803; 10804; RV32IA-LABEL: atomicrmw_or_i32_acq_rel: 10805; RV32IA: # %bb.0: 10806; RV32IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10807; RV32IA-NEXT: ret 10808; 10809; RV64I-LABEL: atomicrmw_or_i32_acq_rel: 10810; RV64I: # %bb.0: 10811; RV64I-NEXT: addi sp, sp, -16 10812; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10813; RV64I-NEXT: li a2, 4 10814; RV64I-NEXT: call __atomic_fetch_or_4@plt 10815; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10816; RV64I-NEXT: addi sp, sp, 16 10817; RV64I-NEXT: ret 10818; 10819; RV64IA-LABEL: atomicrmw_or_i32_acq_rel: 10820; RV64IA: # %bb.0: 10821; RV64IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10822; RV64IA-NEXT: ret 10823 %1 = atomicrmw or i32* %a, i32 %b acq_rel 10824 ret i32 %1 10825} 10826 10827define i32 @atomicrmw_or_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10828; RV32I-LABEL: atomicrmw_or_i32_seq_cst: 10829; RV32I: # %bb.0: 10830; RV32I-NEXT: addi sp, sp, -16 10831; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10832; RV32I-NEXT: li a2, 5 10833; RV32I-NEXT: call __atomic_fetch_or_4@plt 10834; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10835; RV32I-NEXT: addi sp, sp, 16 10836; RV32I-NEXT: ret 10837; 10838; RV32IA-LABEL: atomicrmw_or_i32_seq_cst: 10839; RV32IA: # %bb.0: 10840; RV32IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10841; RV32IA-NEXT: ret 10842; 10843; RV64I-LABEL: atomicrmw_or_i32_seq_cst: 10844; RV64I: # %bb.0: 10845; RV64I-NEXT: addi sp, sp, -16 10846; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10847; RV64I-NEXT: li a2, 5 10848; RV64I-NEXT: call __atomic_fetch_or_4@plt 10849; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10850; RV64I-NEXT: addi sp, sp, 16 10851; RV64I-NEXT: ret 10852; 10853; RV64IA-LABEL: atomicrmw_or_i32_seq_cst: 10854; RV64IA: # %bb.0: 10855; RV64IA-NEXT: amoor.w.aqrl a0, a1, (a0) 10856; RV64IA-NEXT: ret 10857 %1 = atomicrmw or i32* %a, i32 %b seq_cst 10858 ret i32 %1 10859} 10860 10861define i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind { 10862; RV32I-LABEL: atomicrmw_xor_i32_monotonic: 10863; RV32I: # %bb.0: 10864; RV32I-NEXT: addi sp, sp, -16 10865; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10866; RV32I-NEXT: li a2, 0 10867; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10868; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10869; RV32I-NEXT: addi sp, sp, 16 10870; RV32I-NEXT: ret 10871; 10872; RV32IA-LABEL: atomicrmw_xor_i32_monotonic: 10873; RV32IA: # %bb.0: 10874; RV32IA-NEXT: amoxor.w a0, a1, (a0) 10875; RV32IA-NEXT: ret 10876; 10877; RV64I-LABEL: atomicrmw_xor_i32_monotonic: 10878; RV64I: # %bb.0: 10879; RV64I-NEXT: addi sp, sp, -16 10880; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10881; RV64I-NEXT: li a2, 0 10882; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10883; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10884; RV64I-NEXT: addi sp, sp, 16 10885; RV64I-NEXT: ret 10886; 10887; RV64IA-LABEL: atomicrmw_xor_i32_monotonic: 10888; RV64IA: # %bb.0: 10889; RV64IA-NEXT: amoxor.w a0, a1, (a0) 10890; RV64IA-NEXT: ret 10891 %1 = atomicrmw xor i32* %a, i32 %b monotonic 10892 ret i32 %1 10893} 10894 10895define i32 @atomicrmw_xor_i32_acquire(i32 *%a, i32 %b) nounwind { 10896; RV32I-LABEL: atomicrmw_xor_i32_acquire: 10897; RV32I: # %bb.0: 10898; RV32I-NEXT: addi sp, sp, -16 10899; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10900; RV32I-NEXT: li a2, 2 10901; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10902; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10903; RV32I-NEXT: addi sp, sp, 16 10904; RV32I-NEXT: ret 10905; 10906; RV32IA-LABEL: atomicrmw_xor_i32_acquire: 10907; RV32IA: # %bb.0: 10908; RV32IA-NEXT: amoxor.w.aq a0, a1, (a0) 10909; RV32IA-NEXT: ret 10910; 10911; RV64I-LABEL: atomicrmw_xor_i32_acquire: 10912; RV64I: # %bb.0: 10913; RV64I-NEXT: addi sp, sp, -16 10914; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10915; RV64I-NEXT: li a2, 2 10916; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10917; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10918; RV64I-NEXT: addi sp, sp, 16 10919; RV64I-NEXT: ret 10920; 10921; RV64IA-LABEL: atomicrmw_xor_i32_acquire: 10922; RV64IA: # %bb.0: 10923; RV64IA-NEXT: amoxor.w.aq a0, a1, (a0) 10924; RV64IA-NEXT: ret 10925 %1 = atomicrmw xor i32* %a, i32 %b acquire 10926 ret i32 %1 10927} 10928 10929define i32 @atomicrmw_xor_i32_release(i32 *%a, i32 %b) nounwind { 10930; RV32I-LABEL: atomicrmw_xor_i32_release: 10931; RV32I: # %bb.0: 10932; RV32I-NEXT: addi sp, sp, -16 10933; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10934; RV32I-NEXT: li a2, 3 10935; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10936; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10937; RV32I-NEXT: addi sp, sp, 16 10938; RV32I-NEXT: ret 10939; 10940; RV32IA-LABEL: atomicrmw_xor_i32_release: 10941; RV32IA: # %bb.0: 10942; RV32IA-NEXT: amoxor.w.rl a0, a1, (a0) 10943; RV32IA-NEXT: ret 10944; 10945; RV64I-LABEL: atomicrmw_xor_i32_release: 10946; RV64I: # %bb.0: 10947; RV64I-NEXT: addi sp, sp, -16 10948; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10949; RV64I-NEXT: li a2, 3 10950; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10951; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10952; RV64I-NEXT: addi sp, sp, 16 10953; RV64I-NEXT: ret 10954; 10955; RV64IA-LABEL: atomicrmw_xor_i32_release: 10956; RV64IA: # %bb.0: 10957; RV64IA-NEXT: amoxor.w.rl a0, a1, (a0) 10958; RV64IA-NEXT: ret 10959 %1 = atomicrmw xor i32* %a, i32 %b release 10960 ret i32 %1 10961} 10962 10963define i32 @atomicrmw_xor_i32_acq_rel(i32 *%a, i32 %b) nounwind { 10964; RV32I-LABEL: atomicrmw_xor_i32_acq_rel: 10965; RV32I: # %bb.0: 10966; RV32I-NEXT: addi sp, sp, -16 10967; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10968; RV32I-NEXT: li a2, 4 10969; RV32I-NEXT: call __atomic_fetch_xor_4@plt 10970; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10971; RV32I-NEXT: addi sp, sp, 16 10972; RV32I-NEXT: ret 10973; 10974; RV32IA-LABEL: atomicrmw_xor_i32_acq_rel: 10975; RV32IA: # %bb.0: 10976; RV32IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 10977; RV32IA-NEXT: ret 10978; 10979; RV64I-LABEL: atomicrmw_xor_i32_acq_rel: 10980; RV64I: # %bb.0: 10981; RV64I-NEXT: addi sp, sp, -16 10982; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10983; RV64I-NEXT: li a2, 4 10984; RV64I-NEXT: call __atomic_fetch_xor_4@plt 10985; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10986; RV64I-NEXT: addi sp, sp, 16 10987; RV64I-NEXT: ret 10988; 10989; RV64IA-LABEL: atomicrmw_xor_i32_acq_rel: 10990; RV64IA: # %bb.0: 10991; RV64IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 10992; RV64IA-NEXT: ret 10993 %1 = atomicrmw xor i32* %a, i32 %b acq_rel 10994 ret i32 %1 10995} 10996 10997define i32 @atomicrmw_xor_i32_seq_cst(i32 *%a, i32 %b) nounwind { 10998; RV32I-LABEL: atomicrmw_xor_i32_seq_cst: 10999; RV32I: # %bb.0: 11000; RV32I-NEXT: addi sp, sp, -16 11001; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11002; RV32I-NEXT: li a2, 5 11003; RV32I-NEXT: call __atomic_fetch_xor_4@plt 11004; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11005; RV32I-NEXT: addi sp, sp, 16 11006; RV32I-NEXT: ret 11007; 11008; RV32IA-LABEL: atomicrmw_xor_i32_seq_cst: 11009; RV32IA: # %bb.0: 11010; RV32IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 11011; RV32IA-NEXT: ret 11012; 11013; RV64I-LABEL: atomicrmw_xor_i32_seq_cst: 11014; RV64I: # %bb.0: 11015; RV64I-NEXT: addi sp, sp, -16 11016; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11017; RV64I-NEXT: li a2, 5 11018; RV64I-NEXT: call __atomic_fetch_xor_4@plt 11019; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11020; RV64I-NEXT: addi sp, sp, 16 11021; RV64I-NEXT: ret 11022; 11023; RV64IA-LABEL: atomicrmw_xor_i32_seq_cst: 11024; RV64IA: # %bb.0: 11025; RV64IA-NEXT: amoxor.w.aqrl a0, a1, (a0) 11026; RV64IA-NEXT: ret 11027 %1 = atomicrmw xor i32* %a, i32 %b seq_cst 11028 ret i32 %1 11029} 11030 11031define i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind { 11032; RV32I-LABEL: atomicrmw_max_i32_monotonic: 11033; RV32I: # %bb.0: 11034; RV32I-NEXT: addi sp, sp, -16 11035; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11036; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11037; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11038; RV32I-NEXT: mv s0, a0 11039; RV32I-NEXT: lw a3, 0(a0) 11040; RV32I-NEXT: mv s1, a1 11041; RV32I-NEXT: j .LBB145_2 11042; RV32I-NEXT: .LBB145_1: # %atomicrmw.start 11043; RV32I-NEXT: # in Loop: Header=BB145_2 Depth=1 11044; RV32I-NEXT: sw a3, 0(sp) 11045; RV32I-NEXT: mv a1, sp 11046; RV32I-NEXT: mv a0, s0 11047; RV32I-NEXT: li a3, 0 11048; RV32I-NEXT: li a4, 0 11049; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11050; RV32I-NEXT: lw a3, 0(sp) 11051; RV32I-NEXT: bnez a0, .LBB145_4 11052; RV32I-NEXT: .LBB145_2: # %atomicrmw.start 11053; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11054; RV32I-NEXT: mv a2, a3 11055; RV32I-NEXT: blt s1, a3, .LBB145_1 11056; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11057; RV32I-NEXT: # in Loop: Header=BB145_2 Depth=1 11058; RV32I-NEXT: mv a2, s1 11059; RV32I-NEXT: j .LBB145_1 11060; RV32I-NEXT: .LBB145_4: # %atomicrmw.end 11061; RV32I-NEXT: mv a0, a3 11062; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11063; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11064; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11065; RV32I-NEXT: addi sp, sp, 16 11066; RV32I-NEXT: ret 11067; 11068; RV32IA-LABEL: atomicrmw_max_i32_monotonic: 11069; RV32IA: # %bb.0: 11070; RV32IA-NEXT: amomax.w a0, a1, (a0) 11071; RV32IA-NEXT: ret 11072; 11073; RV64I-LABEL: atomicrmw_max_i32_monotonic: 11074; RV64I: # %bb.0: 11075; RV64I-NEXT: addi sp, sp, -48 11076; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11077; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11078; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11079; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11080; RV64I-NEXT: mv s0, a0 11081; RV64I-NEXT: lw a3, 0(a0) 11082; RV64I-NEXT: mv s1, a1 11083; RV64I-NEXT: sext.w s2, a1 11084; RV64I-NEXT: j .LBB145_2 11085; RV64I-NEXT: .LBB145_1: # %atomicrmw.start 11086; RV64I-NEXT: # in Loop: Header=BB145_2 Depth=1 11087; RV64I-NEXT: sw a3, 12(sp) 11088; RV64I-NEXT: addi a1, sp, 12 11089; RV64I-NEXT: mv a0, s0 11090; RV64I-NEXT: li a3, 0 11091; RV64I-NEXT: li a4, 0 11092; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11093; RV64I-NEXT: lw a3, 12(sp) 11094; RV64I-NEXT: bnez a0, .LBB145_4 11095; RV64I-NEXT: .LBB145_2: # %atomicrmw.start 11096; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11097; RV64I-NEXT: mv a2, a3 11098; RV64I-NEXT: blt s2, a3, .LBB145_1 11099; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11100; RV64I-NEXT: # in Loop: Header=BB145_2 Depth=1 11101; RV64I-NEXT: mv a2, s1 11102; RV64I-NEXT: j .LBB145_1 11103; RV64I-NEXT: .LBB145_4: # %atomicrmw.end 11104; RV64I-NEXT: mv a0, a3 11105; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11106; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11107; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11108; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11109; RV64I-NEXT: addi sp, sp, 48 11110; RV64I-NEXT: ret 11111; 11112; RV64IA-LABEL: atomicrmw_max_i32_monotonic: 11113; RV64IA: # %bb.0: 11114; RV64IA-NEXT: amomax.w a0, a1, (a0) 11115; RV64IA-NEXT: ret 11116 %1 = atomicrmw max i32* %a, i32 %b monotonic 11117 ret i32 %1 11118} 11119 11120define i32 @atomicrmw_max_i32_acquire(i32 *%a, i32 %b) nounwind { 11121; RV32I-LABEL: atomicrmw_max_i32_acquire: 11122; RV32I: # %bb.0: 11123; RV32I-NEXT: addi sp, sp, -16 11124; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11125; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11126; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11127; RV32I-NEXT: mv s0, a0 11128; RV32I-NEXT: lw a3, 0(a0) 11129; RV32I-NEXT: mv s1, a1 11130; RV32I-NEXT: j .LBB146_2 11131; RV32I-NEXT: .LBB146_1: # %atomicrmw.start 11132; RV32I-NEXT: # in Loop: Header=BB146_2 Depth=1 11133; RV32I-NEXT: sw a3, 0(sp) 11134; RV32I-NEXT: mv a1, sp 11135; RV32I-NEXT: li a3, 2 11136; RV32I-NEXT: li a4, 2 11137; RV32I-NEXT: mv a0, s0 11138; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11139; RV32I-NEXT: lw a3, 0(sp) 11140; RV32I-NEXT: bnez a0, .LBB146_4 11141; RV32I-NEXT: .LBB146_2: # %atomicrmw.start 11142; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11143; RV32I-NEXT: mv a2, a3 11144; RV32I-NEXT: blt s1, a3, .LBB146_1 11145; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11146; RV32I-NEXT: # in Loop: Header=BB146_2 Depth=1 11147; RV32I-NEXT: mv a2, s1 11148; RV32I-NEXT: j .LBB146_1 11149; RV32I-NEXT: .LBB146_4: # %atomicrmw.end 11150; RV32I-NEXT: mv a0, a3 11151; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11152; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11153; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11154; RV32I-NEXT: addi sp, sp, 16 11155; RV32I-NEXT: ret 11156; 11157; RV32IA-LABEL: atomicrmw_max_i32_acquire: 11158; RV32IA: # %bb.0: 11159; RV32IA-NEXT: amomax.w.aq a0, a1, (a0) 11160; RV32IA-NEXT: ret 11161; 11162; RV64I-LABEL: atomicrmw_max_i32_acquire: 11163; RV64I: # %bb.0: 11164; RV64I-NEXT: addi sp, sp, -48 11165; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11166; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11167; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11168; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11169; RV64I-NEXT: mv s0, a0 11170; RV64I-NEXT: lw a3, 0(a0) 11171; RV64I-NEXT: mv s1, a1 11172; RV64I-NEXT: sext.w s2, a1 11173; RV64I-NEXT: j .LBB146_2 11174; RV64I-NEXT: .LBB146_1: # %atomicrmw.start 11175; RV64I-NEXT: # in Loop: Header=BB146_2 Depth=1 11176; RV64I-NEXT: sw a3, 12(sp) 11177; RV64I-NEXT: addi a1, sp, 12 11178; RV64I-NEXT: li a3, 2 11179; RV64I-NEXT: li a4, 2 11180; RV64I-NEXT: mv a0, s0 11181; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11182; RV64I-NEXT: lw a3, 12(sp) 11183; RV64I-NEXT: bnez a0, .LBB146_4 11184; RV64I-NEXT: .LBB146_2: # %atomicrmw.start 11185; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11186; RV64I-NEXT: mv a2, a3 11187; RV64I-NEXT: blt s2, a3, .LBB146_1 11188; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11189; RV64I-NEXT: # in Loop: Header=BB146_2 Depth=1 11190; RV64I-NEXT: mv a2, s1 11191; RV64I-NEXT: j .LBB146_1 11192; RV64I-NEXT: .LBB146_4: # %atomicrmw.end 11193; RV64I-NEXT: mv a0, a3 11194; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11195; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11196; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11197; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11198; RV64I-NEXT: addi sp, sp, 48 11199; RV64I-NEXT: ret 11200; 11201; RV64IA-LABEL: atomicrmw_max_i32_acquire: 11202; RV64IA: # %bb.0: 11203; RV64IA-NEXT: amomax.w.aq a0, a1, (a0) 11204; RV64IA-NEXT: ret 11205 %1 = atomicrmw max i32* %a, i32 %b acquire 11206 ret i32 %1 11207} 11208 11209define i32 @atomicrmw_max_i32_release(i32 *%a, i32 %b) nounwind { 11210; RV32I-LABEL: atomicrmw_max_i32_release: 11211; RV32I: # %bb.0: 11212; RV32I-NEXT: addi sp, sp, -16 11213; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11214; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11215; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11216; RV32I-NEXT: mv s0, a0 11217; RV32I-NEXT: lw a3, 0(a0) 11218; RV32I-NEXT: mv s1, a1 11219; RV32I-NEXT: j .LBB147_2 11220; RV32I-NEXT: .LBB147_1: # %atomicrmw.start 11221; RV32I-NEXT: # in Loop: Header=BB147_2 Depth=1 11222; RV32I-NEXT: sw a3, 0(sp) 11223; RV32I-NEXT: mv a1, sp 11224; RV32I-NEXT: li a3, 3 11225; RV32I-NEXT: mv a0, s0 11226; RV32I-NEXT: li a4, 0 11227; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11228; RV32I-NEXT: lw a3, 0(sp) 11229; RV32I-NEXT: bnez a0, .LBB147_4 11230; RV32I-NEXT: .LBB147_2: # %atomicrmw.start 11231; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11232; RV32I-NEXT: mv a2, a3 11233; RV32I-NEXT: blt s1, a3, .LBB147_1 11234; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11235; RV32I-NEXT: # in Loop: Header=BB147_2 Depth=1 11236; RV32I-NEXT: mv a2, s1 11237; RV32I-NEXT: j .LBB147_1 11238; RV32I-NEXT: .LBB147_4: # %atomicrmw.end 11239; RV32I-NEXT: mv a0, a3 11240; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11241; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11242; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11243; RV32I-NEXT: addi sp, sp, 16 11244; RV32I-NEXT: ret 11245; 11246; RV32IA-LABEL: atomicrmw_max_i32_release: 11247; RV32IA: # %bb.0: 11248; RV32IA-NEXT: amomax.w.rl a0, a1, (a0) 11249; RV32IA-NEXT: ret 11250; 11251; RV64I-LABEL: atomicrmw_max_i32_release: 11252; RV64I: # %bb.0: 11253; RV64I-NEXT: addi sp, sp, -48 11254; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11255; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11256; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11257; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11258; RV64I-NEXT: mv s0, a0 11259; RV64I-NEXT: lw a3, 0(a0) 11260; RV64I-NEXT: mv s1, a1 11261; RV64I-NEXT: sext.w s2, a1 11262; RV64I-NEXT: j .LBB147_2 11263; RV64I-NEXT: .LBB147_1: # %atomicrmw.start 11264; RV64I-NEXT: # in Loop: Header=BB147_2 Depth=1 11265; RV64I-NEXT: sw a3, 12(sp) 11266; RV64I-NEXT: addi a1, sp, 12 11267; RV64I-NEXT: li a3, 3 11268; RV64I-NEXT: mv a0, s0 11269; RV64I-NEXT: li a4, 0 11270; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11271; RV64I-NEXT: lw a3, 12(sp) 11272; RV64I-NEXT: bnez a0, .LBB147_4 11273; RV64I-NEXT: .LBB147_2: # %atomicrmw.start 11274; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11275; RV64I-NEXT: mv a2, a3 11276; RV64I-NEXT: blt s2, a3, .LBB147_1 11277; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11278; RV64I-NEXT: # in Loop: Header=BB147_2 Depth=1 11279; RV64I-NEXT: mv a2, s1 11280; RV64I-NEXT: j .LBB147_1 11281; RV64I-NEXT: .LBB147_4: # %atomicrmw.end 11282; RV64I-NEXT: mv a0, a3 11283; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11284; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11285; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11286; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11287; RV64I-NEXT: addi sp, sp, 48 11288; RV64I-NEXT: ret 11289; 11290; RV64IA-LABEL: atomicrmw_max_i32_release: 11291; RV64IA: # %bb.0: 11292; RV64IA-NEXT: amomax.w.rl a0, a1, (a0) 11293; RV64IA-NEXT: ret 11294 %1 = atomicrmw max i32* %a, i32 %b release 11295 ret i32 %1 11296} 11297 11298define i32 @atomicrmw_max_i32_acq_rel(i32 *%a, i32 %b) nounwind { 11299; RV32I-LABEL: atomicrmw_max_i32_acq_rel: 11300; RV32I: # %bb.0: 11301; RV32I-NEXT: addi sp, sp, -16 11302; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11303; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11304; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11305; RV32I-NEXT: mv s0, a0 11306; RV32I-NEXT: lw a3, 0(a0) 11307; RV32I-NEXT: mv s1, a1 11308; RV32I-NEXT: j .LBB148_2 11309; RV32I-NEXT: .LBB148_1: # %atomicrmw.start 11310; RV32I-NEXT: # in Loop: Header=BB148_2 Depth=1 11311; RV32I-NEXT: sw a3, 0(sp) 11312; RV32I-NEXT: mv a1, sp 11313; RV32I-NEXT: li a3, 4 11314; RV32I-NEXT: li a4, 2 11315; RV32I-NEXT: mv a0, s0 11316; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11317; RV32I-NEXT: lw a3, 0(sp) 11318; RV32I-NEXT: bnez a0, .LBB148_4 11319; RV32I-NEXT: .LBB148_2: # %atomicrmw.start 11320; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11321; RV32I-NEXT: mv a2, a3 11322; RV32I-NEXT: blt s1, a3, .LBB148_1 11323; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11324; RV32I-NEXT: # in Loop: Header=BB148_2 Depth=1 11325; RV32I-NEXT: mv a2, s1 11326; RV32I-NEXT: j .LBB148_1 11327; RV32I-NEXT: .LBB148_4: # %atomicrmw.end 11328; RV32I-NEXT: mv a0, a3 11329; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11330; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11331; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11332; RV32I-NEXT: addi sp, sp, 16 11333; RV32I-NEXT: ret 11334; 11335; RV32IA-LABEL: atomicrmw_max_i32_acq_rel: 11336; RV32IA: # %bb.0: 11337; RV32IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11338; RV32IA-NEXT: ret 11339; 11340; RV64I-LABEL: atomicrmw_max_i32_acq_rel: 11341; RV64I: # %bb.0: 11342; RV64I-NEXT: addi sp, sp, -48 11343; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11344; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11345; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11346; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11347; RV64I-NEXT: mv s0, a0 11348; RV64I-NEXT: lw a3, 0(a0) 11349; RV64I-NEXT: mv s1, a1 11350; RV64I-NEXT: sext.w s2, a1 11351; RV64I-NEXT: j .LBB148_2 11352; RV64I-NEXT: .LBB148_1: # %atomicrmw.start 11353; RV64I-NEXT: # in Loop: Header=BB148_2 Depth=1 11354; RV64I-NEXT: sw a3, 12(sp) 11355; RV64I-NEXT: addi a1, sp, 12 11356; RV64I-NEXT: li a3, 4 11357; RV64I-NEXT: li a4, 2 11358; RV64I-NEXT: mv a0, s0 11359; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11360; RV64I-NEXT: lw a3, 12(sp) 11361; RV64I-NEXT: bnez a0, .LBB148_4 11362; RV64I-NEXT: .LBB148_2: # %atomicrmw.start 11363; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11364; RV64I-NEXT: mv a2, a3 11365; RV64I-NEXT: blt s2, a3, .LBB148_1 11366; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11367; RV64I-NEXT: # in Loop: Header=BB148_2 Depth=1 11368; RV64I-NEXT: mv a2, s1 11369; RV64I-NEXT: j .LBB148_1 11370; RV64I-NEXT: .LBB148_4: # %atomicrmw.end 11371; RV64I-NEXT: mv a0, a3 11372; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11373; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11374; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11375; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11376; RV64I-NEXT: addi sp, sp, 48 11377; RV64I-NEXT: ret 11378; 11379; RV64IA-LABEL: atomicrmw_max_i32_acq_rel: 11380; RV64IA: # %bb.0: 11381; RV64IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11382; RV64IA-NEXT: ret 11383 %1 = atomicrmw max i32* %a, i32 %b acq_rel 11384 ret i32 %1 11385} 11386 11387define i32 @atomicrmw_max_i32_seq_cst(i32 *%a, i32 %b) nounwind { 11388; RV32I-LABEL: atomicrmw_max_i32_seq_cst: 11389; RV32I: # %bb.0: 11390; RV32I-NEXT: addi sp, sp, -16 11391; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11392; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11393; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11394; RV32I-NEXT: mv s0, a0 11395; RV32I-NEXT: lw a3, 0(a0) 11396; RV32I-NEXT: mv s1, a1 11397; RV32I-NEXT: j .LBB149_2 11398; RV32I-NEXT: .LBB149_1: # %atomicrmw.start 11399; RV32I-NEXT: # in Loop: Header=BB149_2 Depth=1 11400; RV32I-NEXT: sw a3, 0(sp) 11401; RV32I-NEXT: mv a1, sp 11402; RV32I-NEXT: li a3, 5 11403; RV32I-NEXT: li a4, 5 11404; RV32I-NEXT: mv a0, s0 11405; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11406; RV32I-NEXT: lw a3, 0(sp) 11407; RV32I-NEXT: bnez a0, .LBB149_4 11408; RV32I-NEXT: .LBB149_2: # %atomicrmw.start 11409; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11410; RV32I-NEXT: mv a2, a3 11411; RV32I-NEXT: blt s1, a3, .LBB149_1 11412; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11413; RV32I-NEXT: # in Loop: Header=BB149_2 Depth=1 11414; RV32I-NEXT: mv a2, s1 11415; RV32I-NEXT: j .LBB149_1 11416; RV32I-NEXT: .LBB149_4: # %atomicrmw.end 11417; RV32I-NEXT: mv a0, a3 11418; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11419; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11420; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11421; RV32I-NEXT: addi sp, sp, 16 11422; RV32I-NEXT: ret 11423; 11424; RV32IA-LABEL: atomicrmw_max_i32_seq_cst: 11425; RV32IA: # %bb.0: 11426; RV32IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11427; RV32IA-NEXT: ret 11428; 11429; RV64I-LABEL: atomicrmw_max_i32_seq_cst: 11430; RV64I: # %bb.0: 11431; RV64I-NEXT: addi sp, sp, -48 11432; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11433; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11434; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11435; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11436; RV64I-NEXT: mv s0, a0 11437; RV64I-NEXT: lw a3, 0(a0) 11438; RV64I-NEXT: mv s1, a1 11439; RV64I-NEXT: sext.w s2, a1 11440; RV64I-NEXT: j .LBB149_2 11441; RV64I-NEXT: .LBB149_1: # %atomicrmw.start 11442; RV64I-NEXT: # in Loop: Header=BB149_2 Depth=1 11443; RV64I-NEXT: sw a3, 12(sp) 11444; RV64I-NEXT: addi a1, sp, 12 11445; RV64I-NEXT: li a3, 5 11446; RV64I-NEXT: li a4, 5 11447; RV64I-NEXT: mv a0, s0 11448; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11449; RV64I-NEXT: lw a3, 12(sp) 11450; RV64I-NEXT: bnez a0, .LBB149_4 11451; RV64I-NEXT: .LBB149_2: # %atomicrmw.start 11452; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11453; RV64I-NEXT: mv a2, a3 11454; RV64I-NEXT: blt s2, a3, .LBB149_1 11455; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11456; RV64I-NEXT: # in Loop: Header=BB149_2 Depth=1 11457; RV64I-NEXT: mv a2, s1 11458; RV64I-NEXT: j .LBB149_1 11459; RV64I-NEXT: .LBB149_4: # %atomicrmw.end 11460; RV64I-NEXT: mv a0, a3 11461; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11462; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11463; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11464; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11465; RV64I-NEXT: addi sp, sp, 48 11466; RV64I-NEXT: ret 11467; 11468; RV64IA-LABEL: atomicrmw_max_i32_seq_cst: 11469; RV64IA: # %bb.0: 11470; RV64IA-NEXT: amomax.w.aqrl a0, a1, (a0) 11471; RV64IA-NEXT: ret 11472 %1 = atomicrmw max i32* %a, i32 %b seq_cst 11473 ret i32 %1 11474} 11475 11476define i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind { 11477; RV32I-LABEL: atomicrmw_min_i32_monotonic: 11478; RV32I: # %bb.0: 11479; RV32I-NEXT: addi sp, sp, -16 11480; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11481; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11482; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11483; RV32I-NEXT: mv s0, a0 11484; RV32I-NEXT: lw a3, 0(a0) 11485; RV32I-NEXT: mv s1, a1 11486; RV32I-NEXT: j .LBB150_2 11487; RV32I-NEXT: .LBB150_1: # %atomicrmw.start 11488; RV32I-NEXT: # in Loop: Header=BB150_2 Depth=1 11489; RV32I-NEXT: sw a3, 0(sp) 11490; RV32I-NEXT: mv a1, sp 11491; RV32I-NEXT: mv a0, s0 11492; RV32I-NEXT: li a3, 0 11493; RV32I-NEXT: li a4, 0 11494; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11495; RV32I-NEXT: lw a3, 0(sp) 11496; RV32I-NEXT: bnez a0, .LBB150_4 11497; RV32I-NEXT: .LBB150_2: # %atomicrmw.start 11498; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11499; RV32I-NEXT: mv a2, a3 11500; RV32I-NEXT: bge s1, a3, .LBB150_1 11501; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11502; RV32I-NEXT: # in Loop: Header=BB150_2 Depth=1 11503; RV32I-NEXT: mv a2, s1 11504; RV32I-NEXT: j .LBB150_1 11505; RV32I-NEXT: .LBB150_4: # %atomicrmw.end 11506; RV32I-NEXT: mv a0, a3 11507; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11508; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11509; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11510; RV32I-NEXT: addi sp, sp, 16 11511; RV32I-NEXT: ret 11512; 11513; RV32IA-LABEL: atomicrmw_min_i32_monotonic: 11514; RV32IA: # %bb.0: 11515; RV32IA-NEXT: amomin.w a0, a1, (a0) 11516; RV32IA-NEXT: ret 11517; 11518; RV64I-LABEL: atomicrmw_min_i32_monotonic: 11519; RV64I: # %bb.0: 11520; RV64I-NEXT: addi sp, sp, -48 11521; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11522; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11523; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11524; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11525; RV64I-NEXT: mv s0, a0 11526; RV64I-NEXT: lw a3, 0(a0) 11527; RV64I-NEXT: mv s1, a1 11528; RV64I-NEXT: sext.w s2, a1 11529; RV64I-NEXT: j .LBB150_2 11530; RV64I-NEXT: .LBB150_1: # %atomicrmw.start 11531; RV64I-NEXT: # in Loop: Header=BB150_2 Depth=1 11532; RV64I-NEXT: sw a3, 12(sp) 11533; RV64I-NEXT: addi a1, sp, 12 11534; RV64I-NEXT: mv a0, s0 11535; RV64I-NEXT: li a3, 0 11536; RV64I-NEXT: li a4, 0 11537; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11538; RV64I-NEXT: lw a3, 12(sp) 11539; RV64I-NEXT: bnez a0, .LBB150_4 11540; RV64I-NEXT: .LBB150_2: # %atomicrmw.start 11541; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11542; RV64I-NEXT: mv a2, a3 11543; RV64I-NEXT: bge s2, a3, .LBB150_1 11544; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11545; RV64I-NEXT: # in Loop: Header=BB150_2 Depth=1 11546; RV64I-NEXT: mv a2, s1 11547; RV64I-NEXT: j .LBB150_1 11548; RV64I-NEXT: .LBB150_4: # %atomicrmw.end 11549; RV64I-NEXT: mv a0, a3 11550; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11551; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11552; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11553; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11554; RV64I-NEXT: addi sp, sp, 48 11555; RV64I-NEXT: ret 11556; 11557; RV64IA-LABEL: atomicrmw_min_i32_monotonic: 11558; RV64IA: # %bb.0: 11559; RV64IA-NEXT: amomin.w a0, a1, (a0) 11560; RV64IA-NEXT: ret 11561 %1 = atomicrmw min i32* %a, i32 %b monotonic 11562 ret i32 %1 11563} 11564 11565define i32 @atomicrmw_min_i32_acquire(i32 *%a, i32 %b) nounwind { 11566; RV32I-LABEL: atomicrmw_min_i32_acquire: 11567; RV32I: # %bb.0: 11568; RV32I-NEXT: addi sp, sp, -16 11569; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11570; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11571; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11572; RV32I-NEXT: mv s0, a0 11573; RV32I-NEXT: lw a3, 0(a0) 11574; RV32I-NEXT: mv s1, a1 11575; RV32I-NEXT: j .LBB151_2 11576; RV32I-NEXT: .LBB151_1: # %atomicrmw.start 11577; RV32I-NEXT: # in Loop: Header=BB151_2 Depth=1 11578; RV32I-NEXT: sw a3, 0(sp) 11579; RV32I-NEXT: mv a1, sp 11580; RV32I-NEXT: li a3, 2 11581; RV32I-NEXT: li a4, 2 11582; RV32I-NEXT: mv a0, s0 11583; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11584; RV32I-NEXT: lw a3, 0(sp) 11585; RV32I-NEXT: bnez a0, .LBB151_4 11586; RV32I-NEXT: .LBB151_2: # %atomicrmw.start 11587; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11588; RV32I-NEXT: mv a2, a3 11589; RV32I-NEXT: bge s1, a3, .LBB151_1 11590; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11591; RV32I-NEXT: # in Loop: Header=BB151_2 Depth=1 11592; RV32I-NEXT: mv a2, s1 11593; RV32I-NEXT: j .LBB151_1 11594; RV32I-NEXT: .LBB151_4: # %atomicrmw.end 11595; RV32I-NEXT: mv a0, a3 11596; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11597; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11598; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11599; RV32I-NEXT: addi sp, sp, 16 11600; RV32I-NEXT: ret 11601; 11602; RV32IA-LABEL: atomicrmw_min_i32_acquire: 11603; RV32IA: # %bb.0: 11604; RV32IA-NEXT: amomin.w.aq a0, a1, (a0) 11605; RV32IA-NEXT: ret 11606; 11607; RV64I-LABEL: atomicrmw_min_i32_acquire: 11608; RV64I: # %bb.0: 11609; RV64I-NEXT: addi sp, sp, -48 11610; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11611; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11612; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11613; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11614; RV64I-NEXT: mv s0, a0 11615; RV64I-NEXT: lw a3, 0(a0) 11616; RV64I-NEXT: mv s1, a1 11617; RV64I-NEXT: sext.w s2, a1 11618; RV64I-NEXT: j .LBB151_2 11619; RV64I-NEXT: .LBB151_1: # %atomicrmw.start 11620; RV64I-NEXT: # in Loop: Header=BB151_2 Depth=1 11621; RV64I-NEXT: sw a3, 12(sp) 11622; RV64I-NEXT: addi a1, sp, 12 11623; RV64I-NEXT: li a3, 2 11624; RV64I-NEXT: li a4, 2 11625; RV64I-NEXT: mv a0, s0 11626; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11627; RV64I-NEXT: lw a3, 12(sp) 11628; RV64I-NEXT: bnez a0, .LBB151_4 11629; RV64I-NEXT: .LBB151_2: # %atomicrmw.start 11630; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11631; RV64I-NEXT: mv a2, a3 11632; RV64I-NEXT: bge s2, a3, .LBB151_1 11633; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11634; RV64I-NEXT: # in Loop: Header=BB151_2 Depth=1 11635; RV64I-NEXT: mv a2, s1 11636; RV64I-NEXT: j .LBB151_1 11637; RV64I-NEXT: .LBB151_4: # %atomicrmw.end 11638; RV64I-NEXT: mv a0, a3 11639; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11640; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11641; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11642; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11643; RV64I-NEXT: addi sp, sp, 48 11644; RV64I-NEXT: ret 11645; 11646; RV64IA-LABEL: atomicrmw_min_i32_acquire: 11647; RV64IA: # %bb.0: 11648; RV64IA-NEXT: amomin.w.aq a0, a1, (a0) 11649; RV64IA-NEXT: ret 11650 %1 = atomicrmw min i32* %a, i32 %b acquire 11651 ret i32 %1 11652} 11653 11654define i32 @atomicrmw_min_i32_release(i32 *%a, i32 %b) nounwind { 11655; RV32I-LABEL: atomicrmw_min_i32_release: 11656; RV32I: # %bb.0: 11657; RV32I-NEXT: addi sp, sp, -16 11658; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11659; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11660; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11661; RV32I-NEXT: mv s0, a0 11662; RV32I-NEXT: lw a3, 0(a0) 11663; RV32I-NEXT: mv s1, a1 11664; RV32I-NEXT: j .LBB152_2 11665; RV32I-NEXT: .LBB152_1: # %atomicrmw.start 11666; RV32I-NEXT: # in Loop: Header=BB152_2 Depth=1 11667; RV32I-NEXT: sw a3, 0(sp) 11668; RV32I-NEXT: mv a1, sp 11669; RV32I-NEXT: li a3, 3 11670; RV32I-NEXT: mv a0, s0 11671; RV32I-NEXT: li a4, 0 11672; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11673; RV32I-NEXT: lw a3, 0(sp) 11674; RV32I-NEXT: bnez a0, .LBB152_4 11675; RV32I-NEXT: .LBB152_2: # %atomicrmw.start 11676; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11677; RV32I-NEXT: mv a2, a3 11678; RV32I-NEXT: bge s1, a3, .LBB152_1 11679; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11680; RV32I-NEXT: # in Loop: Header=BB152_2 Depth=1 11681; RV32I-NEXT: mv a2, s1 11682; RV32I-NEXT: j .LBB152_1 11683; RV32I-NEXT: .LBB152_4: # %atomicrmw.end 11684; RV32I-NEXT: mv a0, a3 11685; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11686; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11687; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11688; RV32I-NEXT: addi sp, sp, 16 11689; RV32I-NEXT: ret 11690; 11691; RV32IA-LABEL: atomicrmw_min_i32_release: 11692; RV32IA: # %bb.0: 11693; RV32IA-NEXT: amomin.w.rl a0, a1, (a0) 11694; RV32IA-NEXT: ret 11695; 11696; RV64I-LABEL: atomicrmw_min_i32_release: 11697; RV64I: # %bb.0: 11698; RV64I-NEXT: addi sp, sp, -48 11699; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11700; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11701; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11702; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11703; RV64I-NEXT: mv s0, a0 11704; RV64I-NEXT: lw a3, 0(a0) 11705; RV64I-NEXT: mv s1, a1 11706; RV64I-NEXT: sext.w s2, a1 11707; RV64I-NEXT: j .LBB152_2 11708; RV64I-NEXT: .LBB152_1: # %atomicrmw.start 11709; RV64I-NEXT: # in Loop: Header=BB152_2 Depth=1 11710; RV64I-NEXT: sw a3, 12(sp) 11711; RV64I-NEXT: addi a1, sp, 12 11712; RV64I-NEXT: li a3, 3 11713; RV64I-NEXT: mv a0, s0 11714; RV64I-NEXT: li a4, 0 11715; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11716; RV64I-NEXT: lw a3, 12(sp) 11717; RV64I-NEXT: bnez a0, .LBB152_4 11718; RV64I-NEXT: .LBB152_2: # %atomicrmw.start 11719; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11720; RV64I-NEXT: mv a2, a3 11721; RV64I-NEXT: bge s2, a3, .LBB152_1 11722; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11723; RV64I-NEXT: # in Loop: Header=BB152_2 Depth=1 11724; RV64I-NEXT: mv a2, s1 11725; RV64I-NEXT: j .LBB152_1 11726; RV64I-NEXT: .LBB152_4: # %atomicrmw.end 11727; RV64I-NEXT: mv a0, a3 11728; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11729; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11730; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11731; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11732; RV64I-NEXT: addi sp, sp, 48 11733; RV64I-NEXT: ret 11734; 11735; RV64IA-LABEL: atomicrmw_min_i32_release: 11736; RV64IA: # %bb.0: 11737; RV64IA-NEXT: amomin.w.rl a0, a1, (a0) 11738; RV64IA-NEXT: ret 11739 %1 = atomicrmw min i32* %a, i32 %b release 11740 ret i32 %1 11741} 11742 11743define i32 @atomicrmw_min_i32_acq_rel(i32 *%a, i32 %b) nounwind { 11744; RV32I-LABEL: atomicrmw_min_i32_acq_rel: 11745; RV32I: # %bb.0: 11746; RV32I-NEXT: addi sp, sp, -16 11747; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11748; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11749; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11750; RV32I-NEXT: mv s0, a0 11751; RV32I-NEXT: lw a3, 0(a0) 11752; RV32I-NEXT: mv s1, a1 11753; RV32I-NEXT: j .LBB153_2 11754; RV32I-NEXT: .LBB153_1: # %atomicrmw.start 11755; RV32I-NEXT: # in Loop: Header=BB153_2 Depth=1 11756; RV32I-NEXT: sw a3, 0(sp) 11757; RV32I-NEXT: mv a1, sp 11758; RV32I-NEXT: li a3, 4 11759; RV32I-NEXT: li a4, 2 11760; RV32I-NEXT: mv a0, s0 11761; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11762; RV32I-NEXT: lw a3, 0(sp) 11763; RV32I-NEXT: bnez a0, .LBB153_4 11764; RV32I-NEXT: .LBB153_2: # %atomicrmw.start 11765; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11766; RV32I-NEXT: mv a2, a3 11767; RV32I-NEXT: bge s1, a3, .LBB153_1 11768; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11769; RV32I-NEXT: # in Loop: Header=BB153_2 Depth=1 11770; RV32I-NEXT: mv a2, s1 11771; RV32I-NEXT: j .LBB153_1 11772; RV32I-NEXT: .LBB153_4: # %atomicrmw.end 11773; RV32I-NEXT: mv a0, a3 11774; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11775; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11776; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11777; RV32I-NEXT: addi sp, sp, 16 11778; RV32I-NEXT: ret 11779; 11780; RV32IA-LABEL: atomicrmw_min_i32_acq_rel: 11781; RV32IA: # %bb.0: 11782; RV32IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11783; RV32IA-NEXT: ret 11784; 11785; RV64I-LABEL: atomicrmw_min_i32_acq_rel: 11786; RV64I: # %bb.0: 11787; RV64I-NEXT: addi sp, sp, -48 11788; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11789; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11790; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11791; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11792; RV64I-NEXT: mv s0, a0 11793; RV64I-NEXT: lw a3, 0(a0) 11794; RV64I-NEXT: mv s1, a1 11795; RV64I-NEXT: sext.w s2, a1 11796; RV64I-NEXT: j .LBB153_2 11797; RV64I-NEXT: .LBB153_1: # %atomicrmw.start 11798; RV64I-NEXT: # in Loop: Header=BB153_2 Depth=1 11799; RV64I-NEXT: sw a3, 12(sp) 11800; RV64I-NEXT: addi a1, sp, 12 11801; RV64I-NEXT: li a3, 4 11802; RV64I-NEXT: li a4, 2 11803; RV64I-NEXT: mv a0, s0 11804; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11805; RV64I-NEXT: lw a3, 12(sp) 11806; RV64I-NEXT: bnez a0, .LBB153_4 11807; RV64I-NEXT: .LBB153_2: # %atomicrmw.start 11808; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11809; RV64I-NEXT: mv a2, a3 11810; RV64I-NEXT: bge s2, a3, .LBB153_1 11811; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11812; RV64I-NEXT: # in Loop: Header=BB153_2 Depth=1 11813; RV64I-NEXT: mv a2, s1 11814; RV64I-NEXT: j .LBB153_1 11815; RV64I-NEXT: .LBB153_4: # %atomicrmw.end 11816; RV64I-NEXT: mv a0, a3 11817; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11818; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11819; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11820; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11821; RV64I-NEXT: addi sp, sp, 48 11822; RV64I-NEXT: ret 11823; 11824; RV64IA-LABEL: atomicrmw_min_i32_acq_rel: 11825; RV64IA: # %bb.0: 11826; RV64IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11827; RV64IA-NEXT: ret 11828 %1 = atomicrmw min i32* %a, i32 %b acq_rel 11829 ret i32 %1 11830} 11831 11832define i32 @atomicrmw_min_i32_seq_cst(i32 *%a, i32 %b) nounwind { 11833; RV32I-LABEL: atomicrmw_min_i32_seq_cst: 11834; RV32I: # %bb.0: 11835; RV32I-NEXT: addi sp, sp, -16 11836; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11837; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11838; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11839; RV32I-NEXT: mv s0, a0 11840; RV32I-NEXT: lw a3, 0(a0) 11841; RV32I-NEXT: mv s1, a1 11842; RV32I-NEXT: j .LBB154_2 11843; RV32I-NEXT: .LBB154_1: # %atomicrmw.start 11844; RV32I-NEXT: # in Loop: Header=BB154_2 Depth=1 11845; RV32I-NEXT: sw a3, 0(sp) 11846; RV32I-NEXT: mv a1, sp 11847; RV32I-NEXT: li a3, 5 11848; RV32I-NEXT: li a4, 5 11849; RV32I-NEXT: mv a0, s0 11850; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11851; RV32I-NEXT: lw a3, 0(sp) 11852; RV32I-NEXT: bnez a0, .LBB154_4 11853; RV32I-NEXT: .LBB154_2: # %atomicrmw.start 11854; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11855; RV32I-NEXT: mv a2, a3 11856; RV32I-NEXT: bge s1, a3, .LBB154_1 11857; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11858; RV32I-NEXT: # in Loop: Header=BB154_2 Depth=1 11859; RV32I-NEXT: mv a2, s1 11860; RV32I-NEXT: j .LBB154_1 11861; RV32I-NEXT: .LBB154_4: # %atomicrmw.end 11862; RV32I-NEXT: mv a0, a3 11863; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11864; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11865; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11866; RV32I-NEXT: addi sp, sp, 16 11867; RV32I-NEXT: ret 11868; 11869; RV32IA-LABEL: atomicrmw_min_i32_seq_cst: 11870; RV32IA: # %bb.0: 11871; RV32IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11872; RV32IA-NEXT: ret 11873; 11874; RV64I-LABEL: atomicrmw_min_i32_seq_cst: 11875; RV64I: # %bb.0: 11876; RV64I-NEXT: addi sp, sp, -48 11877; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11878; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11879; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11880; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11881; RV64I-NEXT: mv s0, a0 11882; RV64I-NEXT: lw a3, 0(a0) 11883; RV64I-NEXT: mv s1, a1 11884; RV64I-NEXT: sext.w s2, a1 11885; RV64I-NEXT: j .LBB154_2 11886; RV64I-NEXT: .LBB154_1: # %atomicrmw.start 11887; RV64I-NEXT: # in Loop: Header=BB154_2 Depth=1 11888; RV64I-NEXT: sw a3, 12(sp) 11889; RV64I-NEXT: addi a1, sp, 12 11890; RV64I-NEXT: li a3, 5 11891; RV64I-NEXT: li a4, 5 11892; RV64I-NEXT: mv a0, s0 11893; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11894; RV64I-NEXT: lw a3, 12(sp) 11895; RV64I-NEXT: bnez a0, .LBB154_4 11896; RV64I-NEXT: .LBB154_2: # %atomicrmw.start 11897; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11898; RV64I-NEXT: mv a2, a3 11899; RV64I-NEXT: bge s2, a3, .LBB154_1 11900; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11901; RV64I-NEXT: # in Loop: Header=BB154_2 Depth=1 11902; RV64I-NEXT: mv a2, s1 11903; RV64I-NEXT: j .LBB154_1 11904; RV64I-NEXT: .LBB154_4: # %atomicrmw.end 11905; RV64I-NEXT: mv a0, a3 11906; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11907; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11908; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11909; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11910; RV64I-NEXT: addi sp, sp, 48 11911; RV64I-NEXT: ret 11912; 11913; RV64IA-LABEL: atomicrmw_min_i32_seq_cst: 11914; RV64IA: # %bb.0: 11915; RV64IA-NEXT: amomin.w.aqrl a0, a1, (a0) 11916; RV64IA-NEXT: ret 11917 %1 = atomicrmw min i32* %a, i32 %b seq_cst 11918 ret i32 %1 11919} 11920 11921define i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind { 11922; RV32I-LABEL: atomicrmw_umax_i32_monotonic: 11923; RV32I: # %bb.0: 11924; RV32I-NEXT: addi sp, sp, -16 11925; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11926; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 11927; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 11928; RV32I-NEXT: mv s0, a0 11929; RV32I-NEXT: lw a3, 0(a0) 11930; RV32I-NEXT: mv s1, a1 11931; RV32I-NEXT: j .LBB155_2 11932; RV32I-NEXT: .LBB155_1: # %atomicrmw.start 11933; RV32I-NEXT: # in Loop: Header=BB155_2 Depth=1 11934; RV32I-NEXT: sw a3, 0(sp) 11935; RV32I-NEXT: mv a1, sp 11936; RV32I-NEXT: mv a0, s0 11937; RV32I-NEXT: li a3, 0 11938; RV32I-NEXT: li a4, 0 11939; RV32I-NEXT: call __atomic_compare_exchange_4@plt 11940; RV32I-NEXT: lw a3, 0(sp) 11941; RV32I-NEXT: bnez a0, .LBB155_4 11942; RV32I-NEXT: .LBB155_2: # %atomicrmw.start 11943; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 11944; RV32I-NEXT: mv a2, a3 11945; RV32I-NEXT: bltu s1, a3, .LBB155_1 11946; RV32I-NEXT: # %bb.3: # %atomicrmw.start 11947; RV32I-NEXT: # in Loop: Header=BB155_2 Depth=1 11948; RV32I-NEXT: mv a2, s1 11949; RV32I-NEXT: j .LBB155_1 11950; RV32I-NEXT: .LBB155_4: # %atomicrmw.end 11951; RV32I-NEXT: mv a0, a3 11952; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11953; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 11954; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 11955; RV32I-NEXT: addi sp, sp, 16 11956; RV32I-NEXT: ret 11957; 11958; RV32IA-LABEL: atomicrmw_umax_i32_monotonic: 11959; RV32IA: # %bb.0: 11960; RV32IA-NEXT: amomaxu.w a0, a1, (a0) 11961; RV32IA-NEXT: ret 11962; 11963; RV64I-LABEL: atomicrmw_umax_i32_monotonic: 11964; RV64I: # %bb.0: 11965; RV64I-NEXT: addi sp, sp, -48 11966; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 11967; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 11968; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 11969; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 11970; RV64I-NEXT: mv s0, a0 11971; RV64I-NEXT: lw a3, 0(a0) 11972; RV64I-NEXT: mv s1, a1 11973; RV64I-NEXT: sext.w s2, a1 11974; RV64I-NEXT: j .LBB155_2 11975; RV64I-NEXT: .LBB155_1: # %atomicrmw.start 11976; RV64I-NEXT: # in Loop: Header=BB155_2 Depth=1 11977; RV64I-NEXT: sw a3, 12(sp) 11978; RV64I-NEXT: addi a1, sp, 12 11979; RV64I-NEXT: mv a0, s0 11980; RV64I-NEXT: li a3, 0 11981; RV64I-NEXT: li a4, 0 11982; RV64I-NEXT: call __atomic_compare_exchange_4@plt 11983; RV64I-NEXT: lw a3, 12(sp) 11984; RV64I-NEXT: bnez a0, .LBB155_4 11985; RV64I-NEXT: .LBB155_2: # %atomicrmw.start 11986; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11987; RV64I-NEXT: mv a2, a3 11988; RV64I-NEXT: bltu s2, a3, .LBB155_1 11989; RV64I-NEXT: # %bb.3: # %atomicrmw.start 11990; RV64I-NEXT: # in Loop: Header=BB155_2 Depth=1 11991; RV64I-NEXT: mv a2, s1 11992; RV64I-NEXT: j .LBB155_1 11993; RV64I-NEXT: .LBB155_4: # %atomicrmw.end 11994; RV64I-NEXT: mv a0, a3 11995; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 11996; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 11997; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 11998; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 11999; RV64I-NEXT: addi sp, sp, 48 12000; RV64I-NEXT: ret 12001; 12002; RV64IA-LABEL: atomicrmw_umax_i32_monotonic: 12003; RV64IA: # %bb.0: 12004; RV64IA-NEXT: amomaxu.w a0, a1, (a0) 12005; RV64IA-NEXT: ret 12006 %1 = atomicrmw umax i32* %a, i32 %b monotonic 12007 ret i32 %1 12008} 12009 12010define i32 @atomicrmw_umax_i32_acquire(i32 *%a, i32 %b) nounwind { 12011; RV32I-LABEL: atomicrmw_umax_i32_acquire: 12012; RV32I: # %bb.0: 12013; RV32I-NEXT: addi sp, sp, -16 12014; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12015; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12016; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12017; RV32I-NEXT: mv s0, a0 12018; RV32I-NEXT: lw a3, 0(a0) 12019; RV32I-NEXT: mv s1, a1 12020; RV32I-NEXT: j .LBB156_2 12021; RV32I-NEXT: .LBB156_1: # %atomicrmw.start 12022; RV32I-NEXT: # in Loop: Header=BB156_2 Depth=1 12023; RV32I-NEXT: sw a3, 0(sp) 12024; RV32I-NEXT: mv a1, sp 12025; RV32I-NEXT: li a3, 2 12026; RV32I-NEXT: li a4, 2 12027; RV32I-NEXT: mv a0, s0 12028; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12029; RV32I-NEXT: lw a3, 0(sp) 12030; RV32I-NEXT: bnez a0, .LBB156_4 12031; RV32I-NEXT: .LBB156_2: # %atomicrmw.start 12032; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12033; RV32I-NEXT: mv a2, a3 12034; RV32I-NEXT: bltu s1, a3, .LBB156_1 12035; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12036; RV32I-NEXT: # in Loop: Header=BB156_2 Depth=1 12037; RV32I-NEXT: mv a2, s1 12038; RV32I-NEXT: j .LBB156_1 12039; RV32I-NEXT: .LBB156_4: # %atomicrmw.end 12040; RV32I-NEXT: mv a0, a3 12041; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12042; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12043; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12044; RV32I-NEXT: addi sp, sp, 16 12045; RV32I-NEXT: ret 12046; 12047; RV32IA-LABEL: atomicrmw_umax_i32_acquire: 12048; RV32IA: # %bb.0: 12049; RV32IA-NEXT: amomaxu.w.aq a0, a1, (a0) 12050; RV32IA-NEXT: ret 12051; 12052; RV64I-LABEL: atomicrmw_umax_i32_acquire: 12053; RV64I: # %bb.0: 12054; RV64I-NEXT: addi sp, sp, -48 12055; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12056; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12057; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12058; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12059; RV64I-NEXT: mv s0, a0 12060; RV64I-NEXT: lw a3, 0(a0) 12061; RV64I-NEXT: mv s1, a1 12062; RV64I-NEXT: sext.w s2, a1 12063; RV64I-NEXT: j .LBB156_2 12064; RV64I-NEXT: .LBB156_1: # %atomicrmw.start 12065; RV64I-NEXT: # in Loop: Header=BB156_2 Depth=1 12066; RV64I-NEXT: sw a3, 12(sp) 12067; RV64I-NEXT: addi a1, sp, 12 12068; RV64I-NEXT: li a3, 2 12069; RV64I-NEXT: li a4, 2 12070; RV64I-NEXT: mv a0, s0 12071; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12072; RV64I-NEXT: lw a3, 12(sp) 12073; RV64I-NEXT: bnez a0, .LBB156_4 12074; RV64I-NEXT: .LBB156_2: # %atomicrmw.start 12075; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12076; RV64I-NEXT: mv a2, a3 12077; RV64I-NEXT: bltu s2, a3, .LBB156_1 12078; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12079; RV64I-NEXT: # in Loop: Header=BB156_2 Depth=1 12080; RV64I-NEXT: mv a2, s1 12081; RV64I-NEXT: j .LBB156_1 12082; RV64I-NEXT: .LBB156_4: # %atomicrmw.end 12083; RV64I-NEXT: mv a0, a3 12084; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12085; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12086; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12087; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12088; RV64I-NEXT: addi sp, sp, 48 12089; RV64I-NEXT: ret 12090; 12091; RV64IA-LABEL: atomicrmw_umax_i32_acquire: 12092; RV64IA: # %bb.0: 12093; RV64IA-NEXT: amomaxu.w.aq a0, a1, (a0) 12094; RV64IA-NEXT: ret 12095 %1 = atomicrmw umax i32* %a, i32 %b acquire 12096 ret i32 %1 12097} 12098 12099define i32 @atomicrmw_umax_i32_release(i32 *%a, i32 %b) nounwind { 12100; RV32I-LABEL: atomicrmw_umax_i32_release: 12101; RV32I: # %bb.0: 12102; RV32I-NEXT: addi sp, sp, -16 12103; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12104; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12105; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12106; RV32I-NEXT: mv s0, a0 12107; RV32I-NEXT: lw a3, 0(a0) 12108; RV32I-NEXT: mv s1, a1 12109; RV32I-NEXT: j .LBB157_2 12110; RV32I-NEXT: .LBB157_1: # %atomicrmw.start 12111; RV32I-NEXT: # in Loop: Header=BB157_2 Depth=1 12112; RV32I-NEXT: sw a3, 0(sp) 12113; RV32I-NEXT: mv a1, sp 12114; RV32I-NEXT: li a3, 3 12115; RV32I-NEXT: mv a0, s0 12116; RV32I-NEXT: li a4, 0 12117; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12118; RV32I-NEXT: lw a3, 0(sp) 12119; RV32I-NEXT: bnez a0, .LBB157_4 12120; RV32I-NEXT: .LBB157_2: # %atomicrmw.start 12121; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12122; RV32I-NEXT: mv a2, a3 12123; RV32I-NEXT: bltu s1, a3, .LBB157_1 12124; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12125; RV32I-NEXT: # in Loop: Header=BB157_2 Depth=1 12126; RV32I-NEXT: mv a2, s1 12127; RV32I-NEXT: j .LBB157_1 12128; RV32I-NEXT: .LBB157_4: # %atomicrmw.end 12129; RV32I-NEXT: mv a0, a3 12130; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12131; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12132; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12133; RV32I-NEXT: addi sp, sp, 16 12134; RV32I-NEXT: ret 12135; 12136; RV32IA-LABEL: atomicrmw_umax_i32_release: 12137; RV32IA: # %bb.0: 12138; RV32IA-NEXT: amomaxu.w.rl a0, a1, (a0) 12139; RV32IA-NEXT: ret 12140; 12141; RV64I-LABEL: atomicrmw_umax_i32_release: 12142; RV64I: # %bb.0: 12143; RV64I-NEXT: addi sp, sp, -48 12144; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12145; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12146; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12147; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12148; RV64I-NEXT: mv s0, a0 12149; RV64I-NEXT: lw a3, 0(a0) 12150; RV64I-NEXT: mv s1, a1 12151; RV64I-NEXT: sext.w s2, a1 12152; RV64I-NEXT: j .LBB157_2 12153; RV64I-NEXT: .LBB157_1: # %atomicrmw.start 12154; RV64I-NEXT: # in Loop: Header=BB157_2 Depth=1 12155; RV64I-NEXT: sw a3, 12(sp) 12156; RV64I-NEXT: addi a1, sp, 12 12157; RV64I-NEXT: li a3, 3 12158; RV64I-NEXT: mv a0, s0 12159; RV64I-NEXT: li a4, 0 12160; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12161; RV64I-NEXT: lw a3, 12(sp) 12162; RV64I-NEXT: bnez a0, .LBB157_4 12163; RV64I-NEXT: .LBB157_2: # %atomicrmw.start 12164; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12165; RV64I-NEXT: mv a2, a3 12166; RV64I-NEXT: bltu s2, a3, .LBB157_1 12167; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12168; RV64I-NEXT: # in Loop: Header=BB157_2 Depth=1 12169; RV64I-NEXT: mv a2, s1 12170; RV64I-NEXT: j .LBB157_1 12171; RV64I-NEXT: .LBB157_4: # %atomicrmw.end 12172; RV64I-NEXT: mv a0, a3 12173; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12174; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12175; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12176; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12177; RV64I-NEXT: addi sp, sp, 48 12178; RV64I-NEXT: ret 12179; 12180; RV64IA-LABEL: atomicrmw_umax_i32_release: 12181; RV64IA: # %bb.0: 12182; RV64IA-NEXT: amomaxu.w.rl a0, a1, (a0) 12183; RV64IA-NEXT: ret 12184 %1 = atomicrmw umax i32* %a, i32 %b release 12185 ret i32 %1 12186} 12187 12188define i32 @atomicrmw_umax_i32_acq_rel(i32 *%a, i32 %b) nounwind { 12189; RV32I-LABEL: atomicrmw_umax_i32_acq_rel: 12190; RV32I: # %bb.0: 12191; RV32I-NEXT: addi sp, sp, -16 12192; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12193; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12194; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12195; RV32I-NEXT: mv s0, a0 12196; RV32I-NEXT: lw a3, 0(a0) 12197; RV32I-NEXT: mv s1, a1 12198; RV32I-NEXT: j .LBB158_2 12199; RV32I-NEXT: .LBB158_1: # %atomicrmw.start 12200; RV32I-NEXT: # in Loop: Header=BB158_2 Depth=1 12201; RV32I-NEXT: sw a3, 0(sp) 12202; RV32I-NEXT: mv a1, sp 12203; RV32I-NEXT: li a3, 4 12204; RV32I-NEXT: li a4, 2 12205; RV32I-NEXT: mv a0, s0 12206; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12207; RV32I-NEXT: lw a3, 0(sp) 12208; RV32I-NEXT: bnez a0, .LBB158_4 12209; RV32I-NEXT: .LBB158_2: # %atomicrmw.start 12210; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12211; RV32I-NEXT: mv a2, a3 12212; RV32I-NEXT: bltu s1, a3, .LBB158_1 12213; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12214; RV32I-NEXT: # in Loop: Header=BB158_2 Depth=1 12215; RV32I-NEXT: mv a2, s1 12216; RV32I-NEXT: j .LBB158_1 12217; RV32I-NEXT: .LBB158_4: # %atomicrmw.end 12218; RV32I-NEXT: mv a0, a3 12219; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12220; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12221; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12222; RV32I-NEXT: addi sp, sp, 16 12223; RV32I-NEXT: ret 12224; 12225; RV32IA-LABEL: atomicrmw_umax_i32_acq_rel: 12226; RV32IA: # %bb.0: 12227; RV32IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12228; RV32IA-NEXT: ret 12229; 12230; RV64I-LABEL: atomicrmw_umax_i32_acq_rel: 12231; RV64I: # %bb.0: 12232; RV64I-NEXT: addi sp, sp, -48 12233; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12234; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12235; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12236; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12237; RV64I-NEXT: mv s0, a0 12238; RV64I-NEXT: lw a3, 0(a0) 12239; RV64I-NEXT: mv s1, a1 12240; RV64I-NEXT: sext.w s2, a1 12241; RV64I-NEXT: j .LBB158_2 12242; RV64I-NEXT: .LBB158_1: # %atomicrmw.start 12243; RV64I-NEXT: # in Loop: Header=BB158_2 Depth=1 12244; RV64I-NEXT: sw a3, 12(sp) 12245; RV64I-NEXT: addi a1, sp, 12 12246; RV64I-NEXT: li a3, 4 12247; RV64I-NEXT: li a4, 2 12248; RV64I-NEXT: mv a0, s0 12249; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12250; RV64I-NEXT: lw a3, 12(sp) 12251; RV64I-NEXT: bnez a0, .LBB158_4 12252; RV64I-NEXT: .LBB158_2: # %atomicrmw.start 12253; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12254; RV64I-NEXT: mv a2, a3 12255; RV64I-NEXT: bltu s2, a3, .LBB158_1 12256; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12257; RV64I-NEXT: # in Loop: Header=BB158_2 Depth=1 12258; RV64I-NEXT: mv a2, s1 12259; RV64I-NEXT: j .LBB158_1 12260; RV64I-NEXT: .LBB158_4: # %atomicrmw.end 12261; RV64I-NEXT: mv a0, a3 12262; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12263; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12264; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12265; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12266; RV64I-NEXT: addi sp, sp, 48 12267; RV64I-NEXT: ret 12268; 12269; RV64IA-LABEL: atomicrmw_umax_i32_acq_rel: 12270; RV64IA: # %bb.0: 12271; RV64IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12272; RV64IA-NEXT: ret 12273 %1 = atomicrmw umax i32* %a, i32 %b acq_rel 12274 ret i32 %1 12275} 12276 12277define i32 @atomicrmw_umax_i32_seq_cst(i32 *%a, i32 %b) nounwind { 12278; RV32I-LABEL: atomicrmw_umax_i32_seq_cst: 12279; RV32I: # %bb.0: 12280; RV32I-NEXT: addi sp, sp, -16 12281; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12282; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12283; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12284; RV32I-NEXT: mv s0, a0 12285; RV32I-NEXT: lw a3, 0(a0) 12286; RV32I-NEXT: mv s1, a1 12287; RV32I-NEXT: j .LBB159_2 12288; RV32I-NEXT: .LBB159_1: # %atomicrmw.start 12289; RV32I-NEXT: # in Loop: Header=BB159_2 Depth=1 12290; RV32I-NEXT: sw a3, 0(sp) 12291; RV32I-NEXT: mv a1, sp 12292; RV32I-NEXT: li a3, 5 12293; RV32I-NEXT: li a4, 5 12294; RV32I-NEXT: mv a0, s0 12295; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12296; RV32I-NEXT: lw a3, 0(sp) 12297; RV32I-NEXT: bnez a0, .LBB159_4 12298; RV32I-NEXT: .LBB159_2: # %atomicrmw.start 12299; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12300; RV32I-NEXT: mv a2, a3 12301; RV32I-NEXT: bltu s1, a3, .LBB159_1 12302; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12303; RV32I-NEXT: # in Loop: Header=BB159_2 Depth=1 12304; RV32I-NEXT: mv a2, s1 12305; RV32I-NEXT: j .LBB159_1 12306; RV32I-NEXT: .LBB159_4: # %atomicrmw.end 12307; RV32I-NEXT: mv a0, a3 12308; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12309; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12310; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12311; RV32I-NEXT: addi sp, sp, 16 12312; RV32I-NEXT: ret 12313; 12314; RV32IA-LABEL: atomicrmw_umax_i32_seq_cst: 12315; RV32IA: # %bb.0: 12316; RV32IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12317; RV32IA-NEXT: ret 12318; 12319; RV64I-LABEL: atomicrmw_umax_i32_seq_cst: 12320; RV64I: # %bb.0: 12321; RV64I-NEXT: addi sp, sp, -48 12322; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12323; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12324; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12325; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12326; RV64I-NEXT: mv s0, a0 12327; RV64I-NEXT: lw a3, 0(a0) 12328; RV64I-NEXT: mv s1, a1 12329; RV64I-NEXT: sext.w s2, a1 12330; RV64I-NEXT: j .LBB159_2 12331; RV64I-NEXT: .LBB159_1: # %atomicrmw.start 12332; RV64I-NEXT: # in Loop: Header=BB159_2 Depth=1 12333; RV64I-NEXT: sw a3, 12(sp) 12334; RV64I-NEXT: addi a1, sp, 12 12335; RV64I-NEXT: li a3, 5 12336; RV64I-NEXT: li a4, 5 12337; RV64I-NEXT: mv a0, s0 12338; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12339; RV64I-NEXT: lw a3, 12(sp) 12340; RV64I-NEXT: bnez a0, .LBB159_4 12341; RV64I-NEXT: .LBB159_2: # %atomicrmw.start 12342; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12343; RV64I-NEXT: mv a2, a3 12344; RV64I-NEXT: bltu s2, a3, .LBB159_1 12345; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12346; RV64I-NEXT: # in Loop: Header=BB159_2 Depth=1 12347; RV64I-NEXT: mv a2, s1 12348; RV64I-NEXT: j .LBB159_1 12349; RV64I-NEXT: .LBB159_4: # %atomicrmw.end 12350; RV64I-NEXT: mv a0, a3 12351; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12352; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12353; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12354; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12355; RV64I-NEXT: addi sp, sp, 48 12356; RV64I-NEXT: ret 12357; 12358; RV64IA-LABEL: atomicrmw_umax_i32_seq_cst: 12359; RV64IA: # %bb.0: 12360; RV64IA-NEXT: amomaxu.w.aqrl a0, a1, (a0) 12361; RV64IA-NEXT: ret 12362 %1 = atomicrmw umax i32* %a, i32 %b seq_cst 12363 ret i32 %1 12364} 12365 12366define i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind { 12367; RV32I-LABEL: atomicrmw_umin_i32_monotonic: 12368; RV32I: # %bb.0: 12369; RV32I-NEXT: addi sp, sp, -16 12370; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12371; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12372; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12373; RV32I-NEXT: mv s0, a0 12374; RV32I-NEXT: lw a3, 0(a0) 12375; RV32I-NEXT: mv s1, a1 12376; RV32I-NEXT: j .LBB160_2 12377; RV32I-NEXT: .LBB160_1: # %atomicrmw.start 12378; RV32I-NEXT: # in Loop: Header=BB160_2 Depth=1 12379; RV32I-NEXT: sw a3, 0(sp) 12380; RV32I-NEXT: mv a1, sp 12381; RV32I-NEXT: mv a0, s0 12382; RV32I-NEXT: li a3, 0 12383; RV32I-NEXT: li a4, 0 12384; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12385; RV32I-NEXT: lw a3, 0(sp) 12386; RV32I-NEXT: bnez a0, .LBB160_4 12387; RV32I-NEXT: .LBB160_2: # %atomicrmw.start 12388; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12389; RV32I-NEXT: mv a2, a3 12390; RV32I-NEXT: bgeu s1, a3, .LBB160_1 12391; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12392; RV32I-NEXT: # in Loop: Header=BB160_2 Depth=1 12393; RV32I-NEXT: mv a2, s1 12394; RV32I-NEXT: j .LBB160_1 12395; RV32I-NEXT: .LBB160_4: # %atomicrmw.end 12396; RV32I-NEXT: mv a0, a3 12397; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12398; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12399; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12400; RV32I-NEXT: addi sp, sp, 16 12401; RV32I-NEXT: ret 12402; 12403; RV32IA-LABEL: atomicrmw_umin_i32_monotonic: 12404; RV32IA: # %bb.0: 12405; RV32IA-NEXT: amominu.w a0, a1, (a0) 12406; RV32IA-NEXT: ret 12407; 12408; RV64I-LABEL: atomicrmw_umin_i32_monotonic: 12409; RV64I: # %bb.0: 12410; RV64I-NEXT: addi sp, sp, -48 12411; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12412; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12413; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12414; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12415; RV64I-NEXT: mv s0, a0 12416; RV64I-NEXT: lw a3, 0(a0) 12417; RV64I-NEXT: mv s1, a1 12418; RV64I-NEXT: sext.w s2, a1 12419; RV64I-NEXT: j .LBB160_2 12420; RV64I-NEXT: .LBB160_1: # %atomicrmw.start 12421; RV64I-NEXT: # in Loop: Header=BB160_2 Depth=1 12422; RV64I-NEXT: sw a3, 12(sp) 12423; RV64I-NEXT: addi a1, sp, 12 12424; RV64I-NEXT: mv a0, s0 12425; RV64I-NEXT: li a3, 0 12426; RV64I-NEXT: li a4, 0 12427; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12428; RV64I-NEXT: lw a3, 12(sp) 12429; RV64I-NEXT: bnez a0, .LBB160_4 12430; RV64I-NEXT: .LBB160_2: # %atomicrmw.start 12431; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12432; RV64I-NEXT: mv a2, a3 12433; RV64I-NEXT: bgeu s2, a3, .LBB160_1 12434; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12435; RV64I-NEXT: # in Loop: Header=BB160_2 Depth=1 12436; RV64I-NEXT: mv a2, s1 12437; RV64I-NEXT: j .LBB160_1 12438; RV64I-NEXT: .LBB160_4: # %atomicrmw.end 12439; RV64I-NEXT: mv a0, a3 12440; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12441; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12442; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12443; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12444; RV64I-NEXT: addi sp, sp, 48 12445; RV64I-NEXT: ret 12446; 12447; RV64IA-LABEL: atomicrmw_umin_i32_monotonic: 12448; RV64IA: # %bb.0: 12449; RV64IA-NEXT: amominu.w a0, a1, (a0) 12450; RV64IA-NEXT: ret 12451 %1 = atomicrmw umin i32* %a, i32 %b monotonic 12452 ret i32 %1 12453} 12454 12455define i32 @atomicrmw_umin_i32_acquire(i32 *%a, i32 %b) nounwind { 12456; RV32I-LABEL: atomicrmw_umin_i32_acquire: 12457; RV32I: # %bb.0: 12458; RV32I-NEXT: addi sp, sp, -16 12459; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12460; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12461; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12462; RV32I-NEXT: mv s0, a0 12463; RV32I-NEXT: lw a3, 0(a0) 12464; RV32I-NEXT: mv s1, a1 12465; RV32I-NEXT: j .LBB161_2 12466; RV32I-NEXT: .LBB161_1: # %atomicrmw.start 12467; RV32I-NEXT: # in Loop: Header=BB161_2 Depth=1 12468; RV32I-NEXT: sw a3, 0(sp) 12469; RV32I-NEXT: mv a1, sp 12470; RV32I-NEXT: li a3, 2 12471; RV32I-NEXT: li a4, 2 12472; RV32I-NEXT: mv a0, s0 12473; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12474; RV32I-NEXT: lw a3, 0(sp) 12475; RV32I-NEXT: bnez a0, .LBB161_4 12476; RV32I-NEXT: .LBB161_2: # %atomicrmw.start 12477; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12478; RV32I-NEXT: mv a2, a3 12479; RV32I-NEXT: bgeu s1, a3, .LBB161_1 12480; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12481; RV32I-NEXT: # in Loop: Header=BB161_2 Depth=1 12482; RV32I-NEXT: mv a2, s1 12483; RV32I-NEXT: j .LBB161_1 12484; RV32I-NEXT: .LBB161_4: # %atomicrmw.end 12485; RV32I-NEXT: mv a0, a3 12486; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12487; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12488; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12489; RV32I-NEXT: addi sp, sp, 16 12490; RV32I-NEXT: ret 12491; 12492; RV32IA-LABEL: atomicrmw_umin_i32_acquire: 12493; RV32IA: # %bb.0: 12494; RV32IA-NEXT: amominu.w.aq a0, a1, (a0) 12495; RV32IA-NEXT: ret 12496; 12497; RV64I-LABEL: atomicrmw_umin_i32_acquire: 12498; RV64I: # %bb.0: 12499; RV64I-NEXT: addi sp, sp, -48 12500; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12501; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12502; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12503; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12504; RV64I-NEXT: mv s0, a0 12505; RV64I-NEXT: lw a3, 0(a0) 12506; RV64I-NEXT: mv s1, a1 12507; RV64I-NEXT: sext.w s2, a1 12508; RV64I-NEXT: j .LBB161_2 12509; RV64I-NEXT: .LBB161_1: # %atomicrmw.start 12510; RV64I-NEXT: # in Loop: Header=BB161_2 Depth=1 12511; RV64I-NEXT: sw a3, 12(sp) 12512; RV64I-NEXT: addi a1, sp, 12 12513; RV64I-NEXT: li a3, 2 12514; RV64I-NEXT: li a4, 2 12515; RV64I-NEXT: mv a0, s0 12516; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12517; RV64I-NEXT: lw a3, 12(sp) 12518; RV64I-NEXT: bnez a0, .LBB161_4 12519; RV64I-NEXT: .LBB161_2: # %atomicrmw.start 12520; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12521; RV64I-NEXT: mv a2, a3 12522; RV64I-NEXT: bgeu s2, a3, .LBB161_1 12523; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12524; RV64I-NEXT: # in Loop: Header=BB161_2 Depth=1 12525; RV64I-NEXT: mv a2, s1 12526; RV64I-NEXT: j .LBB161_1 12527; RV64I-NEXT: .LBB161_4: # %atomicrmw.end 12528; RV64I-NEXT: mv a0, a3 12529; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12530; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12531; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12532; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12533; RV64I-NEXT: addi sp, sp, 48 12534; RV64I-NEXT: ret 12535; 12536; RV64IA-LABEL: atomicrmw_umin_i32_acquire: 12537; RV64IA: # %bb.0: 12538; RV64IA-NEXT: amominu.w.aq a0, a1, (a0) 12539; RV64IA-NEXT: ret 12540 %1 = atomicrmw umin i32* %a, i32 %b acquire 12541 ret i32 %1 12542} 12543 12544define i32 @atomicrmw_umin_i32_release(i32 *%a, i32 %b) nounwind { 12545; RV32I-LABEL: atomicrmw_umin_i32_release: 12546; RV32I: # %bb.0: 12547; RV32I-NEXT: addi sp, sp, -16 12548; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12549; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12550; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12551; RV32I-NEXT: mv s0, a0 12552; RV32I-NEXT: lw a3, 0(a0) 12553; RV32I-NEXT: mv s1, a1 12554; RV32I-NEXT: j .LBB162_2 12555; RV32I-NEXT: .LBB162_1: # %atomicrmw.start 12556; RV32I-NEXT: # in Loop: Header=BB162_2 Depth=1 12557; RV32I-NEXT: sw a3, 0(sp) 12558; RV32I-NEXT: mv a1, sp 12559; RV32I-NEXT: li a3, 3 12560; RV32I-NEXT: mv a0, s0 12561; RV32I-NEXT: li a4, 0 12562; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12563; RV32I-NEXT: lw a3, 0(sp) 12564; RV32I-NEXT: bnez a0, .LBB162_4 12565; RV32I-NEXT: .LBB162_2: # %atomicrmw.start 12566; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12567; RV32I-NEXT: mv a2, a3 12568; RV32I-NEXT: bgeu s1, a3, .LBB162_1 12569; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12570; RV32I-NEXT: # in Loop: Header=BB162_2 Depth=1 12571; RV32I-NEXT: mv a2, s1 12572; RV32I-NEXT: j .LBB162_1 12573; RV32I-NEXT: .LBB162_4: # %atomicrmw.end 12574; RV32I-NEXT: mv a0, a3 12575; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12576; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12577; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12578; RV32I-NEXT: addi sp, sp, 16 12579; RV32I-NEXT: ret 12580; 12581; RV32IA-LABEL: atomicrmw_umin_i32_release: 12582; RV32IA: # %bb.0: 12583; RV32IA-NEXT: amominu.w.rl a0, a1, (a0) 12584; RV32IA-NEXT: ret 12585; 12586; RV64I-LABEL: atomicrmw_umin_i32_release: 12587; RV64I: # %bb.0: 12588; RV64I-NEXT: addi sp, sp, -48 12589; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12590; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12591; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12592; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12593; RV64I-NEXT: mv s0, a0 12594; RV64I-NEXT: lw a3, 0(a0) 12595; RV64I-NEXT: mv s1, a1 12596; RV64I-NEXT: sext.w s2, a1 12597; RV64I-NEXT: j .LBB162_2 12598; RV64I-NEXT: .LBB162_1: # %atomicrmw.start 12599; RV64I-NEXT: # in Loop: Header=BB162_2 Depth=1 12600; RV64I-NEXT: sw a3, 12(sp) 12601; RV64I-NEXT: addi a1, sp, 12 12602; RV64I-NEXT: li a3, 3 12603; RV64I-NEXT: mv a0, s0 12604; RV64I-NEXT: li a4, 0 12605; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12606; RV64I-NEXT: lw a3, 12(sp) 12607; RV64I-NEXT: bnez a0, .LBB162_4 12608; RV64I-NEXT: .LBB162_2: # %atomicrmw.start 12609; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12610; RV64I-NEXT: mv a2, a3 12611; RV64I-NEXT: bgeu s2, a3, .LBB162_1 12612; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12613; RV64I-NEXT: # in Loop: Header=BB162_2 Depth=1 12614; RV64I-NEXT: mv a2, s1 12615; RV64I-NEXT: j .LBB162_1 12616; RV64I-NEXT: .LBB162_4: # %atomicrmw.end 12617; RV64I-NEXT: mv a0, a3 12618; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12619; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12620; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12621; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12622; RV64I-NEXT: addi sp, sp, 48 12623; RV64I-NEXT: ret 12624; 12625; RV64IA-LABEL: atomicrmw_umin_i32_release: 12626; RV64IA: # %bb.0: 12627; RV64IA-NEXT: amominu.w.rl a0, a1, (a0) 12628; RV64IA-NEXT: ret 12629 %1 = atomicrmw umin i32* %a, i32 %b release 12630 ret i32 %1 12631} 12632 12633define i32 @atomicrmw_umin_i32_acq_rel(i32 *%a, i32 %b) nounwind { 12634; RV32I-LABEL: atomicrmw_umin_i32_acq_rel: 12635; RV32I: # %bb.0: 12636; RV32I-NEXT: addi sp, sp, -16 12637; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12638; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12639; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12640; RV32I-NEXT: mv s0, a0 12641; RV32I-NEXT: lw a3, 0(a0) 12642; RV32I-NEXT: mv s1, a1 12643; RV32I-NEXT: j .LBB163_2 12644; RV32I-NEXT: .LBB163_1: # %atomicrmw.start 12645; RV32I-NEXT: # in Loop: Header=BB163_2 Depth=1 12646; RV32I-NEXT: sw a3, 0(sp) 12647; RV32I-NEXT: mv a1, sp 12648; RV32I-NEXT: li a3, 4 12649; RV32I-NEXT: li a4, 2 12650; RV32I-NEXT: mv a0, s0 12651; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12652; RV32I-NEXT: lw a3, 0(sp) 12653; RV32I-NEXT: bnez a0, .LBB163_4 12654; RV32I-NEXT: .LBB163_2: # %atomicrmw.start 12655; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12656; RV32I-NEXT: mv a2, a3 12657; RV32I-NEXT: bgeu s1, a3, .LBB163_1 12658; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12659; RV32I-NEXT: # in Loop: Header=BB163_2 Depth=1 12660; RV32I-NEXT: mv a2, s1 12661; RV32I-NEXT: j .LBB163_1 12662; RV32I-NEXT: .LBB163_4: # %atomicrmw.end 12663; RV32I-NEXT: mv a0, a3 12664; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12665; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12666; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12667; RV32I-NEXT: addi sp, sp, 16 12668; RV32I-NEXT: ret 12669; 12670; RV32IA-LABEL: atomicrmw_umin_i32_acq_rel: 12671; RV32IA: # %bb.0: 12672; RV32IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12673; RV32IA-NEXT: ret 12674; 12675; RV64I-LABEL: atomicrmw_umin_i32_acq_rel: 12676; RV64I: # %bb.0: 12677; RV64I-NEXT: addi sp, sp, -48 12678; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12679; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12680; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12681; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12682; RV64I-NEXT: mv s0, a0 12683; RV64I-NEXT: lw a3, 0(a0) 12684; RV64I-NEXT: mv s1, a1 12685; RV64I-NEXT: sext.w s2, a1 12686; RV64I-NEXT: j .LBB163_2 12687; RV64I-NEXT: .LBB163_1: # %atomicrmw.start 12688; RV64I-NEXT: # in Loop: Header=BB163_2 Depth=1 12689; RV64I-NEXT: sw a3, 12(sp) 12690; RV64I-NEXT: addi a1, sp, 12 12691; RV64I-NEXT: li a3, 4 12692; RV64I-NEXT: li a4, 2 12693; RV64I-NEXT: mv a0, s0 12694; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12695; RV64I-NEXT: lw a3, 12(sp) 12696; RV64I-NEXT: bnez a0, .LBB163_4 12697; RV64I-NEXT: .LBB163_2: # %atomicrmw.start 12698; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12699; RV64I-NEXT: mv a2, a3 12700; RV64I-NEXT: bgeu s2, a3, .LBB163_1 12701; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12702; RV64I-NEXT: # in Loop: Header=BB163_2 Depth=1 12703; RV64I-NEXT: mv a2, s1 12704; RV64I-NEXT: j .LBB163_1 12705; RV64I-NEXT: .LBB163_4: # %atomicrmw.end 12706; RV64I-NEXT: mv a0, a3 12707; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12708; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12709; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12710; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12711; RV64I-NEXT: addi sp, sp, 48 12712; RV64I-NEXT: ret 12713; 12714; RV64IA-LABEL: atomicrmw_umin_i32_acq_rel: 12715; RV64IA: # %bb.0: 12716; RV64IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12717; RV64IA-NEXT: ret 12718 %1 = atomicrmw umin i32* %a, i32 %b acq_rel 12719 ret i32 %1 12720} 12721 12722define i32 @atomicrmw_umin_i32_seq_cst(i32 *%a, i32 %b) nounwind { 12723; RV32I-LABEL: atomicrmw_umin_i32_seq_cst: 12724; RV32I: # %bb.0: 12725; RV32I-NEXT: addi sp, sp, -16 12726; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12727; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 12728; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 12729; RV32I-NEXT: mv s0, a0 12730; RV32I-NEXT: lw a3, 0(a0) 12731; RV32I-NEXT: mv s1, a1 12732; RV32I-NEXT: j .LBB164_2 12733; RV32I-NEXT: .LBB164_1: # %atomicrmw.start 12734; RV32I-NEXT: # in Loop: Header=BB164_2 Depth=1 12735; RV32I-NEXT: sw a3, 0(sp) 12736; RV32I-NEXT: mv a1, sp 12737; RV32I-NEXT: li a3, 5 12738; RV32I-NEXT: li a4, 5 12739; RV32I-NEXT: mv a0, s0 12740; RV32I-NEXT: call __atomic_compare_exchange_4@plt 12741; RV32I-NEXT: lw a3, 0(sp) 12742; RV32I-NEXT: bnez a0, .LBB164_4 12743; RV32I-NEXT: .LBB164_2: # %atomicrmw.start 12744; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 12745; RV32I-NEXT: mv a2, a3 12746; RV32I-NEXT: bgeu s1, a3, .LBB164_1 12747; RV32I-NEXT: # %bb.3: # %atomicrmw.start 12748; RV32I-NEXT: # in Loop: Header=BB164_2 Depth=1 12749; RV32I-NEXT: mv a2, s1 12750; RV32I-NEXT: j .LBB164_1 12751; RV32I-NEXT: .LBB164_4: # %atomicrmw.end 12752; RV32I-NEXT: mv a0, a3 12753; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12754; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 12755; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 12756; RV32I-NEXT: addi sp, sp, 16 12757; RV32I-NEXT: ret 12758; 12759; RV32IA-LABEL: atomicrmw_umin_i32_seq_cst: 12760; RV32IA: # %bb.0: 12761; RV32IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12762; RV32IA-NEXT: ret 12763; 12764; RV64I-LABEL: atomicrmw_umin_i32_seq_cst: 12765; RV64I: # %bb.0: 12766; RV64I-NEXT: addi sp, sp, -48 12767; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 12768; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 12769; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 12770; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 12771; RV64I-NEXT: mv s0, a0 12772; RV64I-NEXT: lw a3, 0(a0) 12773; RV64I-NEXT: mv s1, a1 12774; RV64I-NEXT: sext.w s2, a1 12775; RV64I-NEXT: j .LBB164_2 12776; RV64I-NEXT: .LBB164_1: # %atomicrmw.start 12777; RV64I-NEXT: # in Loop: Header=BB164_2 Depth=1 12778; RV64I-NEXT: sw a3, 12(sp) 12779; RV64I-NEXT: addi a1, sp, 12 12780; RV64I-NEXT: li a3, 5 12781; RV64I-NEXT: li a4, 5 12782; RV64I-NEXT: mv a0, s0 12783; RV64I-NEXT: call __atomic_compare_exchange_4@plt 12784; RV64I-NEXT: lw a3, 12(sp) 12785; RV64I-NEXT: bnez a0, .LBB164_4 12786; RV64I-NEXT: .LBB164_2: # %atomicrmw.start 12787; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 12788; RV64I-NEXT: mv a2, a3 12789; RV64I-NEXT: bgeu s2, a3, .LBB164_1 12790; RV64I-NEXT: # %bb.3: # %atomicrmw.start 12791; RV64I-NEXT: # in Loop: Header=BB164_2 Depth=1 12792; RV64I-NEXT: mv a2, s1 12793; RV64I-NEXT: j .LBB164_1 12794; RV64I-NEXT: .LBB164_4: # %atomicrmw.end 12795; RV64I-NEXT: mv a0, a3 12796; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 12797; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 12798; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 12799; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 12800; RV64I-NEXT: addi sp, sp, 48 12801; RV64I-NEXT: ret 12802; 12803; RV64IA-LABEL: atomicrmw_umin_i32_seq_cst: 12804; RV64IA: # %bb.0: 12805; RV64IA-NEXT: amominu.w.aqrl a0, a1, (a0) 12806; RV64IA-NEXT: ret 12807 %1 = atomicrmw umin i32* %a, i32 %b seq_cst 12808 ret i32 %1 12809} 12810 12811define i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind { 12812; RV32I-LABEL: atomicrmw_xchg_i64_monotonic: 12813; RV32I: # %bb.0: 12814; RV32I-NEXT: addi sp, sp, -16 12815; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12816; RV32I-NEXT: li a3, 0 12817; RV32I-NEXT: call __atomic_exchange_8@plt 12818; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12819; RV32I-NEXT: addi sp, sp, 16 12820; RV32I-NEXT: ret 12821; 12822; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic: 12823; RV32IA: # %bb.0: 12824; RV32IA-NEXT: addi sp, sp, -16 12825; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12826; RV32IA-NEXT: li a3, 0 12827; RV32IA-NEXT: call __atomic_exchange_8@plt 12828; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12829; RV32IA-NEXT: addi sp, sp, 16 12830; RV32IA-NEXT: ret 12831; 12832; RV64I-LABEL: atomicrmw_xchg_i64_monotonic: 12833; RV64I: # %bb.0: 12834; RV64I-NEXT: addi sp, sp, -16 12835; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12836; RV64I-NEXT: li a2, 0 12837; RV64I-NEXT: call __atomic_exchange_8@plt 12838; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12839; RV64I-NEXT: addi sp, sp, 16 12840; RV64I-NEXT: ret 12841; 12842; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic: 12843; RV64IA: # %bb.0: 12844; RV64IA-NEXT: amoswap.d a0, a1, (a0) 12845; RV64IA-NEXT: ret 12846 %1 = atomicrmw xchg i64* %a, i64 %b monotonic 12847 ret i64 %1 12848} 12849 12850define i64 @atomicrmw_xchg_i64_acquire(i64* %a, i64 %b) nounwind { 12851; RV32I-LABEL: atomicrmw_xchg_i64_acquire: 12852; RV32I: # %bb.0: 12853; RV32I-NEXT: addi sp, sp, -16 12854; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12855; RV32I-NEXT: li a3, 2 12856; RV32I-NEXT: call __atomic_exchange_8@plt 12857; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12858; RV32I-NEXT: addi sp, sp, 16 12859; RV32I-NEXT: ret 12860; 12861; RV32IA-LABEL: atomicrmw_xchg_i64_acquire: 12862; RV32IA: # %bb.0: 12863; RV32IA-NEXT: addi sp, sp, -16 12864; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12865; RV32IA-NEXT: li a3, 2 12866; RV32IA-NEXT: call __atomic_exchange_8@plt 12867; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12868; RV32IA-NEXT: addi sp, sp, 16 12869; RV32IA-NEXT: ret 12870; 12871; RV64I-LABEL: atomicrmw_xchg_i64_acquire: 12872; RV64I: # %bb.0: 12873; RV64I-NEXT: addi sp, sp, -16 12874; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12875; RV64I-NEXT: li a2, 2 12876; RV64I-NEXT: call __atomic_exchange_8@plt 12877; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12878; RV64I-NEXT: addi sp, sp, 16 12879; RV64I-NEXT: ret 12880; 12881; RV64IA-LABEL: atomicrmw_xchg_i64_acquire: 12882; RV64IA: # %bb.0: 12883; RV64IA-NEXT: amoswap.d.aq a0, a1, (a0) 12884; RV64IA-NEXT: ret 12885 %1 = atomicrmw xchg i64* %a, i64 %b acquire 12886 ret i64 %1 12887} 12888 12889define i64 @atomicrmw_xchg_i64_release(i64* %a, i64 %b) nounwind { 12890; RV32I-LABEL: atomicrmw_xchg_i64_release: 12891; RV32I: # %bb.0: 12892; RV32I-NEXT: addi sp, sp, -16 12893; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12894; RV32I-NEXT: li a3, 3 12895; RV32I-NEXT: call __atomic_exchange_8@plt 12896; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12897; RV32I-NEXT: addi sp, sp, 16 12898; RV32I-NEXT: ret 12899; 12900; RV32IA-LABEL: atomicrmw_xchg_i64_release: 12901; RV32IA: # %bb.0: 12902; RV32IA-NEXT: addi sp, sp, -16 12903; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12904; RV32IA-NEXT: li a3, 3 12905; RV32IA-NEXT: call __atomic_exchange_8@plt 12906; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12907; RV32IA-NEXT: addi sp, sp, 16 12908; RV32IA-NEXT: ret 12909; 12910; RV64I-LABEL: atomicrmw_xchg_i64_release: 12911; RV64I: # %bb.0: 12912; RV64I-NEXT: addi sp, sp, -16 12913; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12914; RV64I-NEXT: li a2, 3 12915; RV64I-NEXT: call __atomic_exchange_8@plt 12916; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12917; RV64I-NEXT: addi sp, sp, 16 12918; RV64I-NEXT: ret 12919; 12920; RV64IA-LABEL: atomicrmw_xchg_i64_release: 12921; RV64IA: # %bb.0: 12922; RV64IA-NEXT: amoswap.d.rl a0, a1, (a0) 12923; RV64IA-NEXT: ret 12924 %1 = atomicrmw xchg i64* %a, i64 %b release 12925 ret i64 %1 12926} 12927 12928define i64 @atomicrmw_xchg_i64_acq_rel(i64* %a, i64 %b) nounwind { 12929; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel: 12930; RV32I: # %bb.0: 12931; RV32I-NEXT: addi sp, sp, -16 12932; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12933; RV32I-NEXT: li a3, 4 12934; RV32I-NEXT: call __atomic_exchange_8@plt 12935; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12936; RV32I-NEXT: addi sp, sp, 16 12937; RV32I-NEXT: ret 12938; 12939; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel: 12940; RV32IA: # %bb.0: 12941; RV32IA-NEXT: addi sp, sp, -16 12942; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12943; RV32IA-NEXT: li a3, 4 12944; RV32IA-NEXT: call __atomic_exchange_8@plt 12945; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12946; RV32IA-NEXT: addi sp, sp, 16 12947; RV32IA-NEXT: ret 12948; 12949; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel: 12950; RV64I: # %bb.0: 12951; RV64I-NEXT: addi sp, sp, -16 12952; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12953; RV64I-NEXT: li a2, 4 12954; RV64I-NEXT: call __atomic_exchange_8@plt 12955; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12956; RV64I-NEXT: addi sp, sp, 16 12957; RV64I-NEXT: ret 12958; 12959; RV64IA-LABEL: atomicrmw_xchg_i64_acq_rel: 12960; RV64IA: # %bb.0: 12961; RV64IA-NEXT: amoswap.d.aqrl a0, a1, (a0) 12962; RV64IA-NEXT: ret 12963 %1 = atomicrmw xchg i64* %a, i64 %b acq_rel 12964 ret i64 %1 12965} 12966 12967define i64 @atomicrmw_xchg_i64_seq_cst(i64* %a, i64 %b) nounwind { 12968; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst: 12969; RV32I: # %bb.0: 12970; RV32I-NEXT: addi sp, sp, -16 12971; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12972; RV32I-NEXT: li a3, 5 12973; RV32I-NEXT: call __atomic_exchange_8@plt 12974; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12975; RV32I-NEXT: addi sp, sp, 16 12976; RV32I-NEXT: ret 12977; 12978; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst: 12979; RV32IA: # %bb.0: 12980; RV32IA-NEXT: addi sp, sp, -16 12981; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12982; RV32IA-NEXT: li a3, 5 12983; RV32IA-NEXT: call __atomic_exchange_8@plt 12984; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12985; RV32IA-NEXT: addi sp, sp, 16 12986; RV32IA-NEXT: ret 12987; 12988; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst: 12989; RV64I: # %bb.0: 12990; RV64I-NEXT: addi sp, sp, -16 12991; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12992; RV64I-NEXT: li a2, 5 12993; RV64I-NEXT: call __atomic_exchange_8@plt 12994; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12995; RV64I-NEXT: addi sp, sp, 16 12996; RV64I-NEXT: ret 12997; 12998; RV64IA-LABEL: atomicrmw_xchg_i64_seq_cst: 12999; RV64IA: # %bb.0: 13000; RV64IA-NEXT: amoswap.d.aqrl a0, a1, (a0) 13001; RV64IA-NEXT: ret 13002 %1 = atomicrmw xchg i64* %a, i64 %b seq_cst 13003 ret i64 %1 13004} 13005 13006define i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind { 13007; RV32I-LABEL: atomicrmw_add_i64_monotonic: 13008; RV32I: # %bb.0: 13009; RV32I-NEXT: addi sp, sp, -16 13010; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13011; RV32I-NEXT: li a3, 0 13012; RV32I-NEXT: call __atomic_fetch_add_8@plt 13013; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13014; RV32I-NEXT: addi sp, sp, 16 13015; RV32I-NEXT: ret 13016; 13017; RV32IA-LABEL: atomicrmw_add_i64_monotonic: 13018; RV32IA: # %bb.0: 13019; RV32IA-NEXT: addi sp, sp, -16 13020; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13021; RV32IA-NEXT: li a3, 0 13022; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13023; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13024; RV32IA-NEXT: addi sp, sp, 16 13025; RV32IA-NEXT: ret 13026; 13027; RV64I-LABEL: atomicrmw_add_i64_monotonic: 13028; RV64I: # %bb.0: 13029; RV64I-NEXT: addi sp, sp, -16 13030; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13031; RV64I-NEXT: li a2, 0 13032; RV64I-NEXT: call __atomic_fetch_add_8@plt 13033; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13034; RV64I-NEXT: addi sp, sp, 16 13035; RV64I-NEXT: ret 13036; 13037; RV64IA-LABEL: atomicrmw_add_i64_monotonic: 13038; RV64IA: # %bb.0: 13039; RV64IA-NEXT: amoadd.d a0, a1, (a0) 13040; RV64IA-NEXT: ret 13041 %1 = atomicrmw add i64* %a, i64 %b monotonic 13042 ret i64 %1 13043} 13044 13045define i64 @atomicrmw_add_i64_acquire(i64 *%a, i64 %b) nounwind { 13046; RV32I-LABEL: atomicrmw_add_i64_acquire: 13047; RV32I: # %bb.0: 13048; RV32I-NEXT: addi sp, sp, -16 13049; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13050; RV32I-NEXT: li a3, 2 13051; RV32I-NEXT: call __atomic_fetch_add_8@plt 13052; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13053; RV32I-NEXT: addi sp, sp, 16 13054; RV32I-NEXT: ret 13055; 13056; RV32IA-LABEL: atomicrmw_add_i64_acquire: 13057; RV32IA: # %bb.0: 13058; RV32IA-NEXT: addi sp, sp, -16 13059; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13060; RV32IA-NEXT: li a3, 2 13061; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13062; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13063; RV32IA-NEXT: addi sp, sp, 16 13064; RV32IA-NEXT: ret 13065; 13066; RV64I-LABEL: atomicrmw_add_i64_acquire: 13067; RV64I: # %bb.0: 13068; RV64I-NEXT: addi sp, sp, -16 13069; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13070; RV64I-NEXT: li a2, 2 13071; RV64I-NEXT: call __atomic_fetch_add_8@plt 13072; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13073; RV64I-NEXT: addi sp, sp, 16 13074; RV64I-NEXT: ret 13075; 13076; RV64IA-LABEL: atomicrmw_add_i64_acquire: 13077; RV64IA: # %bb.0: 13078; RV64IA-NEXT: amoadd.d.aq a0, a1, (a0) 13079; RV64IA-NEXT: ret 13080 %1 = atomicrmw add i64* %a, i64 %b acquire 13081 ret i64 %1 13082} 13083 13084define i64 @atomicrmw_add_i64_release(i64 *%a, i64 %b) nounwind { 13085; RV32I-LABEL: atomicrmw_add_i64_release: 13086; RV32I: # %bb.0: 13087; RV32I-NEXT: addi sp, sp, -16 13088; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13089; RV32I-NEXT: li a3, 3 13090; RV32I-NEXT: call __atomic_fetch_add_8@plt 13091; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13092; RV32I-NEXT: addi sp, sp, 16 13093; RV32I-NEXT: ret 13094; 13095; RV32IA-LABEL: atomicrmw_add_i64_release: 13096; RV32IA: # %bb.0: 13097; RV32IA-NEXT: addi sp, sp, -16 13098; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13099; RV32IA-NEXT: li a3, 3 13100; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13101; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13102; RV32IA-NEXT: addi sp, sp, 16 13103; RV32IA-NEXT: ret 13104; 13105; RV64I-LABEL: atomicrmw_add_i64_release: 13106; RV64I: # %bb.0: 13107; RV64I-NEXT: addi sp, sp, -16 13108; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13109; RV64I-NEXT: li a2, 3 13110; RV64I-NEXT: call __atomic_fetch_add_8@plt 13111; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13112; RV64I-NEXT: addi sp, sp, 16 13113; RV64I-NEXT: ret 13114; 13115; RV64IA-LABEL: atomicrmw_add_i64_release: 13116; RV64IA: # %bb.0: 13117; RV64IA-NEXT: amoadd.d.rl a0, a1, (a0) 13118; RV64IA-NEXT: ret 13119 %1 = atomicrmw add i64* %a, i64 %b release 13120 ret i64 %1 13121} 13122 13123define i64 @atomicrmw_add_i64_acq_rel(i64 *%a, i64 %b) nounwind { 13124; RV32I-LABEL: atomicrmw_add_i64_acq_rel: 13125; RV32I: # %bb.0: 13126; RV32I-NEXT: addi sp, sp, -16 13127; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13128; RV32I-NEXT: li a3, 4 13129; RV32I-NEXT: call __atomic_fetch_add_8@plt 13130; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13131; RV32I-NEXT: addi sp, sp, 16 13132; RV32I-NEXT: ret 13133; 13134; RV32IA-LABEL: atomicrmw_add_i64_acq_rel: 13135; RV32IA: # %bb.0: 13136; RV32IA-NEXT: addi sp, sp, -16 13137; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13138; RV32IA-NEXT: li a3, 4 13139; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13140; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13141; RV32IA-NEXT: addi sp, sp, 16 13142; RV32IA-NEXT: ret 13143; 13144; RV64I-LABEL: atomicrmw_add_i64_acq_rel: 13145; RV64I: # %bb.0: 13146; RV64I-NEXT: addi sp, sp, -16 13147; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13148; RV64I-NEXT: li a2, 4 13149; RV64I-NEXT: call __atomic_fetch_add_8@plt 13150; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13151; RV64I-NEXT: addi sp, sp, 16 13152; RV64I-NEXT: ret 13153; 13154; RV64IA-LABEL: atomicrmw_add_i64_acq_rel: 13155; RV64IA: # %bb.0: 13156; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13157; RV64IA-NEXT: ret 13158 %1 = atomicrmw add i64* %a, i64 %b acq_rel 13159 ret i64 %1 13160} 13161 13162define i64 @atomicrmw_add_i64_seq_cst(i64 *%a, i64 %b) nounwind { 13163; RV32I-LABEL: atomicrmw_add_i64_seq_cst: 13164; RV32I: # %bb.0: 13165; RV32I-NEXT: addi sp, sp, -16 13166; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13167; RV32I-NEXT: li a3, 5 13168; RV32I-NEXT: call __atomic_fetch_add_8@plt 13169; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13170; RV32I-NEXT: addi sp, sp, 16 13171; RV32I-NEXT: ret 13172; 13173; RV32IA-LABEL: atomicrmw_add_i64_seq_cst: 13174; RV32IA: # %bb.0: 13175; RV32IA-NEXT: addi sp, sp, -16 13176; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13177; RV32IA-NEXT: li a3, 5 13178; RV32IA-NEXT: call __atomic_fetch_add_8@plt 13179; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13180; RV32IA-NEXT: addi sp, sp, 16 13181; RV32IA-NEXT: ret 13182; 13183; RV64I-LABEL: atomicrmw_add_i64_seq_cst: 13184; RV64I: # %bb.0: 13185; RV64I-NEXT: addi sp, sp, -16 13186; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13187; RV64I-NEXT: li a2, 5 13188; RV64I-NEXT: call __atomic_fetch_add_8@plt 13189; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13190; RV64I-NEXT: addi sp, sp, 16 13191; RV64I-NEXT: ret 13192; 13193; RV64IA-LABEL: atomicrmw_add_i64_seq_cst: 13194; RV64IA: # %bb.0: 13195; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13196; RV64IA-NEXT: ret 13197 %1 = atomicrmw add i64* %a, i64 %b seq_cst 13198 ret i64 %1 13199} 13200 13201define i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind { 13202; RV32I-LABEL: atomicrmw_sub_i64_monotonic: 13203; RV32I: # %bb.0: 13204; RV32I-NEXT: addi sp, sp, -16 13205; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13206; RV32I-NEXT: li a3, 0 13207; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13208; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13209; RV32I-NEXT: addi sp, sp, 16 13210; RV32I-NEXT: ret 13211; 13212; RV32IA-LABEL: atomicrmw_sub_i64_monotonic: 13213; RV32IA: # %bb.0: 13214; RV32IA-NEXT: addi sp, sp, -16 13215; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13216; RV32IA-NEXT: li a3, 0 13217; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13218; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13219; RV32IA-NEXT: addi sp, sp, 16 13220; RV32IA-NEXT: ret 13221; 13222; RV64I-LABEL: atomicrmw_sub_i64_monotonic: 13223; RV64I: # %bb.0: 13224; RV64I-NEXT: addi sp, sp, -16 13225; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13226; RV64I-NEXT: li a2, 0 13227; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13228; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13229; RV64I-NEXT: addi sp, sp, 16 13230; RV64I-NEXT: ret 13231; 13232; RV64IA-LABEL: atomicrmw_sub_i64_monotonic: 13233; RV64IA: # %bb.0: 13234; RV64IA-NEXT: neg a1, a1 13235; RV64IA-NEXT: amoadd.d a0, a1, (a0) 13236; RV64IA-NEXT: ret 13237 %1 = atomicrmw sub i64* %a, i64 %b monotonic 13238 ret i64 %1 13239} 13240 13241define i64 @atomicrmw_sub_i64_acquire(i64* %a, i64 %b) nounwind { 13242; RV32I-LABEL: atomicrmw_sub_i64_acquire: 13243; RV32I: # %bb.0: 13244; RV32I-NEXT: addi sp, sp, -16 13245; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13246; RV32I-NEXT: li a3, 2 13247; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13248; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13249; RV32I-NEXT: addi sp, sp, 16 13250; RV32I-NEXT: ret 13251; 13252; RV32IA-LABEL: atomicrmw_sub_i64_acquire: 13253; RV32IA: # %bb.0: 13254; RV32IA-NEXT: addi sp, sp, -16 13255; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13256; RV32IA-NEXT: li a3, 2 13257; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13258; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13259; RV32IA-NEXT: addi sp, sp, 16 13260; RV32IA-NEXT: ret 13261; 13262; RV64I-LABEL: atomicrmw_sub_i64_acquire: 13263; RV64I: # %bb.0: 13264; RV64I-NEXT: addi sp, sp, -16 13265; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13266; RV64I-NEXT: li a2, 2 13267; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13268; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13269; RV64I-NEXT: addi sp, sp, 16 13270; RV64I-NEXT: ret 13271; 13272; RV64IA-LABEL: atomicrmw_sub_i64_acquire: 13273; RV64IA: # %bb.0: 13274; RV64IA-NEXT: neg a1, a1 13275; RV64IA-NEXT: amoadd.d.aq a0, a1, (a0) 13276; RV64IA-NEXT: ret 13277 %1 = atomicrmw sub i64* %a, i64 %b acquire 13278 ret i64 %1 13279} 13280 13281define i64 @atomicrmw_sub_i64_release(i64* %a, i64 %b) nounwind { 13282; RV32I-LABEL: atomicrmw_sub_i64_release: 13283; RV32I: # %bb.0: 13284; RV32I-NEXT: addi sp, sp, -16 13285; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13286; RV32I-NEXT: li a3, 3 13287; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13288; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13289; RV32I-NEXT: addi sp, sp, 16 13290; RV32I-NEXT: ret 13291; 13292; RV32IA-LABEL: atomicrmw_sub_i64_release: 13293; RV32IA: # %bb.0: 13294; RV32IA-NEXT: addi sp, sp, -16 13295; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13296; RV32IA-NEXT: li a3, 3 13297; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13298; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13299; RV32IA-NEXT: addi sp, sp, 16 13300; RV32IA-NEXT: ret 13301; 13302; RV64I-LABEL: atomicrmw_sub_i64_release: 13303; RV64I: # %bb.0: 13304; RV64I-NEXT: addi sp, sp, -16 13305; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13306; RV64I-NEXT: li a2, 3 13307; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13308; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13309; RV64I-NEXT: addi sp, sp, 16 13310; RV64I-NEXT: ret 13311; 13312; RV64IA-LABEL: atomicrmw_sub_i64_release: 13313; RV64IA: # %bb.0: 13314; RV64IA-NEXT: neg a1, a1 13315; RV64IA-NEXT: amoadd.d.rl a0, a1, (a0) 13316; RV64IA-NEXT: ret 13317 %1 = atomicrmw sub i64* %a, i64 %b release 13318 ret i64 %1 13319} 13320 13321define i64 @atomicrmw_sub_i64_acq_rel(i64* %a, i64 %b) nounwind { 13322; RV32I-LABEL: atomicrmw_sub_i64_acq_rel: 13323; RV32I: # %bb.0: 13324; RV32I-NEXT: addi sp, sp, -16 13325; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13326; RV32I-NEXT: li a3, 4 13327; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13328; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13329; RV32I-NEXT: addi sp, sp, 16 13330; RV32I-NEXT: ret 13331; 13332; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel: 13333; RV32IA: # %bb.0: 13334; RV32IA-NEXT: addi sp, sp, -16 13335; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13336; RV32IA-NEXT: li a3, 4 13337; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13338; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13339; RV32IA-NEXT: addi sp, sp, 16 13340; RV32IA-NEXT: ret 13341; 13342; RV64I-LABEL: atomicrmw_sub_i64_acq_rel: 13343; RV64I: # %bb.0: 13344; RV64I-NEXT: addi sp, sp, -16 13345; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13346; RV64I-NEXT: li a2, 4 13347; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13348; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13349; RV64I-NEXT: addi sp, sp, 16 13350; RV64I-NEXT: ret 13351; 13352; RV64IA-LABEL: atomicrmw_sub_i64_acq_rel: 13353; RV64IA: # %bb.0: 13354; RV64IA-NEXT: neg a1, a1 13355; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13356; RV64IA-NEXT: ret 13357 %1 = atomicrmw sub i64* %a, i64 %b acq_rel 13358 ret i64 %1 13359} 13360 13361define i64 @atomicrmw_sub_i64_seq_cst(i64* %a, i64 %b) nounwind { 13362; RV32I-LABEL: atomicrmw_sub_i64_seq_cst: 13363; RV32I: # %bb.0: 13364; RV32I-NEXT: addi sp, sp, -16 13365; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13366; RV32I-NEXT: li a3, 5 13367; RV32I-NEXT: call __atomic_fetch_sub_8@plt 13368; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13369; RV32I-NEXT: addi sp, sp, 16 13370; RV32I-NEXT: ret 13371; 13372; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst: 13373; RV32IA: # %bb.0: 13374; RV32IA-NEXT: addi sp, sp, -16 13375; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13376; RV32IA-NEXT: li a3, 5 13377; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 13378; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13379; RV32IA-NEXT: addi sp, sp, 16 13380; RV32IA-NEXT: ret 13381; 13382; RV64I-LABEL: atomicrmw_sub_i64_seq_cst: 13383; RV64I: # %bb.0: 13384; RV64I-NEXT: addi sp, sp, -16 13385; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13386; RV64I-NEXT: li a2, 5 13387; RV64I-NEXT: call __atomic_fetch_sub_8@plt 13388; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13389; RV64I-NEXT: addi sp, sp, 16 13390; RV64I-NEXT: ret 13391; 13392; RV64IA-LABEL: atomicrmw_sub_i64_seq_cst: 13393; RV64IA: # %bb.0: 13394; RV64IA-NEXT: neg a1, a1 13395; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0) 13396; RV64IA-NEXT: ret 13397 %1 = atomicrmw sub i64* %a, i64 %b seq_cst 13398 ret i64 %1 13399} 13400 13401define i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind { 13402; RV32I-LABEL: atomicrmw_and_i64_monotonic: 13403; RV32I: # %bb.0: 13404; RV32I-NEXT: addi sp, sp, -16 13405; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13406; RV32I-NEXT: li a3, 0 13407; RV32I-NEXT: call __atomic_fetch_and_8@plt 13408; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13409; RV32I-NEXT: addi sp, sp, 16 13410; RV32I-NEXT: ret 13411; 13412; RV32IA-LABEL: atomicrmw_and_i64_monotonic: 13413; RV32IA: # %bb.0: 13414; RV32IA-NEXT: addi sp, sp, -16 13415; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13416; RV32IA-NEXT: li a3, 0 13417; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13418; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13419; RV32IA-NEXT: addi sp, sp, 16 13420; RV32IA-NEXT: ret 13421; 13422; RV64I-LABEL: atomicrmw_and_i64_monotonic: 13423; RV64I: # %bb.0: 13424; RV64I-NEXT: addi sp, sp, -16 13425; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13426; RV64I-NEXT: li a2, 0 13427; RV64I-NEXT: call __atomic_fetch_and_8@plt 13428; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13429; RV64I-NEXT: addi sp, sp, 16 13430; RV64I-NEXT: ret 13431; 13432; RV64IA-LABEL: atomicrmw_and_i64_monotonic: 13433; RV64IA: # %bb.0: 13434; RV64IA-NEXT: amoand.d a0, a1, (a0) 13435; RV64IA-NEXT: ret 13436 %1 = atomicrmw and i64* %a, i64 %b monotonic 13437 ret i64 %1 13438} 13439 13440define i64 @atomicrmw_and_i64_acquire(i64 *%a, i64 %b) nounwind { 13441; RV32I-LABEL: atomicrmw_and_i64_acquire: 13442; RV32I: # %bb.0: 13443; RV32I-NEXT: addi sp, sp, -16 13444; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13445; RV32I-NEXT: li a3, 2 13446; RV32I-NEXT: call __atomic_fetch_and_8@plt 13447; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13448; RV32I-NEXT: addi sp, sp, 16 13449; RV32I-NEXT: ret 13450; 13451; RV32IA-LABEL: atomicrmw_and_i64_acquire: 13452; RV32IA: # %bb.0: 13453; RV32IA-NEXT: addi sp, sp, -16 13454; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13455; RV32IA-NEXT: li a3, 2 13456; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13457; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13458; RV32IA-NEXT: addi sp, sp, 16 13459; RV32IA-NEXT: ret 13460; 13461; RV64I-LABEL: atomicrmw_and_i64_acquire: 13462; RV64I: # %bb.0: 13463; RV64I-NEXT: addi sp, sp, -16 13464; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13465; RV64I-NEXT: li a2, 2 13466; RV64I-NEXT: call __atomic_fetch_and_8@plt 13467; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13468; RV64I-NEXT: addi sp, sp, 16 13469; RV64I-NEXT: ret 13470; 13471; RV64IA-LABEL: atomicrmw_and_i64_acquire: 13472; RV64IA: # %bb.0: 13473; RV64IA-NEXT: amoand.d.aq a0, a1, (a0) 13474; RV64IA-NEXT: ret 13475 %1 = atomicrmw and i64* %a, i64 %b acquire 13476 ret i64 %1 13477} 13478 13479define i64 @atomicrmw_and_i64_release(i64 *%a, i64 %b) nounwind { 13480; RV32I-LABEL: atomicrmw_and_i64_release: 13481; RV32I: # %bb.0: 13482; RV32I-NEXT: addi sp, sp, -16 13483; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13484; RV32I-NEXT: li a3, 3 13485; RV32I-NEXT: call __atomic_fetch_and_8@plt 13486; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13487; RV32I-NEXT: addi sp, sp, 16 13488; RV32I-NEXT: ret 13489; 13490; RV32IA-LABEL: atomicrmw_and_i64_release: 13491; RV32IA: # %bb.0: 13492; RV32IA-NEXT: addi sp, sp, -16 13493; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13494; RV32IA-NEXT: li a3, 3 13495; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13496; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13497; RV32IA-NEXT: addi sp, sp, 16 13498; RV32IA-NEXT: ret 13499; 13500; RV64I-LABEL: atomicrmw_and_i64_release: 13501; RV64I: # %bb.0: 13502; RV64I-NEXT: addi sp, sp, -16 13503; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13504; RV64I-NEXT: li a2, 3 13505; RV64I-NEXT: call __atomic_fetch_and_8@plt 13506; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13507; RV64I-NEXT: addi sp, sp, 16 13508; RV64I-NEXT: ret 13509; 13510; RV64IA-LABEL: atomicrmw_and_i64_release: 13511; RV64IA: # %bb.0: 13512; RV64IA-NEXT: amoand.d.rl a0, a1, (a0) 13513; RV64IA-NEXT: ret 13514 %1 = atomicrmw and i64* %a, i64 %b release 13515 ret i64 %1 13516} 13517 13518define i64 @atomicrmw_and_i64_acq_rel(i64 *%a, i64 %b) nounwind { 13519; RV32I-LABEL: atomicrmw_and_i64_acq_rel: 13520; RV32I: # %bb.0: 13521; RV32I-NEXT: addi sp, sp, -16 13522; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13523; RV32I-NEXT: li a3, 4 13524; RV32I-NEXT: call __atomic_fetch_and_8@plt 13525; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13526; RV32I-NEXT: addi sp, sp, 16 13527; RV32I-NEXT: ret 13528; 13529; RV32IA-LABEL: atomicrmw_and_i64_acq_rel: 13530; RV32IA: # %bb.0: 13531; RV32IA-NEXT: addi sp, sp, -16 13532; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13533; RV32IA-NEXT: li a3, 4 13534; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13535; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13536; RV32IA-NEXT: addi sp, sp, 16 13537; RV32IA-NEXT: ret 13538; 13539; RV64I-LABEL: atomicrmw_and_i64_acq_rel: 13540; RV64I: # %bb.0: 13541; RV64I-NEXT: addi sp, sp, -16 13542; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13543; RV64I-NEXT: li a2, 4 13544; RV64I-NEXT: call __atomic_fetch_and_8@plt 13545; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13546; RV64I-NEXT: addi sp, sp, 16 13547; RV64I-NEXT: ret 13548; 13549; RV64IA-LABEL: atomicrmw_and_i64_acq_rel: 13550; RV64IA: # %bb.0: 13551; RV64IA-NEXT: amoand.d.aqrl a0, a1, (a0) 13552; RV64IA-NEXT: ret 13553 %1 = atomicrmw and i64* %a, i64 %b acq_rel 13554 ret i64 %1 13555} 13556 13557define i64 @atomicrmw_and_i64_seq_cst(i64 *%a, i64 %b) nounwind { 13558; RV32I-LABEL: atomicrmw_and_i64_seq_cst: 13559; RV32I: # %bb.0: 13560; RV32I-NEXT: addi sp, sp, -16 13561; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13562; RV32I-NEXT: li a3, 5 13563; RV32I-NEXT: call __atomic_fetch_and_8@plt 13564; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13565; RV32I-NEXT: addi sp, sp, 16 13566; RV32I-NEXT: ret 13567; 13568; RV32IA-LABEL: atomicrmw_and_i64_seq_cst: 13569; RV32IA: # %bb.0: 13570; RV32IA-NEXT: addi sp, sp, -16 13571; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13572; RV32IA-NEXT: li a3, 5 13573; RV32IA-NEXT: call __atomic_fetch_and_8@plt 13574; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13575; RV32IA-NEXT: addi sp, sp, 16 13576; RV32IA-NEXT: ret 13577; 13578; RV64I-LABEL: atomicrmw_and_i64_seq_cst: 13579; RV64I: # %bb.0: 13580; RV64I-NEXT: addi sp, sp, -16 13581; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13582; RV64I-NEXT: li a2, 5 13583; RV64I-NEXT: call __atomic_fetch_and_8@plt 13584; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13585; RV64I-NEXT: addi sp, sp, 16 13586; RV64I-NEXT: ret 13587; 13588; RV64IA-LABEL: atomicrmw_and_i64_seq_cst: 13589; RV64IA: # %bb.0: 13590; RV64IA-NEXT: amoand.d.aqrl a0, a1, (a0) 13591; RV64IA-NEXT: ret 13592 %1 = atomicrmw and i64* %a, i64 %b seq_cst 13593 ret i64 %1 13594} 13595 13596define i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind { 13597; RV32I-LABEL: atomicrmw_nand_i64_monotonic: 13598; RV32I: # %bb.0: 13599; RV32I-NEXT: addi sp, sp, -16 13600; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13601; RV32I-NEXT: li a3, 0 13602; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13603; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13604; RV32I-NEXT: addi sp, sp, 16 13605; RV32I-NEXT: ret 13606; 13607; RV32IA-LABEL: atomicrmw_nand_i64_monotonic: 13608; RV32IA: # %bb.0: 13609; RV32IA-NEXT: addi sp, sp, -16 13610; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13611; RV32IA-NEXT: li a3, 0 13612; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13613; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13614; RV32IA-NEXT: addi sp, sp, 16 13615; RV32IA-NEXT: ret 13616; 13617; RV64I-LABEL: atomicrmw_nand_i64_monotonic: 13618; RV64I: # %bb.0: 13619; RV64I-NEXT: addi sp, sp, -16 13620; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13621; RV64I-NEXT: li a2, 0 13622; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13623; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13624; RV64I-NEXT: addi sp, sp, 16 13625; RV64I-NEXT: ret 13626; 13627; RV64IA-LABEL: atomicrmw_nand_i64_monotonic: 13628; RV64IA: # %bb.0: 13629; RV64IA-NEXT: .LBB185_1: # =>This Inner Loop Header: Depth=1 13630; RV64IA-NEXT: lr.d a2, (a0) 13631; RV64IA-NEXT: and a3, a2, a1 13632; RV64IA-NEXT: not a3, a3 13633; RV64IA-NEXT: sc.d a3, a3, (a0) 13634; RV64IA-NEXT: bnez a3, .LBB185_1 13635; RV64IA-NEXT: # %bb.2: 13636; RV64IA-NEXT: mv a0, a2 13637; RV64IA-NEXT: ret 13638 %1 = atomicrmw nand i64* %a, i64 %b monotonic 13639 ret i64 %1 13640} 13641 13642define i64 @atomicrmw_nand_i64_acquire(i64* %a, i64 %b) nounwind { 13643; RV32I-LABEL: atomicrmw_nand_i64_acquire: 13644; RV32I: # %bb.0: 13645; RV32I-NEXT: addi sp, sp, -16 13646; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13647; RV32I-NEXT: li a3, 2 13648; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13649; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13650; RV32I-NEXT: addi sp, sp, 16 13651; RV32I-NEXT: ret 13652; 13653; RV32IA-LABEL: atomicrmw_nand_i64_acquire: 13654; RV32IA: # %bb.0: 13655; RV32IA-NEXT: addi sp, sp, -16 13656; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13657; RV32IA-NEXT: li a3, 2 13658; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13659; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13660; RV32IA-NEXT: addi sp, sp, 16 13661; RV32IA-NEXT: ret 13662; 13663; RV64I-LABEL: atomicrmw_nand_i64_acquire: 13664; RV64I: # %bb.0: 13665; RV64I-NEXT: addi sp, sp, -16 13666; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13667; RV64I-NEXT: li a2, 2 13668; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13669; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13670; RV64I-NEXT: addi sp, sp, 16 13671; RV64I-NEXT: ret 13672; 13673; RV64IA-LABEL: atomicrmw_nand_i64_acquire: 13674; RV64IA: # %bb.0: 13675; RV64IA-NEXT: .LBB186_1: # =>This Inner Loop Header: Depth=1 13676; RV64IA-NEXT: lr.d.aq a2, (a0) 13677; RV64IA-NEXT: and a3, a2, a1 13678; RV64IA-NEXT: not a3, a3 13679; RV64IA-NEXT: sc.d a3, a3, (a0) 13680; RV64IA-NEXT: bnez a3, .LBB186_1 13681; RV64IA-NEXT: # %bb.2: 13682; RV64IA-NEXT: mv a0, a2 13683; RV64IA-NEXT: ret 13684 %1 = atomicrmw nand i64* %a, i64 %b acquire 13685 ret i64 %1 13686} 13687 13688define i64 @atomicrmw_nand_i64_release(i64* %a, i64 %b) nounwind { 13689; RV32I-LABEL: atomicrmw_nand_i64_release: 13690; RV32I: # %bb.0: 13691; RV32I-NEXT: addi sp, sp, -16 13692; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13693; RV32I-NEXT: li a3, 3 13694; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13695; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13696; RV32I-NEXT: addi sp, sp, 16 13697; RV32I-NEXT: ret 13698; 13699; RV32IA-LABEL: atomicrmw_nand_i64_release: 13700; RV32IA: # %bb.0: 13701; RV32IA-NEXT: addi sp, sp, -16 13702; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13703; RV32IA-NEXT: li a3, 3 13704; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13705; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13706; RV32IA-NEXT: addi sp, sp, 16 13707; RV32IA-NEXT: ret 13708; 13709; RV64I-LABEL: atomicrmw_nand_i64_release: 13710; RV64I: # %bb.0: 13711; RV64I-NEXT: addi sp, sp, -16 13712; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13713; RV64I-NEXT: li a2, 3 13714; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13715; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13716; RV64I-NEXT: addi sp, sp, 16 13717; RV64I-NEXT: ret 13718; 13719; RV64IA-LABEL: atomicrmw_nand_i64_release: 13720; RV64IA: # %bb.0: 13721; RV64IA-NEXT: .LBB187_1: # =>This Inner Loop Header: Depth=1 13722; RV64IA-NEXT: lr.d a2, (a0) 13723; RV64IA-NEXT: and a3, a2, a1 13724; RV64IA-NEXT: not a3, a3 13725; RV64IA-NEXT: sc.d.rl a3, a3, (a0) 13726; RV64IA-NEXT: bnez a3, .LBB187_1 13727; RV64IA-NEXT: # %bb.2: 13728; RV64IA-NEXT: mv a0, a2 13729; RV64IA-NEXT: ret 13730 %1 = atomicrmw nand i64* %a, i64 %b release 13731 ret i64 %1 13732} 13733 13734define i64 @atomicrmw_nand_i64_acq_rel(i64* %a, i64 %b) nounwind { 13735; RV32I-LABEL: atomicrmw_nand_i64_acq_rel: 13736; RV32I: # %bb.0: 13737; RV32I-NEXT: addi sp, sp, -16 13738; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13739; RV32I-NEXT: li a3, 4 13740; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13741; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13742; RV32I-NEXT: addi sp, sp, 16 13743; RV32I-NEXT: ret 13744; 13745; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel: 13746; RV32IA: # %bb.0: 13747; RV32IA-NEXT: addi sp, sp, -16 13748; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13749; RV32IA-NEXT: li a3, 4 13750; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13751; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13752; RV32IA-NEXT: addi sp, sp, 16 13753; RV32IA-NEXT: ret 13754; 13755; RV64I-LABEL: atomicrmw_nand_i64_acq_rel: 13756; RV64I: # %bb.0: 13757; RV64I-NEXT: addi sp, sp, -16 13758; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13759; RV64I-NEXT: li a2, 4 13760; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13761; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13762; RV64I-NEXT: addi sp, sp, 16 13763; RV64I-NEXT: ret 13764; 13765; RV64IA-LABEL: atomicrmw_nand_i64_acq_rel: 13766; RV64IA: # %bb.0: 13767; RV64IA-NEXT: .LBB188_1: # =>This Inner Loop Header: Depth=1 13768; RV64IA-NEXT: lr.d.aq a2, (a0) 13769; RV64IA-NEXT: and a3, a2, a1 13770; RV64IA-NEXT: not a3, a3 13771; RV64IA-NEXT: sc.d.rl a3, a3, (a0) 13772; RV64IA-NEXT: bnez a3, .LBB188_1 13773; RV64IA-NEXT: # %bb.2: 13774; RV64IA-NEXT: mv a0, a2 13775; RV64IA-NEXT: ret 13776 %1 = atomicrmw nand i64* %a, i64 %b acq_rel 13777 ret i64 %1 13778} 13779 13780define i64 @atomicrmw_nand_i64_seq_cst(i64* %a, i64 %b) nounwind { 13781; RV32I-LABEL: atomicrmw_nand_i64_seq_cst: 13782; RV32I: # %bb.0: 13783; RV32I-NEXT: addi sp, sp, -16 13784; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13785; RV32I-NEXT: li a3, 5 13786; RV32I-NEXT: call __atomic_fetch_nand_8@plt 13787; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13788; RV32I-NEXT: addi sp, sp, 16 13789; RV32I-NEXT: ret 13790; 13791; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst: 13792; RV32IA: # %bb.0: 13793; RV32IA-NEXT: addi sp, sp, -16 13794; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13795; RV32IA-NEXT: li a3, 5 13796; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 13797; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13798; RV32IA-NEXT: addi sp, sp, 16 13799; RV32IA-NEXT: ret 13800; 13801; RV64I-LABEL: atomicrmw_nand_i64_seq_cst: 13802; RV64I: # %bb.0: 13803; RV64I-NEXT: addi sp, sp, -16 13804; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13805; RV64I-NEXT: li a2, 5 13806; RV64I-NEXT: call __atomic_fetch_nand_8@plt 13807; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13808; RV64I-NEXT: addi sp, sp, 16 13809; RV64I-NEXT: ret 13810; 13811; RV64IA-LABEL: atomicrmw_nand_i64_seq_cst: 13812; RV64IA: # %bb.0: 13813; RV64IA-NEXT: .LBB189_1: # =>This Inner Loop Header: Depth=1 13814; RV64IA-NEXT: lr.d.aqrl a2, (a0) 13815; RV64IA-NEXT: and a3, a2, a1 13816; RV64IA-NEXT: not a3, a3 13817; RV64IA-NEXT: sc.d.aqrl a3, a3, (a0) 13818; RV64IA-NEXT: bnez a3, .LBB189_1 13819; RV64IA-NEXT: # %bb.2: 13820; RV64IA-NEXT: mv a0, a2 13821; RV64IA-NEXT: ret 13822 %1 = atomicrmw nand i64* %a, i64 %b seq_cst 13823 ret i64 %1 13824} 13825 13826define i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind { 13827; RV32I-LABEL: atomicrmw_or_i64_monotonic: 13828; RV32I: # %bb.0: 13829; RV32I-NEXT: addi sp, sp, -16 13830; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13831; RV32I-NEXT: li a3, 0 13832; RV32I-NEXT: call __atomic_fetch_or_8@plt 13833; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13834; RV32I-NEXT: addi sp, sp, 16 13835; RV32I-NEXT: ret 13836; 13837; RV32IA-LABEL: atomicrmw_or_i64_monotonic: 13838; RV32IA: # %bb.0: 13839; RV32IA-NEXT: addi sp, sp, -16 13840; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13841; RV32IA-NEXT: li a3, 0 13842; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13843; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13844; RV32IA-NEXT: addi sp, sp, 16 13845; RV32IA-NEXT: ret 13846; 13847; RV64I-LABEL: atomicrmw_or_i64_monotonic: 13848; RV64I: # %bb.0: 13849; RV64I-NEXT: addi sp, sp, -16 13850; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13851; RV64I-NEXT: li a2, 0 13852; RV64I-NEXT: call __atomic_fetch_or_8@plt 13853; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13854; RV64I-NEXT: addi sp, sp, 16 13855; RV64I-NEXT: ret 13856; 13857; RV64IA-LABEL: atomicrmw_or_i64_monotonic: 13858; RV64IA: # %bb.0: 13859; RV64IA-NEXT: amoor.d a0, a1, (a0) 13860; RV64IA-NEXT: ret 13861 %1 = atomicrmw or i64* %a, i64 %b monotonic 13862 ret i64 %1 13863} 13864 13865define i64 @atomicrmw_or_i64_acquire(i64 *%a, i64 %b) nounwind { 13866; RV32I-LABEL: atomicrmw_or_i64_acquire: 13867; RV32I: # %bb.0: 13868; RV32I-NEXT: addi sp, sp, -16 13869; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13870; RV32I-NEXT: li a3, 2 13871; RV32I-NEXT: call __atomic_fetch_or_8@plt 13872; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13873; RV32I-NEXT: addi sp, sp, 16 13874; RV32I-NEXT: ret 13875; 13876; RV32IA-LABEL: atomicrmw_or_i64_acquire: 13877; RV32IA: # %bb.0: 13878; RV32IA-NEXT: addi sp, sp, -16 13879; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13880; RV32IA-NEXT: li a3, 2 13881; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13882; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13883; RV32IA-NEXT: addi sp, sp, 16 13884; RV32IA-NEXT: ret 13885; 13886; RV64I-LABEL: atomicrmw_or_i64_acquire: 13887; RV64I: # %bb.0: 13888; RV64I-NEXT: addi sp, sp, -16 13889; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13890; RV64I-NEXT: li a2, 2 13891; RV64I-NEXT: call __atomic_fetch_or_8@plt 13892; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13893; RV64I-NEXT: addi sp, sp, 16 13894; RV64I-NEXT: ret 13895; 13896; RV64IA-LABEL: atomicrmw_or_i64_acquire: 13897; RV64IA: # %bb.0: 13898; RV64IA-NEXT: amoor.d.aq a0, a1, (a0) 13899; RV64IA-NEXT: ret 13900 %1 = atomicrmw or i64* %a, i64 %b acquire 13901 ret i64 %1 13902} 13903 13904define i64 @atomicrmw_or_i64_release(i64 *%a, i64 %b) nounwind { 13905; RV32I-LABEL: atomicrmw_or_i64_release: 13906; RV32I: # %bb.0: 13907; RV32I-NEXT: addi sp, sp, -16 13908; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13909; RV32I-NEXT: li a3, 3 13910; RV32I-NEXT: call __atomic_fetch_or_8@plt 13911; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13912; RV32I-NEXT: addi sp, sp, 16 13913; RV32I-NEXT: ret 13914; 13915; RV32IA-LABEL: atomicrmw_or_i64_release: 13916; RV32IA: # %bb.0: 13917; RV32IA-NEXT: addi sp, sp, -16 13918; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13919; RV32IA-NEXT: li a3, 3 13920; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13921; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13922; RV32IA-NEXT: addi sp, sp, 16 13923; RV32IA-NEXT: ret 13924; 13925; RV64I-LABEL: atomicrmw_or_i64_release: 13926; RV64I: # %bb.0: 13927; RV64I-NEXT: addi sp, sp, -16 13928; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13929; RV64I-NEXT: li a2, 3 13930; RV64I-NEXT: call __atomic_fetch_or_8@plt 13931; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13932; RV64I-NEXT: addi sp, sp, 16 13933; RV64I-NEXT: ret 13934; 13935; RV64IA-LABEL: atomicrmw_or_i64_release: 13936; RV64IA: # %bb.0: 13937; RV64IA-NEXT: amoor.d.rl a0, a1, (a0) 13938; RV64IA-NEXT: ret 13939 %1 = atomicrmw or i64* %a, i64 %b release 13940 ret i64 %1 13941} 13942 13943define i64 @atomicrmw_or_i64_acq_rel(i64 *%a, i64 %b) nounwind { 13944; RV32I-LABEL: atomicrmw_or_i64_acq_rel: 13945; RV32I: # %bb.0: 13946; RV32I-NEXT: addi sp, sp, -16 13947; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13948; RV32I-NEXT: li a3, 4 13949; RV32I-NEXT: call __atomic_fetch_or_8@plt 13950; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13951; RV32I-NEXT: addi sp, sp, 16 13952; RV32I-NEXT: ret 13953; 13954; RV32IA-LABEL: atomicrmw_or_i64_acq_rel: 13955; RV32IA: # %bb.0: 13956; RV32IA-NEXT: addi sp, sp, -16 13957; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13958; RV32IA-NEXT: li a3, 4 13959; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13960; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13961; RV32IA-NEXT: addi sp, sp, 16 13962; RV32IA-NEXT: ret 13963; 13964; RV64I-LABEL: atomicrmw_or_i64_acq_rel: 13965; RV64I: # %bb.0: 13966; RV64I-NEXT: addi sp, sp, -16 13967; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13968; RV64I-NEXT: li a2, 4 13969; RV64I-NEXT: call __atomic_fetch_or_8@plt 13970; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13971; RV64I-NEXT: addi sp, sp, 16 13972; RV64I-NEXT: ret 13973; 13974; RV64IA-LABEL: atomicrmw_or_i64_acq_rel: 13975; RV64IA: # %bb.0: 13976; RV64IA-NEXT: amoor.d.aqrl a0, a1, (a0) 13977; RV64IA-NEXT: ret 13978 %1 = atomicrmw or i64* %a, i64 %b acq_rel 13979 ret i64 %1 13980} 13981 13982define i64 @atomicrmw_or_i64_seq_cst(i64 *%a, i64 %b) nounwind { 13983; RV32I-LABEL: atomicrmw_or_i64_seq_cst: 13984; RV32I: # %bb.0: 13985; RV32I-NEXT: addi sp, sp, -16 13986; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13987; RV32I-NEXT: li a3, 5 13988; RV32I-NEXT: call __atomic_fetch_or_8@plt 13989; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13990; RV32I-NEXT: addi sp, sp, 16 13991; RV32I-NEXT: ret 13992; 13993; RV32IA-LABEL: atomicrmw_or_i64_seq_cst: 13994; RV32IA: # %bb.0: 13995; RV32IA-NEXT: addi sp, sp, -16 13996; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13997; RV32IA-NEXT: li a3, 5 13998; RV32IA-NEXT: call __atomic_fetch_or_8@plt 13999; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14000; RV32IA-NEXT: addi sp, sp, 16 14001; RV32IA-NEXT: ret 14002; 14003; RV64I-LABEL: atomicrmw_or_i64_seq_cst: 14004; RV64I: # %bb.0: 14005; RV64I-NEXT: addi sp, sp, -16 14006; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14007; RV64I-NEXT: li a2, 5 14008; RV64I-NEXT: call __atomic_fetch_or_8@plt 14009; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14010; RV64I-NEXT: addi sp, sp, 16 14011; RV64I-NEXT: ret 14012; 14013; RV64IA-LABEL: atomicrmw_or_i64_seq_cst: 14014; RV64IA: # %bb.0: 14015; RV64IA-NEXT: amoor.d.aqrl a0, a1, (a0) 14016; RV64IA-NEXT: ret 14017 %1 = atomicrmw or i64* %a, i64 %b seq_cst 14018 ret i64 %1 14019} 14020 14021define i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind { 14022; RV32I-LABEL: atomicrmw_xor_i64_monotonic: 14023; RV32I: # %bb.0: 14024; RV32I-NEXT: addi sp, sp, -16 14025; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14026; RV32I-NEXT: li a3, 0 14027; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14028; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14029; RV32I-NEXT: addi sp, sp, 16 14030; RV32I-NEXT: ret 14031; 14032; RV32IA-LABEL: atomicrmw_xor_i64_monotonic: 14033; RV32IA: # %bb.0: 14034; RV32IA-NEXT: addi sp, sp, -16 14035; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14036; RV32IA-NEXT: li a3, 0 14037; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14038; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14039; RV32IA-NEXT: addi sp, sp, 16 14040; RV32IA-NEXT: ret 14041; 14042; RV64I-LABEL: atomicrmw_xor_i64_monotonic: 14043; RV64I: # %bb.0: 14044; RV64I-NEXT: addi sp, sp, -16 14045; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14046; RV64I-NEXT: li a2, 0 14047; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14048; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14049; RV64I-NEXT: addi sp, sp, 16 14050; RV64I-NEXT: ret 14051; 14052; RV64IA-LABEL: atomicrmw_xor_i64_monotonic: 14053; RV64IA: # %bb.0: 14054; RV64IA-NEXT: amoxor.d a0, a1, (a0) 14055; RV64IA-NEXT: ret 14056 %1 = atomicrmw xor i64* %a, i64 %b monotonic 14057 ret i64 %1 14058} 14059 14060define i64 @atomicrmw_xor_i64_acquire(i64 *%a, i64 %b) nounwind { 14061; RV32I-LABEL: atomicrmw_xor_i64_acquire: 14062; RV32I: # %bb.0: 14063; RV32I-NEXT: addi sp, sp, -16 14064; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14065; RV32I-NEXT: li a3, 2 14066; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14067; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14068; RV32I-NEXT: addi sp, sp, 16 14069; RV32I-NEXT: ret 14070; 14071; RV32IA-LABEL: atomicrmw_xor_i64_acquire: 14072; RV32IA: # %bb.0: 14073; RV32IA-NEXT: addi sp, sp, -16 14074; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14075; RV32IA-NEXT: li a3, 2 14076; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14077; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14078; RV32IA-NEXT: addi sp, sp, 16 14079; RV32IA-NEXT: ret 14080; 14081; RV64I-LABEL: atomicrmw_xor_i64_acquire: 14082; RV64I: # %bb.0: 14083; RV64I-NEXT: addi sp, sp, -16 14084; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14085; RV64I-NEXT: li a2, 2 14086; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14087; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14088; RV64I-NEXT: addi sp, sp, 16 14089; RV64I-NEXT: ret 14090; 14091; RV64IA-LABEL: atomicrmw_xor_i64_acquire: 14092; RV64IA: # %bb.0: 14093; RV64IA-NEXT: amoxor.d.aq a0, a1, (a0) 14094; RV64IA-NEXT: ret 14095 %1 = atomicrmw xor i64* %a, i64 %b acquire 14096 ret i64 %1 14097} 14098 14099define i64 @atomicrmw_xor_i64_release(i64 *%a, i64 %b) nounwind { 14100; RV32I-LABEL: atomicrmw_xor_i64_release: 14101; RV32I: # %bb.0: 14102; RV32I-NEXT: addi sp, sp, -16 14103; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14104; RV32I-NEXT: li a3, 3 14105; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14106; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14107; RV32I-NEXT: addi sp, sp, 16 14108; RV32I-NEXT: ret 14109; 14110; RV32IA-LABEL: atomicrmw_xor_i64_release: 14111; RV32IA: # %bb.0: 14112; RV32IA-NEXT: addi sp, sp, -16 14113; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14114; RV32IA-NEXT: li a3, 3 14115; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14116; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14117; RV32IA-NEXT: addi sp, sp, 16 14118; RV32IA-NEXT: ret 14119; 14120; RV64I-LABEL: atomicrmw_xor_i64_release: 14121; RV64I: # %bb.0: 14122; RV64I-NEXT: addi sp, sp, -16 14123; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14124; RV64I-NEXT: li a2, 3 14125; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14126; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14127; RV64I-NEXT: addi sp, sp, 16 14128; RV64I-NEXT: ret 14129; 14130; RV64IA-LABEL: atomicrmw_xor_i64_release: 14131; RV64IA: # %bb.0: 14132; RV64IA-NEXT: amoxor.d.rl a0, a1, (a0) 14133; RV64IA-NEXT: ret 14134 %1 = atomicrmw xor i64* %a, i64 %b release 14135 ret i64 %1 14136} 14137 14138define i64 @atomicrmw_xor_i64_acq_rel(i64 *%a, i64 %b) nounwind { 14139; RV32I-LABEL: atomicrmw_xor_i64_acq_rel: 14140; RV32I: # %bb.0: 14141; RV32I-NEXT: addi sp, sp, -16 14142; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14143; RV32I-NEXT: li a3, 4 14144; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14145; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14146; RV32I-NEXT: addi sp, sp, 16 14147; RV32I-NEXT: ret 14148; 14149; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel: 14150; RV32IA: # %bb.0: 14151; RV32IA-NEXT: addi sp, sp, -16 14152; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14153; RV32IA-NEXT: li a3, 4 14154; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14155; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14156; RV32IA-NEXT: addi sp, sp, 16 14157; RV32IA-NEXT: ret 14158; 14159; RV64I-LABEL: atomicrmw_xor_i64_acq_rel: 14160; RV64I: # %bb.0: 14161; RV64I-NEXT: addi sp, sp, -16 14162; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14163; RV64I-NEXT: li a2, 4 14164; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14165; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14166; RV64I-NEXT: addi sp, sp, 16 14167; RV64I-NEXT: ret 14168; 14169; RV64IA-LABEL: atomicrmw_xor_i64_acq_rel: 14170; RV64IA: # %bb.0: 14171; RV64IA-NEXT: amoxor.d.aqrl a0, a1, (a0) 14172; RV64IA-NEXT: ret 14173 %1 = atomicrmw xor i64* %a, i64 %b acq_rel 14174 ret i64 %1 14175} 14176 14177define i64 @atomicrmw_xor_i64_seq_cst(i64 *%a, i64 %b) nounwind { 14178; RV32I-LABEL: atomicrmw_xor_i64_seq_cst: 14179; RV32I: # %bb.0: 14180; RV32I-NEXT: addi sp, sp, -16 14181; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14182; RV32I-NEXT: li a3, 5 14183; RV32I-NEXT: call __atomic_fetch_xor_8@plt 14184; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14185; RV32I-NEXT: addi sp, sp, 16 14186; RV32I-NEXT: ret 14187; 14188; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst: 14189; RV32IA: # %bb.0: 14190; RV32IA-NEXT: addi sp, sp, -16 14191; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14192; RV32IA-NEXT: li a3, 5 14193; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 14194; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14195; RV32IA-NEXT: addi sp, sp, 16 14196; RV32IA-NEXT: ret 14197; 14198; RV64I-LABEL: atomicrmw_xor_i64_seq_cst: 14199; RV64I: # %bb.0: 14200; RV64I-NEXT: addi sp, sp, -16 14201; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14202; RV64I-NEXT: li a2, 5 14203; RV64I-NEXT: call __atomic_fetch_xor_8@plt 14204; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14205; RV64I-NEXT: addi sp, sp, 16 14206; RV64I-NEXT: ret 14207; 14208; RV64IA-LABEL: atomicrmw_xor_i64_seq_cst: 14209; RV64IA: # %bb.0: 14210; RV64IA-NEXT: amoxor.d.aqrl a0, a1, (a0) 14211; RV64IA-NEXT: ret 14212 %1 = atomicrmw xor i64* %a, i64 %b seq_cst 14213 ret i64 %1 14214} 14215 14216define i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind { 14217; RV32I-LABEL: atomicrmw_max_i64_monotonic: 14218; RV32I: # %bb.0: 14219; RV32I-NEXT: addi sp, sp, -32 14220; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14221; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14222; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14223; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14224; RV32I-NEXT: mv s0, a0 14225; RV32I-NEXT: lw a5, 4(a0) 14226; RV32I-NEXT: lw a4, 0(a0) 14227; RV32I-NEXT: mv s1, a2 14228; RV32I-NEXT: mv s2, a1 14229; RV32I-NEXT: j .LBB200_2 14230; RV32I-NEXT: .LBB200_1: # %atomicrmw.start 14231; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14232; RV32I-NEXT: sw a4, 8(sp) 14233; RV32I-NEXT: sw a5, 12(sp) 14234; RV32I-NEXT: addi a1, sp, 8 14235; RV32I-NEXT: mv a0, s0 14236; RV32I-NEXT: li a4, 0 14237; RV32I-NEXT: li a5, 0 14238; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14239; RV32I-NEXT: lw a5, 12(sp) 14240; RV32I-NEXT: lw a4, 8(sp) 14241; RV32I-NEXT: bnez a0, .LBB200_7 14242; RV32I-NEXT: .LBB200_2: # %atomicrmw.start 14243; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14244; RV32I-NEXT: beq a5, s1, .LBB200_4 14245; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14246; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14247; RV32I-NEXT: slt a0, s1, a5 14248; RV32I-NEXT: j .LBB200_5 14249; RV32I-NEXT: .LBB200_4: # in Loop: Header=BB200_2 Depth=1 14250; RV32I-NEXT: sltu a0, s2, a4 14251; RV32I-NEXT: .LBB200_5: # %atomicrmw.start 14252; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14253; RV32I-NEXT: mv a2, a4 14254; RV32I-NEXT: mv a3, a5 14255; RV32I-NEXT: bnez a0, .LBB200_1 14256; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14257; RV32I-NEXT: # in Loop: Header=BB200_2 Depth=1 14258; RV32I-NEXT: mv a2, s2 14259; RV32I-NEXT: mv a3, s1 14260; RV32I-NEXT: j .LBB200_1 14261; RV32I-NEXT: .LBB200_7: # %atomicrmw.end 14262; RV32I-NEXT: mv a0, a4 14263; RV32I-NEXT: mv a1, a5 14264; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14265; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14266; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14267; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14268; RV32I-NEXT: addi sp, sp, 32 14269; RV32I-NEXT: ret 14270; 14271; RV32IA-LABEL: atomicrmw_max_i64_monotonic: 14272; RV32IA: # %bb.0: 14273; RV32IA-NEXT: addi sp, sp, -32 14274; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14275; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14276; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14277; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14278; RV32IA-NEXT: mv s0, a0 14279; RV32IA-NEXT: lw a5, 4(a0) 14280; RV32IA-NEXT: lw a4, 0(a0) 14281; RV32IA-NEXT: mv s1, a2 14282; RV32IA-NEXT: mv s2, a1 14283; RV32IA-NEXT: j .LBB200_2 14284; RV32IA-NEXT: .LBB200_1: # %atomicrmw.start 14285; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14286; RV32IA-NEXT: sw a4, 8(sp) 14287; RV32IA-NEXT: sw a5, 12(sp) 14288; RV32IA-NEXT: addi a1, sp, 8 14289; RV32IA-NEXT: mv a0, s0 14290; RV32IA-NEXT: li a4, 0 14291; RV32IA-NEXT: li a5, 0 14292; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14293; RV32IA-NEXT: lw a5, 12(sp) 14294; RV32IA-NEXT: lw a4, 8(sp) 14295; RV32IA-NEXT: bnez a0, .LBB200_7 14296; RV32IA-NEXT: .LBB200_2: # %atomicrmw.start 14297; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14298; RV32IA-NEXT: beq a5, s1, .LBB200_4 14299; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14300; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14301; RV32IA-NEXT: slt a0, s1, a5 14302; RV32IA-NEXT: j .LBB200_5 14303; RV32IA-NEXT: .LBB200_4: # in Loop: Header=BB200_2 Depth=1 14304; RV32IA-NEXT: sltu a0, s2, a4 14305; RV32IA-NEXT: .LBB200_5: # %atomicrmw.start 14306; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14307; RV32IA-NEXT: mv a2, a4 14308; RV32IA-NEXT: mv a3, a5 14309; RV32IA-NEXT: bnez a0, .LBB200_1 14310; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14311; RV32IA-NEXT: # in Loop: Header=BB200_2 Depth=1 14312; RV32IA-NEXT: mv a2, s2 14313; RV32IA-NEXT: mv a3, s1 14314; RV32IA-NEXT: j .LBB200_1 14315; RV32IA-NEXT: .LBB200_7: # %atomicrmw.end 14316; RV32IA-NEXT: mv a0, a4 14317; RV32IA-NEXT: mv a1, a5 14318; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14319; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14320; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14321; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14322; RV32IA-NEXT: addi sp, sp, 32 14323; RV32IA-NEXT: ret 14324; 14325; RV64I-LABEL: atomicrmw_max_i64_monotonic: 14326; RV64I: # %bb.0: 14327; RV64I-NEXT: addi sp, sp, -32 14328; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14329; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14330; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14331; RV64I-NEXT: mv s0, a0 14332; RV64I-NEXT: ld a3, 0(a0) 14333; RV64I-NEXT: mv s1, a1 14334; RV64I-NEXT: j .LBB200_2 14335; RV64I-NEXT: .LBB200_1: # %atomicrmw.start 14336; RV64I-NEXT: # in Loop: Header=BB200_2 Depth=1 14337; RV64I-NEXT: sd a3, 0(sp) 14338; RV64I-NEXT: mv a1, sp 14339; RV64I-NEXT: mv a0, s0 14340; RV64I-NEXT: li a3, 0 14341; RV64I-NEXT: li a4, 0 14342; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14343; RV64I-NEXT: ld a3, 0(sp) 14344; RV64I-NEXT: bnez a0, .LBB200_4 14345; RV64I-NEXT: .LBB200_2: # %atomicrmw.start 14346; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14347; RV64I-NEXT: mv a2, a3 14348; RV64I-NEXT: blt s1, a3, .LBB200_1 14349; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14350; RV64I-NEXT: # in Loop: Header=BB200_2 Depth=1 14351; RV64I-NEXT: mv a2, s1 14352; RV64I-NEXT: j .LBB200_1 14353; RV64I-NEXT: .LBB200_4: # %atomicrmw.end 14354; RV64I-NEXT: mv a0, a3 14355; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14356; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14357; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14358; RV64I-NEXT: addi sp, sp, 32 14359; RV64I-NEXT: ret 14360; 14361; RV64IA-LABEL: atomicrmw_max_i64_monotonic: 14362; RV64IA: # %bb.0: 14363; RV64IA-NEXT: amomax.d a0, a1, (a0) 14364; RV64IA-NEXT: ret 14365 %1 = atomicrmw max i64* %a, i64 %b monotonic 14366 ret i64 %1 14367} 14368 14369define i64 @atomicrmw_max_i64_acquire(i64 *%a, i64 %b) nounwind { 14370; RV32I-LABEL: atomicrmw_max_i64_acquire: 14371; RV32I: # %bb.0: 14372; RV32I-NEXT: addi sp, sp, -32 14373; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14374; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14375; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14376; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14377; RV32I-NEXT: mv s0, a0 14378; RV32I-NEXT: lw a5, 4(a0) 14379; RV32I-NEXT: lw a4, 0(a0) 14380; RV32I-NEXT: mv s1, a2 14381; RV32I-NEXT: mv s2, a1 14382; RV32I-NEXT: j .LBB201_2 14383; RV32I-NEXT: .LBB201_1: # %atomicrmw.start 14384; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14385; RV32I-NEXT: sw a4, 8(sp) 14386; RV32I-NEXT: sw a5, 12(sp) 14387; RV32I-NEXT: addi a1, sp, 8 14388; RV32I-NEXT: li a4, 2 14389; RV32I-NEXT: li a5, 2 14390; RV32I-NEXT: mv a0, s0 14391; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14392; RV32I-NEXT: lw a5, 12(sp) 14393; RV32I-NEXT: lw a4, 8(sp) 14394; RV32I-NEXT: bnez a0, .LBB201_7 14395; RV32I-NEXT: .LBB201_2: # %atomicrmw.start 14396; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14397; RV32I-NEXT: beq a5, s1, .LBB201_4 14398; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14399; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14400; RV32I-NEXT: slt a0, s1, a5 14401; RV32I-NEXT: j .LBB201_5 14402; RV32I-NEXT: .LBB201_4: # in Loop: Header=BB201_2 Depth=1 14403; RV32I-NEXT: sltu a0, s2, a4 14404; RV32I-NEXT: .LBB201_5: # %atomicrmw.start 14405; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14406; RV32I-NEXT: mv a2, a4 14407; RV32I-NEXT: mv a3, a5 14408; RV32I-NEXT: bnez a0, .LBB201_1 14409; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14410; RV32I-NEXT: # in Loop: Header=BB201_2 Depth=1 14411; RV32I-NEXT: mv a2, s2 14412; RV32I-NEXT: mv a3, s1 14413; RV32I-NEXT: j .LBB201_1 14414; RV32I-NEXT: .LBB201_7: # %atomicrmw.end 14415; RV32I-NEXT: mv a0, a4 14416; RV32I-NEXT: mv a1, a5 14417; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14418; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14419; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14420; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14421; RV32I-NEXT: addi sp, sp, 32 14422; RV32I-NEXT: ret 14423; 14424; RV32IA-LABEL: atomicrmw_max_i64_acquire: 14425; RV32IA: # %bb.0: 14426; RV32IA-NEXT: addi sp, sp, -32 14427; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14428; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14429; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14430; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14431; RV32IA-NEXT: mv s0, a0 14432; RV32IA-NEXT: lw a5, 4(a0) 14433; RV32IA-NEXT: lw a4, 0(a0) 14434; RV32IA-NEXT: mv s1, a2 14435; RV32IA-NEXT: mv s2, a1 14436; RV32IA-NEXT: j .LBB201_2 14437; RV32IA-NEXT: .LBB201_1: # %atomicrmw.start 14438; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14439; RV32IA-NEXT: sw a4, 8(sp) 14440; RV32IA-NEXT: sw a5, 12(sp) 14441; RV32IA-NEXT: addi a1, sp, 8 14442; RV32IA-NEXT: li a4, 2 14443; RV32IA-NEXT: li a5, 2 14444; RV32IA-NEXT: mv a0, s0 14445; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14446; RV32IA-NEXT: lw a5, 12(sp) 14447; RV32IA-NEXT: lw a4, 8(sp) 14448; RV32IA-NEXT: bnez a0, .LBB201_7 14449; RV32IA-NEXT: .LBB201_2: # %atomicrmw.start 14450; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14451; RV32IA-NEXT: beq a5, s1, .LBB201_4 14452; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14453; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14454; RV32IA-NEXT: slt a0, s1, a5 14455; RV32IA-NEXT: j .LBB201_5 14456; RV32IA-NEXT: .LBB201_4: # in Loop: Header=BB201_2 Depth=1 14457; RV32IA-NEXT: sltu a0, s2, a4 14458; RV32IA-NEXT: .LBB201_5: # %atomicrmw.start 14459; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14460; RV32IA-NEXT: mv a2, a4 14461; RV32IA-NEXT: mv a3, a5 14462; RV32IA-NEXT: bnez a0, .LBB201_1 14463; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14464; RV32IA-NEXT: # in Loop: Header=BB201_2 Depth=1 14465; RV32IA-NEXT: mv a2, s2 14466; RV32IA-NEXT: mv a3, s1 14467; RV32IA-NEXT: j .LBB201_1 14468; RV32IA-NEXT: .LBB201_7: # %atomicrmw.end 14469; RV32IA-NEXT: mv a0, a4 14470; RV32IA-NEXT: mv a1, a5 14471; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14472; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14473; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14474; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14475; RV32IA-NEXT: addi sp, sp, 32 14476; RV32IA-NEXT: ret 14477; 14478; RV64I-LABEL: atomicrmw_max_i64_acquire: 14479; RV64I: # %bb.0: 14480; RV64I-NEXT: addi sp, sp, -32 14481; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14482; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14483; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14484; RV64I-NEXT: mv s0, a0 14485; RV64I-NEXT: ld a3, 0(a0) 14486; RV64I-NEXT: mv s1, a1 14487; RV64I-NEXT: j .LBB201_2 14488; RV64I-NEXT: .LBB201_1: # %atomicrmw.start 14489; RV64I-NEXT: # in Loop: Header=BB201_2 Depth=1 14490; RV64I-NEXT: sd a3, 0(sp) 14491; RV64I-NEXT: mv a1, sp 14492; RV64I-NEXT: li a3, 2 14493; RV64I-NEXT: li a4, 2 14494; RV64I-NEXT: mv a0, s0 14495; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14496; RV64I-NEXT: ld a3, 0(sp) 14497; RV64I-NEXT: bnez a0, .LBB201_4 14498; RV64I-NEXT: .LBB201_2: # %atomicrmw.start 14499; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14500; RV64I-NEXT: mv a2, a3 14501; RV64I-NEXT: blt s1, a3, .LBB201_1 14502; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14503; RV64I-NEXT: # in Loop: Header=BB201_2 Depth=1 14504; RV64I-NEXT: mv a2, s1 14505; RV64I-NEXT: j .LBB201_1 14506; RV64I-NEXT: .LBB201_4: # %atomicrmw.end 14507; RV64I-NEXT: mv a0, a3 14508; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14509; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14510; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14511; RV64I-NEXT: addi sp, sp, 32 14512; RV64I-NEXT: ret 14513; 14514; RV64IA-LABEL: atomicrmw_max_i64_acquire: 14515; RV64IA: # %bb.0: 14516; RV64IA-NEXT: amomax.d.aq a0, a1, (a0) 14517; RV64IA-NEXT: ret 14518 %1 = atomicrmw max i64* %a, i64 %b acquire 14519 ret i64 %1 14520} 14521 14522define i64 @atomicrmw_max_i64_release(i64 *%a, i64 %b) nounwind { 14523; RV32I-LABEL: atomicrmw_max_i64_release: 14524; RV32I: # %bb.0: 14525; RV32I-NEXT: addi sp, sp, -32 14526; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14527; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14528; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14529; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14530; RV32I-NEXT: mv s0, a0 14531; RV32I-NEXT: lw a5, 4(a0) 14532; RV32I-NEXT: lw a4, 0(a0) 14533; RV32I-NEXT: mv s1, a2 14534; RV32I-NEXT: mv s2, a1 14535; RV32I-NEXT: j .LBB202_2 14536; RV32I-NEXT: .LBB202_1: # %atomicrmw.start 14537; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14538; RV32I-NEXT: sw a4, 8(sp) 14539; RV32I-NEXT: sw a5, 12(sp) 14540; RV32I-NEXT: addi a1, sp, 8 14541; RV32I-NEXT: li a4, 3 14542; RV32I-NEXT: mv a0, s0 14543; RV32I-NEXT: li a5, 0 14544; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14545; RV32I-NEXT: lw a5, 12(sp) 14546; RV32I-NEXT: lw a4, 8(sp) 14547; RV32I-NEXT: bnez a0, .LBB202_7 14548; RV32I-NEXT: .LBB202_2: # %atomicrmw.start 14549; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14550; RV32I-NEXT: beq a5, s1, .LBB202_4 14551; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14552; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14553; RV32I-NEXT: slt a0, s1, a5 14554; RV32I-NEXT: j .LBB202_5 14555; RV32I-NEXT: .LBB202_4: # in Loop: Header=BB202_2 Depth=1 14556; RV32I-NEXT: sltu a0, s2, a4 14557; RV32I-NEXT: .LBB202_5: # %atomicrmw.start 14558; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14559; RV32I-NEXT: mv a2, a4 14560; RV32I-NEXT: mv a3, a5 14561; RV32I-NEXT: bnez a0, .LBB202_1 14562; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14563; RV32I-NEXT: # in Loop: Header=BB202_2 Depth=1 14564; RV32I-NEXT: mv a2, s2 14565; RV32I-NEXT: mv a3, s1 14566; RV32I-NEXT: j .LBB202_1 14567; RV32I-NEXT: .LBB202_7: # %atomicrmw.end 14568; RV32I-NEXT: mv a0, a4 14569; RV32I-NEXT: mv a1, a5 14570; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14571; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14572; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14573; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14574; RV32I-NEXT: addi sp, sp, 32 14575; RV32I-NEXT: ret 14576; 14577; RV32IA-LABEL: atomicrmw_max_i64_release: 14578; RV32IA: # %bb.0: 14579; RV32IA-NEXT: addi sp, sp, -32 14580; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14581; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14582; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14583; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14584; RV32IA-NEXT: mv s0, a0 14585; RV32IA-NEXT: lw a5, 4(a0) 14586; RV32IA-NEXT: lw a4, 0(a0) 14587; RV32IA-NEXT: mv s1, a2 14588; RV32IA-NEXT: mv s2, a1 14589; RV32IA-NEXT: j .LBB202_2 14590; RV32IA-NEXT: .LBB202_1: # %atomicrmw.start 14591; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14592; RV32IA-NEXT: sw a4, 8(sp) 14593; RV32IA-NEXT: sw a5, 12(sp) 14594; RV32IA-NEXT: addi a1, sp, 8 14595; RV32IA-NEXT: li a4, 3 14596; RV32IA-NEXT: mv a0, s0 14597; RV32IA-NEXT: li a5, 0 14598; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14599; RV32IA-NEXT: lw a5, 12(sp) 14600; RV32IA-NEXT: lw a4, 8(sp) 14601; RV32IA-NEXT: bnez a0, .LBB202_7 14602; RV32IA-NEXT: .LBB202_2: # %atomicrmw.start 14603; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14604; RV32IA-NEXT: beq a5, s1, .LBB202_4 14605; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14606; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14607; RV32IA-NEXT: slt a0, s1, a5 14608; RV32IA-NEXT: j .LBB202_5 14609; RV32IA-NEXT: .LBB202_4: # in Loop: Header=BB202_2 Depth=1 14610; RV32IA-NEXT: sltu a0, s2, a4 14611; RV32IA-NEXT: .LBB202_5: # %atomicrmw.start 14612; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14613; RV32IA-NEXT: mv a2, a4 14614; RV32IA-NEXT: mv a3, a5 14615; RV32IA-NEXT: bnez a0, .LBB202_1 14616; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14617; RV32IA-NEXT: # in Loop: Header=BB202_2 Depth=1 14618; RV32IA-NEXT: mv a2, s2 14619; RV32IA-NEXT: mv a3, s1 14620; RV32IA-NEXT: j .LBB202_1 14621; RV32IA-NEXT: .LBB202_7: # %atomicrmw.end 14622; RV32IA-NEXT: mv a0, a4 14623; RV32IA-NEXT: mv a1, a5 14624; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14625; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14626; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14627; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14628; RV32IA-NEXT: addi sp, sp, 32 14629; RV32IA-NEXT: ret 14630; 14631; RV64I-LABEL: atomicrmw_max_i64_release: 14632; RV64I: # %bb.0: 14633; RV64I-NEXT: addi sp, sp, -32 14634; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14635; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14636; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14637; RV64I-NEXT: mv s0, a0 14638; RV64I-NEXT: ld a3, 0(a0) 14639; RV64I-NEXT: mv s1, a1 14640; RV64I-NEXT: j .LBB202_2 14641; RV64I-NEXT: .LBB202_1: # %atomicrmw.start 14642; RV64I-NEXT: # in Loop: Header=BB202_2 Depth=1 14643; RV64I-NEXT: sd a3, 0(sp) 14644; RV64I-NEXT: mv a1, sp 14645; RV64I-NEXT: li a3, 3 14646; RV64I-NEXT: mv a0, s0 14647; RV64I-NEXT: li a4, 0 14648; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14649; RV64I-NEXT: ld a3, 0(sp) 14650; RV64I-NEXT: bnez a0, .LBB202_4 14651; RV64I-NEXT: .LBB202_2: # %atomicrmw.start 14652; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14653; RV64I-NEXT: mv a2, a3 14654; RV64I-NEXT: blt s1, a3, .LBB202_1 14655; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14656; RV64I-NEXT: # in Loop: Header=BB202_2 Depth=1 14657; RV64I-NEXT: mv a2, s1 14658; RV64I-NEXT: j .LBB202_1 14659; RV64I-NEXT: .LBB202_4: # %atomicrmw.end 14660; RV64I-NEXT: mv a0, a3 14661; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14662; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14663; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14664; RV64I-NEXT: addi sp, sp, 32 14665; RV64I-NEXT: ret 14666; 14667; RV64IA-LABEL: atomicrmw_max_i64_release: 14668; RV64IA: # %bb.0: 14669; RV64IA-NEXT: amomax.d.rl a0, a1, (a0) 14670; RV64IA-NEXT: ret 14671 %1 = atomicrmw max i64* %a, i64 %b release 14672 ret i64 %1 14673} 14674 14675define i64 @atomicrmw_max_i64_acq_rel(i64 *%a, i64 %b) nounwind { 14676; RV32I-LABEL: atomicrmw_max_i64_acq_rel: 14677; RV32I: # %bb.0: 14678; RV32I-NEXT: addi sp, sp, -32 14679; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14680; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14681; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14682; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14683; RV32I-NEXT: mv s0, a0 14684; RV32I-NEXT: lw a5, 4(a0) 14685; RV32I-NEXT: lw a4, 0(a0) 14686; RV32I-NEXT: mv s1, a2 14687; RV32I-NEXT: mv s2, a1 14688; RV32I-NEXT: j .LBB203_2 14689; RV32I-NEXT: .LBB203_1: # %atomicrmw.start 14690; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14691; RV32I-NEXT: sw a4, 8(sp) 14692; RV32I-NEXT: sw a5, 12(sp) 14693; RV32I-NEXT: addi a1, sp, 8 14694; RV32I-NEXT: li a4, 4 14695; RV32I-NEXT: li a5, 2 14696; RV32I-NEXT: mv a0, s0 14697; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14698; RV32I-NEXT: lw a5, 12(sp) 14699; RV32I-NEXT: lw a4, 8(sp) 14700; RV32I-NEXT: bnez a0, .LBB203_7 14701; RV32I-NEXT: .LBB203_2: # %atomicrmw.start 14702; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14703; RV32I-NEXT: beq a5, s1, .LBB203_4 14704; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14705; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14706; RV32I-NEXT: slt a0, s1, a5 14707; RV32I-NEXT: j .LBB203_5 14708; RV32I-NEXT: .LBB203_4: # in Loop: Header=BB203_2 Depth=1 14709; RV32I-NEXT: sltu a0, s2, a4 14710; RV32I-NEXT: .LBB203_5: # %atomicrmw.start 14711; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14712; RV32I-NEXT: mv a2, a4 14713; RV32I-NEXT: mv a3, a5 14714; RV32I-NEXT: bnez a0, .LBB203_1 14715; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14716; RV32I-NEXT: # in Loop: Header=BB203_2 Depth=1 14717; RV32I-NEXT: mv a2, s2 14718; RV32I-NEXT: mv a3, s1 14719; RV32I-NEXT: j .LBB203_1 14720; RV32I-NEXT: .LBB203_7: # %atomicrmw.end 14721; RV32I-NEXT: mv a0, a4 14722; RV32I-NEXT: mv a1, a5 14723; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14724; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14725; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14726; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14727; RV32I-NEXT: addi sp, sp, 32 14728; RV32I-NEXT: ret 14729; 14730; RV32IA-LABEL: atomicrmw_max_i64_acq_rel: 14731; RV32IA: # %bb.0: 14732; RV32IA-NEXT: addi sp, sp, -32 14733; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14734; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14735; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14736; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14737; RV32IA-NEXT: mv s0, a0 14738; RV32IA-NEXT: lw a5, 4(a0) 14739; RV32IA-NEXT: lw a4, 0(a0) 14740; RV32IA-NEXT: mv s1, a2 14741; RV32IA-NEXT: mv s2, a1 14742; RV32IA-NEXT: j .LBB203_2 14743; RV32IA-NEXT: .LBB203_1: # %atomicrmw.start 14744; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14745; RV32IA-NEXT: sw a4, 8(sp) 14746; RV32IA-NEXT: sw a5, 12(sp) 14747; RV32IA-NEXT: addi a1, sp, 8 14748; RV32IA-NEXT: li a4, 4 14749; RV32IA-NEXT: li a5, 2 14750; RV32IA-NEXT: mv a0, s0 14751; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14752; RV32IA-NEXT: lw a5, 12(sp) 14753; RV32IA-NEXT: lw a4, 8(sp) 14754; RV32IA-NEXT: bnez a0, .LBB203_7 14755; RV32IA-NEXT: .LBB203_2: # %atomicrmw.start 14756; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14757; RV32IA-NEXT: beq a5, s1, .LBB203_4 14758; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14759; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14760; RV32IA-NEXT: slt a0, s1, a5 14761; RV32IA-NEXT: j .LBB203_5 14762; RV32IA-NEXT: .LBB203_4: # in Loop: Header=BB203_2 Depth=1 14763; RV32IA-NEXT: sltu a0, s2, a4 14764; RV32IA-NEXT: .LBB203_5: # %atomicrmw.start 14765; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14766; RV32IA-NEXT: mv a2, a4 14767; RV32IA-NEXT: mv a3, a5 14768; RV32IA-NEXT: bnez a0, .LBB203_1 14769; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14770; RV32IA-NEXT: # in Loop: Header=BB203_2 Depth=1 14771; RV32IA-NEXT: mv a2, s2 14772; RV32IA-NEXT: mv a3, s1 14773; RV32IA-NEXT: j .LBB203_1 14774; RV32IA-NEXT: .LBB203_7: # %atomicrmw.end 14775; RV32IA-NEXT: mv a0, a4 14776; RV32IA-NEXT: mv a1, a5 14777; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14778; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14779; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14780; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14781; RV32IA-NEXT: addi sp, sp, 32 14782; RV32IA-NEXT: ret 14783; 14784; RV64I-LABEL: atomicrmw_max_i64_acq_rel: 14785; RV64I: # %bb.0: 14786; RV64I-NEXT: addi sp, sp, -32 14787; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14788; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14789; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14790; RV64I-NEXT: mv s0, a0 14791; RV64I-NEXT: ld a3, 0(a0) 14792; RV64I-NEXT: mv s1, a1 14793; RV64I-NEXT: j .LBB203_2 14794; RV64I-NEXT: .LBB203_1: # %atomicrmw.start 14795; RV64I-NEXT: # in Loop: Header=BB203_2 Depth=1 14796; RV64I-NEXT: sd a3, 0(sp) 14797; RV64I-NEXT: mv a1, sp 14798; RV64I-NEXT: li a3, 4 14799; RV64I-NEXT: li a4, 2 14800; RV64I-NEXT: mv a0, s0 14801; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14802; RV64I-NEXT: ld a3, 0(sp) 14803; RV64I-NEXT: bnez a0, .LBB203_4 14804; RV64I-NEXT: .LBB203_2: # %atomicrmw.start 14805; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14806; RV64I-NEXT: mv a2, a3 14807; RV64I-NEXT: blt s1, a3, .LBB203_1 14808; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14809; RV64I-NEXT: # in Loop: Header=BB203_2 Depth=1 14810; RV64I-NEXT: mv a2, s1 14811; RV64I-NEXT: j .LBB203_1 14812; RV64I-NEXT: .LBB203_4: # %atomicrmw.end 14813; RV64I-NEXT: mv a0, a3 14814; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14815; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14816; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14817; RV64I-NEXT: addi sp, sp, 32 14818; RV64I-NEXT: ret 14819; 14820; RV64IA-LABEL: atomicrmw_max_i64_acq_rel: 14821; RV64IA: # %bb.0: 14822; RV64IA-NEXT: amomax.d.aqrl a0, a1, (a0) 14823; RV64IA-NEXT: ret 14824 %1 = atomicrmw max i64* %a, i64 %b acq_rel 14825 ret i64 %1 14826} 14827 14828define i64 @atomicrmw_max_i64_seq_cst(i64 *%a, i64 %b) nounwind { 14829; RV32I-LABEL: atomicrmw_max_i64_seq_cst: 14830; RV32I: # %bb.0: 14831; RV32I-NEXT: addi sp, sp, -32 14832; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14833; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14834; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14835; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14836; RV32I-NEXT: mv s0, a0 14837; RV32I-NEXT: lw a5, 4(a0) 14838; RV32I-NEXT: lw a4, 0(a0) 14839; RV32I-NEXT: mv s1, a2 14840; RV32I-NEXT: mv s2, a1 14841; RV32I-NEXT: j .LBB204_2 14842; RV32I-NEXT: .LBB204_1: # %atomicrmw.start 14843; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14844; RV32I-NEXT: sw a4, 8(sp) 14845; RV32I-NEXT: sw a5, 12(sp) 14846; RV32I-NEXT: addi a1, sp, 8 14847; RV32I-NEXT: li a4, 5 14848; RV32I-NEXT: li a5, 5 14849; RV32I-NEXT: mv a0, s0 14850; RV32I-NEXT: call __atomic_compare_exchange_8@plt 14851; RV32I-NEXT: lw a5, 12(sp) 14852; RV32I-NEXT: lw a4, 8(sp) 14853; RV32I-NEXT: bnez a0, .LBB204_7 14854; RV32I-NEXT: .LBB204_2: # %atomicrmw.start 14855; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 14856; RV32I-NEXT: beq a5, s1, .LBB204_4 14857; RV32I-NEXT: # %bb.3: # %atomicrmw.start 14858; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14859; RV32I-NEXT: slt a0, s1, a5 14860; RV32I-NEXT: j .LBB204_5 14861; RV32I-NEXT: .LBB204_4: # in Loop: Header=BB204_2 Depth=1 14862; RV32I-NEXT: sltu a0, s2, a4 14863; RV32I-NEXT: .LBB204_5: # %atomicrmw.start 14864; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14865; RV32I-NEXT: mv a2, a4 14866; RV32I-NEXT: mv a3, a5 14867; RV32I-NEXT: bnez a0, .LBB204_1 14868; RV32I-NEXT: # %bb.6: # %atomicrmw.start 14869; RV32I-NEXT: # in Loop: Header=BB204_2 Depth=1 14870; RV32I-NEXT: mv a2, s2 14871; RV32I-NEXT: mv a3, s1 14872; RV32I-NEXT: j .LBB204_1 14873; RV32I-NEXT: .LBB204_7: # %atomicrmw.end 14874; RV32I-NEXT: mv a0, a4 14875; RV32I-NEXT: mv a1, a5 14876; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14877; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14878; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14879; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14880; RV32I-NEXT: addi sp, sp, 32 14881; RV32I-NEXT: ret 14882; 14883; RV32IA-LABEL: atomicrmw_max_i64_seq_cst: 14884; RV32IA: # %bb.0: 14885; RV32IA-NEXT: addi sp, sp, -32 14886; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14887; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14888; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14889; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14890; RV32IA-NEXT: mv s0, a0 14891; RV32IA-NEXT: lw a5, 4(a0) 14892; RV32IA-NEXT: lw a4, 0(a0) 14893; RV32IA-NEXT: mv s1, a2 14894; RV32IA-NEXT: mv s2, a1 14895; RV32IA-NEXT: j .LBB204_2 14896; RV32IA-NEXT: .LBB204_1: # %atomicrmw.start 14897; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14898; RV32IA-NEXT: sw a4, 8(sp) 14899; RV32IA-NEXT: sw a5, 12(sp) 14900; RV32IA-NEXT: addi a1, sp, 8 14901; RV32IA-NEXT: li a4, 5 14902; RV32IA-NEXT: li a5, 5 14903; RV32IA-NEXT: mv a0, s0 14904; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 14905; RV32IA-NEXT: lw a5, 12(sp) 14906; RV32IA-NEXT: lw a4, 8(sp) 14907; RV32IA-NEXT: bnez a0, .LBB204_7 14908; RV32IA-NEXT: .LBB204_2: # %atomicrmw.start 14909; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 14910; RV32IA-NEXT: beq a5, s1, .LBB204_4 14911; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 14912; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14913; RV32IA-NEXT: slt a0, s1, a5 14914; RV32IA-NEXT: j .LBB204_5 14915; RV32IA-NEXT: .LBB204_4: # in Loop: Header=BB204_2 Depth=1 14916; RV32IA-NEXT: sltu a0, s2, a4 14917; RV32IA-NEXT: .LBB204_5: # %atomicrmw.start 14918; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14919; RV32IA-NEXT: mv a2, a4 14920; RV32IA-NEXT: mv a3, a5 14921; RV32IA-NEXT: bnez a0, .LBB204_1 14922; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 14923; RV32IA-NEXT: # in Loop: Header=BB204_2 Depth=1 14924; RV32IA-NEXT: mv a2, s2 14925; RV32IA-NEXT: mv a3, s1 14926; RV32IA-NEXT: j .LBB204_1 14927; RV32IA-NEXT: .LBB204_7: # %atomicrmw.end 14928; RV32IA-NEXT: mv a0, a4 14929; RV32IA-NEXT: mv a1, a5 14930; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 14931; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 14932; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 14933; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 14934; RV32IA-NEXT: addi sp, sp, 32 14935; RV32IA-NEXT: ret 14936; 14937; RV64I-LABEL: atomicrmw_max_i64_seq_cst: 14938; RV64I: # %bb.0: 14939; RV64I-NEXT: addi sp, sp, -32 14940; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 14941; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 14942; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 14943; RV64I-NEXT: mv s0, a0 14944; RV64I-NEXT: ld a3, 0(a0) 14945; RV64I-NEXT: mv s1, a1 14946; RV64I-NEXT: j .LBB204_2 14947; RV64I-NEXT: .LBB204_1: # %atomicrmw.start 14948; RV64I-NEXT: # in Loop: Header=BB204_2 Depth=1 14949; RV64I-NEXT: sd a3, 0(sp) 14950; RV64I-NEXT: mv a1, sp 14951; RV64I-NEXT: li a3, 5 14952; RV64I-NEXT: li a4, 5 14953; RV64I-NEXT: mv a0, s0 14954; RV64I-NEXT: call __atomic_compare_exchange_8@plt 14955; RV64I-NEXT: ld a3, 0(sp) 14956; RV64I-NEXT: bnez a0, .LBB204_4 14957; RV64I-NEXT: .LBB204_2: # %atomicrmw.start 14958; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 14959; RV64I-NEXT: mv a2, a3 14960; RV64I-NEXT: blt s1, a3, .LBB204_1 14961; RV64I-NEXT: # %bb.3: # %atomicrmw.start 14962; RV64I-NEXT: # in Loop: Header=BB204_2 Depth=1 14963; RV64I-NEXT: mv a2, s1 14964; RV64I-NEXT: j .LBB204_1 14965; RV64I-NEXT: .LBB204_4: # %atomicrmw.end 14966; RV64I-NEXT: mv a0, a3 14967; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 14968; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 14969; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 14970; RV64I-NEXT: addi sp, sp, 32 14971; RV64I-NEXT: ret 14972; 14973; RV64IA-LABEL: atomicrmw_max_i64_seq_cst: 14974; RV64IA: # %bb.0: 14975; RV64IA-NEXT: amomax.d.aqrl a0, a1, (a0) 14976; RV64IA-NEXT: ret 14977 %1 = atomicrmw max i64* %a, i64 %b seq_cst 14978 ret i64 %1 14979} 14980 14981define i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind { 14982; RV32I-LABEL: atomicrmw_min_i64_monotonic: 14983; RV32I: # %bb.0: 14984; RV32I-NEXT: addi sp, sp, -32 14985; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 14986; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 14987; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 14988; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 14989; RV32I-NEXT: mv s0, a0 14990; RV32I-NEXT: lw a5, 4(a0) 14991; RV32I-NEXT: lw a4, 0(a0) 14992; RV32I-NEXT: mv s1, a2 14993; RV32I-NEXT: mv s2, a1 14994; RV32I-NEXT: j .LBB205_2 14995; RV32I-NEXT: .LBB205_1: # %atomicrmw.start 14996; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 14997; RV32I-NEXT: sw a4, 8(sp) 14998; RV32I-NEXT: sw a5, 12(sp) 14999; RV32I-NEXT: addi a1, sp, 8 15000; RV32I-NEXT: mv a0, s0 15001; RV32I-NEXT: li a4, 0 15002; RV32I-NEXT: li a5, 0 15003; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15004; RV32I-NEXT: lw a5, 12(sp) 15005; RV32I-NEXT: lw a4, 8(sp) 15006; RV32I-NEXT: bnez a0, .LBB205_7 15007; RV32I-NEXT: .LBB205_2: # %atomicrmw.start 15008; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15009; RV32I-NEXT: beq a5, s1, .LBB205_4 15010; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15011; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15012; RV32I-NEXT: slt a0, s1, a5 15013; RV32I-NEXT: j .LBB205_5 15014; RV32I-NEXT: .LBB205_4: # in Loop: Header=BB205_2 Depth=1 15015; RV32I-NEXT: sltu a0, s2, a4 15016; RV32I-NEXT: .LBB205_5: # %atomicrmw.start 15017; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15018; RV32I-NEXT: xori a0, a0, 1 15019; RV32I-NEXT: mv a2, a4 15020; RV32I-NEXT: mv a3, a5 15021; RV32I-NEXT: bnez a0, .LBB205_1 15022; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15023; RV32I-NEXT: # in Loop: Header=BB205_2 Depth=1 15024; RV32I-NEXT: mv a2, s2 15025; RV32I-NEXT: mv a3, s1 15026; RV32I-NEXT: j .LBB205_1 15027; RV32I-NEXT: .LBB205_7: # %atomicrmw.end 15028; RV32I-NEXT: mv a0, a4 15029; RV32I-NEXT: mv a1, a5 15030; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15031; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15032; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15033; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15034; RV32I-NEXT: addi sp, sp, 32 15035; RV32I-NEXT: ret 15036; 15037; RV32IA-LABEL: atomicrmw_min_i64_monotonic: 15038; RV32IA: # %bb.0: 15039; RV32IA-NEXT: addi sp, sp, -32 15040; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15041; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15042; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15043; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15044; RV32IA-NEXT: mv s0, a0 15045; RV32IA-NEXT: lw a5, 4(a0) 15046; RV32IA-NEXT: lw a4, 0(a0) 15047; RV32IA-NEXT: mv s1, a2 15048; RV32IA-NEXT: mv s2, a1 15049; RV32IA-NEXT: j .LBB205_2 15050; RV32IA-NEXT: .LBB205_1: # %atomicrmw.start 15051; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15052; RV32IA-NEXT: sw a4, 8(sp) 15053; RV32IA-NEXT: sw a5, 12(sp) 15054; RV32IA-NEXT: addi a1, sp, 8 15055; RV32IA-NEXT: mv a0, s0 15056; RV32IA-NEXT: li a4, 0 15057; RV32IA-NEXT: li a5, 0 15058; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15059; RV32IA-NEXT: lw a5, 12(sp) 15060; RV32IA-NEXT: lw a4, 8(sp) 15061; RV32IA-NEXT: bnez a0, .LBB205_7 15062; RV32IA-NEXT: .LBB205_2: # %atomicrmw.start 15063; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15064; RV32IA-NEXT: beq a5, s1, .LBB205_4 15065; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15066; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15067; RV32IA-NEXT: slt a0, s1, a5 15068; RV32IA-NEXT: j .LBB205_5 15069; RV32IA-NEXT: .LBB205_4: # in Loop: Header=BB205_2 Depth=1 15070; RV32IA-NEXT: sltu a0, s2, a4 15071; RV32IA-NEXT: .LBB205_5: # %atomicrmw.start 15072; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15073; RV32IA-NEXT: xori a0, a0, 1 15074; RV32IA-NEXT: mv a2, a4 15075; RV32IA-NEXT: mv a3, a5 15076; RV32IA-NEXT: bnez a0, .LBB205_1 15077; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15078; RV32IA-NEXT: # in Loop: Header=BB205_2 Depth=1 15079; RV32IA-NEXT: mv a2, s2 15080; RV32IA-NEXT: mv a3, s1 15081; RV32IA-NEXT: j .LBB205_1 15082; RV32IA-NEXT: .LBB205_7: # %atomicrmw.end 15083; RV32IA-NEXT: mv a0, a4 15084; RV32IA-NEXT: mv a1, a5 15085; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15086; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15087; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15088; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15089; RV32IA-NEXT: addi sp, sp, 32 15090; RV32IA-NEXT: ret 15091; 15092; RV64I-LABEL: atomicrmw_min_i64_monotonic: 15093; RV64I: # %bb.0: 15094; RV64I-NEXT: addi sp, sp, -32 15095; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15096; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15097; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15098; RV64I-NEXT: mv s0, a0 15099; RV64I-NEXT: ld a3, 0(a0) 15100; RV64I-NEXT: mv s1, a1 15101; RV64I-NEXT: j .LBB205_2 15102; RV64I-NEXT: .LBB205_1: # %atomicrmw.start 15103; RV64I-NEXT: # in Loop: Header=BB205_2 Depth=1 15104; RV64I-NEXT: sd a3, 0(sp) 15105; RV64I-NEXT: mv a1, sp 15106; RV64I-NEXT: mv a0, s0 15107; RV64I-NEXT: li a3, 0 15108; RV64I-NEXT: li a4, 0 15109; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15110; RV64I-NEXT: ld a3, 0(sp) 15111; RV64I-NEXT: bnez a0, .LBB205_4 15112; RV64I-NEXT: .LBB205_2: # %atomicrmw.start 15113; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15114; RV64I-NEXT: mv a2, a3 15115; RV64I-NEXT: bge s1, a3, .LBB205_1 15116; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15117; RV64I-NEXT: # in Loop: Header=BB205_2 Depth=1 15118; RV64I-NEXT: mv a2, s1 15119; RV64I-NEXT: j .LBB205_1 15120; RV64I-NEXT: .LBB205_4: # %atomicrmw.end 15121; RV64I-NEXT: mv a0, a3 15122; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15123; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15124; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15125; RV64I-NEXT: addi sp, sp, 32 15126; RV64I-NEXT: ret 15127; 15128; RV64IA-LABEL: atomicrmw_min_i64_monotonic: 15129; RV64IA: # %bb.0: 15130; RV64IA-NEXT: amomin.d a0, a1, (a0) 15131; RV64IA-NEXT: ret 15132 %1 = atomicrmw min i64* %a, i64 %b monotonic 15133 ret i64 %1 15134} 15135 15136define i64 @atomicrmw_min_i64_acquire(i64 *%a, i64 %b) nounwind { 15137; RV32I-LABEL: atomicrmw_min_i64_acquire: 15138; RV32I: # %bb.0: 15139; RV32I-NEXT: addi sp, sp, -32 15140; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15141; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15142; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15143; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15144; RV32I-NEXT: mv s0, a0 15145; RV32I-NEXT: lw a5, 4(a0) 15146; RV32I-NEXT: lw a4, 0(a0) 15147; RV32I-NEXT: mv s1, a2 15148; RV32I-NEXT: mv s2, a1 15149; RV32I-NEXT: j .LBB206_2 15150; RV32I-NEXT: .LBB206_1: # %atomicrmw.start 15151; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15152; RV32I-NEXT: sw a4, 8(sp) 15153; RV32I-NEXT: sw a5, 12(sp) 15154; RV32I-NEXT: addi a1, sp, 8 15155; RV32I-NEXT: li a4, 2 15156; RV32I-NEXT: li a5, 2 15157; RV32I-NEXT: mv a0, s0 15158; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15159; RV32I-NEXT: lw a5, 12(sp) 15160; RV32I-NEXT: lw a4, 8(sp) 15161; RV32I-NEXT: bnez a0, .LBB206_7 15162; RV32I-NEXT: .LBB206_2: # %atomicrmw.start 15163; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15164; RV32I-NEXT: beq a5, s1, .LBB206_4 15165; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15166; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15167; RV32I-NEXT: slt a0, s1, a5 15168; RV32I-NEXT: j .LBB206_5 15169; RV32I-NEXT: .LBB206_4: # in Loop: Header=BB206_2 Depth=1 15170; RV32I-NEXT: sltu a0, s2, a4 15171; RV32I-NEXT: .LBB206_5: # %atomicrmw.start 15172; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15173; RV32I-NEXT: xori a0, a0, 1 15174; RV32I-NEXT: mv a2, a4 15175; RV32I-NEXT: mv a3, a5 15176; RV32I-NEXT: bnez a0, .LBB206_1 15177; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15178; RV32I-NEXT: # in Loop: Header=BB206_2 Depth=1 15179; RV32I-NEXT: mv a2, s2 15180; RV32I-NEXT: mv a3, s1 15181; RV32I-NEXT: j .LBB206_1 15182; RV32I-NEXT: .LBB206_7: # %atomicrmw.end 15183; RV32I-NEXT: mv a0, a4 15184; RV32I-NEXT: mv a1, a5 15185; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15186; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15187; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15188; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15189; RV32I-NEXT: addi sp, sp, 32 15190; RV32I-NEXT: ret 15191; 15192; RV32IA-LABEL: atomicrmw_min_i64_acquire: 15193; RV32IA: # %bb.0: 15194; RV32IA-NEXT: addi sp, sp, -32 15195; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15196; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15197; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15198; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15199; RV32IA-NEXT: mv s0, a0 15200; RV32IA-NEXT: lw a5, 4(a0) 15201; RV32IA-NEXT: lw a4, 0(a0) 15202; RV32IA-NEXT: mv s1, a2 15203; RV32IA-NEXT: mv s2, a1 15204; RV32IA-NEXT: j .LBB206_2 15205; RV32IA-NEXT: .LBB206_1: # %atomicrmw.start 15206; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15207; RV32IA-NEXT: sw a4, 8(sp) 15208; RV32IA-NEXT: sw a5, 12(sp) 15209; RV32IA-NEXT: addi a1, sp, 8 15210; RV32IA-NEXT: li a4, 2 15211; RV32IA-NEXT: li a5, 2 15212; RV32IA-NEXT: mv a0, s0 15213; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15214; RV32IA-NEXT: lw a5, 12(sp) 15215; RV32IA-NEXT: lw a4, 8(sp) 15216; RV32IA-NEXT: bnez a0, .LBB206_7 15217; RV32IA-NEXT: .LBB206_2: # %atomicrmw.start 15218; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15219; RV32IA-NEXT: beq a5, s1, .LBB206_4 15220; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15221; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15222; RV32IA-NEXT: slt a0, s1, a5 15223; RV32IA-NEXT: j .LBB206_5 15224; RV32IA-NEXT: .LBB206_4: # in Loop: Header=BB206_2 Depth=1 15225; RV32IA-NEXT: sltu a0, s2, a4 15226; RV32IA-NEXT: .LBB206_5: # %atomicrmw.start 15227; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15228; RV32IA-NEXT: xori a0, a0, 1 15229; RV32IA-NEXT: mv a2, a4 15230; RV32IA-NEXT: mv a3, a5 15231; RV32IA-NEXT: bnez a0, .LBB206_1 15232; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15233; RV32IA-NEXT: # in Loop: Header=BB206_2 Depth=1 15234; RV32IA-NEXT: mv a2, s2 15235; RV32IA-NEXT: mv a3, s1 15236; RV32IA-NEXT: j .LBB206_1 15237; RV32IA-NEXT: .LBB206_7: # %atomicrmw.end 15238; RV32IA-NEXT: mv a0, a4 15239; RV32IA-NEXT: mv a1, a5 15240; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15241; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15242; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15243; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15244; RV32IA-NEXT: addi sp, sp, 32 15245; RV32IA-NEXT: ret 15246; 15247; RV64I-LABEL: atomicrmw_min_i64_acquire: 15248; RV64I: # %bb.0: 15249; RV64I-NEXT: addi sp, sp, -32 15250; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15251; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15252; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15253; RV64I-NEXT: mv s0, a0 15254; RV64I-NEXT: ld a3, 0(a0) 15255; RV64I-NEXT: mv s1, a1 15256; RV64I-NEXT: j .LBB206_2 15257; RV64I-NEXT: .LBB206_1: # %atomicrmw.start 15258; RV64I-NEXT: # in Loop: Header=BB206_2 Depth=1 15259; RV64I-NEXT: sd a3, 0(sp) 15260; RV64I-NEXT: mv a1, sp 15261; RV64I-NEXT: li a3, 2 15262; RV64I-NEXT: li a4, 2 15263; RV64I-NEXT: mv a0, s0 15264; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15265; RV64I-NEXT: ld a3, 0(sp) 15266; RV64I-NEXT: bnez a0, .LBB206_4 15267; RV64I-NEXT: .LBB206_2: # %atomicrmw.start 15268; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15269; RV64I-NEXT: mv a2, a3 15270; RV64I-NEXT: bge s1, a3, .LBB206_1 15271; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15272; RV64I-NEXT: # in Loop: Header=BB206_2 Depth=1 15273; RV64I-NEXT: mv a2, s1 15274; RV64I-NEXT: j .LBB206_1 15275; RV64I-NEXT: .LBB206_4: # %atomicrmw.end 15276; RV64I-NEXT: mv a0, a3 15277; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15278; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15279; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15280; RV64I-NEXT: addi sp, sp, 32 15281; RV64I-NEXT: ret 15282; 15283; RV64IA-LABEL: atomicrmw_min_i64_acquire: 15284; RV64IA: # %bb.0: 15285; RV64IA-NEXT: amomin.d.aq a0, a1, (a0) 15286; RV64IA-NEXT: ret 15287 %1 = atomicrmw min i64* %a, i64 %b acquire 15288 ret i64 %1 15289} 15290 15291define i64 @atomicrmw_min_i64_release(i64 *%a, i64 %b) nounwind { 15292; RV32I-LABEL: atomicrmw_min_i64_release: 15293; RV32I: # %bb.0: 15294; RV32I-NEXT: addi sp, sp, -32 15295; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15296; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15297; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15298; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15299; RV32I-NEXT: mv s0, a0 15300; RV32I-NEXT: lw a5, 4(a0) 15301; RV32I-NEXT: lw a4, 0(a0) 15302; RV32I-NEXT: mv s1, a2 15303; RV32I-NEXT: mv s2, a1 15304; RV32I-NEXT: j .LBB207_2 15305; RV32I-NEXT: .LBB207_1: # %atomicrmw.start 15306; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15307; RV32I-NEXT: sw a4, 8(sp) 15308; RV32I-NEXT: sw a5, 12(sp) 15309; RV32I-NEXT: addi a1, sp, 8 15310; RV32I-NEXT: li a4, 3 15311; RV32I-NEXT: mv a0, s0 15312; RV32I-NEXT: li a5, 0 15313; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15314; RV32I-NEXT: lw a5, 12(sp) 15315; RV32I-NEXT: lw a4, 8(sp) 15316; RV32I-NEXT: bnez a0, .LBB207_7 15317; RV32I-NEXT: .LBB207_2: # %atomicrmw.start 15318; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15319; RV32I-NEXT: beq a5, s1, .LBB207_4 15320; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15321; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15322; RV32I-NEXT: slt a0, s1, a5 15323; RV32I-NEXT: j .LBB207_5 15324; RV32I-NEXT: .LBB207_4: # in Loop: Header=BB207_2 Depth=1 15325; RV32I-NEXT: sltu a0, s2, a4 15326; RV32I-NEXT: .LBB207_5: # %atomicrmw.start 15327; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15328; RV32I-NEXT: xori a0, a0, 1 15329; RV32I-NEXT: mv a2, a4 15330; RV32I-NEXT: mv a3, a5 15331; RV32I-NEXT: bnez a0, .LBB207_1 15332; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15333; RV32I-NEXT: # in Loop: Header=BB207_2 Depth=1 15334; RV32I-NEXT: mv a2, s2 15335; RV32I-NEXT: mv a3, s1 15336; RV32I-NEXT: j .LBB207_1 15337; RV32I-NEXT: .LBB207_7: # %atomicrmw.end 15338; RV32I-NEXT: mv a0, a4 15339; RV32I-NEXT: mv a1, a5 15340; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15341; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15342; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15343; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15344; RV32I-NEXT: addi sp, sp, 32 15345; RV32I-NEXT: ret 15346; 15347; RV32IA-LABEL: atomicrmw_min_i64_release: 15348; RV32IA: # %bb.0: 15349; RV32IA-NEXT: addi sp, sp, -32 15350; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15351; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15352; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15353; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15354; RV32IA-NEXT: mv s0, a0 15355; RV32IA-NEXT: lw a5, 4(a0) 15356; RV32IA-NEXT: lw a4, 0(a0) 15357; RV32IA-NEXT: mv s1, a2 15358; RV32IA-NEXT: mv s2, a1 15359; RV32IA-NEXT: j .LBB207_2 15360; RV32IA-NEXT: .LBB207_1: # %atomicrmw.start 15361; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15362; RV32IA-NEXT: sw a4, 8(sp) 15363; RV32IA-NEXT: sw a5, 12(sp) 15364; RV32IA-NEXT: addi a1, sp, 8 15365; RV32IA-NEXT: li a4, 3 15366; RV32IA-NEXT: mv a0, s0 15367; RV32IA-NEXT: li a5, 0 15368; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15369; RV32IA-NEXT: lw a5, 12(sp) 15370; RV32IA-NEXT: lw a4, 8(sp) 15371; RV32IA-NEXT: bnez a0, .LBB207_7 15372; RV32IA-NEXT: .LBB207_2: # %atomicrmw.start 15373; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15374; RV32IA-NEXT: beq a5, s1, .LBB207_4 15375; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15376; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15377; RV32IA-NEXT: slt a0, s1, a5 15378; RV32IA-NEXT: j .LBB207_5 15379; RV32IA-NEXT: .LBB207_4: # in Loop: Header=BB207_2 Depth=1 15380; RV32IA-NEXT: sltu a0, s2, a4 15381; RV32IA-NEXT: .LBB207_5: # %atomicrmw.start 15382; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15383; RV32IA-NEXT: xori a0, a0, 1 15384; RV32IA-NEXT: mv a2, a4 15385; RV32IA-NEXT: mv a3, a5 15386; RV32IA-NEXT: bnez a0, .LBB207_1 15387; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15388; RV32IA-NEXT: # in Loop: Header=BB207_2 Depth=1 15389; RV32IA-NEXT: mv a2, s2 15390; RV32IA-NEXT: mv a3, s1 15391; RV32IA-NEXT: j .LBB207_1 15392; RV32IA-NEXT: .LBB207_7: # %atomicrmw.end 15393; RV32IA-NEXT: mv a0, a4 15394; RV32IA-NEXT: mv a1, a5 15395; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15396; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15397; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15398; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15399; RV32IA-NEXT: addi sp, sp, 32 15400; RV32IA-NEXT: ret 15401; 15402; RV64I-LABEL: atomicrmw_min_i64_release: 15403; RV64I: # %bb.0: 15404; RV64I-NEXT: addi sp, sp, -32 15405; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15406; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15407; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15408; RV64I-NEXT: mv s0, a0 15409; RV64I-NEXT: ld a3, 0(a0) 15410; RV64I-NEXT: mv s1, a1 15411; RV64I-NEXT: j .LBB207_2 15412; RV64I-NEXT: .LBB207_1: # %atomicrmw.start 15413; RV64I-NEXT: # in Loop: Header=BB207_2 Depth=1 15414; RV64I-NEXT: sd a3, 0(sp) 15415; RV64I-NEXT: mv a1, sp 15416; RV64I-NEXT: li a3, 3 15417; RV64I-NEXT: mv a0, s0 15418; RV64I-NEXT: li a4, 0 15419; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15420; RV64I-NEXT: ld a3, 0(sp) 15421; RV64I-NEXT: bnez a0, .LBB207_4 15422; RV64I-NEXT: .LBB207_2: # %atomicrmw.start 15423; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15424; RV64I-NEXT: mv a2, a3 15425; RV64I-NEXT: bge s1, a3, .LBB207_1 15426; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15427; RV64I-NEXT: # in Loop: Header=BB207_2 Depth=1 15428; RV64I-NEXT: mv a2, s1 15429; RV64I-NEXT: j .LBB207_1 15430; RV64I-NEXT: .LBB207_4: # %atomicrmw.end 15431; RV64I-NEXT: mv a0, a3 15432; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15433; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15434; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15435; RV64I-NEXT: addi sp, sp, 32 15436; RV64I-NEXT: ret 15437; 15438; RV64IA-LABEL: atomicrmw_min_i64_release: 15439; RV64IA: # %bb.0: 15440; RV64IA-NEXT: amomin.d.rl a0, a1, (a0) 15441; RV64IA-NEXT: ret 15442 %1 = atomicrmw min i64* %a, i64 %b release 15443 ret i64 %1 15444} 15445 15446define i64 @atomicrmw_min_i64_acq_rel(i64 *%a, i64 %b) nounwind { 15447; RV32I-LABEL: atomicrmw_min_i64_acq_rel: 15448; RV32I: # %bb.0: 15449; RV32I-NEXT: addi sp, sp, -32 15450; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15451; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15452; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15453; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15454; RV32I-NEXT: mv s0, a0 15455; RV32I-NEXT: lw a5, 4(a0) 15456; RV32I-NEXT: lw a4, 0(a0) 15457; RV32I-NEXT: mv s1, a2 15458; RV32I-NEXT: mv s2, a1 15459; RV32I-NEXT: j .LBB208_2 15460; RV32I-NEXT: .LBB208_1: # %atomicrmw.start 15461; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15462; RV32I-NEXT: sw a4, 8(sp) 15463; RV32I-NEXT: sw a5, 12(sp) 15464; RV32I-NEXT: addi a1, sp, 8 15465; RV32I-NEXT: li a4, 4 15466; RV32I-NEXT: li a5, 2 15467; RV32I-NEXT: mv a0, s0 15468; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15469; RV32I-NEXT: lw a5, 12(sp) 15470; RV32I-NEXT: lw a4, 8(sp) 15471; RV32I-NEXT: bnez a0, .LBB208_7 15472; RV32I-NEXT: .LBB208_2: # %atomicrmw.start 15473; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15474; RV32I-NEXT: beq a5, s1, .LBB208_4 15475; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15476; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15477; RV32I-NEXT: slt a0, s1, a5 15478; RV32I-NEXT: j .LBB208_5 15479; RV32I-NEXT: .LBB208_4: # in Loop: Header=BB208_2 Depth=1 15480; RV32I-NEXT: sltu a0, s2, a4 15481; RV32I-NEXT: .LBB208_5: # %atomicrmw.start 15482; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15483; RV32I-NEXT: xori a0, a0, 1 15484; RV32I-NEXT: mv a2, a4 15485; RV32I-NEXT: mv a3, a5 15486; RV32I-NEXT: bnez a0, .LBB208_1 15487; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15488; RV32I-NEXT: # in Loop: Header=BB208_2 Depth=1 15489; RV32I-NEXT: mv a2, s2 15490; RV32I-NEXT: mv a3, s1 15491; RV32I-NEXT: j .LBB208_1 15492; RV32I-NEXT: .LBB208_7: # %atomicrmw.end 15493; RV32I-NEXT: mv a0, a4 15494; RV32I-NEXT: mv a1, a5 15495; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15496; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15497; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15498; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15499; RV32I-NEXT: addi sp, sp, 32 15500; RV32I-NEXT: ret 15501; 15502; RV32IA-LABEL: atomicrmw_min_i64_acq_rel: 15503; RV32IA: # %bb.0: 15504; RV32IA-NEXT: addi sp, sp, -32 15505; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15506; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15507; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15508; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15509; RV32IA-NEXT: mv s0, a0 15510; RV32IA-NEXT: lw a5, 4(a0) 15511; RV32IA-NEXT: lw a4, 0(a0) 15512; RV32IA-NEXT: mv s1, a2 15513; RV32IA-NEXT: mv s2, a1 15514; RV32IA-NEXT: j .LBB208_2 15515; RV32IA-NEXT: .LBB208_1: # %atomicrmw.start 15516; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15517; RV32IA-NEXT: sw a4, 8(sp) 15518; RV32IA-NEXT: sw a5, 12(sp) 15519; RV32IA-NEXT: addi a1, sp, 8 15520; RV32IA-NEXT: li a4, 4 15521; RV32IA-NEXT: li a5, 2 15522; RV32IA-NEXT: mv a0, s0 15523; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15524; RV32IA-NEXT: lw a5, 12(sp) 15525; RV32IA-NEXT: lw a4, 8(sp) 15526; RV32IA-NEXT: bnez a0, .LBB208_7 15527; RV32IA-NEXT: .LBB208_2: # %atomicrmw.start 15528; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15529; RV32IA-NEXT: beq a5, s1, .LBB208_4 15530; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15531; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15532; RV32IA-NEXT: slt a0, s1, a5 15533; RV32IA-NEXT: j .LBB208_5 15534; RV32IA-NEXT: .LBB208_4: # in Loop: Header=BB208_2 Depth=1 15535; RV32IA-NEXT: sltu a0, s2, a4 15536; RV32IA-NEXT: .LBB208_5: # %atomicrmw.start 15537; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15538; RV32IA-NEXT: xori a0, a0, 1 15539; RV32IA-NEXT: mv a2, a4 15540; RV32IA-NEXT: mv a3, a5 15541; RV32IA-NEXT: bnez a0, .LBB208_1 15542; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15543; RV32IA-NEXT: # in Loop: Header=BB208_2 Depth=1 15544; RV32IA-NEXT: mv a2, s2 15545; RV32IA-NEXT: mv a3, s1 15546; RV32IA-NEXT: j .LBB208_1 15547; RV32IA-NEXT: .LBB208_7: # %atomicrmw.end 15548; RV32IA-NEXT: mv a0, a4 15549; RV32IA-NEXT: mv a1, a5 15550; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15551; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15552; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15553; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15554; RV32IA-NEXT: addi sp, sp, 32 15555; RV32IA-NEXT: ret 15556; 15557; RV64I-LABEL: atomicrmw_min_i64_acq_rel: 15558; RV64I: # %bb.0: 15559; RV64I-NEXT: addi sp, sp, -32 15560; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15561; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15562; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15563; RV64I-NEXT: mv s0, a0 15564; RV64I-NEXT: ld a3, 0(a0) 15565; RV64I-NEXT: mv s1, a1 15566; RV64I-NEXT: j .LBB208_2 15567; RV64I-NEXT: .LBB208_1: # %atomicrmw.start 15568; RV64I-NEXT: # in Loop: Header=BB208_2 Depth=1 15569; RV64I-NEXT: sd a3, 0(sp) 15570; RV64I-NEXT: mv a1, sp 15571; RV64I-NEXT: li a3, 4 15572; RV64I-NEXT: li a4, 2 15573; RV64I-NEXT: mv a0, s0 15574; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15575; RV64I-NEXT: ld a3, 0(sp) 15576; RV64I-NEXT: bnez a0, .LBB208_4 15577; RV64I-NEXT: .LBB208_2: # %atomicrmw.start 15578; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15579; RV64I-NEXT: mv a2, a3 15580; RV64I-NEXT: bge s1, a3, .LBB208_1 15581; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15582; RV64I-NEXT: # in Loop: Header=BB208_2 Depth=1 15583; RV64I-NEXT: mv a2, s1 15584; RV64I-NEXT: j .LBB208_1 15585; RV64I-NEXT: .LBB208_4: # %atomicrmw.end 15586; RV64I-NEXT: mv a0, a3 15587; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15588; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15589; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15590; RV64I-NEXT: addi sp, sp, 32 15591; RV64I-NEXT: ret 15592; 15593; RV64IA-LABEL: atomicrmw_min_i64_acq_rel: 15594; RV64IA: # %bb.0: 15595; RV64IA-NEXT: amomin.d.aqrl a0, a1, (a0) 15596; RV64IA-NEXT: ret 15597 %1 = atomicrmw min i64* %a, i64 %b acq_rel 15598 ret i64 %1 15599} 15600 15601define i64 @atomicrmw_min_i64_seq_cst(i64 *%a, i64 %b) nounwind { 15602; RV32I-LABEL: atomicrmw_min_i64_seq_cst: 15603; RV32I: # %bb.0: 15604; RV32I-NEXT: addi sp, sp, -32 15605; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15606; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15607; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15608; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15609; RV32I-NEXT: mv s0, a0 15610; RV32I-NEXT: lw a5, 4(a0) 15611; RV32I-NEXT: lw a4, 0(a0) 15612; RV32I-NEXT: mv s1, a2 15613; RV32I-NEXT: mv s2, a1 15614; RV32I-NEXT: j .LBB209_2 15615; RV32I-NEXT: .LBB209_1: # %atomicrmw.start 15616; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15617; RV32I-NEXT: sw a4, 8(sp) 15618; RV32I-NEXT: sw a5, 12(sp) 15619; RV32I-NEXT: addi a1, sp, 8 15620; RV32I-NEXT: li a4, 5 15621; RV32I-NEXT: li a5, 5 15622; RV32I-NEXT: mv a0, s0 15623; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15624; RV32I-NEXT: lw a5, 12(sp) 15625; RV32I-NEXT: lw a4, 8(sp) 15626; RV32I-NEXT: bnez a0, .LBB209_7 15627; RV32I-NEXT: .LBB209_2: # %atomicrmw.start 15628; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15629; RV32I-NEXT: beq a5, s1, .LBB209_4 15630; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15631; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15632; RV32I-NEXT: slt a0, s1, a5 15633; RV32I-NEXT: j .LBB209_5 15634; RV32I-NEXT: .LBB209_4: # in Loop: Header=BB209_2 Depth=1 15635; RV32I-NEXT: sltu a0, s2, a4 15636; RV32I-NEXT: .LBB209_5: # %atomicrmw.start 15637; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15638; RV32I-NEXT: xori a0, a0, 1 15639; RV32I-NEXT: mv a2, a4 15640; RV32I-NEXT: mv a3, a5 15641; RV32I-NEXT: bnez a0, .LBB209_1 15642; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15643; RV32I-NEXT: # in Loop: Header=BB209_2 Depth=1 15644; RV32I-NEXT: mv a2, s2 15645; RV32I-NEXT: mv a3, s1 15646; RV32I-NEXT: j .LBB209_1 15647; RV32I-NEXT: .LBB209_7: # %atomicrmw.end 15648; RV32I-NEXT: mv a0, a4 15649; RV32I-NEXT: mv a1, a5 15650; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15651; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15652; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15653; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15654; RV32I-NEXT: addi sp, sp, 32 15655; RV32I-NEXT: ret 15656; 15657; RV32IA-LABEL: atomicrmw_min_i64_seq_cst: 15658; RV32IA: # %bb.0: 15659; RV32IA-NEXT: addi sp, sp, -32 15660; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15661; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15662; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15663; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15664; RV32IA-NEXT: mv s0, a0 15665; RV32IA-NEXT: lw a5, 4(a0) 15666; RV32IA-NEXT: lw a4, 0(a0) 15667; RV32IA-NEXT: mv s1, a2 15668; RV32IA-NEXT: mv s2, a1 15669; RV32IA-NEXT: j .LBB209_2 15670; RV32IA-NEXT: .LBB209_1: # %atomicrmw.start 15671; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15672; RV32IA-NEXT: sw a4, 8(sp) 15673; RV32IA-NEXT: sw a5, 12(sp) 15674; RV32IA-NEXT: addi a1, sp, 8 15675; RV32IA-NEXT: li a4, 5 15676; RV32IA-NEXT: li a5, 5 15677; RV32IA-NEXT: mv a0, s0 15678; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15679; RV32IA-NEXT: lw a5, 12(sp) 15680; RV32IA-NEXT: lw a4, 8(sp) 15681; RV32IA-NEXT: bnez a0, .LBB209_7 15682; RV32IA-NEXT: .LBB209_2: # %atomicrmw.start 15683; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15684; RV32IA-NEXT: beq a5, s1, .LBB209_4 15685; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15686; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15687; RV32IA-NEXT: slt a0, s1, a5 15688; RV32IA-NEXT: j .LBB209_5 15689; RV32IA-NEXT: .LBB209_4: # in Loop: Header=BB209_2 Depth=1 15690; RV32IA-NEXT: sltu a0, s2, a4 15691; RV32IA-NEXT: .LBB209_5: # %atomicrmw.start 15692; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15693; RV32IA-NEXT: xori a0, a0, 1 15694; RV32IA-NEXT: mv a2, a4 15695; RV32IA-NEXT: mv a3, a5 15696; RV32IA-NEXT: bnez a0, .LBB209_1 15697; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15698; RV32IA-NEXT: # in Loop: Header=BB209_2 Depth=1 15699; RV32IA-NEXT: mv a2, s2 15700; RV32IA-NEXT: mv a3, s1 15701; RV32IA-NEXT: j .LBB209_1 15702; RV32IA-NEXT: .LBB209_7: # %atomicrmw.end 15703; RV32IA-NEXT: mv a0, a4 15704; RV32IA-NEXT: mv a1, a5 15705; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15706; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15707; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15708; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15709; RV32IA-NEXT: addi sp, sp, 32 15710; RV32IA-NEXT: ret 15711; 15712; RV64I-LABEL: atomicrmw_min_i64_seq_cst: 15713; RV64I: # %bb.0: 15714; RV64I-NEXT: addi sp, sp, -32 15715; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15716; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15717; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15718; RV64I-NEXT: mv s0, a0 15719; RV64I-NEXT: ld a3, 0(a0) 15720; RV64I-NEXT: mv s1, a1 15721; RV64I-NEXT: j .LBB209_2 15722; RV64I-NEXT: .LBB209_1: # %atomicrmw.start 15723; RV64I-NEXT: # in Loop: Header=BB209_2 Depth=1 15724; RV64I-NEXT: sd a3, 0(sp) 15725; RV64I-NEXT: mv a1, sp 15726; RV64I-NEXT: li a3, 5 15727; RV64I-NEXT: li a4, 5 15728; RV64I-NEXT: mv a0, s0 15729; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15730; RV64I-NEXT: ld a3, 0(sp) 15731; RV64I-NEXT: bnez a0, .LBB209_4 15732; RV64I-NEXT: .LBB209_2: # %atomicrmw.start 15733; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15734; RV64I-NEXT: mv a2, a3 15735; RV64I-NEXT: bge s1, a3, .LBB209_1 15736; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15737; RV64I-NEXT: # in Loop: Header=BB209_2 Depth=1 15738; RV64I-NEXT: mv a2, s1 15739; RV64I-NEXT: j .LBB209_1 15740; RV64I-NEXT: .LBB209_4: # %atomicrmw.end 15741; RV64I-NEXT: mv a0, a3 15742; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15743; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15744; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15745; RV64I-NEXT: addi sp, sp, 32 15746; RV64I-NEXT: ret 15747; 15748; RV64IA-LABEL: atomicrmw_min_i64_seq_cst: 15749; RV64IA: # %bb.0: 15750; RV64IA-NEXT: amomin.d.aqrl a0, a1, (a0) 15751; RV64IA-NEXT: ret 15752 %1 = atomicrmw min i64* %a, i64 %b seq_cst 15753 ret i64 %1 15754} 15755 15756define i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind { 15757; RV32I-LABEL: atomicrmw_umax_i64_monotonic: 15758; RV32I: # %bb.0: 15759; RV32I-NEXT: addi sp, sp, -32 15760; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15761; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15762; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15763; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15764; RV32I-NEXT: mv s0, a0 15765; RV32I-NEXT: lw a5, 4(a0) 15766; RV32I-NEXT: lw a4, 0(a0) 15767; RV32I-NEXT: mv s1, a2 15768; RV32I-NEXT: mv s2, a1 15769; RV32I-NEXT: j .LBB210_2 15770; RV32I-NEXT: .LBB210_1: # %atomicrmw.start 15771; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15772; RV32I-NEXT: sw a4, 8(sp) 15773; RV32I-NEXT: sw a5, 12(sp) 15774; RV32I-NEXT: addi a1, sp, 8 15775; RV32I-NEXT: mv a0, s0 15776; RV32I-NEXT: li a4, 0 15777; RV32I-NEXT: li a5, 0 15778; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15779; RV32I-NEXT: lw a5, 12(sp) 15780; RV32I-NEXT: lw a4, 8(sp) 15781; RV32I-NEXT: bnez a0, .LBB210_7 15782; RV32I-NEXT: .LBB210_2: # %atomicrmw.start 15783; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15784; RV32I-NEXT: beq a5, s1, .LBB210_4 15785; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15786; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15787; RV32I-NEXT: sltu a0, s1, a5 15788; RV32I-NEXT: j .LBB210_5 15789; RV32I-NEXT: .LBB210_4: # in Loop: Header=BB210_2 Depth=1 15790; RV32I-NEXT: sltu a0, s2, a4 15791; RV32I-NEXT: .LBB210_5: # %atomicrmw.start 15792; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15793; RV32I-NEXT: mv a2, a4 15794; RV32I-NEXT: mv a3, a5 15795; RV32I-NEXT: bnez a0, .LBB210_1 15796; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15797; RV32I-NEXT: # in Loop: Header=BB210_2 Depth=1 15798; RV32I-NEXT: mv a2, s2 15799; RV32I-NEXT: mv a3, s1 15800; RV32I-NEXT: j .LBB210_1 15801; RV32I-NEXT: .LBB210_7: # %atomicrmw.end 15802; RV32I-NEXT: mv a0, a4 15803; RV32I-NEXT: mv a1, a5 15804; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15805; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15806; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15807; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15808; RV32I-NEXT: addi sp, sp, 32 15809; RV32I-NEXT: ret 15810; 15811; RV32IA-LABEL: atomicrmw_umax_i64_monotonic: 15812; RV32IA: # %bb.0: 15813; RV32IA-NEXT: addi sp, sp, -32 15814; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15815; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15816; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15817; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15818; RV32IA-NEXT: mv s0, a0 15819; RV32IA-NEXT: lw a5, 4(a0) 15820; RV32IA-NEXT: lw a4, 0(a0) 15821; RV32IA-NEXT: mv s1, a2 15822; RV32IA-NEXT: mv s2, a1 15823; RV32IA-NEXT: j .LBB210_2 15824; RV32IA-NEXT: .LBB210_1: # %atomicrmw.start 15825; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15826; RV32IA-NEXT: sw a4, 8(sp) 15827; RV32IA-NEXT: sw a5, 12(sp) 15828; RV32IA-NEXT: addi a1, sp, 8 15829; RV32IA-NEXT: mv a0, s0 15830; RV32IA-NEXT: li a4, 0 15831; RV32IA-NEXT: li a5, 0 15832; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15833; RV32IA-NEXT: lw a5, 12(sp) 15834; RV32IA-NEXT: lw a4, 8(sp) 15835; RV32IA-NEXT: bnez a0, .LBB210_7 15836; RV32IA-NEXT: .LBB210_2: # %atomicrmw.start 15837; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15838; RV32IA-NEXT: beq a5, s1, .LBB210_4 15839; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15840; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15841; RV32IA-NEXT: sltu a0, s1, a5 15842; RV32IA-NEXT: j .LBB210_5 15843; RV32IA-NEXT: .LBB210_4: # in Loop: Header=BB210_2 Depth=1 15844; RV32IA-NEXT: sltu a0, s2, a4 15845; RV32IA-NEXT: .LBB210_5: # %atomicrmw.start 15846; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15847; RV32IA-NEXT: mv a2, a4 15848; RV32IA-NEXT: mv a3, a5 15849; RV32IA-NEXT: bnez a0, .LBB210_1 15850; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 15851; RV32IA-NEXT: # in Loop: Header=BB210_2 Depth=1 15852; RV32IA-NEXT: mv a2, s2 15853; RV32IA-NEXT: mv a3, s1 15854; RV32IA-NEXT: j .LBB210_1 15855; RV32IA-NEXT: .LBB210_7: # %atomicrmw.end 15856; RV32IA-NEXT: mv a0, a4 15857; RV32IA-NEXT: mv a1, a5 15858; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15859; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15860; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15861; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15862; RV32IA-NEXT: addi sp, sp, 32 15863; RV32IA-NEXT: ret 15864; 15865; RV64I-LABEL: atomicrmw_umax_i64_monotonic: 15866; RV64I: # %bb.0: 15867; RV64I-NEXT: addi sp, sp, -32 15868; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 15869; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 15870; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 15871; RV64I-NEXT: mv s0, a0 15872; RV64I-NEXT: ld a3, 0(a0) 15873; RV64I-NEXT: mv s1, a1 15874; RV64I-NEXT: j .LBB210_2 15875; RV64I-NEXT: .LBB210_1: # %atomicrmw.start 15876; RV64I-NEXT: # in Loop: Header=BB210_2 Depth=1 15877; RV64I-NEXT: sd a3, 0(sp) 15878; RV64I-NEXT: mv a1, sp 15879; RV64I-NEXT: mv a0, s0 15880; RV64I-NEXT: li a3, 0 15881; RV64I-NEXT: li a4, 0 15882; RV64I-NEXT: call __atomic_compare_exchange_8@plt 15883; RV64I-NEXT: ld a3, 0(sp) 15884; RV64I-NEXT: bnez a0, .LBB210_4 15885; RV64I-NEXT: .LBB210_2: # %atomicrmw.start 15886; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15887; RV64I-NEXT: mv a2, a3 15888; RV64I-NEXT: bltu s1, a3, .LBB210_1 15889; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15890; RV64I-NEXT: # in Loop: Header=BB210_2 Depth=1 15891; RV64I-NEXT: mv a2, s1 15892; RV64I-NEXT: j .LBB210_1 15893; RV64I-NEXT: .LBB210_4: # %atomicrmw.end 15894; RV64I-NEXT: mv a0, a3 15895; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 15896; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 15897; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 15898; RV64I-NEXT: addi sp, sp, 32 15899; RV64I-NEXT: ret 15900; 15901; RV64IA-LABEL: atomicrmw_umax_i64_monotonic: 15902; RV64IA: # %bb.0: 15903; RV64IA-NEXT: amomaxu.d a0, a1, (a0) 15904; RV64IA-NEXT: ret 15905 %1 = atomicrmw umax i64* %a, i64 %b monotonic 15906 ret i64 %1 15907} 15908 15909define i64 @atomicrmw_umax_i64_acquire(i64 *%a, i64 %b) nounwind { 15910; RV32I-LABEL: atomicrmw_umax_i64_acquire: 15911; RV32I: # %bb.0: 15912; RV32I-NEXT: addi sp, sp, -32 15913; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15914; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15915; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15916; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15917; RV32I-NEXT: mv s0, a0 15918; RV32I-NEXT: lw a5, 4(a0) 15919; RV32I-NEXT: lw a4, 0(a0) 15920; RV32I-NEXT: mv s1, a2 15921; RV32I-NEXT: mv s2, a1 15922; RV32I-NEXT: j .LBB211_2 15923; RV32I-NEXT: .LBB211_1: # %atomicrmw.start 15924; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15925; RV32I-NEXT: sw a4, 8(sp) 15926; RV32I-NEXT: sw a5, 12(sp) 15927; RV32I-NEXT: addi a1, sp, 8 15928; RV32I-NEXT: li a4, 2 15929; RV32I-NEXT: li a5, 2 15930; RV32I-NEXT: mv a0, s0 15931; RV32I-NEXT: call __atomic_compare_exchange_8@plt 15932; RV32I-NEXT: lw a5, 12(sp) 15933; RV32I-NEXT: lw a4, 8(sp) 15934; RV32I-NEXT: bnez a0, .LBB211_7 15935; RV32I-NEXT: .LBB211_2: # %atomicrmw.start 15936; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15937; RV32I-NEXT: beq a5, s1, .LBB211_4 15938; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15939; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15940; RV32I-NEXT: sltu a0, s1, a5 15941; RV32I-NEXT: j .LBB211_5 15942; RV32I-NEXT: .LBB211_4: # in Loop: Header=BB211_2 Depth=1 15943; RV32I-NEXT: sltu a0, s2, a4 15944; RV32I-NEXT: .LBB211_5: # %atomicrmw.start 15945; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15946; RV32I-NEXT: mv a2, a4 15947; RV32I-NEXT: mv a3, a5 15948; RV32I-NEXT: bnez a0, .LBB211_1 15949; RV32I-NEXT: # %bb.6: # %atomicrmw.start 15950; RV32I-NEXT: # in Loop: Header=BB211_2 Depth=1 15951; RV32I-NEXT: mv a2, s2 15952; RV32I-NEXT: mv a3, s1 15953; RV32I-NEXT: j .LBB211_1 15954; RV32I-NEXT: .LBB211_7: # %atomicrmw.end 15955; RV32I-NEXT: mv a0, a4 15956; RV32I-NEXT: mv a1, a5 15957; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15958; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15959; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15960; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15961; RV32I-NEXT: addi sp, sp, 32 15962; RV32I-NEXT: ret 15963; 15964; RV32IA-LABEL: atomicrmw_umax_i64_acquire: 15965; RV32IA: # %bb.0: 15966; RV32IA-NEXT: addi sp, sp, -32 15967; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15968; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15969; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15970; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15971; RV32IA-NEXT: mv s0, a0 15972; RV32IA-NEXT: lw a5, 4(a0) 15973; RV32IA-NEXT: lw a4, 0(a0) 15974; RV32IA-NEXT: mv s1, a2 15975; RV32IA-NEXT: mv s2, a1 15976; RV32IA-NEXT: j .LBB211_2 15977; RV32IA-NEXT: .LBB211_1: # %atomicrmw.start 15978; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 15979; RV32IA-NEXT: sw a4, 8(sp) 15980; RV32IA-NEXT: sw a5, 12(sp) 15981; RV32IA-NEXT: addi a1, sp, 8 15982; RV32IA-NEXT: li a4, 2 15983; RV32IA-NEXT: li a5, 2 15984; RV32IA-NEXT: mv a0, s0 15985; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 15986; RV32IA-NEXT: lw a5, 12(sp) 15987; RV32IA-NEXT: lw a4, 8(sp) 15988; RV32IA-NEXT: bnez a0, .LBB211_7 15989; RV32IA-NEXT: .LBB211_2: # %atomicrmw.start 15990; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 15991; RV32IA-NEXT: beq a5, s1, .LBB211_4 15992; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 15993; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 15994; RV32IA-NEXT: sltu a0, s1, a5 15995; RV32IA-NEXT: j .LBB211_5 15996; RV32IA-NEXT: .LBB211_4: # in Loop: Header=BB211_2 Depth=1 15997; RV32IA-NEXT: sltu a0, s2, a4 15998; RV32IA-NEXT: .LBB211_5: # %atomicrmw.start 15999; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 16000; RV32IA-NEXT: mv a2, a4 16001; RV32IA-NEXT: mv a3, a5 16002; RV32IA-NEXT: bnez a0, .LBB211_1 16003; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16004; RV32IA-NEXT: # in Loop: Header=BB211_2 Depth=1 16005; RV32IA-NEXT: mv a2, s2 16006; RV32IA-NEXT: mv a3, s1 16007; RV32IA-NEXT: j .LBB211_1 16008; RV32IA-NEXT: .LBB211_7: # %atomicrmw.end 16009; RV32IA-NEXT: mv a0, a4 16010; RV32IA-NEXT: mv a1, a5 16011; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16012; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16013; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16014; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16015; RV32IA-NEXT: addi sp, sp, 32 16016; RV32IA-NEXT: ret 16017; 16018; RV64I-LABEL: atomicrmw_umax_i64_acquire: 16019; RV64I: # %bb.0: 16020; RV64I-NEXT: addi sp, sp, -32 16021; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16022; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16023; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16024; RV64I-NEXT: mv s0, a0 16025; RV64I-NEXT: ld a3, 0(a0) 16026; RV64I-NEXT: mv s1, a1 16027; RV64I-NEXT: j .LBB211_2 16028; RV64I-NEXT: .LBB211_1: # %atomicrmw.start 16029; RV64I-NEXT: # in Loop: Header=BB211_2 Depth=1 16030; RV64I-NEXT: sd a3, 0(sp) 16031; RV64I-NEXT: mv a1, sp 16032; RV64I-NEXT: li a3, 2 16033; RV64I-NEXT: li a4, 2 16034; RV64I-NEXT: mv a0, s0 16035; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16036; RV64I-NEXT: ld a3, 0(sp) 16037; RV64I-NEXT: bnez a0, .LBB211_4 16038; RV64I-NEXT: .LBB211_2: # %atomicrmw.start 16039; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16040; RV64I-NEXT: mv a2, a3 16041; RV64I-NEXT: bltu s1, a3, .LBB211_1 16042; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16043; RV64I-NEXT: # in Loop: Header=BB211_2 Depth=1 16044; RV64I-NEXT: mv a2, s1 16045; RV64I-NEXT: j .LBB211_1 16046; RV64I-NEXT: .LBB211_4: # %atomicrmw.end 16047; RV64I-NEXT: mv a0, a3 16048; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16049; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16050; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16051; RV64I-NEXT: addi sp, sp, 32 16052; RV64I-NEXT: ret 16053; 16054; RV64IA-LABEL: atomicrmw_umax_i64_acquire: 16055; RV64IA: # %bb.0: 16056; RV64IA-NEXT: amomaxu.d.aq a0, a1, (a0) 16057; RV64IA-NEXT: ret 16058 %1 = atomicrmw umax i64* %a, i64 %b acquire 16059 ret i64 %1 16060} 16061 16062define i64 @atomicrmw_umax_i64_release(i64 *%a, i64 %b) nounwind { 16063; RV32I-LABEL: atomicrmw_umax_i64_release: 16064; RV32I: # %bb.0: 16065; RV32I-NEXT: addi sp, sp, -32 16066; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16067; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16068; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16069; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16070; RV32I-NEXT: mv s0, a0 16071; RV32I-NEXT: lw a5, 4(a0) 16072; RV32I-NEXT: lw a4, 0(a0) 16073; RV32I-NEXT: mv s1, a2 16074; RV32I-NEXT: mv s2, a1 16075; RV32I-NEXT: j .LBB212_2 16076; RV32I-NEXT: .LBB212_1: # %atomicrmw.start 16077; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16078; RV32I-NEXT: sw a4, 8(sp) 16079; RV32I-NEXT: sw a5, 12(sp) 16080; RV32I-NEXT: addi a1, sp, 8 16081; RV32I-NEXT: li a4, 3 16082; RV32I-NEXT: mv a0, s0 16083; RV32I-NEXT: li a5, 0 16084; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16085; RV32I-NEXT: lw a5, 12(sp) 16086; RV32I-NEXT: lw a4, 8(sp) 16087; RV32I-NEXT: bnez a0, .LBB212_7 16088; RV32I-NEXT: .LBB212_2: # %atomicrmw.start 16089; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16090; RV32I-NEXT: beq a5, s1, .LBB212_4 16091; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16092; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16093; RV32I-NEXT: sltu a0, s1, a5 16094; RV32I-NEXT: j .LBB212_5 16095; RV32I-NEXT: .LBB212_4: # in Loop: Header=BB212_2 Depth=1 16096; RV32I-NEXT: sltu a0, s2, a4 16097; RV32I-NEXT: .LBB212_5: # %atomicrmw.start 16098; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16099; RV32I-NEXT: mv a2, a4 16100; RV32I-NEXT: mv a3, a5 16101; RV32I-NEXT: bnez a0, .LBB212_1 16102; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16103; RV32I-NEXT: # in Loop: Header=BB212_2 Depth=1 16104; RV32I-NEXT: mv a2, s2 16105; RV32I-NEXT: mv a3, s1 16106; RV32I-NEXT: j .LBB212_1 16107; RV32I-NEXT: .LBB212_7: # %atomicrmw.end 16108; RV32I-NEXT: mv a0, a4 16109; RV32I-NEXT: mv a1, a5 16110; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16111; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16112; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16113; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16114; RV32I-NEXT: addi sp, sp, 32 16115; RV32I-NEXT: ret 16116; 16117; RV32IA-LABEL: atomicrmw_umax_i64_release: 16118; RV32IA: # %bb.0: 16119; RV32IA-NEXT: addi sp, sp, -32 16120; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16121; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16122; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16123; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16124; RV32IA-NEXT: mv s0, a0 16125; RV32IA-NEXT: lw a5, 4(a0) 16126; RV32IA-NEXT: lw a4, 0(a0) 16127; RV32IA-NEXT: mv s1, a2 16128; RV32IA-NEXT: mv s2, a1 16129; RV32IA-NEXT: j .LBB212_2 16130; RV32IA-NEXT: .LBB212_1: # %atomicrmw.start 16131; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16132; RV32IA-NEXT: sw a4, 8(sp) 16133; RV32IA-NEXT: sw a5, 12(sp) 16134; RV32IA-NEXT: addi a1, sp, 8 16135; RV32IA-NEXT: li a4, 3 16136; RV32IA-NEXT: mv a0, s0 16137; RV32IA-NEXT: li a5, 0 16138; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16139; RV32IA-NEXT: lw a5, 12(sp) 16140; RV32IA-NEXT: lw a4, 8(sp) 16141; RV32IA-NEXT: bnez a0, .LBB212_7 16142; RV32IA-NEXT: .LBB212_2: # %atomicrmw.start 16143; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16144; RV32IA-NEXT: beq a5, s1, .LBB212_4 16145; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16146; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16147; RV32IA-NEXT: sltu a0, s1, a5 16148; RV32IA-NEXT: j .LBB212_5 16149; RV32IA-NEXT: .LBB212_4: # in Loop: Header=BB212_2 Depth=1 16150; RV32IA-NEXT: sltu a0, s2, a4 16151; RV32IA-NEXT: .LBB212_5: # %atomicrmw.start 16152; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16153; RV32IA-NEXT: mv a2, a4 16154; RV32IA-NEXT: mv a3, a5 16155; RV32IA-NEXT: bnez a0, .LBB212_1 16156; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16157; RV32IA-NEXT: # in Loop: Header=BB212_2 Depth=1 16158; RV32IA-NEXT: mv a2, s2 16159; RV32IA-NEXT: mv a3, s1 16160; RV32IA-NEXT: j .LBB212_1 16161; RV32IA-NEXT: .LBB212_7: # %atomicrmw.end 16162; RV32IA-NEXT: mv a0, a4 16163; RV32IA-NEXT: mv a1, a5 16164; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16165; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16166; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16167; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16168; RV32IA-NEXT: addi sp, sp, 32 16169; RV32IA-NEXT: ret 16170; 16171; RV64I-LABEL: atomicrmw_umax_i64_release: 16172; RV64I: # %bb.0: 16173; RV64I-NEXT: addi sp, sp, -32 16174; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16175; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16176; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16177; RV64I-NEXT: mv s0, a0 16178; RV64I-NEXT: ld a3, 0(a0) 16179; RV64I-NEXT: mv s1, a1 16180; RV64I-NEXT: j .LBB212_2 16181; RV64I-NEXT: .LBB212_1: # %atomicrmw.start 16182; RV64I-NEXT: # in Loop: Header=BB212_2 Depth=1 16183; RV64I-NEXT: sd a3, 0(sp) 16184; RV64I-NEXT: mv a1, sp 16185; RV64I-NEXT: li a3, 3 16186; RV64I-NEXT: mv a0, s0 16187; RV64I-NEXT: li a4, 0 16188; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16189; RV64I-NEXT: ld a3, 0(sp) 16190; RV64I-NEXT: bnez a0, .LBB212_4 16191; RV64I-NEXT: .LBB212_2: # %atomicrmw.start 16192; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16193; RV64I-NEXT: mv a2, a3 16194; RV64I-NEXT: bltu s1, a3, .LBB212_1 16195; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16196; RV64I-NEXT: # in Loop: Header=BB212_2 Depth=1 16197; RV64I-NEXT: mv a2, s1 16198; RV64I-NEXT: j .LBB212_1 16199; RV64I-NEXT: .LBB212_4: # %atomicrmw.end 16200; RV64I-NEXT: mv a0, a3 16201; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16202; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16203; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16204; RV64I-NEXT: addi sp, sp, 32 16205; RV64I-NEXT: ret 16206; 16207; RV64IA-LABEL: atomicrmw_umax_i64_release: 16208; RV64IA: # %bb.0: 16209; RV64IA-NEXT: amomaxu.d.rl a0, a1, (a0) 16210; RV64IA-NEXT: ret 16211 %1 = atomicrmw umax i64* %a, i64 %b release 16212 ret i64 %1 16213} 16214 16215define i64 @atomicrmw_umax_i64_acq_rel(i64 *%a, i64 %b) nounwind { 16216; RV32I-LABEL: atomicrmw_umax_i64_acq_rel: 16217; RV32I: # %bb.0: 16218; RV32I-NEXT: addi sp, sp, -32 16219; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16220; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16221; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16222; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16223; RV32I-NEXT: mv s0, a0 16224; RV32I-NEXT: lw a5, 4(a0) 16225; RV32I-NEXT: lw a4, 0(a0) 16226; RV32I-NEXT: mv s1, a2 16227; RV32I-NEXT: mv s2, a1 16228; RV32I-NEXT: j .LBB213_2 16229; RV32I-NEXT: .LBB213_1: # %atomicrmw.start 16230; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16231; RV32I-NEXT: sw a4, 8(sp) 16232; RV32I-NEXT: sw a5, 12(sp) 16233; RV32I-NEXT: addi a1, sp, 8 16234; RV32I-NEXT: li a4, 4 16235; RV32I-NEXT: li a5, 2 16236; RV32I-NEXT: mv a0, s0 16237; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16238; RV32I-NEXT: lw a5, 12(sp) 16239; RV32I-NEXT: lw a4, 8(sp) 16240; RV32I-NEXT: bnez a0, .LBB213_7 16241; RV32I-NEXT: .LBB213_2: # %atomicrmw.start 16242; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16243; RV32I-NEXT: beq a5, s1, .LBB213_4 16244; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16245; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16246; RV32I-NEXT: sltu a0, s1, a5 16247; RV32I-NEXT: j .LBB213_5 16248; RV32I-NEXT: .LBB213_4: # in Loop: Header=BB213_2 Depth=1 16249; RV32I-NEXT: sltu a0, s2, a4 16250; RV32I-NEXT: .LBB213_5: # %atomicrmw.start 16251; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16252; RV32I-NEXT: mv a2, a4 16253; RV32I-NEXT: mv a3, a5 16254; RV32I-NEXT: bnez a0, .LBB213_1 16255; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16256; RV32I-NEXT: # in Loop: Header=BB213_2 Depth=1 16257; RV32I-NEXT: mv a2, s2 16258; RV32I-NEXT: mv a3, s1 16259; RV32I-NEXT: j .LBB213_1 16260; RV32I-NEXT: .LBB213_7: # %atomicrmw.end 16261; RV32I-NEXT: mv a0, a4 16262; RV32I-NEXT: mv a1, a5 16263; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16264; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16265; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16266; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16267; RV32I-NEXT: addi sp, sp, 32 16268; RV32I-NEXT: ret 16269; 16270; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel: 16271; RV32IA: # %bb.0: 16272; RV32IA-NEXT: addi sp, sp, -32 16273; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16274; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16275; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16276; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16277; RV32IA-NEXT: mv s0, a0 16278; RV32IA-NEXT: lw a5, 4(a0) 16279; RV32IA-NEXT: lw a4, 0(a0) 16280; RV32IA-NEXT: mv s1, a2 16281; RV32IA-NEXT: mv s2, a1 16282; RV32IA-NEXT: j .LBB213_2 16283; RV32IA-NEXT: .LBB213_1: # %atomicrmw.start 16284; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16285; RV32IA-NEXT: sw a4, 8(sp) 16286; RV32IA-NEXT: sw a5, 12(sp) 16287; RV32IA-NEXT: addi a1, sp, 8 16288; RV32IA-NEXT: li a4, 4 16289; RV32IA-NEXT: li a5, 2 16290; RV32IA-NEXT: mv a0, s0 16291; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16292; RV32IA-NEXT: lw a5, 12(sp) 16293; RV32IA-NEXT: lw a4, 8(sp) 16294; RV32IA-NEXT: bnez a0, .LBB213_7 16295; RV32IA-NEXT: .LBB213_2: # %atomicrmw.start 16296; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16297; RV32IA-NEXT: beq a5, s1, .LBB213_4 16298; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16299; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16300; RV32IA-NEXT: sltu a0, s1, a5 16301; RV32IA-NEXT: j .LBB213_5 16302; RV32IA-NEXT: .LBB213_4: # in Loop: Header=BB213_2 Depth=1 16303; RV32IA-NEXT: sltu a0, s2, a4 16304; RV32IA-NEXT: .LBB213_5: # %atomicrmw.start 16305; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16306; RV32IA-NEXT: mv a2, a4 16307; RV32IA-NEXT: mv a3, a5 16308; RV32IA-NEXT: bnez a0, .LBB213_1 16309; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16310; RV32IA-NEXT: # in Loop: Header=BB213_2 Depth=1 16311; RV32IA-NEXT: mv a2, s2 16312; RV32IA-NEXT: mv a3, s1 16313; RV32IA-NEXT: j .LBB213_1 16314; RV32IA-NEXT: .LBB213_7: # %atomicrmw.end 16315; RV32IA-NEXT: mv a0, a4 16316; RV32IA-NEXT: mv a1, a5 16317; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16318; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16319; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16320; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16321; RV32IA-NEXT: addi sp, sp, 32 16322; RV32IA-NEXT: ret 16323; 16324; RV64I-LABEL: atomicrmw_umax_i64_acq_rel: 16325; RV64I: # %bb.0: 16326; RV64I-NEXT: addi sp, sp, -32 16327; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16328; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16329; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16330; RV64I-NEXT: mv s0, a0 16331; RV64I-NEXT: ld a3, 0(a0) 16332; RV64I-NEXT: mv s1, a1 16333; RV64I-NEXT: j .LBB213_2 16334; RV64I-NEXT: .LBB213_1: # %atomicrmw.start 16335; RV64I-NEXT: # in Loop: Header=BB213_2 Depth=1 16336; RV64I-NEXT: sd a3, 0(sp) 16337; RV64I-NEXT: mv a1, sp 16338; RV64I-NEXT: li a3, 4 16339; RV64I-NEXT: li a4, 2 16340; RV64I-NEXT: mv a0, s0 16341; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16342; RV64I-NEXT: ld a3, 0(sp) 16343; RV64I-NEXT: bnez a0, .LBB213_4 16344; RV64I-NEXT: .LBB213_2: # %atomicrmw.start 16345; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16346; RV64I-NEXT: mv a2, a3 16347; RV64I-NEXT: bltu s1, a3, .LBB213_1 16348; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16349; RV64I-NEXT: # in Loop: Header=BB213_2 Depth=1 16350; RV64I-NEXT: mv a2, s1 16351; RV64I-NEXT: j .LBB213_1 16352; RV64I-NEXT: .LBB213_4: # %atomicrmw.end 16353; RV64I-NEXT: mv a0, a3 16354; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16355; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16356; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16357; RV64I-NEXT: addi sp, sp, 32 16358; RV64I-NEXT: ret 16359; 16360; RV64IA-LABEL: atomicrmw_umax_i64_acq_rel: 16361; RV64IA: # %bb.0: 16362; RV64IA-NEXT: amomaxu.d.aqrl a0, a1, (a0) 16363; RV64IA-NEXT: ret 16364 %1 = atomicrmw umax i64* %a, i64 %b acq_rel 16365 ret i64 %1 16366} 16367 16368define i64 @atomicrmw_umax_i64_seq_cst(i64 *%a, i64 %b) nounwind { 16369; RV32I-LABEL: atomicrmw_umax_i64_seq_cst: 16370; RV32I: # %bb.0: 16371; RV32I-NEXT: addi sp, sp, -32 16372; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16373; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16374; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16375; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16376; RV32I-NEXT: mv s0, a0 16377; RV32I-NEXT: lw a5, 4(a0) 16378; RV32I-NEXT: lw a4, 0(a0) 16379; RV32I-NEXT: mv s1, a2 16380; RV32I-NEXT: mv s2, a1 16381; RV32I-NEXT: j .LBB214_2 16382; RV32I-NEXT: .LBB214_1: # %atomicrmw.start 16383; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16384; RV32I-NEXT: sw a4, 8(sp) 16385; RV32I-NEXT: sw a5, 12(sp) 16386; RV32I-NEXT: addi a1, sp, 8 16387; RV32I-NEXT: li a4, 5 16388; RV32I-NEXT: li a5, 5 16389; RV32I-NEXT: mv a0, s0 16390; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16391; RV32I-NEXT: lw a5, 12(sp) 16392; RV32I-NEXT: lw a4, 8(sp) 16393; RV32I-NEXT: bnez a0, .LBB214_7 16394; RV32I-NEXT: .LBB214_2: # %atomicrmw.start 16395; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16396; RV32I-NEXT: beq a5, s1, .LBB214_4 16397; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16398; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16399; RV32I-NEXT: sltu a0, s1, a5 16400; RV32I-NEXT: j .LBB214_5 16401; RV32I-NEXT: .LBB214_4: # in Loop: Header=BB214_2 Depth=1 16402; RV32I-NEXT: sltu a0, s2, a4 16403; RV32I-NEXT: .LBB214_5: # %atomicrmw.start 16404; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16405; RV32I-NEXT: mv a2, a4 16406; RV32I-NEXT: mv a3, a5 16407; RV32I-NEXT: bnez a0, .LBB214_1 16408; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16409; RV32I-NEXT: # in Loop: Header=BB214_2 Depth=1 16410; RV32I-NEXT: mv a2, s2 16411; RV32I-NEXT: mv a3, s1 16412; RV32I-NEXT: j .LBB214_1 16413; RV32I-NEXT: .LBB214_7: # %atomicrmw.end 16414; RV32I-NEXT: mv a0, a4 16415; RV32I-NEXT: mv a1, a5 16416; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16417; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16418; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16419; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16420; RV32I-NEXT: addi sp, sp, 32 16421; RV32I-NEXT: ret 16422; 16423; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst: 16424; RV32IA: # %bb.0: 16425; RV32IA-NEXT: addi sp, sp, -32 16426; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16427; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16428; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16429; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16430; RV32IA-NEXT: mv s0, a0 16431; RV32IA-NEXT: lw a5, 4(a0) 16432; RV32IA-NEXT: lw a4, 0(a0) 16433; RV32IA-NEXT: mv s1, a2 16434; RV32IA-NEXT: mv s2, a1 16435; RV32IA-NEXT: j .LBB214_2 16436; RV32IA-NEXT: .LBB214_1: # %atomicrmw.start 16437; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16438; RV32IA-NEXT: sw a4, 8(sp) 16439; RV32IA-NEXT: sw a5, 12(sp) 16440; RV32IA-NEXT: addi a1, sp, 8 16441; RV32IA-NEXT: li a4, 5 16442; RV32IA-NEXT: li a5, 5 16443; RV32IA-NEXT: mv a0, s0 16444; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16445; RV32IA-NEXT: lw a5, 12(sp) 16446; RV32IA-NEXT: lw a4, 8(sp) 16447; RV32IA-NEXT: bnez a0, .LBB214_7 16448; RV32IA-NEXT: .LBB214_2: # %atomicrmw.start 16449; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16450; RV32IA-NEXT: beq a5, s1, .LBB214_4 16451; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16452; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16453; RV32IA-NEXT: sltu a0, s1, a5 16454; RV32IA-NEXT: j .LBB214_5 16455; RV32IA-NEXT: .LBB214_4: # in Loop: Header=BB214_2 Depth=1 16456; RV32IA-NEXT: sltu a0, s2, a4 16457; RV32IA-NEXT: .LBB214_5: # %atomicrmw.start 16458; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16459; RV32IA-NEXT: mv a2, a4 16460; RV32IA-NEXT: mv a3, a5 16461; RV32IA-NEXT: bnez a0, .LBB214_1 16462; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16463; RV32IA-NEXT: # in Loop: Header=BB214_2 Depth=1 16464; RV32IA-NEXT: mv a2, s2 16465; RV32IA-NEXT: mv a3, s1 16466; RV32IA-NEXT: j .LBB214_1 16467; RV32IA-NEXT: .LBB214_7: # %atomicrmw.end 16468; RV32IA-NEXT: mv a0, a4 16469; RV32IA-NEXT: mv a1, a5 16470; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16471; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16472; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16473; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16474; RV32IA-NEXT: addi sp, sp, 32 16475; RV32IA-NEXT: ret 16476; 16477; RV64I-LABEL: atomicrmw_umax_i64_seq_cst: 16478; RV64I: # %bb.0: 16479; RV64I-NEXT: addi sp, sp, -32 16480; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16481; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16482; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16483; RV64I-NEXT: mv s0, a0 16484; RV64I-NEXT: ld a3, 0(a0) 16485; RV64I-NEXT: mv s1, a1 16486; RV64I-NEXT: j .LBB214_2 16487; RV64I-NEXT: .LBB214_1: # %atomicrmw.start 16488; RV64I-NEXT: # in Loop: Header=BB214_2 Depth=1 16489; RV64I-NEXT: sd a3, 0(sp) 16490; RV64I-NEXT: mv a1, sp 16491; RV64I-NEXT: li a3, 5 16492; RV64I-NEXT: li a4, 5 16493; RV64I-NEXT: mv a0, s0 16494; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16495; RV64I-NEXT: ld a3, 0(sp) 16496; RV64I-NEXT: bnez a0, .LBB214_4 16497; RV64I-NEXT: .LBB214_2: # %atomicrmw.start 16498; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16499; RV64I-NEXT: mv a2, a3 16500; RV64I-NEXT: bltu s1, a3, .LBB214_1 16501; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16502; RV64I-NEXT: # in Loop: Header=BB214_2 Depth=1 16503; RV64I-NEXT: mv a2, s1 16504; RV64I-NEXT: j .LBB214_1 16505; RV64I-NEXT: .LBB214_4: # %atomicrmw.end 16506; RV64I-NEXT: mv a0, a3 16507; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16508; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16509; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16510; RV64I-NEXT: addi sp, sp, 32 16511; RV64I-NEXT: ret 16512; 16513; RV64IA-LABEL: atomicrmw_umax_i64_seq_cst: 16514; RV64IA: # %bb.0: 16515; RV64IA-NEXT: amomaxu.d.aqrl a0, a1, (a0) 16516; RV64IA-NEXT: ret 16517 %1 = atomicrmw umax i64* %a, i64 %b seq_cst 16518 ret i64 %1 16519} 16520 16521define i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind { 16522; RV32I-LABEL: atomicrmw_umin_i64_monotonic: 16523; RV32I: # %bb.0: 16524; RV32I-NEXT: addi sp, sp, -32 16525; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16526; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16527; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16528; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16529; RV32I-NEXT: mv s0, a0 16530; RV32I-NEXT: lw a5, 4(a0) 16531; RV32I-NEXT: lw a4, 0(a0) 16532; RV32I-NEXT: mv s1, a2 16533; RV32I-NEXT: mv s2, a1 16534; RV32I-NEXT: j .LBB215_2 16535; RV32I-NEXT: .LBB215_1: # %atomicrmw.start 16536; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16537; RV32I-NEXT: sw a4, 8(sp) 16538; RV32I-NEXT: sw a5, 12(sp) 16539; RV32I-NEXT: addi a1, sp, 8 16540; RV32I-NEXT: mv a0, s0 16541; RV32I-NEXT: li a4, 0 16542; RV32I-NEXT: li a5, 0 16543; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16544; RV32I-NEXT: lw a5, 12(sp) 16545; RV32I-NEXT: lw a4, 8(sp) 16546; RV32I-NEXT: bnez a0, .LBB215_7 16547; RV32I-NEXT: .LBB215_2: # %atomicrmw.start 16548; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16549; RV32I-NEXT: beq a5, s1, .LBB215_4 16550; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16551; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16552; RV32I-NEXT: sltu a0, s1, a5 16553; RV32I-NEXT: j .LBB215_5 16554; RV32I-NEXT: .LBB215_4: # in Loop: Header=BB215_2 Depth=1 16555; RV32I-NEXT: sltu a0, s2, a4 16556; RV32I-NEXT: .LBB215_5: # %atomicrmw.start 16557; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16558; RV32I-NEXT: xori a0, a0, 1 16559; RV32I-NEXT: mv a2, a4 16560; RV32I-NEXT: mv a3, a5 16561; RV32I-NEXT: bnez a0, .LBB215_1 16562; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16563; RV32I-NEXT: # in Loop: Header=BB215_2 Depth=1 16564; RV32I-NEXT: mv a2, s2 16565; RV32I-NEXT: mv a3, s1 16566; RV32I-NEXT: j .LBB215_1 16567; RV32I-NEXT: .LBB215_7: # %atomicrmw.end 16568; RV32I-NEXT: mv a0, a4 16569; RV32I-NEXT: mv a1, a5 16570; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16571; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16572; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16573; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16574; RV32I-NEXT: addi sp, sp, 32 16575; RV32I-NEXT: ret 16576; 16577; RV32IA-LABEL: atomicrmw_umin_i64_monotonic: 16578; RV32IA: # %bb.0: 16579; RV32IA-NEXT: addi sp, sp, -32 16580; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16581; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16582; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16583; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16584; RV32IA-NEXT: mv s0, a0 16585; RV32IA-NEXT: lw a5, 4(a0) 16586; RV32IA-NEXT: lw a4, 0(a0) 16587; RV32IA-NEXT: mv s1, a2 16588; RV32IA-NEXT: mv s2, a1 16589; RV32IA-NEXT: j .LBB215_2 16590; RV32IA-NEXT: .LBB215_1: # %atomicrmw.start 16591; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16592; RV32IA-NEXT: sw a4, 8(sp) 16593; RV32IA-NEXT: sw a5, 12(sp) 16594; RV32IA-NEXT: addi a1, sp, 8 16595; RV32IA-NEXT: mv a0, s0 16596; RV32IA-NEXT: li a4, 0 16597; RV32IA-NEXT: li a5, 0 16598; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16599; RV32IA-NEXT: lw a5, 12(sp) 16600; RV32IA-NEXT: lw a4, 8(sp) 16601; RV32IA-NEXT: bnez a0, .LBB215_7 16602; RV32IA-NEXT: .LBB215_2: # %atomicrmw.start 16603; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16604; RV32IA-NEXT: beq a5, s1, .LBB215_4 16605; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16606; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16607; RV32IA-NEXT: sltu a0, s1, a5 16608; RV32IA-NEXT: j .LBB215_5 16609; RV32IA-NEXT: .LBB215_4: # in Loop: Header=BB215_2 Depth=1 16610; RV32IA-NEXT: sltu a0, s2, a4 16611; RV32IA-NEXT: .LBB215_5: # %atomicrmw.start 16612; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16613; RV32IA-NEXT: xori a0, a0, 1 16614; RV32IA-NEXT: mv a2, a4 16615; RV32IA-NEXT: mv a3, a5 16616; RV32IA-NEXT: bnez a0, .LBB215_1 16617; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16618; RV32IA-NEXT: # in Loop: Header=BB215_2 Depth=1 16619; RV32IA-NEXT: mv a2, s2 16620; RV32IA-NEXT: mv a3, s1 16621; RV32IA-NEXT: j .LBB215_1 16622; RV32IA-NEXT: .LBB215_7: # %atomicrmw.end 16623; RV32IA-NEXT: mv a0, a4 16624; RV32IA-NEXT: mv a1, a5 16625; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16626; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16627; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16628; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16629; RV32IA-NEXT: addi sp, sp, 32 16630; RV32IA-NEXT: ret 16631; 16632; RV64I-LABEL: atomicrmw_umin_i64_monotonic: 16633; RV64I: # %bb.0: 16634; RV64I-NEXT: addi sp, sp, -32 16635; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16636; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16637; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16638; RV64I-NEXT: mv s0, a0 16639; RV64I-NEXT: ld a3, 0(a0) 16640; RV64I-NEXT: mv s1, a1 16641; RV64I-NEXT: j .LBB215_2 16642; RV64I-NEXT: .LBB215_1: # %atomicrmw.start 16643; RV64I-NEXT: # in Loop: Header=BB215_2 Depth=1 16644; RV64I-NEXT: sd a3, 0(sp) 16645; RV64I-NEXT: mv a1, sp 16646; RV64I-NEXT: mv a0, s0 16647; RV64I-NEXT: li a3, 0 16648; RV64I-NEXT: li a4, 0 16649; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16650; RV64I-NEXT: ld a3, 0(sp) 16651; RV64I-NEXT: bnez a0, .LBB215_4 16652; RV64I-NEXT: .LBB215_2: # %atomicrmw.start 16653; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16654; RV64I-NEXT: mv a2, a3 16655; RV64I-NEXT: bgeu s1, a3, .LBB215_1 16656; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16657; RV64I-NEXT: # in Loop: Header=BB215_2 Depth=1 16658; RV64I-NEXT: mv a2, s1 16659; RV64I-NEXT: j .LBB215_1 16660; RV64I-NEXT: .LBB215_4: # %atomicrmw.end 16661; RV64I-NEXT: mv a0, a3 16662; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16663; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16664; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16665; RV64I-NEXT: addi sp, sp, 32 16666; RV64I-NEXT: ret 16667; 16668; RV64IA-LABEL: atomicrmw_umin_i64_monotonic: 16669; RV64IA: # %bb.0: 16670; RV64IA-NEXT: amominu.d a0, a1, (a0) 16671; RV64IA-NEXT: ret 16672 %1 = atomicrmw umin i64* %a, i64 %b monotonic 16673 ret i64 %1 16674} 16675 16676define i64 @atomicrmw_umin_i64_acquire(i64 *%a, i64 %b) nounwind { 16677; RV32I-LABEL: atomicrmw_umin_i64_acquire: 16678; RV32I: # %bb.0: 16679; RV32I-NEXT: addi sp, sp, -32 16680; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16681; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16682; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16683; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16684; RV32I-NEXT: mv s0, a0 16685; RV32I-NEXT: lw a5, 4(a0) 16686; RV32I-NEXT: lw a4, 0(a0) 16687; RV32I-NEXT: mv s1, a2 16688; RV32I-NEXT: mv s2, a1 16689; RV32I-NEXT: j .LBB216_2 16690; RV32I-NEXT: .LBB216_1: # %atomicrmw.start 16691; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16692; RV32I-NEXT: sw a4, 8(sp) 16693; RV32I-NEXT: sw a5, 12(sp) 16694; RV32I-NEXT: addi a1, sp, 8 16695; RV32I-NEXT: li a4, 2 16696; RV32I-NEXT: li a5, 2 16697; RV32I-NEXT: mv a0, s0 16698; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16699; RV32I-NEXT: lw a5, 12(sp) 16700; RV32I-NEXT: lw a4, 8(sp) 16701; RV32I-NEXT: bnez a0, .LBB216_7 16702; RV32I-NEXT: .LBB216_2: # %atomicrmw.start 16703; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16704; RV32I-NEXT: beq a5, s1, .LBB216_4 16705; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16706; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16707; RV32I-NEXT: sltu a0, s1, a5 16708; RV32I-NEXT: j .LBB216_5 16709; RV32I-NEXT: .LBB216_4: # in Loop: Header=BB216_2 Depth=1 16710; RV32I-NEXT: sltu a0, s2, a4 16711; RV32I-NEXT: .LBB216_5: # %atomicrmw.start 16712; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16713; RV32I-NEXT: xori a0, a0, 1 16714; RV32I-NEXT: mv a2, a4 16715; RV32I-NEXT: mv a3, a5 16716; RV32I-NEXT: bnez a0, .LBB216_1 16717; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16718; RV32I-NEXT: # in Loop: Header=BB216_2 Depth=1 16719; RV32I-NEXT: mv a2, s2 16720; RV32I-NEXT: mv a3, s1 16721; RV32I-NEXT: j .LBB216_1 16722; RV32I-NEXT: .LBB216_7: # %atomicrmw.end 16723; RV32I-NEXT: mv a0, a4 16724; RV32I-NEXT: mv a1, a5 16725; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16726; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16727; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16728; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16729; RV32I-NEXT: addi sp, sp, 32 16730; RV32I-NEXT: ret 16731; 16732; RV32IA-LABEL: atomicrmw_umin_i64_acquire: 16733; RV32IA: # %bb.0: 16734; RV32IA-NEXT: addi sp, sp, -32 16735; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16736; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16737; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16738; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16739; RV32IA-NEXT: mv s0, a0 16740; RV32IA-NEXT: lw a5, 4(a0) 16741; RV32IA-NEXT: lw a4, 0(a0) 16742; RV32IA-NEXT: mv s1, a2 16743; RV32IA-NEXT: mv s2, a1 16744; RV32IA-NEXT: j .LBB216_2 16745; RV32IA-NEXT: .LBB216_1: # %atomicrmw.start 16746; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16747; RV32IA-NEXT: sw a4, 8(sp) 16748; RV32IA-NEXT: sw a5, 12(sp) 16749; RV32IA-NEXT: addi a1, sp, 8 16750; RV32IA-NEXT: li a4, 2 16751; RV32IA-NEXT: li a5, 2 16752; RV32IA-NEXT: mv a0, s0 16753; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16754; RV32IA-NEXT: lw a5, 12(sp) 16755; RV32IA-NEXT: lw a4, 8(sp) 16756; RV32IA-NEXT: bnez a0, .LBB216_7 16757; RV32IA-NEXT: .LBB216_2: # %atomicrmw.start 16758; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16759; RV32IA-NEXT: beq a5, s1, .LBB216_4 16760; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16761; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16762; RV32IA-NEXT: sltu a0, s1, a5 16763; RV32IA-NEXT: j .LBB216_5 16764; RV32IA-NEXT: .LBB216_4: # in Loop: Header=BB216_2 Depth=1 16765; RV32IA-NEXT: sltu a0, s2, a4 16766; RV32IA-NEXT: .LBB216_5: # %atomicrmw.start 16767; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16768; RV32IA-NEXT: xori a0, a0, 1 16769; RV32IA-NEXT: mv a2, a4 16770; RV32IA-NEXT: mv a3, a5 16771; RV32IA-NEXT: bnez a0, .LBB216_1 16772; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16773; RV32IA-NEXT: # in Loop: Header=BB216_2 Depth=1 16774; RV32IA-NEXT: mv a2, s2 16775; RV32IA-NEXT: mv a3, s1 16776; RV32IA-NEXT: j .LBB216_1 16777; RV32IA-NEXT: .LBB216_7: # %atomicrmw.end 16778; RV32IA-NEXT: mv a0, a4 16779; RV32IA-NEXT: mv a1, a5 16780; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16781; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16782; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16783; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16784; RV32IA-NEXT: addi sp, sp, 32 16785; RV32IA-NEXT: ret 16786; 16787; RV64I-LABEL: atomicrmw_umin_i64_acquire: 16788; RV64I: # %bb.0: 16789; RV64I-NEXT: addi sp, sp, -32 16790; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16791; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16792; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16793; RV64I-NEXT: mv s0, a0 16794; RV64I-NEXT: ld a3, 0(a0) 16795; RV64I-NEXT: mv s1, a1 16796; RV64I-NEXT: j .LBB216_2 16797; RV64I-NEXT: .LBB216_1: # %atomicrmw.start 16798; RV64I-NEXT: # in Loop: Header=BB216_2 Depth=1 16799; RV64I-NEXT: sd a3, 0(sp) 16800; RV64I-NEXT: mv a1, sp 16801; RV64I-NEXT: li a3, 2 16802; RV64I-NEXT: li a4, 2 16803; RV64I-NEXT: mv a0, s0 16804; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16805; RV64I-NEXT: ld a3, 0(sp) 16806; RV64I-NEXT: bnez a0, .LBB216_4 16807; RV64I-NEXT: .LBB216_2: # %atomicrmw.start 16808; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16809; RV64I-NEXT: mv a2, a3 16810; RV64I-NEXT: bgeu s1, a3, .LBB216_1 16811; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16812; RV64I-NEXT: # in Loop: Header=BB216_2 Depth=1 16813; RV64I-NEXT: mv a2, s1 16814; RV64I-NEXT: j .LBB216_1 16815; RV64I-NEXT: .LBB216_4: # %atomicrmw.end 16816; RV64I-NEXT: mv a0, a3 16817; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16818; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16819; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16820; RV64I-NEXT: addi sp, sp, 32 16821; RV64I-NEXT: ret 16822; 16823; RV64IA-LABEL: atomicrmw_umin_i64_acquire: 16824; RV64IA: # %bb.0: 16825; RV64IA-NEXT: amominu.d.aq a0, a1, (a0) 16826; RV64IA-NEXT: ret 16827 %1 = atomicrmw umin i64* %a, i64 %b acquire 16828 ret i64 %1 16829} 16830 16831define i64 @atomicrmw_umin_i64_release(i64 *%a, i64 %b) nounwind { 16832; RV32I-LABEL: atomicrmw_umin_i64_release: 16833; RV32I: # %bb.0: 16834; RV32I-NEXT: addi sp, sp, -32 16835; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16836; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16837; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16838; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16839; RV32I-NEXT: mv s0, a0 16840; RV32I-NEXT: lw a5, 4(a0) 16841; RV32I-NEXT: lw a4, 0(a0) 16842; RV32I-NEXT: mv s1, a2 16843; RV32I-NEXT: mv s2, a1 16844; RV32I-NEXT: j .LBB217_2 16845; RV32I-NEXT: .LBB217_1: # %atomicrmw.start 16846; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16847; RV32I-NEXT: sw a4, 8(sp) 16848; RV32I-NEXT: sw a5, 12(sp) 16849; RV32I-NEXT: addi a1, sp, 8 16850; RV32I-NEXT: li a4, 3 16851; RV32I-NEXT: mv a0, s0 16852; RV32I-NEXT: li a5, 0 16853; RV32I-NEXT: call __atomic_compare_exchange_8@plt 16854; RV32I-NEXT: lw a5, 12(sp) 16855; RV32I-NEXT: lw a4, 8(sp) 16856; RV32I-NEXT: bnez a0, .LBB217_7 16857; RV32I-NEXT: .LBB217_2: # %atomicrmw.start 16858; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16859; RV32I-NEXT: beq a5, s1, .LBB217_4 16860; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16861; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16862; RV32I-NEXT: sltu a0, s1, a5 16863; RV32I-NEXT: j .LBB217_5 16864; RV32I-NEXT: .LBB217_4: # in Loop: Header=BB217_2 Depth=1 16865; RV32I-NEXT: sltu a0, s2, a4 16866; RV32I-NEXT: .LBB217_5: # %atomicrmw.start 16867; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16868; RV32I-NEXT: xori a0, a0, 1 16869; RV32I-NEXT: mv a2, a4 16870; RV32I-NEXT: mv a3, a5 16871; RV32I-NEXT: bnez a0, .LBB217_1 16872; RV32I-NEXT: # %bb.6: # %atomicrmw.start 16873; RV32I-NEXT: # in Loop: Header=BB217_2 Depth=1 16874; RV32I-NEXT: mv a2, s2 16875; RV32I-NEXT: mv a3, s1 16876; RV32I-NEXT: j .LBB217_1 16877; RV32I-NEXT: .LBB217_7: # %atomicrmw.end 16878; RV32I-NEXT: mv a0, a4 16879; RV32I-NEXT: mv a1, a5 16880; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16881; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16882; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16883; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16884; RV32I-NEXT: addi sp, sp, 32 16885; RV32I-NEXT: ret 16886; 16887; RV32IA-LABEL: atomicrmw_umin_i64_release: 16888; RV32IA: # %bb.0: 16889; RV32IA-NEXT: addi sp, sp, -32 16890; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16891; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16892; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16893; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16894; RV32IA-NEXT: mv s0, a0 16895; RV32IA-NEXT: lw a5, 4(a0) 16896; RV32IA-NEXT: lw a4, 0(a0) 16897; RV32IA-NEXT: mv s1, a2 16898; RV32IA-NEXT: mv s2, a1 16899; RV32IA-NEXT: j .LBB217_2 16900; RV32IA-NEXT: .LBB217_1: # %atomicrmw.start 16901; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16902; RV32IA-NEXT: sw a4, 8(sp) 16903; RV32IA-NEXT: sw a5, 12(sp) 16904; RV32IA-NEXT: addi a1, sp, 8 16905; RV32IA-NEXT: li a4, 3 16906; RV32IA-NEXT: mv a0, s0 16907; RV32IA-NEXT: li a5, 0 16908; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 16909; RV32IA-NEXT: lw a5, 12(sp) 16910; RV32IA-NEXT: lw a4, 8(sp) 16911; RV32IA-NEXT: bnez a0, .LBB217_7 16912; RV32IA-NEXT: .LBB217_2: # %atomicrmw.start 16913; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 16914; RV32IA-NEXT: beq a5, s1, .LBB217_4 16915; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 16916; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16917; RV32IA-NEXT: sltu a0, s1, a5 16918; RV32IA-NEXT: j .LBB217_5 16919; RV32IA-NEXT: .LBB217_4: # in Loop: Header=BB217_2 Depth=1 16920; RV32IA-NEXT: sltu a0, s2, a4 16921; RV32IA-NEXT: .LBB217_5: # %atomicrmw.start 16922; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16923; RV32IA-NEXT: xori a0, a0, 1 16924; RV32IA-NEXT: mv a2, a4 16925; RV32IA-NEXT: mv a3, a5 16926; RV32IA-NEXT: bnez a0, .LBB217_1 16927; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 16928; RV32IA-NEXT: # in Loop: Header=BB217_2 Depth=1 16929; RV32IA-NEXT: mv a2, s2 16930; RV32IA-NEXT: mv a3, s1 16931; RV32IA-NEXT: j .LBB217_1 16932; RV32IA-NEXT: .LBB217_7: # %atomicrmw.end 16933; RV32IA-NEXT: mv a0, a4 16934; RV32IA-NEXT: mv a1, a5 16935; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16936; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16937; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16938; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16939; RV32IA-NEXT: addi sp, sp, 32 16940; RV32IA-NEXT: ret 16941; 16942; RV64I-LABEL: atomicrmw_umin_i64_release: 16943; RV64I: # %bb.0: 16944; RV64I-NEXT: addi sp, sp, -32 16945; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 16946; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 16947; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 16948; RV64I-NEXT: mv s0, a0 16949; RV64I-NEXT: ld a3, 0(a0) 16950; RV64I-NEXT: mv s1, a1 16951; RV64I-NEXT: j .LBB217_2 16952; RV64I-NEXT: .LBB217_1: # %atomicrmw.start 16953; RV64I-NEXT: # in Loop: Header=BB217_2 Depth=1 16954; RV64I-NEXT: sd a3, 0(sp) 16955; RV64I-NEXT: mv a1, sp 16956; RV64I-NEXT: li a3, 3 16957; RV64I-NEXT: mv a0, s0 16958; RV64I-NEXT: li a4, 0 16959; RV64I-NEXT: call __atomic_compare_exchange_8@plt 16960; RV64I-NEXT: ld a3, 0(sp) 16961; RV64I-NEXT: bnez a0, .LBB217_4 16962; RV64I-NEXT: .LBB217_2: # %atomicrmw.start 16963; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16964; RV64I-NEXT: mv a2, a3 16965; RV64I-NEXT: bgeu s1, a3, .LBB217_1 16966; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16967; RV64I-NEXT: # in Loop: Header=BB217_2 Depth=1 16968; RV64I-NEXT: mv a2, s1 16969; RV64I-NEXT: j .LBB217_1 16970; RV64I-NEXT: .LBB217_4: # %atomicrmw.end 16971; RV64I-NEXT: mv a0, a3 16972; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 16973; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 16974; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 16975; RV64I-NEXT: addi sp, sp, 32 16976; RV64I-NEXT: ret 16977; 16978; RV64IA-LABEL: atomicrmw_umin_i64_release: 16979; RV64IA: # %bb.0: 16980; RV64IA-NEXT: amominu.d.rl a0, a1, (a0) 16981; RV64IA-NEXT: ret 16982 %1 = atomicrmw umin i64* %a, i64 %b release 16983 ret i64 %1 16984} 16985 16986define i64 @atomicrmw_umin_i64_acq_rel(i64 *%a, i64 %b) nounwind { 16987; RV32I-LABEL: atomicrmw_umin_i64_acq_rel: 16988; RV32I: # %bb.0: 16989; RV32I-NEXT: addi sp, sp, -32 16990; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16991; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16992; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16993; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16994; RV32I-NEXT: mv s0, a0 16995; RV32I-NEXT: lw a5, 4(a0) 16996; RV32I-NEXT: lw a4, 0(a0) 16997; RV32I-NEXT: mv s1, a2 16998; RV32I-NEXT: mv s2, a1 16999; RV32I-NEXT: j .LBB218_2 17000; RV32I-NEXT: .LBB218_1: # %atomicrmw.start 17001; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17002; RV32I-NEXT: sw a4, 8(sp) 17003; RV32I-NEXT: sw a5, 12(sp) 17004; RV32I-NEXT: addi a1, sp, 8 17005; RV32I-NEXT: li a4, 4 17006; RV32I-NEXT: li a5, 2 17007; RV32I-NEXT: mv a0, s0 17008; RV32I-NEXT: call __atomic_compare_exchange_8@plt 17009; RV32I-NEXT: lw a5, 12(sp) 17010; RV32I-NEXT: lw a4, 8(sp) 17011; RV32I-NEXT: bnez a0, .LBB218_7 17012; RV32I-NEXT: .LBB218_2: # %atomicrmw.start 17013; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17014; RV32I-NEXT: beq a5, s1, .LBB218_4 17015; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17016; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17017; RV32I-NEXT: sltu a0, s1, a5 17018; RV32I-NEXT: j .LBB218_5 17019; RV32I-NEXT: .LBB218_4: # in Loop: Header=BB218_2 Depth=1 17020; RV32I-NEXT: sltu a0, s2, a4 17021; RV32I-NEXT: .LBB218_5: # %atomicrmw.start 17022; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17023; RV32I-NEXT: xori a0, a0, 1 17024; RV32I-NEXT: mv a2, a4 17025; RV32I-NEXT: mv a3, a5 17026; RV32I-NEXT: bnez a0, .LBB218_1 17027; RV32I-NEXT: # %bb.6: # %atomicrmw.start 17028; RV32I-NEXT: # in Loop: Header=BB218_2 Depth=1 17029; RV32I-NEXT: mv a2, s2 17030; RV32I-NEXT: mv a3, s1 17031; RV32I-NEXT: j .LBB218_1 17032; RV32I-NEXT: .LBB218_7: # %atomicrmw.end 17033; RV32I-NEXT: mv a0, a4 17034; RV32I-NEXT: mv a1, a5 17035; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17036; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17037; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17038; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17039; RV32I-NEXT: addi sp, sp, 32 17040; RV32I-NEXT: ret 17041; 17042; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel: 17043; RV32IA: # %bb.0: 17044; RV32IA-NEXT: addi sp, sp, -32 17045; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17046; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17047; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17048; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17049; RV32IA-NEXT: mv s0, a0 17050; RV32IA-NEXT: lw a5, 4(a0) 17051; RV32IA-NEXT: lw a4, 0(a0) 17052; RV32IA-NEXT: mv s1, a2 17053; RV32IA-NEXT: mv s2, a1 17054; RV32IA-NEXT: j .LBB218_2 17055; RV32IA-NEXT: .LBB218_1: # %atomicrmw.start 17056; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17057; RV32IA-NEXT: sw a4, 8(sp) 17058; RV32IA-NEXT: sw a5, 12(sp) 17059; RV32IA-NEXT: addi a1, sp, 8 17060; RV32IA-NEXT: li a4, 4 17061; RV32IA-NEXT: li a5, 2 17062; RV32IA-NEXT: mv a0, s0 17063; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 17064; RV32IA-NEXT: lw a5, 12(sp) 17065; RV32IA-NEXT: lw a4, 8(sp) 17066; RV32IA-NEXT: bnez a0, .LBB218_7 17067; RV32IA-NEXT: .LBB218_2: # %atomicrmw.start 17068; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 17069; RV32IA-NEXT: beq a5, s1, .LBB218_4 17070; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 17071; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17072; RV32IA-NEXT: sltu a0, s1, a5 17073; RV32IA-NEXT: j .LBB218_5 17074; RV32IA-NEXT: .LBB218_4: # in Loop: Header=BB218_2 Depth=1 17075; RV32IA-NEXT: sltu a0, s2, a4 17076; RV32IA-NEXT: .LBB218_5: # %atomicrmw.start 17077; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17078; RV32IA-NEXT: xori a0, a0, 1 17079; RV32IA-NEXT: mv a2, a4 17080; RV32IA-NEXT: mv a3, a5 17081; RV32IA-NEXT: bnez a0, .LBB218_1 17082; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 17083; RV32IA-NEXT: # in Loop: Header=BB218_2 Depth=1 17084; RV32IA-NEXT: mv a2, s2 17085; RV32IA-NEXT: mv a3, s1 17086; RV32IA-NEXT: j .LBB218_1 17087; RV32IA-NEXT: .LBB218_7: # %atomicrmw.end 17088; RV32IA-NEXT: mv a0, a4 17089; RV32IA-NEXT: mv a1, a5 17090; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17091; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17092; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17093; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17094; RV32IA-NEXT: addi sp, sp, 32 17095; RV32IA-NEXT: ret 17096; 17097; RV64I-LABEL: atomicrmw_umin_i64_acq_rel: 17098; RV64I: # %bb.0: 17099; RV64I-NEXT: addi sp, sp, -32 17100; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 17101; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 17102; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 17103; RV64I-NEXT: mv s0, a0 17104; RV64I-NEXT: ld a3, 0(a0) 17105; RV64I-NEXT: mv s1, a1 17106; RV64I-NEXT: j .LBB218_2 17107; RV64I-NEXT: .LBB218_1: # %atomicrmw.start 17108; RV64I-NEXT: # in Loop: Header=BB218_2 Depth=1 17109; RV64I-NEXT: sd a3, 0(sp) 17110; RV64I-NEXT: mv a1, sp 17111; RV64I-NEXT: li a3, 4 17112; RV64I-NEXT: li a4, 2 17113; RV64I-NEXT: mv a0, s0 17114; RV64I-NEXT: call __atomic_compare_exchange_8@plt 17115; RV64I-NEXT: ld a3, 0(sp) 17116; RV64I-NEXT: bnez a0, .LBB218_4 17117; RV64I-NEXT: .LBB218_2: # %atomicrmw.start 17118; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17119; RV64I-NEXT: mv a2, a3 17120; RV64I-NEXT: bgeu s1, a3, .LBB218_1 17121; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17122; RV64I-NEXT: # in Loop: Header=BB218_2 Depth=1 17123; RV64I-NEXT: mv a2, s1 17124; RV64I-NEXT: j .LBB218_1 17125; RV64I-NEXT: .LBB218_4: # %atomicrmw.end 17126; RV64I-NEXT: mv a0, a3 17127; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 17128; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 17129; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 17130; RV64I-NEXT: addi sp, sp, 32 17131; RV64I-NEXT: ret 17132; 17133; RV64IA-LABEL: atomicrmw_umin_i64_acq_rel: 17134; RV64IA: # %bb.0: 17135; RV64IA-NEXT: amominu.d.aqrl a0, a1, (a0) 17136; RV64IA-NEXT: ret 17137 %1 = atomicrmw umin i64* %a, i64 %b acq_rel 17138 ret i64 %1 17139} 17140 17141define i64 @atomicrmw_umin_i64_seq_cst(i64 *%a, i64 %b) nounwind { 17142; RV32I-LABEL: atomicrmw_umin_i64_seq_cst: 17143; RV32I: # %bb.0: 17144; RV32I-NEXT: addi sp, sp, -32 17145; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17146; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17147; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17148; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17149; RV32I-NEXT: mv s0, a0 17150; RV32I-NEXT: lw a5, 4(a0) 17151; RV32I-NEXT: lw a4, 0(a0) 17152; RV32I-NEXT: mv s1, a2 17153; RV32I-NEXT: mv s2, a1 17154; RV32I-NEXT: j .LBB219_2 17155; RV32I-NEXT: .LBB219_1: # %atomicrmw.start 17156; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17157; RV32I-NEXT: sw a4, 8(sp) 17158; RV32I-NEXT: sw a5, 12(sp) 17159; RV32I-NEXT: addi a1, sp, 8 17160; RV32I-NEXT: li a4, 5 17161; RV32I-NEXT: li a5, 5 17162; RV32I-NEXT: mv a0, s0 17163; RV32I-NEXT: call __atomic_compare_exchange_8@plt 17164; RV32I-NEXT: lw a5, 12(sp) 17165; RV32I-NEXT: lw a4, 8(sp) 17166; RV32I-NEXT: bnez a0, .LBB219_7 17167; RV32I-NEXT: .LBB219_2: # %atomicrmw.start 17168; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17169; RV32I-NEXT: beq a5, s1, .LBB219_4 17170; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17171; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17172; RV32I-NEXT: sltu a0, s1, a5 17173; RV32I-NEXT: j .LBB219_5 17174; RV32I-NEXT: .LBB219_4: # in Loop: Header=BB219_2 Depth=1 17175; RV32I-NEXT: sltu a0, s2, a4 17176; RV32I-NEXT: .LBB219_5: # %atomicrmw.start 17177; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17178; RV32I-NEXT: xori a0, a0, 1 17179; RV32I-NEXT: mv a2, a4 17180; RV32I-NEXT: mv a3, a5 17181; RV32I-NEXT: bnez a0, .LBB219_1 17182; RV32I-NEXT: # %bb.6: # %atomicrmw.start 17183; RV32I-NEXT: # in Loop: Header=BB219_2 Depth=1 17184; RV32I-NEXT: mv a2, s2 17185; RV32I-NEXT: mv a3, s1 17186; RV32I-NEXT: j .LBB219_1 17187; RV32I-NEXT: .LBB219_7: # %atomicrmw.end 17188; RV32I-NEXT: mv a0, a4 17189; RV32I-NEXT: mv a1, a5 17190; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17191; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17192; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17193; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17194; RV32I-NEXT: addi sp, sp, 32 17195; RV32I-NEXT: ret 17196; 17197; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst: 17198; RV32IA: # %bb.0: 17199; RV32IA-NEXT: addi sp, sp, -32 17200; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17201; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17202; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17203; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17204; RV32IA-NEXT: mv s0, a0 17205; RV32IA-NEXT: lw a5, 4(a0) 17206; RV32IA-NEXT: lw a4, 0(a0) 17207; RV32IA-NEXT: mv s1, a2 17208; RV32IA-NEXT: mv s2, a1 17209; RV32IA-NEXT: j .LBB219_2 17210; RV32IA-NEXT: .LBB219_1: # %atomicrmw.start 17211; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17212; RV32IA-NEXT: sw a4, 8(sp) 17213; RV32IA-NEXT: sw a5, 12(sp) 17214; RV32IA-NEXT: addi a1, sp, 8 17215; RV32IA-NEXT: li a4, 5 17216; RV32IA-NEXT: li a5, 5 17217; RV32IA-NEXT: mv a0, s0 17218; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 17219; RV32IA-NEXT: lw a5, 12(sp) 17220; RV32IA-NEXT: lw a4, 8(sp) 17221; RV32IA-NEXT: bnez a0, .LBB219_7 17222; RV32IA-NEXT: .LBB219_2: # %atomicrmw.start 17223; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 17224; RV32IA-NEXT: beq a5, s1, .LBB219_4 17225; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 17226; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17227; RV32IA-NEXT: sltu a0, s1, a5 17228; RV32IA-NEXT: j .LBB219_5 17229; RV32IA-NEXT: .LBB219_4: # in Loop: Header=BB219_2 Depth=1 17230; RV32IA-NEXT: sltu a0, s2, a4 17231; RV32IA-NEXT: .LBB219_5: # %atomicrmw.start 17232; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17233; RV32IA-NEXT: xori a0, a0, 1 17234; RV32IA-NEXT: mv a2, a4 17235; RV32IA-NEXT: mv a3, a5 17236; RV32IA-NEXT: bnez a0, .LBB219_1 17237; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 17238; RV32IA-NEXT: # in Loop: Header=BB219_2 Depth=1 17239; RV32IA-NEXT: mv a2, s2 17240; RV32IA-NEXT: mv a3, s1 17241; RV32IA-NEXT: j .LBB219_1 17242; RV32IA-NEXT: .LBB219_7: # %atomicrmw.end 17243; RV32IA-NEXT: mv a0, a4 17244; RV32IA-NEXT: mv a1, a5 17245; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17246; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17247; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17248; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17249; RV32IA-NEXT: addi sp, sp, 32 17250; RV32IA-NEXT: ret 17251; 17252; RV64I-LABEL: atomicrmw_umin_i64_seq_cst: 17253; RV64I: # %bb.0: 17254; RV64I-NEXT: addi sp, sp, -32 17255; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 17256; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 17257; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 17258; RV64I-NEXT: mv s0, a0 17259; RV64I-NEXT: ld a3, 0(a0) 17260; RV64I-NEXT: mv s1, a1 17261; RV64I-NEXT: j .LBB219_2 17262; RV64I-NEXT: .LBB219_1: # %atomicrmw.start 17263; RV64I-NEXT: # in Loop: Header=BB219_2 Depth=1 17264; RV64I-NEXT: sd a3, 0(sp) 17265; RV64I-NEXT: mv a1, sp 17266; RV64I-NEXT: li a3, 5 17267; RV64I-NEXT: li a4, 5 17268; RV64I-NEXT: mv a0, s0 17269; RV64I-NEXT: call __atomic_compare_exchange_8@plt 17270; RV64I-NEXT: ld a3, 0(sp) 17271; RV64I-NEXT: bnez a0, .LBB219_4 17272; RV64I-NEXT: .LBB219_2: # %atomicrmw.start 17273; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17274; RV64I-NEXT: mv a2, a3 17275; RV64I-NEXT: bgeu s1, a3, .LBB219_1 17276; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17277; RV64I-NEXT: # in Loop: Header=BB219_2 Depth=1 17278; RV64I-NEXT: mv a2, s1 17279; RV64I-NEXT: j .LBB219_1 17280; RV64I-NEXT: .LBB219_4: # %atomicrmw.end 17281; RV64I-NEXT: mv a0, a3 17282; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 17283; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 17284; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 17285; RV64I-NEXT: addi sp, sp, 32 17286; RV64I-NEXT: ret 17287; 17288; RV64IA-LABEL: atomicrmw_umin_i64_seq_cst: 17289; RV64IA: # %bb.0: 17290; RV64IA-NEXT: amominu.d.aqrl a0, a1, (a0) 17291; RV64IA-NEXT: ret 17292 %1 = atomicrmw umin i64* %a, i64 %b seq_cst 17293 ret i64 %1 17294} 17295