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-prefixes=RV32IA,RV32IA-NOZACAS %s 6; RUN: llc -mtriple=riscv32 -mattr=+a,+zacas -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS %s 8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64I %s 10; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \ 11; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS %s 12; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas -verify-machineinstrs < %s \ 13; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS %s 14 15define signext i8 @atomic_load_i8_unordered(ptr %a) nounwind { 16; RV32I-LABEL: atomic_load_i8_unordered: 17; RV32I: # %bb.0: 18; RV32I-NEXT: addi sp, sp, -16 19; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20; RV32I-NEXT: li a1, 0 21; RV32I-NEXT: call __atomic_load_1 22; RV32I-NEXT: slli a0, a0, 24 23; RV32I-NEXT: srai a0, a0, 24 24; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25; RV32I-NEXT: addi sp, sp, 16 26; RV32I-NEXT: ret 27; 28; RV32IA-LABEL: atomic_load_i8_unordered: 29; RV32IA: # %bb.0: 30; RV32IA-NEXT: lb a0, 0(a0) 31; RV32IA-NEXT: ret 32; 33; RV64I-LABEL: atomic_load_i8_unordered: 34; RV64I: # %bb.0: 35; RV64I-NEXT: addi sp, sp, -16 36; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 37; RV64I-NEXT: li a1, 0 38; RV64I-NEXT: call __atomic_load_1 39; RV64I-NEXT: slli a0, a0, 56 40; RV64I-NEXT: srai a0, a0, 56 41; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 42; RV64I-NEXT: addi sp, sp, 16 43; RV64I-NEXT: ret 44; 45; RV64IA-LABEL: atomic_load_i8_unordered: 46; RV64IA: # %bb.0: 47; RV64IA-NEXT: lb a0, 0(a0) 48; RV64IA-NEXT: ret 49 %1 = load atomic i8, ptr %a unordered, align 1 50 ret i8 %1 51} 52 53define signext i16 @atomic_load_i16_unordered(ptr %a) nounwind { 54; RV32I-LABEL: atomic_load_i16_unordered: 55; RV32I: # %bb.0: 56; RV32I-NEXT: addi sp, sp, -16 57; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 58; RV32I-NEXT: li a1, 0 59; RV32I-NEXT: call __atomic_load_2 60; RV32I-NEXT: slli a0, a0, 16 61; RV32I-NEXT: srai a0, a0, 16 62; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 63; RV32I-NEXT: addi sp, sp, 16 64; RV32I-NEXT: ret 65; 66; RV32IA-LABEL: atomic_load_i16_unordered: 67; RV32IA: # %bb.0: 68; RV32IA-NEXT: lh a0, 0(a0) 69; RV32IA-NEXT: ret 70; 71; RV64I-LABEL: atomic_load_i16_unordered: 72; RV64I: # %bb.0: 73; RV64I-NEXT: addi sp, sp, -16 74; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 75; RV64I-NEXT: li a1, 0 76; RV64I-NEXT: call __atomic_load_2 77; RV64I-NEXT: slli a0, a0, 48 78; RV64I-NEXT: srai a0, a0, 48 79; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 80; RV64I-NEXT: addi sp, sp, 16 81; RV64I-NEXT: ret 82; 83; RV64IA-LABEL: atomic_load_i16_unordered: 84; RV64IA: # %bb.0: 85; RV64IA-NEXT: lh a0, 0(a0) 86; RV64IA-NEXT: ret 87 %1 = load atomic i16, ptr %a unordered, align 2 88 ret i16 %1 89} 90 91define signext i32 @atomic_load_i32_unordered(ptr %a) nounwind { 92; RV32I-LABEL: atomic_load_i32_unordered: 93; RV32I: # %bb.0: 94; RV32I-NEXT: addi sp, sp, -16 95; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 96; RV32I-NEXT: li a1, 0 97; RV32I-NEXT: call __atomic_load_4 98; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 99; RV32I-NEXT: addi sp, sp, 16 100; RV32I-NEXT: ret 101; 102; RV32IA-LABEL: atomic_load_i32_unordered: 103; RV32IA: # %bb.0: 104; RV32IA-NEXT: lw a0, 0(a0) 105; RV32IA-NEXT: ret 106; 107; RV64I-LABEL: atomic_load_i32_unordered: 108; RV64I: # %bb.0: 109; RV64I-NEXT: addi sp, sp, -16 110; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 111; RV64I-NEXT: li a1, 0 112; RV64I-NEXT: call __atomic_load_4 113; RV64I-NEXT: sext.w a0, a0 114; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 115; RV64I-NEXT: addi sp, sp, 16 116; RV64I-NEXT: ret 117; 118; RV64IA-LABEL: atomic_load_i32_unordered: 119; RV64IA: # %bb.0: 120; RV64IA-NEXT: lw a0, 0(a0) 121; RV64IA-NEXT: ret 122 %1 = load atomic i32, ptr %a unordered, align 4 123 ret i32 %1 124} 125 126 127define signext i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind { 128; RV32I-LABEL: atomicrmw_xchg_i8_monotonic: 129; RV32I: # %bb.0: 130; RV32I-NEXT: addi sp, sp, -16 131; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 132; RV32I-NEXT: li a2, 0 133; RV32I-NEXT: call __atomic_exchange_1 134; RV32I-NEXT: slli a0, a0, 24 135; RV32I-NEXT: srai a0, a0, 24 136; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 137; RV32I-NEXT: addi sp, sp, 16 138; RV32I-NEXT: ret 139; 140; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic: 141; RV32IA: # %bb.0: 142; RV32IA-NEXT: andi a2, a0, -4 143; RV32IA-NEXT: slli a0, a0, 3 144; RV32IA-NEXT: li a3, 255 145; RV32IA-NEXT: andi a1, a1, 255 146; RV32IA-NEXT: sll a3, a3, a0 147; RV32IA-NEXT: sll a1, a1, a0 148; RV32IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 149; RV32IA-NEXT: lr.w a4, (a2) 150; RV32IA-NEXT: mv a5, a1 151; RV32IA-NEXT: xor a5, a4, a5 152; RV32IA-NEXT: and a5, a5, a3 153; RV32IA-NEXT: xor a5, a4, a5 154; RV32IA-NEXT: sc.w a5, a5, (a2) 155; RV32IA-NEXT: bnez a5, .LBB3_1 156; RV32IA-NEXT: # %bb.2: 157; RV32IA-NEXT: srl a0, a4, a0 158; RV32IA-NEXT: slli a0, a0, 24 159; RV32IA-NEXT: srai a0, a0, 24 160; RV32IA-NEXT: ret 161; 162; RV64I-LABEL: atomicrmw_xchg_i8_monotonic: 163; RV64I: # %bb.0: 164; RV64I-NEXT: addi sp, sp, -16 165; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 166; RV64I-NEXT: li a2, 0 167; RV64I-NEXT: call __atomic_exchange_1 168; RV64I-NEXT: slli a0, a0, 56 169; RV64I-NEXT: srai a0, a0, 56 170; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 171; RV64I-NEXT: addi sp, sp, 16 172; RV64I-NEXT: ret 173; 174; RV64IA-LABEL: atomicrmw_xchg_i8_monotonic: 175; RV64IA: # %bb.0: 176; RV64IA-NEXT: andi a2, a0, -4 177; RV64IA-NEXT: slli a0, a0, 3 178; RV64IA-NEXT: li a3, 255 179; RV64IA-NEXT: andi a1, a1, 255 180; RV64IA-NEXT: sllw a3, a3, a0 181; RV64IA-NEXT: sllw a1, a1, a0 182; RV64IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 183; RV64IA-NEXT: lr.w a4, (a2) 184; RV64IA-NEXT: mv a5, a1 185; RV64IA-NEXT: xor a5, a4, a5 186; RV64IA-NEXT: and a5, a5, a3 187; RV64IA-NEXT: xor a5, a4, a5 188; RV64IA-NEXT: sc.w a5, a5, (a2) 189; RV64IA-NEXT: bnez a5, .LBB3_1 190; RV64IA-NEXT: # %bb.2: 191; RV64IA-NEXT: srlw a0, a4, a0 192; RV64IA-NEXT: slli a0, a0, 56 193; RV64IA-NEXT: srai a0, a0, 56 194; RV64IA-NEXT: ret 195 %1 = atomicrmw xchg ptr %a, i8 %b monotonic 196 ret i8 %1 197} 198 199define signext i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind { 200; RV32I-LABEL: atomicrmw_add_i8_monotonic: 201; RV32I: # %bb.0: 202; RV32I-NEXT: addi sp, sp, -16 203; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 204; RV32I-NEXT: li a2, 0 205; RV32I-NEXT: call __atomic_fetch_add_1 206; RV32I-NEXT: slli a0, a0, 24 207; RV32I-NEXT: srai a0, a0, 24 208; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 209; RV32I-NEXT: addi sp, sp, 16 210; RV32I-NEXT: ret 211; 212; RV32IA-LABEL: atomicrmw_add_i8_monotonic: 213; RV32IA: # %bb.0: 214; RV32IA-NEXT: andi a2, a0, -4 215; RV32IA-NEXT: slli a0, a0, 3 216; RV32IA-NEXT: li a3, 255 217; RV32IA-NEXT: andi a1, a1, 255 218; RV32IA-NEXT: sll a3, a3, a0 219; RV32IA-NEXT: sll a1, a1, a0 220; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 221; RV32IA-NEXT: lr.w a4, (a2) 222; RV32IA-NEXT: add a5, a4, a1 223; RV32IA-NEXT: xor a5, a4, a5 224; RV32IA-NEXT: and a5, a5, a3 225; RV32IA-NEXT: xor a5, a4, a5 226; RV32IA-NEXT: sc.w a5, a5, (a2) 227; RV32IA-NEXT: bnez a5, .LBB4_1 228; RV32IA-NEXT: # %bb.2: 229; RV32IA-NEXT: srl a0, a4, a0 230; RV32IA-NEXT: slli a0, a0, 24 231; RV32IA-NEXT: srai a0, a0, 24 232; RV32IA-NEXT: ret 233; 234; RV64I-LABEL: atomicrmw_add_i8_monotonic: 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, 0 239; RV64I-NEXT: call __atomic_fetch_add_1 240; RV64I-NEXT: slli a0, a0, 56 241; RV64I-NEXT: srai a0, a0, 56 242; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 243; RV64I-NEXT: addi sp, sp, 16 244; RV64I-NEXT: ret 245; 246; RV64IA-LABEL: atomicrmw_add_i8_monotonic: 247; RV64IA: # %bb.0: 248; RV64IA-NEXT: andi a2, a0, -4 249; RV64IA-NEXT: slli a0, a0, 3 250; RV64IA-NEXT: li a3, 255 251; RV64IA-NEXT: andi a1, a1, 255 252; RV64IA-NEXT: sllw a3, a3, a0 253; RV64IA-NEXT: sllw a1, a1, a0 254; RV64IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 255; RV64IA-NEXT: lr.w a4, (a2) 256; RV64IA-NEXT: add a5, a4, a1 257; RV64IA-NEXT: xor a5, a4, a5 258; RV64IA-NEXT: and a5, a5, a3 259; RV64IA-NEXT: xor a5, a4, a5 260; RV64IA-NEXT: sc.w a5, a5, (a2) 261; RV64IA-NEXT: bnez a5, .LBB4_1 262; RV64IA-NEXT: # %bb.2: 263; RV64IA-NEXT: srlw a0, a4, a0 264; RV64IA-NEXT: slli a0, a0, 56 265; RV64IA-NEXT: srai a0, a0, 56 266; RV64IA-NEXT: ret 267 %1 = atomicrmw add ptr %a, i8 %b monotonic 268 ret i8 %1 269} 270 271define signext i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind { 272; RV32I-LABEL: atomicrmw_sub_i8_monotonic: 273; RV32I: # %bb.0: 274; RV32I-NEXT: addi sp, sp, -16 275; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 276; RV32I-NEXT: li a2, 0 277; RV32I-NEXT: call __atomic_fetch_sub_1 278; RV32I-NEXT: slli a0, a0, 24 279; RV32I-NEXT: srai a0, a0, 24 280; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 281; RV32I-NEXT: addi sp, sp, 16 282; RV32I-NEXT: ret 283; 284; RV32IA-LABEL: atomicrmw_sub_i8_monotonic: 285; RV32IA: # %bb.0: 286; RV32IA-NEXT: andi a2, a0, -4 287; RV32IA-NEXT: slli a0, a0, 3 288; RV32IA-NEXT: li a3, 255 289; RV32IA-NEXT: andi a1, a1, 255 290; RV32IA-NEXT: sll a3, a3, a0 291; RV32IA-NEXT: sll a1, a1, a0 292; RV32IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 293; RV32IA-NEXT: lr.w a4, (a2) 294; RV32IA-NEXT: sub a5, a4, a1 295; RV32IA-NEXT: xor a5, a4, a5 296; RV32IA-NEXT: and a5, a5, a3 297; RV32IA-NEXT: xor a5, a4, a5 298; RV32IA-NEXT: sc.w a5, a5, (a2) 299; RV32IA-NEXT: bnez a5, .LBB5_1 300; RV32IA-NEXT: # %bb.2: 301; RV32IA-NEXT: srl a0, a4, a0 302; RV32IA-NEXT: slli a0, a0, 24 303; RV32IA-NEXT: srai a0, a0, 24 304; RV32IA-NEXT: ret 305; 306; RV64I-LABEL: atomicrmw_sub_i8_monotonic: 307; RV64I: # %bb.0: 308; RV64I-NEXT: addi sp, sp, -16 309; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 310; RV64I-NEXT: li a2, 0 311; RV64I-NEXT: call __atomic_fetch_sub_1 312; RV64I-NEXT: slli a0, a0, 56 313; RV64I-NEXT: srai a0, a0, 56 314; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 315; RV64I-NEXT: addi sp, sp, 16 316; RV64I-NEXT: ret 317; 318; RV64IA-LABEL: atomicrmw_sub_i8_monotonic: 319; RV64IA: # %bb.0: 320; RV64IA-NEXT: andi a2, a0, -4 321; RV64IA-NEXT: slli a0, a0, 3 322; RV64IA-NEXT: li a3, 255 323; RV64IA-NEXT: andi a1, a1, 255 324; RV64IA-NEXT: sllw a3, a3, a0 325; RV64IA-NEXT: sllw a1, a1, a0 326; RV64IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 327; RV64IA-NEXT: lr.w a4, (a2) 328; RV64IA-NEXT: sub a5, a4, a1 329; RV64IA-NEXT: xor a5, a4, a5 330; RV64IA-NEXT: and a5, a5, a3 331; RV64IA-NEXT: xor a5, a4, a5 332; RV64IA-NEXT: sc.w a5, a5, (a2) 333; RV64IA-NEXT: bnez a5, .LBB5_1 334; RV64IA-NEXT: # %bb.2: 335; RV64IA-NEXT: srlw a0, a4, a0 336; RV64IA-NEXT: slli a0, a0, 56 337; RV64IA-NEXT: srai a0, a0, 56 338; RV64IA-NEXT: ret 339 %1 = atomicrmw sub ptr %a, i8 %b monotonic 340 ret i8 %1 341} 342 343define signext i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind { 344; RV32I-LABEL: atomicrmw_and_i8_monotonic: 345; RV32I: # %bb.0: 346; RV32I-NEXT: addi sp, sp, -16 347; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 348; RV32I-NEXT: li a2, 0 349; RV32I-NEXT: call __atomic_fetch_and_1 350; RV32I-NEXT: slli a0, a0, 24 351; RV32I-NEXT: srai a0, a0, 24 352; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 353; RV32I-NEXT: addi sp, sp, 16 354; RV32I-NEXT: ret 355; 356; RV32IA-LABEL: atomicrmw_and_i8_monotonic: 357; RV32IA: # %bb.0: 358; RV32IA-NEXT: andi a2, a0, -4 359; RV32IA-NEXT: slli a0, a0, 3 360; RV32IA-NEXT: li a3, 255 361; RV32IA-NEXT: andi a1, a1, 255 362; RV32IA-NEXT: sll a3, a3, a0 363; RV32IA-NEXT: not a3, a3 364; RV32IA-NEXT: sll a1, a1, a0 365; RV32IA-NEXT: or a1, a1, a3 366; RV32IA-NEXT: amoand.w a1, a1, (a2) 367; RV32IA-NEXT: srl a0, a1, a0 368; RV32IA-NEXT: slli a0, a0, 24 369; RV32IA-NEXT: srai a0, a0, 24 370; RV32IA-NEXT: ret 371; 372; RV64I-LABEL: atomicrmw_and_i8_monotonic: 373; RV64I: # %bb.0: 374; RV64I-NEXT: addi sp, sp, -16 375; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 376; RV64I-NEXT: li a2, 0 377; RV64I-NEXT: call __atomic_fetch_and_1 378; RV64I-NEXT: slli a0, a0, 56 379; RV64I-NEXT: srai a0, a0, 56 380; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 381; RV64I-NEXT: addi sp, sp, 16 382; RV64I-NEXT: ret 383; 384; RV64IA-LABEL: atomicrmw_and_i8_monotonic: 385; RV64IA: # %bb.0: 386; RV64IA-NEXT: andi a2, a0, -4 387; RV64IA-NEXT: slli a0, a0, 3 388; RV64IA-NEXT: li a3, 255 389; RV64IA-NEXT: andi a1, a1, 255 390; RV64IA-NEXT: sllw a3, a3, a0 391; RV64IA-NEXT: not a3, a3 392; RV64IA-NEXT: sllw a1, a1, a0 393; RV64IA-NEXT: or a1, a1, a3 394; RV64IA-NEXT: amoand.w a1, a1, (a2) 395; RV64IA-NEXT: srlw a0, a1, a0 396; RV64IA-NEXT: slli a0, a0, 56 397; RV64IA-NEXT: srai a0, a0, 56 398; RV64IA-NEXT: ret 399 %1 = atomicrmw and ptr %a, i8 %b monotonic 400 ret i8 %1 401} 402 403define signext i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind { 404; RV32I-LABEL: atomicrmw_nand_i8_monotonic: 405; RV32I: # %bb.0: 406; RV32I-NEXT: addi sp, sp, -16 407; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 408; RV32I-NEXT: li a2, 0 409; RV32I-NEXT: call __atomic_fetch_nand_1 410; RV32I-NEXT: slli a0, a0, 24 411; RV32I-NEXT: srai a0, a0, 24 412; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 413; RV32I-NEXT: addi sp, sp, 16 414; RV32I-NEXT: ret 415; 416; RV32IA-LABEL: atomicrmw_nand_i8_monotonic: 417; RV32IA: # %bb.0: 418; RV32IA-NEXT: andi a2, a0, -4 419; RV32IA-NEXT: slli a0, a0, 3 420; RV32IA-NEXT: li a3, 255 421; RV32IA-NEXT: andi a1, a1, 255 422; RV32IA-NEXT: sll a3, a3, a0 423; RV32IA-NEXT: sll a1, a1, a0 424; RV32IA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 425; RV32IA-NEXT: lr.w a4, (a2) 426; RV32IA-NEXT: and a5, a4, a1 427; RV32IA-NEXT: not a5, a5 428; RV32IA-NEXT: xor a5, a4, a5 429; RV32IA-NEXT: and a5, a5, a3 430; RV32IA-NEXT: xor a5, a4, a5 431; RV32IA-NEXT: sc.w a5, a5, (a2) 432; RV32IA-NEXT: bnez a5, .LBB7_1 433; RV32IA-NEXT: # %bb.2: 434; RV32IA-NEXT: srl a0, a4, a0 435; RV32IA-NEXT: slli a0, a0, 24 436; RV32IA-NEXT: srai a0, a0, 24 437; RV32IA-NEXT: ret 438; 439; RV64I-LABEL: atomicrmw_nand_i8_monotonic: 440; RV64I: # %bb.0: 441; RV64I-NEXT: addi sp, sp, -16 442; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 443; RV64I-NEXT: li a2, 0 444; RV64I-NEXT: call __atomic_fetch_nand_1 445; RV64I-NEXT: slli a0, a0, 56 446; RV64I-NEXT: srai a0, a0, 56 447; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 448; RV64I-NEXT: addi sp, sp, 16 449; RV64I-NEXT: ret 450; 451; RV64IA-LABEL: atomicrmw_nand_i8_monotonic: 452; RV64IA: # %bb.0: 453; RV64IA-NEXT: andi a2, a0, -4 454; RV64IA-NEXT: slli a0, a0, 3 455; RV64IA-NEXT: li a3, 255 456; RV64IA-NEXT: andi a1, a1, 255 457; RV64IA-NEXT: sllw a3, a3, a0 458; RV64IA-NEXT: sllw a1, a1, a0 459; RV64IA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 460; RV64IA-NEXT: lr.w a4, (a2) 461; RV64IA-NEXT: and a5, a4, a1 462; RV64IA-NEXT: not a5, a5 463; RV64IA-NEXT: xor a5, a4, a5 464; RV64IA-NEXT: and a5, a5, a3 465; RV64IA-NEXT: xor a5, a4, a5 466; RV64IA-NEXT: sc.w a5, a5, (a2) 467; RV64IA-NEXT: bnez a5, .LBB7_1 468; RV64IA-NEXT: # %bb.2: 469; RV64IA-NEXT: srlw a0, a4, a0 470; RV64IA-NEXT: slli a0, a0, 56 471; RV64IA-NEXT: srai a0, a0, 56 472; RV64IA-NEXT: ret 473 %1 = atomicrmw nand ptr %a, i8 %b monotonic 474 ret i8 %1 475} 476 477define signext i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind { 478; RV32I-LABEL: atomicrmw_or_i8_monotonic: 479; RV32I: # %bb.0: 480; RV32I-NEXT: addi sp, sp, -16 481; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 482; RV32I-NEXT: li a2, 0 483; RV32I-NEXT: call __atomic_fetch_or_1 484; RV32I-NEXT: slli a0, a0, 24 485; RV32I-NEXT: srai a0, a0, 24 486; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 487; RV32I-NEXT: addi sp, sp, 16 488; RV32I-NEXT: ret 489; 490; RV32IA-LABEL: atomicrmw_or_i8_monotonic: 491; RV32IA: # %bb.0: 492; RV32IA-NEXT: andi a2, a0, -4 493; RV32IA-NEXT: slli a0, a0, 3 494; RV32IA-NEXT: andi a1, a1, 255 495; RV32IA-NEXT: sll a1, a1, a0 496; RV32IA-NEXT: amoor.w a1, a1, (a2) 497; RV32IA-NEXT: srl a0, a1, a0 498; RV32IA-NEXT: slli a0, a0, 24 499; RV32IA-NEXT: srai a0, a0, 24 500; RV32IA-NEXT: ret 501; 502; RV64I-LABEL: atomicrmw_or_i8_monotonic: 503; RV64I: # %bb.0: 504; RV64I-NEXT: addi sp, sp, -16 505; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 506; RV64I-NEXT: li a2, 0 507; RV64I-NEXT: call __atomic_fetch_or_1 508; RV64I-NEXT: slli a0, a0, 56 509; RV64I-NEXT: srai a0, a0, 56 510; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 511; RV64I-NEXT: addi sp, sp, 16 512; RV64I-NEXT: ret 513; 514; RV64IA-LABEL: atomicrmw_or_i8_monotonic: 515; RV64IA: # %bb.0: 516; RV64IA-NEXT: andi a2, a0, -4 517; RV64IA-NEXT: slli a0, a0, 3 518; RV64IA-NEXT: andi a1, a1, 255 519; RV64IA-NEXT: sllw a1, a1, a0 520; RV64IA-NEXT: amoor.w a1, a1, (a2) 521; RV64IA-NEXT: srlw a0, a1, a0 522; RV64IA-NEXT: slli a0, a0, 56 523; RV64IA-NEXT: srai a0, a0, 56 524; RV64IA-NEXT: ret 525 %1 = atomicrmw or ptr %a, i8 %b monotonic 526 ret i8 %1 527} 528 529define signext i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind { 530; RV32I-LABEL: atomicrmw_xor_i8_monotonic: 531; RV32I: # %bb.0: 532; RV32I-NEXT: addi sp, sp, -16 533; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 534; RV32I-NEXT: li a2, 0 535; RV32I-NEXT: call __atomic_fetch_xor_1 536; RV32I-NEXT: slli a0, a0, 24 537; RV32I-NEXT: srai a0, a0, 24 538; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 539; RV32I-NEXT: addi sp, sp, 16 540; RV32I-NEXT: ret 541; 542; RV32IA-LABEL: atomicrmw_xor_i8_monotonic: 543; RV32IA: # %bb.0: 544; RV32IA-NEXT: andi a2, a0, -4 545; RV32IA-NEXT: slli a0, a0, 3 546; RV32IA-NEXT: andi a1, a1, 255 547; RV32IA-NEXT: sll a1, a1, a0 548; RV32IA-NEXT: amoxor.w a1, a1, (a2) 549; RV32IA-NEXT: srl a0, a1, a0 550; RV32IA-NEXT: slli a0, a0, 24 551; RV32IA-NEXT: srai a0, a0, 24 552; RV32IA-NEXT: ret 553; 554; RV64I-LABEL: atomicrmw_xor_i8_monotonic: 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, 0 559; RV64I-NEXT: call __atomic_fetch_xor_1 560; RV64I-NEXT: slli a0, a0, 56 561; RV64I-NEXT: srai a0, a0, 56 562; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 563; RV64I-NEXT: addi sp, sp, 16 564; RV64I-NEXT: ret 565; 566; RV64IA-LABEL: atomicrmw_xor_i8_monotonic: 567; RV64IA: # %bb.0: 568; RV64IA-NEXT: andi a2, a0, -4 569; RV64IA-NEXT: slli a0, a0, 3 570; RV64IA-NEXT: andi a1, a1, 255 571; RV64IA-NEXT: sllw a1, a1, a0 572; RV64IA-NEXT: amoxor.w a1, a1, (a2) 573; RV64IA-NEXT: srlw a0, a1, a0 574; RV64IA-NEXT: slli a0, a0, 56 575; RV64IA-NEXT: srai a0, a0, 56 576; RV64IA-NEXT: ret 577 %1 = atomicrmw xor ptr %a, i8 %b monotonic 578 ret i8 %1 579} 580 581define signext i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind { 582; RV32I-LABEL: atomicrmw_max_i8_monotonic: 583; RV32I: # %bb.0: 584; RV32I-NEXT: addi sp, sp, -32 585; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 586; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 587; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 588; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 589; RV32I-NEXT: mv s0, a0 590; RV32I-NEXT: lbu a3, 0(a0) 591; RV32I-NEXT: mv s1, a1 592; RV32I-NEXT: slli a0, a1, 24 593; RV32I-NEXT: srai s2, a0, 24 594; RV32I-NEXT: j .LBB10_2 595; RV32I-NEXT: .LBB10_1: # %atomicrmw.start 596; RV32I-NEXT: # in Loop: Header=BB10_2 Depth=1 597; RV32I-NEXT: sb a3, 15(sp) 598; RV32I-NEXT: addi a1, sp, 15 599; RV32I-NEXT: mv a0, s0 600; RV32I-NEXT: li a3, 0 601; RV32I-NEXT: li a4, 0 602; RV32I-NEXT: call __atomic_compare_exchange_1 603; RV32I-NEXT: lbu a3, 15(sp) 604; RV32I-NEXT: bnez a0, .LBB10_4 605; RV32I-NEXT: .LBB10_2: # %atomicrmw.start 606; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 607; RV32I-NEXT: slli a0, a3, 24 608; RV32I-NEXT: srai a0, a0, 24 609; RV32I-NEXT: mv a2, a3 610; RV32I-NEXT: blt s2, a0, .LBB10_1 611; RV32I-NEXT: # %bb.3: # %atomicrmw.start 612; RV32I-NEXT: # in Loop: Header=BB10_2 Depth=1 613; RV32I-NEXT: mv a2, s1 614; RV32I-NEXT: j .LBB10_1 615; RV32I-NEXT: .LBB10_4: # %atomicrmw.end 616; RV32I-NEXT: slli a0, a3, 24 617; RV32I-NEXT: srai a0, a0, 24 618; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 619; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 620; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 621; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 622; RV32I-NEXT: addi sp, sp, 32 623; RV32I-NEXT: ret 624; 625; RV32IA-LABEL: atomicrmw_max_i8_monotonic: 626; RV32IA: # %bb.0: 627; RV32IA-NEXT: andi a2, a0, -4 628; RV32IA-NEXT: slli a0, a0, 3 629; RV32IA-NEXT: li a3, 255 630; RV32IA-NEXT: slli a1, a1, 24 631; RV32IA-NEXT: andi a4, a0, 24 632; RV32IA-NEXT: sll a3, a3, a0 633; RV32IA-NEXT: srai a1, a1, 24 634; RV32IA-NEXT: sll a1, a1, a0 635; RV32IA-NEXT: xori a4, a4, 24 636; RV32IA-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 637; RV32IA-NEXT: lr.w a5, (a2) 638; RV32IA-NEXT: and a7, a5, a3 639; RV32IA-NEXT: mv a6, a5 640; RV32IA-NEXT: sll a7, a7, a4 641; RV32IA-NEXT: sra a7, a7, a4 642; RV32IA-NEXT: bge a7, a1, .LBB10_3 643; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1 644; RV32IA-NEXT: xor a6, a5, a1 645; RV32IA-NEXT: and a6, a6, a3 646; RV32IA-NEXT: xor a6, a5, a6 647; RV32IA-NEXT: .LBB10_3: # in Loop: Header=BB10_1 Depth=1 648; RV32IA-NEXT: sc.w a6, a6, (a2) 649; RV32IA-NEXT: bnez a6, .LBB10_1 650; RV32IA-NEXT: # %bb.4: 651; RV32IA-NEXT: srl a0, a5, a0 652; RV32IA-NEXT: slli a0, a0, 24 653; RV32IA-NEXT: srai a0, a0, 24 654; RV32IA-NEXT: ret 655; 656; RV64I-LABEL: atomicrmw_max_i8_monotonic: 657; RV64I: # %bb.0: 658; RV64I-NEXT: addi sp, sp, -48 659; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 660; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 661; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 662; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 663; RV64I-NEXT: mv s0, a0 664; RV64I-NEXT: lbu a3, 0(a0) 665; RV64I-NEXT: mv s1, a1 666; RV64I-NEXT: slli a0, a1, 56 667; RV64I-NEXT: srai s2, a0, 56 668; RV64I-NEXT: j .LBB10_2 669; RV64I-NEXT: .LBB10_1: # %atomicrmw.start 670; RV64I-NEXT: # in Loop: Header=BB10_2 Depth=1 671; RV64I-NEXT: sb a3, 15(sp) 672; RV64I-NEXT: addi a1, sp, 15 673; RV64I-NEXT: mv a0, s0 674; RV64I-NEXT: li a3, 0 675; RV64I-NEXT: li a4, 0 676; RV64I-NEXT: call __atomic_compare_exchange_1 677; RV64I-NEXT: lbu a3, 15(sp) 678; RV64I-NEXT: bnez a0, .LBB10_4 679; RV64I-NEXT: .LBB10_2: # %atomicrmw.start 680; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 681; RV64I-NEXT: slli a0, a3, 56 682; RV64I-NEXT: srai a0, a0, 56 683; RV64I-NEXT: mv a2, a3 684; RV64I-NEXT: blt s2, a0, .LBB10_1 685; RV64I-NEXT: # %bb.3: # %atomicrmw.start 686; RV64I-NEXT: # in Loop: Header=BB10_2 Depth=1 687; RV64I-NEXT: mv a2, s1 688; RV64I-NEXT: j .LBB10_1 689; RV64I-NEXT: .LBB10_4: # %atomicrmw.end 690; RV64I-NEXT: slli a0, a3, 56 691; RV64I-NEXT: srai a0, a0, 56 692; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 693; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 694; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 695; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 696; RV64I-NEXT: addi sp, sp, 48 697; RV64I-NEXT: ret 698; 699; RV64IA-LABEL: atomicrmw_max_i8_monotonic: 700; RV64IA: # %bb.0: 701; RV64IA-NEXT: andi a2, a0, -4 702; RV64IA-NEXT: slli a0, a0, 3 703; RV64IA-NEXT: li a3, 255 704; RV64IA-NEXT: slli a1, a1, 56 705; RV64IA-NEXT: andi a4, a0, 24 706; RV64IA-NEXT: sllw a3, a3, a0 707; RV64IA-NEXT: srai a1, a1, 56 708; RV64IA-NEXT: sllw a1, a1, a0 709; RV64IA-NEXT: xori a4, a4, 56 710; RV64IA-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 711; RV64IA-NEXT: lr.w a5, (a2) 712; RV64IA-NEXT: and a7, a5, a3 713; RV64IA-NEXT: mv a6, a5 714; RV64IA-NEXT: sll a7, a7, a4 715; RV64IA-NEXT: sra a7, a7, a4 716; RV64IA-NEXT: bge a7, a1, .LBB10_3 717; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1 718; RV64IA-NEXT: xor a6, a5, a1 719; RV64IA-NEXT: and a6, a6, a3 720; RV64IA-NEXT: xor a6, a5, a6 721; RV64IA-NEXT: .LBB10_3: # in Loop: Header=BB10_1 Depth=1 722; RV64IA-NEXT: sc.w a6, a6, (a2) 723; RV64IA-NEXT: bnez a6, .LBB10_1 724; RV64IA-NEXT: # %bb.4: 725; RV64IA-NEXT: srlw a0, a5, a0 726; RV64IA-NEXT: slli a0, a0, 56 727; RV64IA-NEXT: srai a0, a0, 56 728; RV64IA-NEXT: ret 729 %1 = atomicrmw max ptr %a, i8 %b monotonic 730 ret i8 %1 731} 732 733define signext i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind { 734; RV32I-LABEL: atomicrmw_min_i8_monotonic: 735; RV32I: # %bb.0: 736; RV32I-NEXT: addi sp, sp, -32 737; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 738; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 739; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 740; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 741; RV32I-NEXT: mv s0, a0 742; RV32I-NEXT: lbu a3, 0(a0) 743; RV32I-NEXT: mv s1, a1 744; RV32I-NEXT: slli a0, a1, 24 745; RV32I-NEXT: srai s2, a0, 24 746; RV32I-NEXT: j .LBB11_2 747; RV32I-NEXT: .LBB11_1: # %atomicrmw.start 748; RV32I-NEXT: # in Loop: Header=BB11_2 Depth=1 749; RV32I-NEXT: sb a3, 15(sp) 750; RV32I-NEXT: addi a1, sp, 15 751; RV32I-NEXT: mv a0, s0 752; RV32I-NEXT: li a3, 0 753; RV32I-NEXT: li a4, 0 754; RV32I-NEXT: call __atomic_compare_exchange_1 755; RV32I-NEXT: lbu a3, 15(sp) 756; RV32I-NEXT: bnez a0, .LBB11_4 757; RV32I-NEXT: .LBB11_2: # %atomicrmw.start 758; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 759; RV32I-NEXT: slli a0, a3, 24 760; RV32I-NEXT: srai a0, a0, 24 761; RV32I-NEXT: mv a2, a3 762; RV32I-NEXT: bge s2, a0, .LBB11_1 763; RV32I-NEXT: # %bb.3: # %atomicrmw.start 764; RV32I-NEXT: # in Loop: Header=BB11_2 Depth=1 765; RV32I-NEXT: mv a2, s1 766; RV32I-NEXT: j .LBB11_1 767; RV32I-NEXT: .LBB11_4: # %atomicrmw.end 768; RV32I-NEXT: slli a0, a3, 24 769; RV32I-NEXT: srai a0, a0, 24 770; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 771; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 772; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 773; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 774; RV32I-NEXT: addi sp, sp, 32 775; RV32I-NEXT: ret 776; 777; RV32IA-LABEL: atomicrmw_min_i8_monotonic: 778; RV32IA: # %bb.0: 779; RV32IA-NEXT: andi a2, a0, -4 780; RV32IA-NEXT: slli a0, a0, 3 781; RV32IA-NEXT: li a3, 255 782; RV32IA-NEXT: slli a1, a1, 24 783; RV32IA-NEXT: andi a4, a0, 24 784; RV32IA-NEXT: sll a3, a3, a0 785; RV32IA-NEXT: srai a1, a1, 24 786; RV32IA-NEXT: sll a1, a1, a0 787; RV32IA-NEXT: xori a4, a4, 24 788; RV32IA-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 789; RV32IA-NEXT: lr.w a5, (a2) 790; RV32IA-NEXT: and a7, a5, a3 791; RV32IA-NEXT: mv a6, a5 792; RV32IA-NEXT: sll a7, a7, a4 793; RV32IA-NEXT: sra a7, a7, a4 794; RV32IA-NEXT: bge a1, a7, .LBB11_3 795; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB11_1 Depth=1 796; RV32IA-NEXT: xor a6, a5, a1 797; RV32IA-NEXT: and a6, a6, a3 798; RV32IA-NEXT: xor a6, a5, a6 799; RV32IA-NEXT: .LBB11_3: # in Loop: Header=BB11_1 Depth=1 800; RV32IA-NEXT: sc.w a6, a6, (a2) 801; RV32IA-NEXT: bnez a6, .LBB11_1 802; RV32IA-NEXT: # %bb.4: 803; RV32IA-NEXT: srl a0, a5, a0 804; RV32IA-NEXT: slli a0, a0, 24 805; RV32IA-NEXT: srai a0, a0, 24 806; RV32IA-NEXT: ret 807; 808; RV64I-LABEL: atomicrmw_min_i8_monotonic: 809; RV64I: # %bb.0: 810; RV64I-NEXT: addi sp, sp, -48 811; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 812; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 813; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 814; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 815; RV64I-NEXT: mv s0, a0 816; RV64I-NEXT: lbu a3, 0(a0) 817; RV64I-NEXT: mv s1, a1 818; RV64I-NEXT: slli a0, a1, 56 819; RV64I-NEXT: srai s2, a0, 56 820; RV64I-NEXT: j .LBB11_2 821; RV64I-NEXT: .LBB11_1: # %atomicrmw.start 822; RV64I-NEXT: # in Loop: Header=BB11_2 Depth=1 823; RV64I-NEXT: sb a3, 15(sp) 824; RV64I-NEXT: addi a1, sp, 15 825; RV64I-NEXT: mv a0, s0 826; RV64I-NEXT: li a3, 0 827; RV64I-NEXT: li a4, 0 828; RV64I-NEXT: call __atomic_compare_exchange_1 829; RV64I-NEXT: lbu a3, 15(sp) 830; RV64I-NEXT: bnez a0, .LBB11_4 831; RV64I-NEXT: .LBB11_2: # %atomicrmw.start 832; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 833; RV64I-NEXT: slli a0, a3, 56 834; RV64I-NEXT: srai a0, a0, 56 835; RV64I-NEXT: mv a2, a3 836; RV64I-NEXT: bge s2, a0, .LBB11_1 837; RV64I-NEXT: # %bb.3: # %atomicrmw.start 838; RV64I-NEXT: # in Loop: Header=BB11_2 Depth=1 839; RV64I-NEXT: mv a2, s1 840; RV64I-NEXT: j .LBB11_1 841; RV64I-NEXT: .LBB11_4: # %atomicrmw.end 842; RV64I-NEXT: slli a0, a3, 56 843; RV64I-NEXT: srai a0, a0, 56 844; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 845; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 846; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 847; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 848; RV64I-NEXT: addi sp, sp, 48 849; RV64I-NEXT: ret 850; 851; RV64IA-LABEL: atomicrmw_min_i8_monotonic: 852; RV64IA: # %bb.0: 853; RV64IA-NEXT: andi a2, a0, -4 854; RV64IA-NEXT: slli a0, a0, 3 855; RV64IA-NEXT: li a3, 255 856; RV64IA-NEXT: slli a1, a1, 56 857; RV64IA-NEXT: andi a4, a0, 24 858; RV64IA-NEXT: sllw a3, a3, a0 859; RV64IA-NEXT: srai a1, a1, 56 860; RV64IA-NEXT: sllw a1, a1, a0 861; RV64IA-NEXT: xori a4, a4, 56 862; RV64IA-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 863; RV64IA-NEXT: lr.w a5, (a2) 864; RV64IA-NEXT: and a7, a5, a3 865; RV64IA-NEXT: mv a6, a5 866; RV64IA-NEXT: sll a7, a7, a4 867; RV64IA-NEXT: sra a7, a7, a4 868; RV64IA-NEXT: bge a1, a7, .LBB11_3 869; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB11_1 Depth=1 870; RV64IA-NEXT: xor a6, a5, a1 871; RV64IA-NEXT: and a6, a6, a3 872; RV64IA-NEXT: xor a6, a5, a6 873; RV64IA-NEXT: .LBB11_3: # in Loop: Header=BB11_1 Depth=1 874; RV64IA-NEXT: sc.w a6, a6, (a2) 875; RV64IA-NEXT: bnez a6, .LBB11_1 876; RV64IA-NEXT: # %bb.4: 877; RV64IA-NEXT: srlw a0, a5, a0 878; RV64IA-NEXT: slli a0, a0, 56 879; RV64IA-NEXT: srai a0, a0, 56 880; RV64IA-NEXT: ret 881 %1 = atomicrmw min ptr %a, i8 %b monotonic 882 ret i8 %1 883} 884 885define signext i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind { 886; RV32I-LABEL: atomicrmw_umax_i8_monotonic: 887; RV32I: # %bb.0: 888; RV32I-NEXT: addi sp, sp, -32 889; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 890; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 891; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 892; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 893; RV32I-NEXT: mv s0, a0 894; RV32I-NEXT: lbu a3, 0(a0) 895; RV32I-NEXT: mv s1, a1 896; RV32I-NEXT: andi s2, a1, 255 897; RV32I-NEXT: j .LBB12_2 898; RV32I-NEXT: .LBB12_1: # %atomicrmw.start 899; RV32I-NEXT: # in Loop: Header=BB12_2 Depth=1 900; RV32I-NEXT: sb a3, 15(sp) 901; RV32I-NEXT: addi a1, sp, 15 902; RV32I-NEXT: mv a0, s0 903; RV32I-NEXT: li a3, 0 904; RV32I-NEXT: li a4, 0 905; RV32I-NEXT: call __atomic_compare_exchange_1 906; RV32I-NEXT: lbu a3, 15(sp) 907; RV32I-NEXT: bnez a0, .LBB12_4 908; RV32I-NEXT: .LBB12_2: # %atomicrmw.start 909; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 910; RV32I-NEXT: andi a0, a3, 255 911; RV32I-NEXT: mv a2, a3 912; RV32I-NEXT: bltu s2, a0, .LBB12_1 913; RV32I-NEXT: # %bb.3: # %atomicrmw.start 914; RV32I-NEXT: # in Loop: Header=BB12_2 Depth=1 915; RV32I-NEXT: mv a2, s1 916; RV32I-NEXT: j .LBB12_1 917; RV32I-NEXT: .LBB12_4: # %atomicrmw.end 918; RV32I-NEXT: slli a0, a3, 24 919; RV32I-NEXT: srai a0, a0, 24 920; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 921; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 922; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 923; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 924; RV32I-NEXT: addi sp, sp, 32 925; RV32I-NEXT: ret 926; 927; RV32IA-LABEL: atomicrmw_umax_i8_monotonic: 928; RV32IA: # %bb.0: 929; RV32IA-NEXT: andi a2, a0, -4 930; RV32IA-NEXT: slli a0, a0, 3 931; RV32IA-NEXT: li a3, 255 932; RV32IA-NEXT: andi a1, a1, 255 933; RV32IA-NEXT: sll a3, a3, a0 934; RV32IA-NEXT: sll a1, a1, a0 935; RV32IA-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 936; RV32IA-NEXT: lr.w a4, (a2) 937; RV32IA-NEXT: and a6, a4, a3 938; RV32IA-NEXT: mv a5, a4 939; RV32IA-NEXT: bgeu a6, a1, .LBB12_3 940; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1 941; RV32IA-NEXT: xor a5, a4, a1 942; RV32IA-NEXT: and a5, a5, a3 943; RV32IA-NEXT: xor a5, a4, a5 944; RV32IA-NEXT: .LBB12_3: # in Loop: Header=BB12_1 Depth=1 945; RV32IA-NEXT: sc.w a5, a5, (a2) 946; RV32IA-NEXT: bnez a5, .LBB12_1 947; RV32IA-NEXT: # %bb.4: 948; RV32IA-NEXT: srl a0, a4, a0 949; RV32IA-NEXT: slli a0, a0, 24 950; RV32IA-NEXT: srai a0, a0, 24 951; RV32IA-NEXT: ret 952; 953; RV64I-LABEL: atomicrmw_umax_i8_monotonic: 954; RV64I: # %bb.0: 955; RV64I-NEXT: addi sp, sp, -48 956; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 957; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 958; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 959; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 960; RV64I-NEXT: mv s0, a0 961; RV64I-NEXT: lbu a3, 0(a0) 962; RV64I-NEXT: mv s1, a1 963; RV64I-NEXT: andi s2, a1, 255 964; RV64I-NEXT: j .LBB12_2 965; RV64I-NEXT: .LBB12_1: # %atomicrmw.start 966; RV64I-NEXT: # in Loop: Header=BB12_2 Depth=1 967; RV64I-NEXT: sb a3, 15(sp) 968; RV64I-NEXT: addi a1, sp, 15 969; RV64I-NEXT: mv a0, s0 970; RV64I-NEXT: li a3, 0 971; RV64I-NEXT: li a4, 0 972; RV64I-NEXT: call __atomic_compare_exchange_1 973; RV64I-NEXT: lbu a3, 15(sp) 974; RV64I-NEXT: bnez a0, .LBB12_4 975; RV64I-NEXT: .LBB12_2: # %atomicrmw.start 976; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 977; RV64I-NEXT: andi a0, a3, 255 978; RV64I-NEXT: mv a2, a3 979; RV64I-NEXT: bltu s2, a0, .LBB12_1 980; RV64I-NEXT: # %bb.3: # %atomicrmw.start 981; RV64I-NEXT: # in Loop: Header=BB12_2 Depth=1 982; RV64I-NEXT: mv a2, s1 983; RV64I-NEXT: j .LBB12_1 984; RV64I-NEXT: .LBB12_4: # %atomicrmw.end 985; RV64I-NEXT: slli a0, a3, 56 986; RV64I-NEXT: srai a0, a0, 56 987; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 988; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 989; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 990; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 991; RV64I-NEXT: addi sp, sp, 48 992; RV64I-NEXT: ret 993; 994; RV64IA-LABEL: atomicrmw_umax_i8_monotonic: 995; RV64IA: # %bb.0: 996; RV64IA-NEXT: andi a2, a0, -4 997; RV64IA-NEXT: slli a0, a0, 3 998; RV64IA-NEXT: li a3, 255 999; RV64IA-NEXT: andi a1, a1, 255 1000; RV64IA-NEXT: sllw a3, a3, a0 1001; RV64IA-NEXT: sllw a1, a1, a0 1002; RV64IA-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 1003; RV64IA-NEXT: lr.w a4, (a2) 1004; RV64IA-NEXT: and a6, a4, a3 1005; RV64IA-NEXT: mv a5, a4 1006; RV64IA-NEXT: bgeu a6, a1, .LBB12_3 1007; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1 1008; RV64IA-NEXT: xor a5, a4, a1 1009; RV64IA-NEXT: and a5, a5, a3 1010; RV64IA-NEXT: xor a5, a4, a5 1011; RV64IA-NEXT: .LBB12_3: # in Loop: Header=BB12_1 Depth=1 1012; RV64IA-NEXT: sc.w a5, a5, (a2) 1013; RV64IA-NEXT: bnez a5, .LBB12_1 1014; RV64IA-NEXT: # %bb.4: 1015; RV64IA-NEXT: srlw a0, a4, a0 1016; RV64IA-NEXT: slli a0, a0, 56 1017; RV64IA-NEXT: srai a0, a0, 56 1018; RV64IA-NEXT: ret 1019 %1 = atomicrmw umax ptr %a, i8 %b monotonic 1020 ret i8 %1 1021} 1022 1023define signext i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind { 1024; RV32I-LABEL: atomicrmw_umin_i8_monotonic: 1025; RV32I: # %bb.0: 1026; RV32I-NEXT: addi sp, sp, -32 1027; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1028; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1029; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1030; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1031; RV32I-NEXT: mv s0, a0 1032; RV32I-NEXT: lbu a3, 0(a0) 1033; RV32I-NEXT: mv s1, a1 1034; RV32I-NEXT: andi s2, a1, 255 1035; RV32I-NEXT: j .LBB13_2 1036; RV32I-NEXT: .LBB13_1: # %atomicrmw.start 1037; RV32I-NEXT: # in Loop: Header=BB13_2 Depth=1 1038; RV32I-NEXT: sb a3, 15(sp) 1039; RV32I-NEXT: addi a1, sp, 15 1040; RV32I-NEXT: mv a0, s0 1041; RV32I-NEXT: li a3, 0 1042; RV32I-NEXT: li a4, 0 1043; RV32I-NEXT: call __atomic_compare_exchange_1 1044; RV32I-NEXT: lbu a3, 15(sp) 1045; RV32I-NEXT: bnez a0, .LBB13_4 1046; RV32I-NEXT: .LBB13_2: # %atomicrmw.start 1047; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1048; RV32I-NEXT: andi a0, a3, 255 1049; RV32I-NEXT: mv a2, a3 1050; RV32I-NEXT: bgeu s2, a0, .LBB13_1 1051; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1052; RV32I-NEXT: # in Loop: Header=BB13_2 Depth=1 1053; RV32I-NEXT: mv a2, s1 1054; RV32I-NEXT: j .LBB13_1 1055; RV32I-NEXT: .LBB13_4: # %atomicrmw.end 1056; RV32I-NEXT: slli a0, a3, 24 1057; RV32I-NEXT: srai a0, a0, 24 1058; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1059; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1060; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1061; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1062; RV32I-NEXT: addi sp, sp, 32 1063; RV32I-NEXT: ret 1064; 1065; RV32IA-LABEL: atomicrmw_umin_i8_monotonic: 1066; RV32IA: # %bb.0: 1067; RV32IA-NEXT: andi a2, a0, -4 1068; RV32IA-NEXT: slli a0, a0, 3 1069; RV32IA-NEXT: li a3, 255 1070; RV32IA-NEXT: andi a1, a1, 255 1071; RV32IA-NEXT: sll a3, a3, a0 1072; RV32IA-NEXT: sll a1, a1, a0 1073; RV32IA-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 1074; RV32IA-NEXT: lr.w a4, (a2) 1075; RV32IA-NEXT: and a6, a4, a3 1076; RV32IA-NEXT: mv a5, a4 1077; RV32IA-NEXT: bgeu a1, a6, .LBB13_3 1078; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1 1079; RV32IA-NEXT: xor a5, a4, a1 1080; RV32IA-NEXT: and a5, a5, a3 1081; RV32IA-NEXT: xor a5, a4, a5 1082; RV32IA-NEXT: .LBB13_3: # in Loop: Header=BB13_1 Depth=1 1083; RV32IA-NEXT: sc.w a5, a5, (a2) 1084; RV32IA-NEXT: bnez a5, .LBB13_1 1085; RV32IA-NEXT: # %bb.4: 1086; RV32IA-NEXT: srl a0, a4, a0 1087; RV32IA-NEXT: slli a0, a0, 24 1088; RV32IA-NEXT: srai a0, a0, 24 1089; RV32IA-NEXT: ret 1090; 1091; RV64I-LABEL: atomicrmw_umin_i8_monotonic: 1092; RV64I: # %bb.0: 1093; RV64I-NEXT: addi sp, sp, -48 1094; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1095; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1096; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1097; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1098; RV64I-NEXT: mv s0, a0 1099; RV64I-NEXT: lbu a3, 0(a0) 1100; RV64I-NEXT: mv s1, a1 1101; RV64I-NEXT: andi s2, a1, 255 1102; RV64I-NEXT: j .LBB13_2 1103; RV64I-NEXT: .LBB13_1: # %atomicrmw.start 1104; RV64I-NEXT: # in Loop: Header=BB13_2 Depth=1 1105; RV64I-NEXT: sb a3, 15(sp) 1106; RV64I-NEXT: addi a1, sp, 15 1107; RV64I-NEXT: mv a0, s0 1108; RV64I-NEXT: li a3, 0 1109; RV64I-NEXT: li a4, 0 1110; RV64I-NEXT: call __atomic_compare_exchange_1 1111; RV64I-NEXT: lbu a3, 15(sp) 1112; RV64I-NEXT: bnez a0, .LBB13_4 1113; RV64I-NEXT: .LBB13_2: # %atomicrmw.start 1114; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1115; RV64I-NEXT: andi a0, a3, 255 1116; RV64I-NEXT: mv a2, a3 1117; RV64I-NEXT: bgeu s2, a0, .LBB13_1 1118; RV64I-NEXT: # %bb.3: # %atomicrmw.start 1119; RV64I-NEXT: # in Loop: Header=BB13_2 Depth=1 1120; RV64I-NEXT: mv a2, s1 1121; RV64I-NEXT: j .LBB13_1 1122; RV64I-NEXT: .LBB13_4: # %atomicrmw.end 1123; RV64I-NEXT: slli a0, a3, 56 1124; RV64I-NEXT: srai a0, a0, 56 1125; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1126; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1127; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1128; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1129; RV64I-NEXT: addi sp, sp, 48 1130; RV64I-NEXT: ret 1131; 1132; RV64IA-LABEL: atomicrmw_umin_i8_monotonic: 1133; RV64IA: # %bb.0: 1134; RV64IA-NEXT: andi a2, a0, -4 1135; RV64IA-NEXT: slli a0, a0, 3 1136; RV64IA-NEXT: li a3, 255 1137; RV64IA-NEXT: andi a1, a1, 255 1138; RV64IA-NEXT: sllw a3, a3, a0 1139; RV64IA-NEXT: sllw a1, a1, a0 1140; RV64IA-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 1141; RV64IA-NEXT: lr.w a4, (a2) 1142; RV64IA-NEXT: and a6, a4, a3 1143; RV64IA-NEXT: mv a5, a4 1144; RV64IA-NEXT: bgeu a1, a6, .LBB13_3 1145; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1 1146; RV64IA-NEXT: xor a5, a4, a1 1147; RV64IA-NEXT: and a5, a5, a3 1148; RV64IA-NEXT: xor a5, a4, a5 1149; RV64IA-NEXT: .LBB13_3: # in Loop: Header=BB13_1 Depth=1 1150; RV64IA-NEXT: sc.w a5, a5, (a2) 1151; RV64IA-NEXT: bnez a5, .LBB13_1 1152; RV64IA-NEXT: # %bb.4: 1153; RV64IA-NEXT: srlw a0, a4, a0 1154; RV64IA-NEXT: slli a0, a0, 56 1155; RV64IA-NEXT: srai a0, a0, 56 1156; RV64IA-NEXT: ret 1157 %1 = atomicrmw umin ptr %a, i8 %b monotonic 1158 ret i8 %1 1159} 1160 1161define signext i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind { 1162; RV32I-LABEL: atomicrmw_xchg_i16_monotonic: 1163; RV32I: # %bb.0: 1164; RV32I-NEXT: addi sp, sp, -16 1165; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1166; RV32I-NEXT: li a2, 0 1167; RV32I-NEXT: call __atomic_exchange_2 1168; RV32I-NEXT: slli a0, a0, 16 1169; RV32I-NEXT: srai a0, a0, 16 1170; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1171; RV32I-NEXT: addi sp, sp, 16 1172; RV32I-NEXT: ret 1173; 1174; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic: 1175; RV32IA: # %bb.0: 1176; RV32IA-NEXT: andi a2, a0, -4 1177; RV32IA-NEXT: slli a0, a0, 3 1178; RV32IA-NEXT: lui a3, 16 1179; RV32IA-NEXT: addi a3, a3, -1 1180; RV32IA-NEXT: sll a4, a3, a0 1181; RV32IA-NEXT: and a1, a1, a3 1182; RV32IA-NEXT: sll a1, a1, a0 1183; RV32IA-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 1184; RV32IA-NEXT: lr.w a3, (a2) 1185; RV32IA-NEXT: mv a5, a1 1186; RV32IA-NEXT: xor a5, a3, a5 1187; RV32IA-NEXT: and a5, a5, a4 1188; RV32IA-NEXT: xor a5, a3, a5 1189; RV32IA-NEXT: sc.w a5, a5, (a2) 1190; RV32IA-NEXT: bnez a5, .LBB14_1 1191; RV32IA-NEXT: # %bb.2: 1192; RV32IA-NEXT: srl a0, a3, a0 1193; RV32IA-NEXT: slli a0, a0, 16 1194; RV32IA-NEXT: srai a0, a0, 16 1195; RV32IA-NEXT: ret 1196; 1197; RV64I-LABEL: atomicrmw_xchg_i16_monotonic: 1198; RV64I: # %bb.0: 1199; RV64I-NEXT: addi sp, sp, -16 1200; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1201; RV64I-NEXT: li a2, 0 1202; RV64I-NEXT: call __atomic_exchange_2 1203; RV64I-NEXT: slli a0, a0, 48 1204; RV64I-NEXT: srai a0, a0, 48 1205; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1206; RV64I-NEXT: addi sp, sp, 16 1207; RV64I-NEXT: ret 1208; 1209; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic: 1210; RV64IA: # %bb.0: 1211; RV64IA-NEXT: andi a2, a0, -4 1212; RV64IA-NEXT: slli a0, a0, 3 1213; RV64IA-NEXT: lui a3, 16 1214; RV64IA-NEXT: addi a3, a3, -1 1215; RV64IA-NEXT: sllw a4, a3, a0 1216; RV64IA-NEXT: and a1, a1, a3 1217; RV64IA-NEXT: sllw a1, a1, a0 1218; RV64IA-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 1219; RV64IA-NEXT: lr.w a3, (a2) 1220; RV64IA-NEXT: mv a5, a1 1221; RV64IA-NEXT: xor a5, a3, a5 1222; RV64IA-NEXT: and a5, a5, a4 1223; RV64IA-NEXT: xor a5, a3, a5 1224; RV64IA-NEXT: sc.w a5, a5, (a2) 1225; RV64IA-NEXT: bnez a5, .LBB14_1 1226; RV64IA-NEXT: # %bb.2: 1227; RV64IA-NEXT: srlw a0, a3, a0 1228; RV64IA-NEXT: slli a0, a0, 48 1229; RV64IA-NEXT: srai a0, a0, 48 1230; RV64IA-NEXT: ret 1231 %1 = atomicrmw xchg ptr %a, i16 %b monotonic 1232 ret i16 %1 1233} 1234 1235define signext i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind { 1236; RV32I-LABEL: atomicrmw_add_i16_monotonic: 1237; RV32I: # %bb.0: 1238; RV32I-NEXT: addi sp, sp, -16 1239; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1240; RV32I-NEXT: li a2, 0 1241; RV32I-NEXT: call __atomic_fetch_add_2 1242; RV32I-NEXT: slli a0, a0, 16 1243; RV32I-NEXT: srai a0, a0, 16 1244; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1245; RV32I-NEXT: addi sp, sp, 16 1246; RV32I-NEXT: ret 1247; 1248; RV32IA-LABEL: atomicrmw_add_i16_monotonic: 1249; RV32IA: # %bb.0: 1250; RV32IA-NEXT: andi a2, a0, -4 1251; RV32IA-NEXT: slli a0, a0, 3 1252; RV32IA-NEXT: lui a3, 16 1253; RV32IA-NEXT: addi a3, a3, -1 1254; RV32IA-NEXT: sll a4, a3, a0 1255; RV32IA-NEXT: and a1, a1, a3 1256; RV32IA-NEXT: sll a1, a1, a0 1257; RV32IA-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1258; RV32IA-NEXT: lr.w a3, (a2) 1259; RV32IA-NEXT: add a5, a3, a1 1260; RV32IA-NEXT: xor a5, a3, a5 1261; RV32IA-NEXT: and a5, a5, a4 1262; RV32IA-NEXT: xor a5, a3, a5 1263; RV32IA-NEXT: sc.w a5, a5, (a2) 1264; RV32IA-NEXT: bnez a5, .LBB15_1 1265; RV32IA-NEXT: # %bb.2: 1266; RV32IA-NEXT: srl a0, a3, a0 1267; RV32IA-NEXT: slli a0, a0, 16 1268; RV32IA-NEXT: srai a0, a0, 16 1269; RV32IA-NEXT: ret 1270; 1271; RV64I-LABEL: atomicrmw_add_i16_monotonic: 1272; RV64I: # %bb.0: 1273; RV64I-NEXT: addi sp, sp, -16 1274; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1275; RV64I-NEXT: li a2, 0 1276; RV64I-NEXT: call __atomic_fetch_add_2 1277; RV64I-NEXT: slli a0, a0, 48 1278; RV64I-NEXT: srai a0, a0, 48 1279; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1280; RV64I-NEXT: addi sp, sp, 16 1281; RV64I-NEXT: ret 1282; 1283; RV64IA-LABEL: atomicrmw_add_i16_monotonic: 1284; RV64IA: # %bb.0: 1285; RV64IA-NEXT: andi a2, a0, -4 1286; RV64IA-NEXT: slli a0, a0, 3 1287; RV64IA-NEXT: lui a3, 16 1288; RV64IA-NEXT: addi a3, a3, -1 1289; RV64IA-NEXT: sllw a4, a3, a0 1290; RV64IA-NEXT: and a1, a1, a3 1291; RV64IA-NEXT: sllw a1, a1, a0 1292; RV64IA-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1293; RV64IA-NEXT: lr.w a3, (a2) 1294; RV64IA-NEXT: add a5, a3, a1 1295; RV64IA-NEXT: xor a5, a3, a5 1296; RV64IA-NEXT: and a5, a5, a4 1297; RV64IA-NEXT: xor a5, a3, a5 1298; RV64IA-NEXT: sc.w a5, a5, (a2) 1299; RV64IA-NEXT: bnez a5, .LBB15_1 1300; RV64IA-NEXT: # %bb.2: 1301; RV64IA-NEXT: srlw a0, a3, a0 1302; RV64IA-NEXT: slli a0, a0, 48 1303; RV64IA-NEXT: srai a0, a0, 48 1304; RV64IA-NEXT: ret 1305 %1 = atomicrmw add ptr %a, i16 %b monotonic 1306 ret i16 %1 1307} 1308 1309define signext i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind { 1310; RV32I-LABEL: atomicrmw_sub_i16_monotonic: 1311; RV32I: # %bb.0: 1312; RV32I-NEXT: addi sp, sp, -16 1313; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1314; RV32I-NEXT: li a2, 0 1315; RV32I-NEXT: call __atomic_fetch_sub_2 1316; RV32I-NEXT: slli a0, a0, 16 1317; RV32I-NEXT: srai a0, a0, 16 1318; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1319; RV32I-NEXT: addi sp, sp, 16 1320; RV32I-NEXT: ret 1321; 1322; RV32IA-LABEL: atomicrmw_sub_i16_monotonic: 1323; RV32IA: # %bb.0: 1324; RV32IA-NEXT: andi a2, a0, -4 1325; RV32IA-NEXT: slli a0, a0, 3 1326; RV32IA-NEXT: lui a3, 16 1327; RV32IA-NEXT: addi a3, a3, -1 1328; RV32IA-NEXT: sll a4, a3, a0 1329; RV32IA-NEXT: and a1, a1, a3 1330; RV32IA-NEXT: sll a1, a1, a0 1331; RV32IA-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1332; RV32IA-NEXT: lr.w a3, (a2) 1333; RV32IA-NEXT: sub a5, a3, a1 1334; RV32IA-NEXT: xor a5, a3, a5 1335; RV32IA-NEXT: and a5, a5, a4 1336; RV32IA-NEXT: xor a5, a3, a5 1337; RV32IA-NEXT: sc.w a5, a5, (a2) 1338; RV32IA-NEXT: bnez a5, .LBB16_1 1339; RV32IA-NEXT: # %bb.2: 1340; RV32IA-NEXT: srl a0, a3, a0 1341; RV32IA-NEXT: slli a0, a0, 16 1342; RV32IA-NEXT: srai a0, a0, 16 1343; RV32IA-NEXT: ret 1344; 1345; RV64I-LABEL: atomicrmw_sub_i16_monotonic: 1346; RV64I: # %bb.0: 1347; RV64I-NEXT: addi sp, sp, -16 1348; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1349; RV64I-NEXT: li a2, 0 1350; RV64I-NEXT: call __atomic_fetch_sub_2 1351; RV64I-NEXT: slli a0, a0, 48 1352; RV64I-NEXT: srai a0, a0, 48 1353; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1354; RV64I-NEXT: addi sp, sp, 16 1355; RV64I-NEXT: ret 1356; 1357; RV64IA-LABEL: atomicrmw_sub_i16_monotonic: 1358; RV64IA: # %bb.0: 1359; RV64IA-NEXT: andi a2, a0, -4 1360; RV64IA-NEXT: slli a0, a0, 3 1361; RV64IA-NEXT: lui a3, 16 1362; RV64IA-NEXT: addi a3, a3, -1 1363; RV64IA-NEXT: sllw a4, a3, a0 1364; RV64IA-NEXT: and a1, a1, a3 1365; RV64IA-NEXT: sllw a1, a1, a0 1366; RV64IA-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1367; RV64IA-NEXT: lr.w a3, (a2) 1368; RV64IA-NEXT: sub a5, a3, a1 1369; RV64IA-NEXT: xor a5, a3, a5 1370; RV64IA-NEXT: and a5, a5, a4 1371; RV64IA-NEXT: xor a5, a3, a5 1372; RV64IA-NEXT: sc.w a5, a5, (a2) 1373; RV64IA-NEXT: bnez a5, .LBB16_1 1374; RV64IA-NEXT: # %bb.2: 1375; RV64IA-NEXT: srlw a0, a3, a0 1376; RV64IA-NEXT: slli a0, a0, 48 1377; RV64IA-NEXT: srai a0, a0, 48 1378; RV64IA-NEXT: ret 1379 %1 = atomicrmw sub ptr %a, i16 %b monotonic 1380 ret i16 %1 1381} 1382 1383define signext i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind { 1384; RV32I-LABEL: atomicrmw_and_i16_monotonic: 1385; RV32I: # %bb.0: 1386; RV32I-NEXT: addi sp, sp, -16 1387; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1388; RV32I-NEXT: li a2, 0 1389; RV32I-NEXT: call __atomic_fetch_and_2 1390; RV32I-NEXT: slli a0, a0, 16 1391; RV32I-NEXT: srai a0, a0, 16 1392; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1393; RV32I-NEXT: addi sp, sp, 16 1394; RV32I-NEXT: ret 1395; 1396; RV32IA-LABEL: atomicrmw_and_i16_monotonic: 1397; RV32IA: # %bb.0: 1398; RV32IA-NEXT: andi a2, a0, -4 1399; RV32IA-NEXT: slli a0, a0, 3 1400; RV32IA-NEXT: lui a3, 16 1401; RV32IA-NEXT: addi a3, a3, -1 1402; RV32IA-NEXT: sll a4, a3, a0 1403; RV32IA-NEXT: and a1, a1, a3 1404; RV32IA-NEXT: not a3, a4 1405; RV32IA-NEXT: sll a1, a1, a0 1406; RV32IA-NEXT: or a1, a1, a3 1407; RV32IA-NEXT: amoand.w a1, a1, (a2) 1408; RV32IA-NEXT: srl a0, a1, a0 1409; RV32IA-NEXT: slli a0, a0, 16 1410; RV32IA-NEXT: srai a0, a0, 16 1411; RV32IA-NEXT: ret 1412; 1413; RV64I-LABEL: atomicrmw_and_i16_monotonic: 1414; RV64I: # %bb.0: 1415; RV64I-NEXT: addi sp, sp, -16 1416; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1417; RV64I-NEXT: li a2, 0 1418; RV64I-NEXT: call __atomic_fetch_and_2 1419; RV64I-NEXT: slli a0, a0, 48 1420; RV64I-NEXT: srai a0, a0, 48 1421; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1422; RV64I-NEXT: addi sp, sp, 16 1423; RV64I-NEXT: ret 1424; 1425; RV64IA-LABEL: atomicrmw_and_i16_monotonic: 1426; RV64IA: # %bb.0: 1427; RV64IA-NEXT: andi a2, a0, -4 1428; RV64IA-NEXT: slli a0, a0, 3 1429; RV64IA-NEXT: lui a3, 16 1430; RV64IA-NEXT: addi a3, a3, -1 1431; RV64IA-NEXT: sllw a4, a3, a0 1432; RV64IA-NEXT: and a1, a1, a3 1433; RV64IA-NEXT: not a3, a4 1434; RV64IA-NEXT: sllw a1, a1, a0 1435; RV64IA-NEXT: or a1, a1, a3 1436; RV64IA-NEXT: amoand.w a1, a1, (a2) 1437; RV64IA-NEXT: srlw a0, a1, a0 1438; RV64IA-NEXT: slli a0, a0, 48 1439; RV64IA-NEXT: srai a0, a0, 48 1440; RV64IA-NEXT: ret 1441 %1 = atomicrmw and ptr %a, i16 %b monotonic 1442 ret i16 %1 1443} 1444 1445define signext i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind { 1446; RV32I-LABEL: atomicrmw_nand_i16_monotonic: 1447; RV32I: # %bb.0: 1448; RV32I-NEXT: addi sp, sp, -16 1449; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1450; RV32I-NEXT: li a2, 0 1451; RV32I-NEXT: call __atomic_fetch_nand_2 1452; RV32I-NEXT: slli a0, a0, 16 1453; RV32I-NEXT: srai a0, a0, 16 1454; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1455; RV32I-NEXT: addi sp, sp, 16 1456; RV32I-NEXT: ret 1457; 1458; RV32IA-LABEL: atomicrmw_nand_i16_monotonic: 1459; RV32IA: # %bb.0: 1460; RV32IA-NEXT: andi a2, a0, -4 1461; RV32IA-NEXT: slli a0, a0, 3 1462; RV32IA-NEXT: lui a3, 16 1463; RV32IA-NEXT: addi a3, a3, -1 1464; RV32IA-NEXT: sll a4, a3, a0 1465; RV32IA-NEXT: and a1, a1, a3 1466; RV32IA-NEXT: sll a1, a1, a0 1467; RV32IA-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 1468; RV32IA-NEXT: lr.w a3, (a2) 1469; RV32IA-NEXT: and a5, a3, a1 1470; RV32IA-NEXT: not a5, a5 1471; RV32IA-NEXT: xor a5, a3, a5 1472; RV32IA-NEXT: and a5, a5, a4 1473; RV32IA-NEXT: xor a5, a3, a5 1474; RV32IA-NEXT: sc.w a5, a5, (a2) 1475; RV32IA-NEXT: bnez a5, .LBB18_1 1476; RV32IA-NEXT: # %bb.2: 1477; RV32IA-NEXT: srl a0, a3, a0 1478; RV32IA-NEXT: slli a0, a0, 16 1479; RV32IA-NEXT: srai a0, a0, 16 1480; RV32IA-NEXT: ret 1481; 1482; RV64I-LABEL: atomicrmw_nand_i16_monotonic: 1483; RV64I: # %bb.0: 1484; RV64I-NEXT: addi sp, sp, -16 1485; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1486; RV64I-NEXT: li a2, 0 1487; RV64I-NEXT: call __atomic_fetch_nand_2 1488; RV64I-NEXT: slli a0, a0, 48 1489; RV64I-NEXT: srai a0, a0, 48 1490; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1491; RV64I-NEXT: addi sp, sp, 16 1492; RV64I-NEXT: ret 1493; 1494; RV64IA-LABEL: atomicrmw_nand_i16_monotonic: 1495; RV64IA: # %bb.0: 1496; RV64IA-NEXT: andi a2, a0, -4 1497; RV64IA-NEXT: slli a0, a0, 3 1498; RV64IA-NEXT: lui a3, 16 1499; RV64IA-NEXT: addi a3, a3, -1 1500; RV64IA-NEXT: sllw a4, a3, a0 1501; RV64IA-NEXT: and a1, a1, a3 1502; RV64IA-NEXT: sllw a1, a1, a0 1503; RV64IA-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 1504; RV64IA-NEXT: lr.w a3, (a2) 1505; RV64IA-NEXT: and a5, a3, a1 1506; RV64IA-NEXT: not a5, a5 1507; RV64IA-NEXT: xor a5, a3, a5 1508; RV64IA-NEXT: and a5, a5, a4 1509; RV64IA-NEXT: xor a5, a3, a5 1510; RV64IA-NEXT: sc.w a5, a5, (a2) 1511; RV64IA-NEXT: bnez a5, .LBB18_1 1512; RV64IA-NEXT: # %bb.2: 1513; RV64IA-NEXT: srlw a0, a3, a0 1514; RV64IA-NEXT: slli a0, a0, 48 1515; RV64IA-NEXT: srai a0, a0, 48 1516; RV64IA-NEXT: ret 1517 %1 = atomicrmw nand ptr %a, i16 %b monotonic 1518 ret i16 %1 1519} 1520 1521define signext i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind { 1522; RV32I-LABEL: atomicrmw_or_i16_monotonic: 1523; RV32I: # %bb.0: 1524; RV32I-NEXT: addi sp, sp, -16 1525; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1526; RV32I-NEXT: li a2, 0 1527; RV32I-NEXT: call __atomic_fetch_or_2 1528; RV32I-NEXT: slli a0, a0, 16 1529; RV32I-NEXT: srai a0, a0, 16 1530; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1531; RV32I-NEXT: addi sp, sp, 16 1532; RV32I-NEXT: ret 1533; 1534; RV32IA-LABEL: atomicrmw_or_i16_monotonic: 1535; RV32IA: # %bb.0: 1536; RV32IA-NEXT: andi a2, a0, -4 1537; RV32IA-NEXT: slli a0, a0, 3 1538; RV32IA-NEXT: slli a1, a1, 16 1539; RV32IA-NEXT: srli a1, a1, 16 1540; RV32IA-NEXT: sll a1, a1, a0 1541; RV32IA-NEXT: amoor.w a1, a1, (a2) 1542; RV32IA-NEXT: srl a0, a1, a0 1543; RV32IA-NEXT: slli a0, a0, 16 1544; RV32IA-NEXT: srai a0, a0, 16 1545; RV32IA-NEXT: ret 1546; 1547; RV64I-LABEL: atomicrmw_or_i16_monotonic: 1548; RV64I: # %bb.0: 1549; RV64I-NEXT: addi sp, sp, -16 1550; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1551; RV64I-NEXT: li a2, 0 1552; RV64I-NEXT: call __atomic_fetch_or_2 1553; RV64I-NEXT: slli a0, a0, 48 1554; RV64I-NEXT: srai a0, a0, 48 1555; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1556; RV64I-NEXT: addi sp, sp, 16 1557; RV64I-NEXT: ret 1558; 1559; RV64IA-LABEL: atomicrmw_or_i16_monotonic: 1560; RV64IA: # %bb.0: 1561; RV64IA-NEXT: andi a2, a0, -4 1562; RV64IA-NEXT: slli a0, a0, 3 1563; RV64IA-NEXT: slli a1, a1, 48 1564; RV64IA-NEXT: srli a1, a1, 48 1565; RV64IA-NEXT: sllw a1, a1, a0 1566; RV64IA-NEXT: amoor.w a1, a1, (a2) 1567; RV64IA-NEXT: srlw a0, a1, a0 1568; RV64IA-NEXT: slli a0, a0, 48 1569; RV64IA-NEXT: srai a0, a0, 48 1570; RV64IA-NEXT: ret 1571 %1 = atomicrmw or ptr %a, i16 %b monotonic 1572 ret i16 %1 1573} 1574 1575define signext i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind { 1576; RV32I-LABEL: atomicrmw_xor_i16_monotonic: 1577; RV32I: # %bb.0: 1578; RV32I-NEXT: addi sp, sp, -16 1579; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1580; RV32I-NEXT: li a2, 0 1581; RV32I-NEXT: call __atomic_fetch_xor_2 1582; RV32I-NEXT: slli a0, a0, 16 1583; RV32I-NEXT: srai a0, a0, 16 1584; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1585; RV32I-NEXT: addi sp, sp, 16 1586; RV32I-NEXT: ret 1587; 1588; RV32IA-LABEL: atomicrmw_xor_i16_monotonic: 1589; RV32IA: # %bb.0: 1590; RV32IA-NEXT: andi a2, a0, -4 1591; RV32IA-NEXT: slli a0, a0, 3 1592; RV32IA-NEXT: slli a1, a1, 16 1593; RV32IA-NEXT: srli a1, a1, 16 1594; RV32IA-NEXT: sll a1, a1, a0 1595; RV32IA-NEXT: amoxor.w a1, a1, (a2) 1596; RV32IA-NEXT: srl a0, a1, a0 1597; RV32IA-NEXT: slli a0, a0, 16 1598; RV32IA-NEXT: srai a0, a0, 16 1599; RV32IA-NEXT: ret 1600; 1601; RV64I-LABEL: atomicrmw_xor_i16_monotonic: 1602; RV64I: # %bb.0: 1603; RV64I-NEXT: addi sp, sp, -16 1604; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1605; RV64I-NEXT: li a2, 0 1606; RV64I-NEXT: call __atomic_fetch_xor_2 1607; RV64I-NEXT: slli a0, a0, 48 1608; RV64I-NEXT: srai a0, a0, 48 1609; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1610; RV64I-NEXT: addi sp, sp, 16 1611; RV64I-NEXT: ret 1612; 1613; RV64IA-LABEL: atomicrmw_xor_i16_monotonic: 1614; RV64IA: # %bb.0: 1615; RV64IA-NEXT: andi a2, a0, -4 1616; RV64IA-NEXT: slli a0, a0, 3 1617; RV64IA-NEXT: slli a1, a1, 48 1618; RV64IA-NEXT: srli a1, a1, 48 1619; RV64IA-NEXT: sllw a1, a1, a0 1620; RV64IA-NEXT: amoxor.w a1, a1, (a2) 1621; RV64IA-NEXT: srlw a0, a1, a0 1622; RV64IA-NEXT: slli a0, a0, 48 1623; RV64IA-NEXT: srai a0, a0, 48 1624; RV64IA-NEXT: ret 1625 %1 = atomicrmw xor ptr %a, i16 %b monotonic 1626 ret i16 %1 1627} 1628 1629define signext i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind { 1630; RV32I-LABEL: atomicrmw_max_i16_monotonic: 1631; RV32I: # %bb.0: 1632; RV32I-NEXT: addi sp, sp, -32 1633; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1634; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1635; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1636; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1637; RV32I-NEXT: mv s0, a0 1638; RV32I-NEXT: lhu a3, 0(a0) 1639; RV32I-NEXT: mv s1, a1 1640; RV32I-NEXT: slli a0, a1, 16 1641; RV32I-NEXT: srai s2, a0, 16 1642; RV32I-NEXT: j .LBB21_2 1643; RV32I-NEXT: .LBB21_1: # %atomicrmw.start 1644; RV32I-NEXT: # in Loop: Header=BB21_2 Depth=1 1645; RV32I-NEXT: sh a3, 14(sp) 1646; RV32I-NEXT: addi a1, sp, 14 1647; RV32I-NEXT: mv a0, s0 1648; RV32I-NEXT: li a3, 0 1649; RV32I-NEXT: li a4, 0 1650; RV32I-NEXT: call __atomic_compare_exchange_2 1651; RV32I-NEXT: lh a3, 14(sp) 1652; RV32I-NEXT: bnez a0, .LBB21_4 1653; RV32I-NEXT: .LBB21_2: # %atomicrmw.start 1654; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1655; RV32I-NEXT: slli a0, a3, 16 1656; RV32I-NEXT: srai a0, a0, 16 1657; RV32I-NEXT: mv a2, a3 1658; RV32I-NEXT: blt s2, a0, .LBB21_1 1659; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1660; RV32I-NEXT: # in Loop: Header=BB21_2 Depth=1 1661; RV32I-NEXT: mv a2, s1 1662; RV32I-NEXT: j .LBB21_1 1663; RV32I-NEXT: .LBB21_4: # %atomicrmw.end 1664; RV32I-NEXT: slli a0, a3, 16 1665; RV32I-NEXT: srai a0, a0, 16 1666; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1667; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1668; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1669; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1670; RV32I-NEXT: addi sp, sp, 32 1671; RV32I-NEXT: ret 1672; 1673; RV32IA-LABEL: atomicrmw_max_i16_monotonic: 1674; RV32IA: # %bb.0: 1675; RV32IA-NEXT: andi a2, a0, -4 1676; RV32IA-NEXT: slli a0, a0, 3 1677; RV32IA-NEXT: lui a3, 16 1678; RV32IA-NEXT: slli a1, a1, 16 1679; RV32IA-NEXT: li a4, 16 1680; RV32IA-NEXT: andi a5, a0, 24 1681; RV32IA-NEXT: addi a3, a3, -1 1682; RV32IA-NEXT: srai a1, a1, 16 1683; RV32IA-NEXT: sll a3, a3, a0 1684; RV32IA-NEXT: sll a1, a1, a0 1685; RV32IA-NEXT: sub a4, a4, a5 1686; RV32IA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 1687; RV32IA-NEXT: lr.w a5, (a2) 1688; RV32IA-NEXT: and a7, a5, a3 1689; RV32IA-NEXT: mv a6, a5 1690; RV32IA-NEXT: sll a7, a7, a4 1691; RV32IA-NEXT: sra a7, a7, a4 1692; RV32IA-NEXT: bge a7, a1, .LBB21_3 1693; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1 1694; RV32IA-NEXT: xor a6, a5, a1 1695; RV32IA-NEXT: and a6, a6, a3 1696; RV32IA-NEXT: xor a6, a5, a6 1697; RV32IA-NEXT: .LBB21_3: # in Loop: Header=BB21_1 Depth=1 1698; RV32IA-NEXT: sc.w a6, a6, (a2) 1699; RV32IA-NEXT: bnez a6, .LBB21_1 1700; RV32IA-NEXT: # %bb.4: 1701; RV32IA-NEXT: srl a0, a5, a0 1702; RV32IA-NEXT: slli a0, a0, 16 1703; RV32IA-NEXT: srai a0, a0, 16 1704; RV32IA-NEXT: ret 1705; 1706; RV64I-LABEL: atomicrmw_max_i16_monotonic: 1707; RV64I: # %bb.0: 1708; RV64I-NEXT: addi sp, sp, -48 1709; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1710; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1711; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1712; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1713; RV64I-NEXT: mv s0, a0 1714; RV64I-NEXT: lhu a3, 0(a0) 1715; RV64I-NEXT: mv s1, a1 1716; RV64I-NEXT: slli a0, a1, 48 1717; RV64I-NEXT: srai s2, a0, 48 1718; RV64I-NEXT: j .LBB21_2 1719; RV64I-NEXT: .LBB21_1: # %atomicrmw.start 1720; RV64I-NEXT: # in Loop: Header=BB21_2 Depth=1 1721; RV64I-NEXT: sh a3, 14(sp) 1722; RV64I-NEXT: addi a1, sp, 14 1723; RV64I-NEXT: mv a0, s0 1724; RV64I-NEXT: li a3, 0 1725; RV64I-NEXT: li a4, 0 1726; RV64I-NEXT: call __atomic_compare_exchange_2 1727; RV64I-NEXT: lh a3, 14(sp) 1728; RV64I-NEXT: bnez a0, .LBB21_4 1729; RV64I-NEXT: .LBB21_2: # %atomicrmw.start 1730; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1731; RV64I-NEXT: slli a0, a3, 48 1732; RV64I-NEXT: srai a0, a0, 48 1733; RV64I-NEXT: mv a2, a3 1734; RV64I-NEXT: blt s2, a0, .LBB21_1 1735; RV64I-NEXT: # %bb.3: # %atomicrmw.start 1736; RV64I-NEXT: # in Loop: Header=BB21_2 Depth=1 1737; RV64I-NEXT: mv a2, s1 1738; RV64I-NEXT: j .LBB21_1 1739; RV64I-NEXT: .LBB21_4: # %atomicrmw.end 1740; RV64I-NEXT: slli a0, a3, 48 1741; RV64I-NEXT: srai a0, a0, 48 1742; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1743; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1744; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1745; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1746; RV64I-NEXT: addi sp, sp, 48 1747; RV64I-NEXT: ret 1748; 1749; RV64IA-LABEL: atomicrmw_max_i16_monotonic: 1750; RV64IA: # %bb.0: 1751; RV64IA-NEXT: andi a2, a0, -4 1752; RV64IA-NEXT: slli a0, a0, 3 1753; RV64IA-NEXT: lui a3, 16 1754; RV64IA-NEXT: slli a1, a1, 48 1755; RV64IA-NEXT: li a4, 48 1756; RV64IA-NEXT: andi a5, a0, 24 1757; RV64IA-NEXT: addi a3, a3, -1 1758; RV64IA-NEXT: srai a1, a1, 48 1759; RV64IA-NEXT: sllw a3, a3, a0 1760; RV64IA-NEXT: sllw a1, a1, a0 1761; RV64IA-NEXT: sub a4, a4, a5 1762; RV64IA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 1763; RV64IA-NEXT: lr.w a5, (a2) 1764; RV64IA-NEXT: and a7, a5, a3 1765; RV64IA-NEXT: mv a6, a5 1766; RV64IA-NEXT: sll a7, a7, a4 1767; RV64IA-NEXT: sra a7, a7, a4 1768; RV64IA-NEXT: bge a7, a1, .LBB21_3 1769; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1 1770; RV64IA-NEXT: xor a6, a5, a1 1771; RV64IA-NEXT: and a6, a6, a3 1772; RV64IA-NEXT: xor a6, a5, a6 1773; RV64IA-NEXT: .LBB21_3: # in Loop: Header=BB21_1 Depth=1 1774; RV64IA-NEXT: sc.w a6, a6, (a2) 1775; RV64IA-NEXT: bnez a6, .LBB21_1 1776; RV64IA-NEXT: # %bb.4: 1777; RV64IA-NEXT: srlw a0, a5, a0 1778; RV64IA-NEXT: slli a0, a0, 48 1779; RV64IA-NEXT: srai a0, a0, 48 1780; RV64IA-NEXT: ret 1781 %1 = atomicrmw max ptr %a, i16 %b monotonic 1782 ret i16 %1 1783} 1784 1785define signext i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind { 1786; RV32I-LABEL: atomicrmw_min_i16_monotonic: 1787; RV32I: # %bb.0: 1788; RV32I-NEXT: addi sp, sp, -32 1789; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1790; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1791; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1792; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1793; RV32I-NEXT: mv s0, a0 1794; RV32I-NEXT: lhu a3, 0(a0) 1795; RV32I-NEXT: mv s1, a1 1796; RV32I-NEXT: slli a0, a1, 16 1797; RV32I-NEXT: srai s2, a0, 16 1798; RV32I-NEXT: j .LBB22_2 1799; RV32I-NEXT: .LBB22_1: # %atomicrmw.start 1800; RV32I-NEXT: # in Loop: Header=BB22_2 Depth=1 1801; RV32I-NEXT: sh a3, 14(sp) 1802; RV32I-NEXT: addi a1, sp, 14 1803; RV32I-NEXT: mv a0, s0 1804; RV32I-NEXT: li a3, 0 1805; RV32I-NEXT: li a4, 0 1806; RV32I-NEXT: call __atomic_compare_exchange_2 1807; RV32I-NEXT: lh a3, 14(sp) 1808; RV32I-NEXT: bnez a0, .LBB22_4 1809; RV32I-NEXT: .LBB22_2: # %atomicrmw.start 1810; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1811; RV32I-NEXT: slli a0, a3, 16 1812; RV32I-NEXT: srai a0, a0, 16 1813; RV32I-NEXT: mv a2, a3 1814; RV32I-NEXT: bge s2, a0, .LBB22_1 1815; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1816; RV32I-NEXT: # in Loop: Header=BB22_2 Depth=1 1817; RV32I-NEXT: mv a2, s1 1818; RV32I-NEXT: j .LBB22_1 1819; RV32I-NEXT: .LBB22_4: # %atomicrmw.end 1820; RV32I-NEXT: slli a0, a3, 16 1821; RV32I-NEXT: srai a0, a0, 16 1822; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1823; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1824; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1825; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1826; RV32I-NEXT: addi sp, sp, 32 1827; RV32I-NEXT: ret 1828; 1829; RV32IA-LABEL: atomicrmw_min_i16_monotonic: 1830; RV32IA: # %bb.0: 1831; RV32IA-NEXT: andi a2, a0, -4 1832; RV32IA-NEXT: slli a0, a0, 3 1833; RV32IA-NEXT: lui a3, 16 1834; RV32IA-NEXT: slli a1, a1, 16 1835; RV32IA-NEXT: li a4, 16 1836; RV32IA-NEXT: andi a5, a0, 24 1837; RV32IA-NEXT: addi a3, a3, -1 1838; RV32IA-NEXT: srai a1, a1, 16 1839; RV32IA-NEXT: sll a3, a3, a0 1840; RV32IA-NEXT: sll a1, a1, a0 1841; RV32IA-NEXT: sub a4, a4, a5 1842; RV32IA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 1843; RV32IA-NEXT: lr.w a5, (a2) 1844; RV32IA-NEXT: and a7, a5, a3 1845; RV32IA-NEXT: mv a6, a5 1846; RV32IA-NEXT: sll a7, a7, a4 1847; RV32IA-NEXT: sra a7, a7, a4 1848; RV32IA-NEXT: bge a1, a7, .LBB22_3 1849; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1 1850; RV32IA-NEXT: xor a6, a5, a1 1851; RV32IA-NEXT: and a6, a6, a3 1852; RV32IA-NEXT: xor a6, a5, a6 1853; RV32IA-NEXT: .LBB22_3: # in Loop: Header=BB22_1 Depth=1 1854; RV32IA-NEXT: sc.w a6, a6, (a2) 1855; RV32IA-NEXT: bnez a6, .LBB22_1 1856; RV32IA-NEXT: # %bb.4: 1857; RV32IA-NEXT: srl a0, a5, a0 1858; RV32IA-NEXT: slli a0, a0, 16 1859; RV32IA-NEXT: srai a0, a0, 16 1860; RV32IA-NEXT: ret 1861; 1862; RV64I-LABEL: atomicrmw_min_i16_monotonic: 1863; RV64I: # %bb.0: 1864; RV64I-NEXT: addi sp, sp, -48 1865; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1866; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1867; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1868; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1869; RV64I-NEXT: mv s0, a0 1870; RV64I-NEXT: lhu a3, 0(a0) 1871; RV64I-NEXT: mv s1, a1 1872; RV64I-NEXT: slli a0, a1, 48 1873; RV64I-NEXT: srai s2, a0, 48 1874; RV64I-NEXT: j .LBB22_2 1875; RV64I-NEXT: .LBB22_1: # %atomicrmw.start 1876; RV64I-NEXT: # in Loop: Header=BB22_2 Depth=1 1877; RV64I-NEXT: sh a3, 14(sp) 1878; RV64I-NEXT: addi a1, sp, 14 1879; RV64I-NEXT: mv a0, s0 1880; RV64I-NEXT: li a3, 0 1881; RV64I-NEXT: li a4, 0 1882; RV64I-NEXT: call __atomic_compare_exchange_2 1883; RV64I-NEXT: lh a3, 14(sp) 1884; RV64I-NEXT: bnez a0, .LBB22_4 1885; RV64I-NEXT: .LBB22_2: # %atomicrmw.start 1886; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1887; RV64I-NEXT: slli a0, a3, 48 1888; RV64I-NEXT: srai a0, a0, 48 1889; RV64I-NEXT: mv a2, a3 1890; RV64I-NEXT: bge s2, a0, .LBB22_1 1891; RV64I-NEXT: # %bb.3: # %atomicrmw.start 1892; RV64I-NEXT: # in Loop: Header=BB22_2 Depth=1 1893; RV64I-NEXT: mv a2, s1 1894; RV64I-NEXT: j .LBB22_1 1895; RV64I-NEXT: .LBB22_4: # %atomicrmw.end 1896; RV64I-NEXT: slli a0, a3, 48 1897; RV64I-NEXT: srai a0, a0, 48 1898; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1899; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1900; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1901; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1902; RV64I-NEXT: addi sp, sp, 48 1903; RV64I-NEXT: ret 1904; 1905; RV64IA-LABEL: atomicrmw_min_i16_monotonic: 1906; RV64IA: # %bb.0: 1907; RV64IA-NEXT: andi a2, a0, -4 1908; RV64IA-NEXT: slli a0, a0, 3 1909; RV64IA-NEXT: lui a3, 16 1910; RV64IA-NEXT: slli a1, a1, 48 1911; RV64IA-NEXT: li a4, 48 1912; RV64IA-NEXT: andi a5, a0, 24 1913; RV64IA-NEXT: addi a3, a3, -1 1914; RV64IA-NEXT: srai a1, a1, 48 1915; RV64IA-NEXT: sllw a3, a3, a0 1916; RV64IA-NEXT: sllw a1, a1, a0 1917; RV64IA-NEXT: sub a4, a4, a5 1918; RV64IA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 1919; RV64IA-NEXT: lr.w a5, (a2) 1920; RV64IA-NEXT: and a7, a5, a3 1921; RV64IA-NEXT: mv a6, a5 1922; RV64IA-NEXT: sll a7, a7, a4 1923; RV64IA-NEXT: sra a7, a7, a4 1924; RV64IA-NEXT: bge a1, a7, .LBB22_3 1925; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1 1926; RV64IA-NEXT: xor a6, a5, a1 1927; RV64IA-NEXT: and a6, a6, a3 1928; RV64IA-NEXT: xor a6, a5, a6 1929; RV64IA-NEXT: .LBB22_3: # in Loop: Header=BB22_1 Depth=1 1930; RV64IA-NEXT: sc.w a6, a6, (a2) 1931; RV64IA-NEXT: bnez a6, .LBB22_1 1932; RV64IA-NEXT: # %bb.4: 1933; RV64IA-NEXT: srlw a0, a5, a0 1934; RV64IA-NEXT: slli a0, a0, 48 1935; RV64IA-NEXT: srai a0, a0, 48 1936; RV64IA-NEXT: ret 1937 %1 = atomicrmw min ptr %a, i16 %b monotonic 1938 ret i16 %1 1939} 1940 1941define signext i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind { 1942; RV32I-LABEL: atomicrmw_umax_i16_monotonic: 1943; RV32I: # %bb.0: 1944; RV32I-NEXT: addi sp, sp, -32 1945; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1946; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1947; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1948; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1949; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1950; RV32I-NEXT: mv s0, a1 1951; RV32I-NEXT: mv s1, a0 1952; RV32I-NEXT: lhu a1, 0(a0) 1953; RV32I-NEXT: lui s2, 16 1954; RV32I-NEXT: addi s2, s2, -1 1955; RV32I-NEXT: and s3, s0, s2 1956; RV32I-NEXT: j .LBB23_2 1957; RV32I-NEXT: .LBB23_1: # %atomicrmw.start 1958; RV32I-NEXT: # in Loop: Header=BB23_2 Depth=1 1959; RV32I-NEXT: sh a1, 10(sp) 1960; RV32I-NEXT: addi a1, sp, 10 1961; RV32I-NEXT: mv a0, s1 1962; RV32I-NEXT: li a3, 0 1963; RV32I-NEXT: li a4, 0 1964; RV32I-NEXT: call __atomic_compare_exchange_2 1965; RV32I-NEXT: lh a1, 10(sp) 1966; RV32I-NEXT: bnez a0, .LBB23_4 1967; RV32I-NEXT: .LBB23_2: # %atomicrmw.start 1968; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1969; RV32I-NEXT: and a0, a1, s2 1970; RV32I-NEXT: mv a2, a1 1971; RV32I-NEXT: bltu s3, a0, .LBB23_1 1972; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1973; RV32I-NEXT: # in Loop: Header=BB23_2 Depth=1 1974; RV32I-NEXT: mv a2, s0 1975; RV32I-NEXT: j .LBB23_1 1976; RV32I-NEXT: .LBB23_4: # %atomicrmw.end 1977; RV32I-NEXT: slli a0, a1, 16 1978; RV32I-NEXT: srai a0, a0, 16 1979; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1980; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1981; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1982; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1983; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 1984; RV32I-NEXT: addi sp, sp, 32 1985; RV32I-NEXT: ret 1986; 1987; RV32IA-LABEL: atomicrmw_umax_i16_monotonic: 1988; RV32IA: # %bb.0: 1989; RV32IA-NEXT: andi a2, a0, -4 1990; RV32IA-NEXT: slli a0, a0, 3 1991; RV32IA-NEXT: lui a3, 16 1992; RV32IA-NEXT: addi a3, a3, -1 1993; RV32IA-NEXT: sll a4, a3, a0 1994; RV32IA-NEXT: and a1, a1, a3 1995; RV32IA-NEXT: sll a1, a1, a0 1996; RV32IA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 1997; RV32IA-NEXT: lr.w a3, (a2) 1998; RV32IA-NEXT: and a6, a3, a4 1999; RV32IA-NEXT: mv a5, a3 2000; RV32IA-NEXT: bgeu a6, a1, .LBB23_3 2001; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1 2002; RV32IA-NEXT: xor a5, a3, a1 2003; RV32IA-NEXT: and a5, a5, a4 2004; RV32IA-NEXT: xor a5, a3, a5 2005; RV32IA-NEXT: .LBB23_3: # in Loop: Header=BB23_1 Depth=1 2006; RV32IA-NEXT: sc.w a5, a5, (a2) 2007; RV32IA-NEXT: bnez a5, .LBB23_1 2008; RV32IA-NEXT: # %bb.4: 2009; RV32IA-NEXT: srl a0, a3, a0 2010; RV32IA-NEXT: slli a0, a0, 16 2011; RV32IA-NEXT: srai a0, a0, 16 2012; RV32IA-NEXT: ret 2013; 2014; RV64I-LABEL: atomicrmw_umax_i16_monotonic: 2015; RV64I: # %bb.0: 2016; RV64I-NEXT: addi sp, sp, -48 2017; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2018; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2019; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2020; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2021; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 2022; RV64I-NEXT: mv s0, a1 2023; RV64I-NEXT: mv s1, a0 2024; RV64I-NEXT: lhu a1, 0(a0) 2025; RV64I-NEXT: lui s2, 16 2026; RV64I-NEXT: addiw s2, s2, -1 2027; RV64I-NEXT: and s3, s0, s2 2028; RV64I-NEXT: j .LBB23_2 2029; RV64I-NEXT: .LBB23_1: # %atomicrmw.start 2030; RV64I-NEXT: # in Loop: Header=BB23_2 Depth=1 2031; RV64I-NEXT: sh a1, 6(sp) 2032; RV64I-NEXT: addi a1, sp, 6 2033; RV64I-NEXT: mv a0, s1 2034; RV64I-NEXT: li a3, 0 2035; RV64I-NEXT: li a4, 0 2036; RV64I-NEXT: call __atomic_compare_exchange_2 2037; RV64I-NEXT: lh a1, 6(sp) 2038; RV64I-NEXT: bnez a0, .LBB23_4 2039; RV64I-NEXT: .LBB23_2: # %atomicrmw.start 2040; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2041; RV64I-NEXT: and a0, a1, s2 2042; RV64I-NEXT: mv a2, a1 2043; RV64I-NEXT: bltu s3, a0, .LBB23_1 2044; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2045; RV64I-NEXT: # in Loop: Header=BB23_2 Depth=1 2046; RV64I-NEXT: mv a2, s0 2047; RV64I-NEXT: j .LBB23_1 2048; RV64I-NEXT: .LBB23_4: # %atomicrmw.end 2049; RV64I-NEXT: slli a0, a1, 48 2050; RV64I-NEXT: srai a0, a0, 48 2051; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2052; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2053; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2054; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2055; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 2056; RV64I-NEXT: addi sp, sp, 48 2057; RV64I-NEXT: ret 2058; 2059; RV64IA-LABEL: atomicrmw_umax_i16_monotonic: 2060; RV64IA: # %bb.0: 2061; RV64IA-NEXT: andi a2, a0, -4 2062; RV64IA-NEXT: slli a0, a0, 3 2063; RV64IA-NEXT: lui a3, 16 2064; RV64IA-NEXT: addi a3, a3, -1 2065; RV64IA-NEXT: sllw a4, a3, a0 2066; RV64IA-NEXT: and a1, a1, a3 2067; RV64IA-NEXT: sllw a1, a1, a0 2068; RV64IA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2069; RV64IA-NEXT: lr.w a3, (a2) 2070; RV64IA-NEXT: and a6, a3, a4 2071; RV64IA-NEXT: mv a5, a3 2072; RV64IA-NEXT: bgeu a6, a1, .LBB23_3 2073; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1 2074; RV64IA-NEXT: xor a5, a3, a1 2075; RV64IA-NEXT: and a5, a5, a4 2076; RV64IA-NEXT: xor a5, a3, a5 2077; RV64IA-NEXT: .LBB23_3: # in Loop: Header=BB23_1 Depth=1 2078; RV64IA-NEXT: sc.w a5, a5, (a2) 2079; RV64IA-NEXT: bnez a5, .LBB23_1 2080; RV64IA-NEXT: # %bb.4: 2081; RV64IA-NEXT: srlw a0, a3, a0 2082; RV64IA-NEXT: slli a0, a0, 48 2083; RV64IA-NEXT: srai a0, a0, 48 2084; RV64IA-NEXT: ret 2085 %1 = atomicrmw umax ptr %a, i16 %b monotonic 2086 ret i16 %1 2087} 2088 2089define signext i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind { 2090; RV32I-LABEL: atomicrmw_umin_i16_monotonic: 2091; RV32I: # %bb.0: 2092; RV32I-NEXT: addi sp, sp, -32 2093; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2094; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2095; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2096; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2097; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 2098; RV32I-NEXT: mv s0, a1 2099; RV32I-NEXT: mv s1, a0 2100; RV32I-NEXT: lhu a1, 0(a0) 2101; RV32I-NEXT: lui s2, 16 2102; RV32I-NEXT: addi s2, s2, -1 2103; RV32I-NEXT: and s3, s0, s2 2104; RV32I-NEXT: j .LBB24_2 2105; RV32I-NEXT: .LBB24_1: # %atomicrmw.start 2106; RV32I-NEXT: # in Loop: Header=BB24_2 Depth=1 2107; RV32I-NEXT: sh a1, 10(sp) 2108; RV32I-NEXT: addi a1, sp, 10 2109; RV32I-NEXT: mv a0, s1 2110; RV32I-NEXT: li a3, 0 2111; RV32I-NEXT: li a4, 0 2112; RV32I-NEXT: call __atomic_compare_exchange_2 2113; RV32I-NEXT: lh a1, 10(sp) 2114; RV32I-NEXT: bnez a0, .LBB24_4 2115; RV32I-NEXT: .LBB24_2: # %atomicrmw.start 2116; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2117; RV32I-NEXT: and a0, a1, s2 2118; RV32I-NEXT: mv a2, a1 2119; RV32I-NEXT: bgeu s3, a0, .LBB24_1 2120; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2121; RV32I-NEXT: # in Loop: Header=BB24_2 Depth=1 2122; RV32I-NEXT: mv a2, s0 2123; RV32I-NEXT: j .LBB24_1 2124; RV32I-NEXT: .LBB24_4: # %atomicrmw.end 2125; RV32I-NEXT: slli a0, a1, 16 2126; RV32I-NEXT: srai a0, a0, 16 2127; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2128; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2129; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2130; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2131; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 2132; RV32I-NEXT: addi sp, sp, 32 2133; RV32I-NEXT: ret 2134; 2135; RV32IA-LABEL: atomicrmw_umin_i16_monotonic: 2136; RV32IA: # %bb.0: 2137; RV32IA-NEXT: andi a2, a0, -4 2138; RV32IA-NEXT: slli a0, a0, 3 2139; RV32IA-NEXT: lui a3, 16 2140; RV32IA-NEXT: addi a3, a3, -1 2141; RV32IA-NEXT: sll a4, a3, a0 2142; RV32IA-NEXT: and a1, a1, a3 2143; RV32IA-NEXT: sll a1, a1, a0 2144; RV32IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2145; RV32IA-NEXT: lr.w a3, (a2) 2146; RV32IA-NEXT: and a6, a3, a4 2147; RV32IA-NEXT: mv a5, a3 2148; RV32IA-NEXT: bgeu a1, a6, .LBB24_3 2149; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB24_1 Depth=1 2150; RV32IA-NEXT: xor a5, a3, a1 2151; RV32IA-NEXT: and a5, a5, a4 2152; RV32IA-NEXT: xor a5, a3, a5 2153; RV32IA-NEXT: .LBB24_3: # in Loop: Header=BB24_1 Depth=1 2154; RV32IA-NEXT: sc.w a5, a5, (a2) 2155; RV32IA-NEXT: bnez a5, .LBB24_1 2156; RV32IA-NEXT: # %bb.4: 2157; RV32IA-NEXT: srl a0, a3, a0 2158; RV32IA-NEXT: slli a0, a0, 16 2159; RV32IA-NEXT: srai a0, a0, 16 2160; RV32IA-NEXT: ret 2161; 2162; RV64I-LABEL: atomicrmw_umin_i16_monotonic: 2163; RV64I: # %bb.0: 2164; RV64I-NEXT: addi sp, sp, -48 2165; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2166; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2167; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2168; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2169; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 2170; RV64I-NEXT: mv s0, a1 2171; RV64I-NEXT: mv s1, a0 2172; RV64I-NEXT: lhu a1, 0(a0) 2173; RV64I-NEXT: lui s2, 16 2174; RV64I-NEXT: addiw s2, s2, -1 2175; RV64I-NEXT: and s3, s0, s2 2176; RV64I-NEXT: j .LBB24_2 2177; RV64I-NEXT: .LBB24_1: # %atomicrmw.start 2178; RV64I-NEXT: # in Loop: Header=BB24_2 Depth=1 2179; RV64I-NEXT: sh a1, 6(sp) 2180; RV64I-NEXT: addi a1, sp, 6 2181; RV64I-NEXT: mv a0, s1 2182; RV64I-NEXT: li a3, 0 2183; RV64I-NEXT: li a4, 0 2184; RV64I-NEXT: call __atomic_compare_exchange_2 2185; RV64I-NEXT: lh a1, 6(sp) 2186; RV64I-NEXT: bnez a0, .LBB24_4 2187; RV64I-NEXT: .LBB24_2: # %atomicrmw.start 2188; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2189; RV64I-NEXT: and a0, a1, s2 2190; RV64I-NEXT: mv a2, a1 2191; RV64I-NEXT: bgeu s3, a0, .LBB24_1 2192; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2193; RV64I-NEXT: # in Loop: Header=BB24_2 Depth=1 2194; RV64I-NEXT: mv a2, s0 2195; RV64I-NEXT: j .LBB24_1 2196; RV64I-NEXT: .LBB24_4: # %atomicrmw.end 2197; RV64I-NEXT: slli a0, a1, 48 2198; RV64I-NEXT: srai a0, a0, 48 2199; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2200; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2201; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2202; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2203; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 2204; RV64I-NEXT: addi sp, sp, 48 2205; RV64I-NEXT: ret 2206; 2207; RV64IA-LABEL: atomicrmw_umin_i16_monotonic: 2208; RV64IA: # %bb.0: 2209; RV64IA-NEXT: andi a2, a0, -4 2210; RV64IA-NEXT: slli a0, a0, 3 2211; RV64IA-NEXT: lui a3, 16 2212; RV64IA-NEXT: addi a3, a3, -1 2213; RV64IA-NEXT: sllw a4, a3, a0 2214; RV64IA-NEXT: and a1, a1, a3 2215; RV64IA-NEXT: sllw a1, a1, a0 2216; RV64IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2217; RV64IA-NEXT: lr.w a3, (a2) 2218; RV64IA-NEXT: and a6, a3, a4 2219; RV64IA-NEXT: mv a5, a3 2220; RV64IA-NEXT: bgeu a1, a6, .LBB24_3 2221; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB24_1 Depth=1 2222; RV64IA-NEXT: xor a5, a3, a1 2223; RV64IA-NEXT: and a5, a5, a4 2224; RV64IA-NEXT: xor a5, a3, a5 2225; RV64IA-NEXT: .LBB24_3: # in Loop: Header=BB24_1 Depth=1 2226; RV64IA-NEXT: sc.w a5, a5, (a2) 2227; RV64IA-NEXT: bnez a5, .LBB24_1 2228; RV64IA-NEXT: # %bb.4: 2229; RV64IA-NEXT: srlw a0, a3, a0 2230; RV64IA-NEXT: slli a0, a0, 48 2231; RV64IA-NEXT: srai a0, a0, 48 2232; RV64IA-NEXT: ret 2233 %1 = atomicrmw umin ptr %a, i16 %b monotonic 2234 ret i16 %1 2235} 2236 2237define signext i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind { 2238; RV32I-LABEL: atomicrmw_xchg_i32_monotonic: 2239; RV32I: # %bb.0: 2240; RV32I-NEXT: addi sp, sp, -16 2241; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2242; RV32I-NEXT: li a2, 0 2243; RV32I-NEXT: call __atomic_exchange_4 2244; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2245; RV32I-NEXT: addi sp, sp, 16 2246; RV32I-NEXT: ret 2247; 2248; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic: 2249; RV32IA: # %bb.0: 2250; RV32IA-NEXT: amoswap.w a0, a1, (a0) 2251; RV32IA-NEXT: ret 2252; 2253; RV64I-LABEL: atomicrmw_xchg_i32_monotonic: 2254; RV64I: # %bb.0: 2255; RV64I-NEXT: addi sp, sp, -16 2256; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2257; RV64I-NEXT: li a2, 0 2258; RV64I-NEXT: call __atomic_exchange_4 2259; RV64I-NEXT: sext.w a0, a0 2260; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2261; RV64I-NEXT: addi sp, sp, 16 2262; RV64I-NEXT: ret 2263; 2264; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic: 2265; RV64IA: # %bb.0: 2266; RV64IA-NEXT: amoswap.w a0, a1, (a0) 2267; RV64IA-NEXT: ret 2268 %1 = atomicrmw xchg ptr %a, i32 %b monotonic 2269 ret i32 %1 2270} 2271 2272define signext i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind { 2273; RV32I-LABEL: atomicrmw_add_i32_monotonic: 2274; RV32I: # %bb.0: 2275; RV32I-NEXT: addi sp, sp, -16 2276; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2277; RV32I-NEXT: li a2, 0 2278; RV32I-NEXT: call __atomic_fetch_add_4 2279; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2280; RV32I-NEXT: addi sp, sp, 16 2281; RV32I-NEXT: ret 2282; 2283; RV32IA-LABEL: atomicrmw_add_i32_monotonic: 2284; RV32IA: # %bb.0: 2285; RV32IA-NEXT: amoadd.w a0, a1, (a0) 2286; RV32IA-NEXT: ret 2287; 2288; RV64I-LABEL: atomicrmw_add_i32_monotonic: 2289; RV64I: # %bb.0: 2290; RV64I-NEXT: addi sp, sp, -16 2291; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2292; RV64I-NEXT: li a2, 0 2293; RV64I-NEXT: call __atomic_fetch_add_4 2294; RV64I-NEXT: sext.w a0, a0 2295; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2296; RV64I-NEXT: addi sp, sp, 16 2297; RV64I-NEXT: ret 2298; 2299; RV64IA-LABEL: atomicrmw_add_i32_monotonic: 2300; RV64IA: # %bb.0: 2301; RV64IA-NEXT: amoadd.w a0, a1, (a0) 2302; RV64IA-NEXT: ret 2303 %1 = atomicrmw add ptr %a, i32 %b monotonic 2304 ret i32 %1 2305} 2306 2307define signext i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind { 2308; RV32I-LABEL: atomicrmw_sub_i32_monotonic: 2309; RV32I: # %bb.0: 2310; RV32I-NEXT: addi sp, sp, -16 2311; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2312; RV32I-NEXT: li a2, 0 2313; RV32I-NEXT: call __atomic_fetch_sub_4 2314; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2315; RV32I-NEXT: addi sp, sp, 16 2316; RV32I-NEXT: ret 2317; 2318; RV32IA-LABEL: atomicrmw_sub_i32_monotonic: 2319; RV32IA: # %bb.0: 2320; RV32IA-NEXT: neg a1, a1 2321; RV32IA-NEXT: amoadd.w a0, a1, (a0) 2322; RV32IA-NEXT: ret 2323; 2324; RV64I-LABEL: atomicrmw_sub_i32_monotonic: 2325; RV64I: # %bb.0: 2326; RV64I-NEXT: addi sp, sp, -16 2327; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2328; RV64I-NEXT: li a2, 0 2329; RV64I-NEXT: call __atomic_fetch_sub_4 2330; RV64I-NEXT: sext.w a0, a0 2331; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2332; RV64I-NEXT: addi sp, sp, 16 2333; RV64I-NEXT: ret 2334; 2335; RV64IA-LABEL: atomicrmw_sub_i32_monotonic: 2336; RV64IA: # %bb.0: 2337; RV64IA-NEXT: neg a1, a1 2338; RV64IA-NEXT: amoadd.w a0, a1, (a0) 2339; RV64IA-NEXT: ret 2340 %1 = atomicrmw sub ptr %a, i32 %b monotonic 2341 ret i32 %1 2342} 2343 2344define signext i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind { 2345; RV32I-LABEL: atomicrmw_and_i32_monotonic: 2346; RV32I: # %bb.0: 2347; RV32I-NEXT: addi sp, sp, -16 2348; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2349; RV32I-NEXT: li a2, 0 2350; RV32I-NEXT: call __atomic_fetch_and_4 2351; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2352; RV32I-NEXT: addi sp, sp, 16 2353; RV32I-NEXT: ret 2354; 2355; RV32IA-LABEL: atomicrmw_and_i32_monotonic: 2356; RV32IA: # %bb.0: 2357; RV32IA-NEXT: amoand.w a0, a1, (a0) 2358; RV32IA-NEXT: ret 2359; 2360; RV64I-LABEL: atomicrmw_and_i32_monotonic: 2361; RV64I: # %bb.0: 2362; RV64I-NEXT: addi sp, sp, -16 2363; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2364; RV64I-NEXT: li a2, 0 2365; RV64I-NEXT: call __atomic_fetch_and_4 2366; RV64I-NEXT: sext.w a0, a0 2367; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2368; RV64I-NEXT: addi sp, sp, 16 2369; RV64I-NEXT: ret 2370; 2371; RV64IA-LABEL: atomicrmw_and_i32_monotonic: 2372; RV64IA: # %bb.0: 2373; RV64IA-NEXT: amoand.w a0, a1, (a0) 2374; RV64IA-NEXT: ret 2375 %1 = atomicrmw and ptr %a, i32 %b monotonic 2376 ret i32 %1 2377} 2378 2379define signext i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind { 2380; RV32I-LABEL: atomicrmw_nand_i32_monotonic: 2381; RV32I: # %bb.0: 2382; RV32I-NEXT: addi sp, sp, -16 2383; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2384; RV32I-NEXT: li a2, 0 2385; RV32I-NEXT: call __atomic_fetch_nand_4 2386; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2387; RV32I-NEXT: addi sp, sp, 16 2388; RV32I-NEXT: ret 2389; 2390; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic: 2391; RV32IA-NOZACAS: # %bb.0: 2392; RV32IA-NOZACAS-NEXT: .LBB29_1: # =>This Inner Loop Header: Depth=1 2393; RV32IA-NOZACAS-NEXT: lr.w a2, (a0) 2394; RV32IA-NOZACAS-NEXT: and a3, a2, a1 2395; RV32IA-NOZACAS-NEXT: not a3, a3 2396; RV32IA-NOZACAS-NEXT: sc.w a3, a3, (a0) 2397; RV32IA-NOZACAS-NEXT: bnez a3, .LBB29_1 2398; RV32IA-NOZACAS-NEXT: # %bb.2: 2399; RV32IA-NOZACAS-NEXT: mv a0, a2 2400; RV32IA-NOZACAS-NEXT: ret 2401; 2402; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic: 2403; RV32IA-ZACAS: # %bb.0: 2404; RV32IA-ZACAS-NEXT: mv a2, a0 2405; RV32IA-ZACAS-NEXT: lw a0, 0(a0) 2406; RV32IA-ZACAS-NEXT: .LBB29_1: # %atomicrmw.start 2407; RV32IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 2408; RV32IA-ZACAS-NEXT: mv a3, a0 2409; RV32IA-ZACAS-NEXT: and a4, a0, a1 2410; RV32IA-ZACAS-NEXT: not a4, a4 2411; RV32IA-ZACAS-NEXT: amocas.w a0, a4, (a2) 2412; RV32IA-ZACAS-NEXT: bne a0, a3, .LBB29_1 2413; RV32IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 2414; RV32IA-ZACAS-NEXT: ret 2415; 2416; RV64I-LABEL: atomicrmw_nand_i32_monotonic: 2417; RV64I: # %bb.0: 2418; RV64I-NEXT: addi sp, sp, -16 2419; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2420; RV64I-NEXT: li a2, 0 2421; RV64I-NEXT: call __atomic_fetch_nand_4 2422; RV64I-NEXT: sext.w a0, a0 2423; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2424; RV64I-NEXT: addi sp, sp, 16 2425; RV64I-NEXT: ret 2426; 2427; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic: 2428; RV64IA-NOZACAS: # %bb.0: 2429; RV64IA-NOZACAS-NEXT: .LBB29_1: # =>This Inner Loop Header: Depth=1 2430; RV64IA-NOZACAS-NEXT: lr.w a2, (a0) 2431; RV64IA-NOZACAS-NEXT: and a3, a2, a1 2432; RV64IA-NOZACAS-NEXT: not a3, a3 2433; RV64IA-NOZACAS-NEXT: sc.w a3, a3, (a0) 2434; RV64IA-NOZACAS-NEXT: bnez a3, .LBB29_1 2435; RV64IA-NOZACAS-NEXT: # %bb.2: 2436; RV64IA-NOZACAS-NEXT: mv a0, a2 2437; RV64IA-NOZACAS-NEXT: ret 2438; 2439; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic: 2440; RV64IA-ZACAS: # %bb.0: 2441; RV64IA-ZACAS-NEXT: mv a2, a0 2442; RV64IA-ZACAS-NEXT: lw a0, 0(a0) 2443; RV64IA-ZACAS-NEXT: .LBB29_1: # %atomicrmw.start 2444; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 2445; RV64IA-ZACAS-NEXT: mv a3, a0 2446; RV64IA-ZACAS-NEXT: and a4, a0, a1 2447; RV64IA-ZACAS-NEXT: not a4, a4 2448; RV64IA-ZACAS-NEXT: amocas.w a0, a4, (a2) 2449; RV64IA-ZACAS-NEXT: bne a0, a3, .LBB29_1 2450; RV64IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 2451; RV64IA-ZACAS-NEXT: ret 2452 %1 = atomicrmw nand ptr %a, i32 %b monotonic 2453 ret i32 %1 2454} 2455 2456define signext i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind { 2457; RV32I-LABEL: atomicrmw_or_i32_monotonic: 2458; RV32I: # %bb.0: 2459; RV32I-NEXT: addi sp, sp, -16 2460; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2461; RV32I-NEXT: li a2, 0 2462; RV32I-NEXT: call __atomic_fetch_or_4 2463; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2464; RV32I-NEXT: addi sp, sp, 16 2465; RV32I-NEXT: ret 2466; 2467; RV32IA-LABEL: atomicrmw_or_i32_monotonic: 2468; RV32IA: # %bb.0: 2469; RV32IA-NEXT: amoor.w a0, a1, (a0) 2470; RV32IA-NEXT: ret 2471; 2472; RV64I-LABEL: atomicrmw_or_i32_monotonic: 2473; RV64I: # %bb.0: 2474; RV64I-NEXT: addi sp, sp, -16 2475; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2476; RV64I-NEXT: li a2, 0 2477; RV64I-NEXT: call __atomic_fetch_or_4 2478; RV64I-NEXT: sext.w a0, a0 2479; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2480; RV64I-NEXT: addi sp, sp, 16 2481; RV64I-NEXT: ret 2482; 2483; RV64IA-LABEL: atomicrmw_or_i32_monotonic: 2484; RV64IA: # %bb.0: 2485; RV64IA-NEXT: amoor.w a0, a1, (a0) 2486; RV64IA-NEXT: ret 2487 %1 = atomicrmw or ptr %a, i32 %b monotonic 2488 ret i32 %1 2489} 2490 2491define signext i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind { 2492; RV32I-LABEL: atomicrmw_xor_i32_monotonic: 2493; RV32I: # %bb.0: 2494; RV32I-NEXT: addi sp, sp, -16 2495; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2496; RV32I-NEXT: li a2, 0 2497; RV32I-NEXT: call __atomic_fetch_xor_4 2498; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2499; RV32I-NEXT: addi sp, sp, 16 2500; RV32I-NEXT: ret 2501; 2502; RV32IA-LABEL: atomicrmw_xor_i32_monotonic: 2503; RV32IA: # %bb.0: 2504; RV32IA-NEXT: amoxor.w a0, a1, (a0) 2505; RV32IA-NEXT: ret 2506; 2507; RV64I-LABEL: atomicrmw_xor_i32_monotonic: 2508; RV64I: # %bb.0: 2509; RV64I-NEXT: addi sp, sp, -16 2510; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2511; RV64I-NEXT: li a2, 0 2512; RV64I-NEXT: call __atomic_fetch_xor_4 2513; RV64I-NEXT: sext.w a0, a0 2514; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2515; RV64I-NEXT: addi sp, sp, 16 2516; RV64I-NEXT: ret 2517; 2518; RV64IA-LABEL: atomicrmw_xor_i32_monotonic: 2519; RV64IA: # %bb.0: 2520; RV64IA-NEXT: amoxor.w a0, a1, (a0) 2521; RV64IA-NEXT: ret 2522 %1 = atomicrmw xor ptr %a, i32 %b monotonic 2523 ret i32 %1 2524} 2525 2526define signext i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind { 2527; RV32I-LABEL: atomicrmw_max_i32_monotonic: 2528; RV32I: # %bb.0: 2529; RV32I-NEXT: addi sp, sp, -16 2530; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2531; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2532; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2533; RV32I-NEXT: mv s0, a0 2534; RV32I-NEXT: lw a3, 0(a0) 2535; RV32I-NEXT: mv s1, a1 2536; RV32I-NEXT: j .LBB32_2 2537; RV32I-NEXT: .LBB32_1: # %atomicrmw.start 2538; RV32I-NEXT: # in Loop: Header=BB32_2 Depth=1 2539; RV32I-NEXT: sw a3, 0(sp) 2540; RV32I-NEXT: mv a1, sp 2541; RV32I-NEXT: mv a0, s0 2542; RV32I-NEXT: li a3, 0 2543; RV32I-NEXT: li a4, 0 2544; RV32I-NEXT: call __atomic_compare_exchange_4 2545; RV32I-NEXT: lw a3, 0(sp) 2546; RV32I-NEXT: bnez a0, .LBB32_4 2547; RV32I-NEXT: .LBB32_2: # %atomicrmw.start 2548; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2549; RV32I-NEXT: mv a2, a3 2550; RV32I-NEXT: blt s1, a3, .LBB32_1 2551; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2552; RV32I-NEXT: # in Loop: Header=BB32_2 Depth=1 2553; RV32I-NEXT: mv a2, s1 2554; RV32I-NEXT: j .LBB32_1 2555; RV32I-NEXT: .LBB32_4: # %atomicrmw.end 2556; RV32I-NEXT: mv a0, a3 2557; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2558; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2559; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2560; RV32I-NEXT: addi sp, sp, 16 2561; RV32I-NEXT: ret 2562; 2563; RV32IA-LABEL: atomicrmw_max_i32_monotonic: 2564; RV32IA: # %bb.0: 2565; RV32IA-NEXT: amomax.w a0, a1, (a0) 2566; RV32IA-NEXT: ret 2567; 2568; RV64I-LABEL: atomicrmw_max_i32_monotonic: 2569; RV64I: # %bb.0: 2570; RV64I-NEXT: addi sp, sp, -48 2571; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2572; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2573; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2574; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2575; RV64I-NEXT: mv s0, a0 2576; RV64I-NEXT: lw a3, 0(a0) 2577; RV64I-NEXT: mv s1, a1 2578; RV64I-NEXT: sext.w s2, a1 2579; RV64I-NEXT: j .LBB32_2 2580; RV64I-NEXT: .LBB32_1: # %atomicrmw.start 2581; RV64I-NEXT: # in Loop: Header=BB32_2 Depth=1 2582; RV64I-NEXT: sw a3, 12(sp) 2583; RV64I-NEXT: addi a1, sp, 12 2584; RV64I-NEXT: mv a0, s0 2585; RV64I-NEXT: li a3, 0 2586; RV64I-NEXT: li a4, 0 2587; RV64I-NEXT: call __atomic_compare_exchange_4 2588; RV64I-NEXT: lw a3, 12(sp) 2589; RV64I-NEXT: bnez a0, .LBB32_4 2590; RV64I-NEXT: .LBB32_2: # %atomicrmw.start 2591; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2592; RV64I-NEXT: mv a2, a3 2593; RV64I-NEXT: blt s2, a3, .LBB32_1 2594; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2595; RV64I-NEXT: # in Loop: Header=BB32_2 Depth=1 2596; RV64I-NEXT: mv a2, s1 2597; RV64I-NEXT: j .LBB32_1 2598; RV64I-NEXT: .LBB32_4: # %atomicrmw.end 2599; RV64I-NEXT: mv a0, a3 2600; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2601; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2602; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2603; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2604; RV64I-NEXT: addi sp, sp, 48 2605; RV64I-NEXT: ret 2606; 2607; RV64IA-LABEL: atomicrmw_max_i32_monotonic: 2608; RV64IA: # %bb.0: 2609; RV64IA-NEXT: amomax.w a0, a1, (a0) 2610; RV64IA-NEXT: ret 2611 %1 = atomicrmw max ptr %a, i32 %b monotonic 2612 ret i32 %1 2613} 2614 2615define signext i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind { 2616; RV32I-LABEL: atomicrmw_min_i32_monotonic: 2617; RV32I: # %bb.0: 2618; RV32I-NEXT: addi sp, sp, -16 2619; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2620; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2621; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2622; RV32I-NEXT: mv s0, a0 2623; RV32I-NEXT: lw a3, 0(a0) 2624; RV32I-NEXT: mv s1, a1 2625; RV32I-NEXT: j .LBB33_2 2626; RV32I-NEXT: .LBB33_1: # %atomicrmw.start 2627; RV32I-NEXT: # in Loop: Header=BB33_2 Depth=1 2628; RV32I-NEXT: sw a3, 0(sp) 2629; RV32I-NEXT: mv a1, sp 2630; RV32I-NEXT: mv a0, s0 2631; RV32I-NEXT: li a3, 0 2632; RV32I-NEXT: li a4, 0 2633; RV32I-NEXT: call __atomic_compare_exchange_4 2634; RV32I-NEXT: lw a3, 0(sp) 2635; RV32I-NEXT: bnez a0, .LBB33_4 2636; RV32I-NEXT: .LBB33_2: # %atomicrmw.start 2637; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2638; RV32I-NEXT: mv a2, a3 2639; RV32I-NEXT: bge s1, a3, .LBB33_1 2640; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2641; RV32I-NEXT: # in Loop: Header=BB33_2 Depth=1 2642; RV32I-NEXT: mv a2, s1 2643; RV32I-NEXT: j .LBB33_1 2644; RV32I-NEXT: .LBB33_4: # %atomicrmw.end 2645; RV32I-NEXT: mv a0, a3 2646; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2647; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2648; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2649; RV32I-NEXT: addi sp, sp, 16 2650; RV32I-NEXT: ret 2651; 2652; RV32IA-LABEL: atomicrmw_min_i32_monotonic: 2653; RV32IA: # %bb.0: 2654; RV32IA-NEXT: amomin.w a0, a1, (a0) 2655; RV32IA-NEXT: ret 2656; 2657; RV64I-LABEL: atomicrmw_min_i32_monotonic: 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: lw a3, 0(a0) 2666; RV64I-NEXT: mv s1, a1 2667; RV64I-NEXT: sext.w s2, a1 2668; RV64I-NEXT: j .LBB33_2 2669; RV64I-NEXT: .LBB33_1: # %atomicrmw.start 2670; RV64I-NEXT: # in Loop: Header=BB33_2 Depth=1 2671; RV64I-NEXT: sw a3, 12(sp) 2672; RV64I-NEXT: addi a1, sp, 12 2673; RV64I-NEXT: mv a0, s0 2674; RV64I-NEXT: li a3, 0 2675; RV64I-NEXT: li a4, 0 2676; RV64I-NEXT: call __atomic_compare_exchange_4 2677; RV64I-NEXT: lw a3, 12(sp) 2678; RV64I-NEXT: bnez a0, .LBB33_4 2679; RV64I-NEXT: .LBB33_2: # %atomicrmw.start 2680; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2681; RV64I-NEXT: mv a2, a3 2682; RV64I-NEXT: bge s2, a3, .LBB33_1 2683; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2684; RV64I-NEXT: # in Loop: Header=BB33_2 Depth=1 2685; RV64I-NEXT: mv a2, s1 2686; RV64I-NEXT: j .LBB33_1 2687; RV64I-NEXT: .LBB33_4: # %atomicrmw.end 2688; RV64I-NEXT: mv a0, a3 2689; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2690; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2691; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2692; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2693; RV64I-NEXT: addi sp, sp, 48 2694; RV64I-NEXT: ret 2695; 2696; RV64IA-LABEL: atomicrmw_min_i32_monotonic: 2697; RV64IA: # %bb.0: 2698; RV64IA-NEXT: amomin.w a0, a1, (a0) 2699; RV64IA-NEXT: ret 2700 %1 = atomicrmw min ptr %a, i32 %b monotonic 2701 ret i32 %1 2702} 2703 2704define signext i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind { 2705; RV32I-LABEL: atomicrmw_umax_i32_monotonic: 2706; RV32I: # %bb.0: 2707; RV32I-NEXT: addi sp, sp, -16 2708; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2709; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2710; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2711; RV32I-NEXT: mv s0, a0 2712; RV32I-NEXT: lw a3, 0(a0) 2713; RV32I-NEXT: mv s1, a1 2714; RV32I-NEXT: j .LBB34_2 2715; RV32I-NEXT: .LBB34_1: # %atomicrmw.start 2716; RV32I-NEXT: # in Loop: Header=BB34_2 Depth=1 2717; RV32I-NEXT: sw a3, 0(sp) 2718; RV32I-NEXT: mv a1, sp 2719; RV32I-NEXT: mv a0, s0 2720; RV32I-NEXT: li a3, 0 2721; RV32I-NEXT: li a4, 0 2722; RV32I-NEXT: call __atomic_compare_exchange_4 2723; RV32I-NEXT: lw a3, 0(sp) 2724; RV32I-NEXT: bnez a0, .LBB34_4 2725; RV32I-NEXT: .LBB34_2: # %atomicrmw.start 2726; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2727; RV32I-NEXT: mv a2, a3 2728; RV32I-NEXT: bltu s1, a3, .LBB34_1 2729; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2730; RV32I-NEXT: # in Loop: Header=BB34_2 Depth=1 2731; RV32I-NEXT: mv a2, s1 2732; RV32I-NEXT: j .LBB34_1 2733; RV32I-NEXT: .LBB34_4: # %atomicrmw.end 2734; RV32I-NEXT: mv a0, a3 2735; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2736; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2737; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2738; RV32I-NEXT: addi sp, sp, 16 2739; RV32I-NEXT: ret 2740; 2741; RV32IA-LABEL: atomicrmw_umax_i32_monotonic: 2742; RV32IA: # %bb.0: 2743; RV32IA-NEXT: amomaxu.w a0, a1, (a0) 2744; RV32IA-NEXT: ret 2745; 2746; RV64I-LABEL: atomicrmw_umax_i32_monotonic: 2747; RV64I: # %bb.0: 2748; RV64I-NEXT: addi sp, sp, -48 2749; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2750; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2751; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2752; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2753; RV64I-NEXT: mv s0, a0 2754; RV64I-NEXT: lw a3, 0(a0) 2755; RV64I-NEXT: mv s1, a1 2756; RV64I-NEXT: sext.w s2, a1 2757; RV64I-NEXT: j .LBB34_2 2758; RV64I-NEXT: .LBB34_1: # %atomicrmw.start 2759; RV64I-NEXT: # in Loop: Header=BB34_2 Depth=1 2760; RV64I-NEXT: sw a3, 12(sp) 2761; RV64I-NEXT: addi a1, sp, 12 2762; RV64I-NEXT: mv a0, s0 2763; RV64I-NEXT: li a3, 0 2764; RV64I-NEXT: li a4, 0 2765; RV64I-NEXT: call __atomic_compare_exchange_4 2766; RV64I-NEXT: lw a3, 12(sp) 2767; RV64I-NEXT: bnez a0, .LBB34_4 2768; RV64I-NEXT: .LBB34_2: # %atomicrmw.start 2769; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2770; RV64I-NEXT: mv a2, a3 2771; RV64I-NEXT: bltu s2, a3, .LBB34_1 2772; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2773; RV64I-NEXT: # in Loop: Header=BB34_2 Depth=1 2774; RV64I-NEXT: mv a2, s1 2775; RV64I-NEXT: j .LBB34_1 2776; RV64I-NEXT: .LBB34_4: # %atomicrmw.end 2777; RV64I-NEXT: mv a0, a3 2778; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2779; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2780; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2781; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2782; RV64I-NEXT: addi sp, sp, 48 2783; RV64I-NEXT: ret 2784; 2785; RV64IA-LABEL: atomicrmw_umax_i32_monotonic: 2786; RV64IA: # %bb.0: 2787; RV64IA-NEXT: amomaxu.w a0, a1, (a0) 2788; RV64IA-NEXT: ret 2789 %1 = atomicrmw umax ptr %a, i32 %b monotonic 2790 ret i32 %1 2791} 2792 2793define signext i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind { 2794; RV32I-LABEL: atomicrmw_umin_i32_monotonic: 2795; RV32I: # %bb.0: 2796; RV32I-NEXT: addi sp, sp, -16 2797; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2798; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2799; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2800; RV32I-NEXT: mv s0, a0 2801; RV32I-NEXT: lw a3, 0(a0) 2802; RV32I-NEXT: mv s1, a1 2803; RV32I-NEXT: j .LBB35_2 2804; RV32I-NEXT: .LBB35_1: # %atomicrmw.start 2805; RV32I-NEXT: # in Loop: Header=BB35_2 Depth=1 2806; RV32I-NEXT: sw a3, 0(sp) 2807; RV32I-NEXT: mv a1, sp 2808; RV32I-NEXT: mv a0, s0 2809; RV32I-NEXT: li a3, 0 2810; RV32I-NEXT: li a4, 0 2811; RV32I-NEXT: call __atomic_compare_exchange_4 2812; RV32I-NEXT: lw a3, 0(sp) 2813; RV32I-NEXT: bnez a0, .LBB35_4 2814; RV32I-NEXT: .LBB35_2: # %atomicrmw.start 2815; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2816; RV32I-NEXT: mv a2, a3 2817; RV32I-NEXT: bgeu s1, a3, .LBB35_1 2818; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2819; RV32I-NEXT: # in Loop: Header=BB35_2 Depth=1 2820; RV32I-NEXT: mv a2, s1 2821; RV32I-NEXT: j .LBB35_1 2822; RV32I-NEXT: .LBB35_4: # %atomicrmw.end 2823; RV32I-NEXT: mv a0, a3 2824; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2825; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2826; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2827; RV32I-NEXT: addi sp, sp, 16 2828; RV32I-NEXT: ret 2829; 2830; RV32IA-LABEL: atomicrmw_umin_i32_monotonic: 2831; RV32IA: # %bb.0: 2832; RV32IA-NEXT: amominu.w a0, a1, (a0) 2833; RV32IA-NEXT: ret 2834; 2835; RV64I-LABEL: atomicrmw_umin_i32_monotonic: 2836; RV64I: # %bb.0: 2837; RV64I-NEXT: addi sp, sp, -48 2838; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2839; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2840; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2841; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2842; RV64I-NEXT: mv s0, a0 2843; RV64I-NEXT: lw a3, 0(a0) 2844; RV64I-NEXT: mv s1, a1 2845; RV64I-NEXT: sext.w s2, a1 2846; RV64I-NEXT: j .LBB35_2 2847; RV64I-NEXT: .LBB35_1: # %atomicrmw.start 2848; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2849; RV64I-NEXT: sw a3, 12(sp) 2850; RV64I-NEXT: addi a1, sp, 12 2851; RV64I-NEXT: mv a0, s0 2852; RV64I-NEXT: li a3, 0 2853; RV64I-NEXT: li a4, 0 2854; RV64I-NEXT: call __atomic_compare_exchange_4 2855; RV64I-NEXT: lw a3, 12(sp) 2856; RV64I-NEXT: bnez a0, .LBB35_4 2857; RV64I-NEXT: .LBB35_2: # %atomicrmw.start 2858; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2859; RV64I-NEXT: mv a2, a3 2860; RV64I-NEXT: bgeu s2, a3, .LBB35_1 2861; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2862; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2863; RV64I-NEXT: mv a2, s1 2864; RV64I-NEXT: j .LBB35_1 2865; RV64I-NEXT: .LBB35_4: # %atomicrmw.end 2866; RV64I-NEXT: mv a0, a3 2867; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2868; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2869; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2870; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2871; RV64I-NEXT: addi sp, sp, 48 2872; RV64I-NEXT: ret 2873; 2874; RV64IA-LABEL: atomicrmw_umin_i32_monotonic: 2875; RV64IA: # %bb.0: 2876; RV64IA-NEXT: amominu.w a0, a1, (a0) 2877; RV64IA-NEXT: ret 2878 %1 = atomicrmw umin ptr %a, i32 %b monotonic 2879 ret i32 %1 2880} 2881 2882define signext i64 @atomicrmw_xchg_i64_monotonic(ptr %a, i64 %b) nounwind { 2883; RV32I-LABEL: atomicrmw_xchg_i64_monotonic: 2884; RV32I: # %bb.0: 2885; RV32I-NEXT: addi sp, sp, -16 2886; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2887; RV32I-NEXT: li a3, 0 2888; RV32I-NEXT: call __atomic_exchange_8 2889; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2890; RV32I-NEXT: addi sp, sp, 16 2891; RV32I-NEXT: ret 2892; 2893; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic: 2894; RV32IA: # %bb.0: 2895; RV32IA-NEXT: addi sp, sp, -16 2896; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2897; RV32IA-NEXT: li a3, 0 2898; RV32IA-NEXT: call __atomic_exchange_8 2899; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2900; RV32IA-NEXT: addi sp, sp, 16 2901; RV32IA-NEXT: ret 2902; 2903; RV64I-LABEL: atomicrmw_xchg_i64_monotonic: 2904; RV64I: # %bb.0: 2905; RV64I-NEXT: addi sp, sp, -16 2906; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2907; RV64I-NEXT: li a2, 0 2908; RV64I-NEXT: call __atomic_exchange_8 2909; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2910; RV64I-NEXT: addi sp, sp, 16 2911; RV64I-NEXT: ret 2912; 2913; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic: 2914; RV64IA: # %bb.0: 2915; RV64IA-NEXT: amoswap.d a0, a1, (a0) 2916; RV64IA-NEXT: ret 2917 %1 = atomicrmw xchg ptr %a, i64 %b monotonic 2918 ret i64 %1 2919} 2920 2921define signext i64 @atomicrmw_add_i64_monotonic(ptr %a, i64 %b) nounwind { 2922; RV32I-LABEL: atomicrmw_add_i64_monotonic: 2923; RV32I: # %bb.0: 2924; RV32I-NEXT: addi sp, sp, -16 2925; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2926; RV32I-NEXT: li a3, 0 2927; RV32I-NEXT: call __atomic_fetch_add_8 2928; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2929; RV32I-NEXT: addi sp, sp, 16 2930; RV32I-NEXT: ret 2931; 2932; RV32IA-LABEL: atomicrmw_add_i64_monotonic: 2933; RV32IA: # %bb.0: 2934; RV32IA-NEXT: addi sp, sp, -16 2935; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2936; RV32IA-NEXT: li a3, 0 2937; RV32IA-NEXT: call __atomic_fetch_add_8 2938; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2939; RV32IA-NEXT: addi sp, sp, 16 2940; RV32IA-NEXT: ret 2941; 2942; RV64I-LABEL: atomicrmw_add_i64_monotonic: 2943; RV64I: # %bb.0: 2944; RV64I-NEXT: addi sp, sp, -16 2945; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2946; RV64I-NEXT: li a2, 0 2947; RV64I-NEXT: call __atomic_fetch_add_8 2948; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2949; RV64I-NEXT: addi sp, sp, 16 2950; RV64I-NEXT: ret 2951; 2952; RV64IA-LABEL: atomicrmw_add_i64_monotonic: 2953; RV64IA: # %bb.0: 2954; RV64IA-NEXT: amoadd.d a0, a1, (a0) 2955; RV64IA-NEXT: ret 2956 %1 = atomicrmw add ptr %a, i64 %b monotonic 2957 ret i64 %1 2958} 2959 2960define signext i64 @atomicrmw_sub_i64_monotonic(ptr %a, i64 %b) nounwind { 2961; RV32I-LABEL: atomicrmw_sub_i64_monotonic: 2962; RV32I: # %bb.0: 2963; RV32I-NEXT: addi sp, sp, -16 2964; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2965; RV32I-NEXT: li a3, 0 2966; RV32I-NEXT: call __atomic_fetch_sub_8 2967; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2968; RV32I-NEXT: addi sp, sp, 16 2969; RV32I-NEXT: ret 2970; 2971; RV32IA-LABEL: atomicrmw_sub_i64_monotonic: 2972; RV32IA: # %bb.0: 2973; RV32IA-NEXT: addi sp, sp, -16 2974; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2975; RV32IA-NEXT: li a3, 0 2976; RV32IA-NEXT: call __atomic_fetch_sub_8 2977; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2978; RV32IA-NEXT: addi sp, sp, 16 2979; RV32IA-NEXT: ret 2980; 2981; RV64I-LABEL: atomicrmw_sub_i64_monotonic: 2982; RV64I: # %bb.0: 2983; RV64I-NEXT: addi sp, sp, -16 2984; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2985; RV64I-NEXT: li a2, 0 2986; RV64I-NEXT: call __atomic_fetch_sub_8 2987; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2988; RV64I-NEXT: addi sp, sp, 16 2989; RV64I-NEXT: ret 2990; 2991; RV64IA-LABEL: atomicrmw_sub_i64_monotonic: 2992; RV64IA: # %bb.0: 2993; RV64IA-NEXT: neg a1, a1 2994; RV64IA-NEXT: amoadd.d a0, a1, (a0) 2995; RV64IA-NEXT: ret 2996 %1 = atomicrmw sub ptr %a, i64 %b monotonic 2997 ret i64 %1 2998} 2999 3000define signext i64 @atomicrmw_and_i64_monotonic(ptr %a, i64 %b) nounwind { 3001; RV32I-LABEL: atomicrmw_and_i64_monotonic: 3002; RV32I: # %bb.0: 3003; RV32I-NEXT: addi sp, sp, -16 3004; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3005; RV32I-NEXT: li a3, 0 3006; RV32I-NEXT: call __atomic_fetch_and_8 3007; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3008; RV32I-NEXT: addi sp, sp, 16 3009; RV32I-NEXT: ret 3010; 3011; RV32IA-LABEL: atomicrmw_and_i64_monotonic: 3012; RV32IA: # %bb.0: 3013; RV32IA-NEXT: addi sp, sp, -16 3014; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3015; RV32IA-NEXT: li a3, 0 3016; RV32IA-NEXT: call __atomic_fetch_and_8 3017; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3018; RV32IA-NEXT: addi sp, sp, 16 3019; RV32IA-NEXT: ret 3020; 3021; RV64I-LABEL: atomicrmw_and_i64_monotonic: 3022; RV64I: # %bb.0: 3023; RV64I-NEXT: addi sp, sp, -16 3024; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3025; RV64I-NEXT: li a2, 0 3026; RV64I-NEXT: call __atomic_fetch_and_8 3027; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3028; RV64I-NEXT: addi sp, sp, 16 3029; RV64I-NEXT: ret 3030; 3031; RV64IA-LABEL: atomicrmw_and_i64_monotonic: 3032; RV64IA: # %bb.0: 3033; RV64IA-NEXT: amoand.d a0, a1, (a0) 3034; RV64IA-NEXT: ret 3035 %1 = atomicrmw and ptr %a, i64 %b monotonic 3036 ret i64 %1 3037} 3038 3039define signext i64 @atomicrmw_nand_i64_monotonic(ptr %a, i64 %b) nounwind { 3040; RV32I-LABEL: atomicrmw_nand_i64_monotonic: 3041; RV32I: # %bb.0: 3042; RV32I-NEXT: addi sp, sp, -16 3043; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3044; RV32I-NEXT: li a3, 0 3045; RV32I-NEXT: call __atomic_fetch_nand_8 3046; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3047; RV32I-NEXT: addi sp, sp, 16 3048; RV32I-NEXT: ret 3049; 3050; RV32IA-LABEL: atomicrmw_nand_i64_monotonic: 3051; RV32IA: # %bb.0: 3052; RV32IA-NEXT: addi sp, sp, -16 3053; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3054; RV32IA-NEXT: li a3, 0 3055; RV32IA-NEXT: call __atomic_fetch_nand_8 3056; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3057; RV32IA-NEXT: addi sp, sp, 16 3058; RV32IA-NEXT: ret 3059; 3060; RV64I-LABEL: atomicrmw_nand_i64_monotonic: 3061; RV64I: # %bb.0: 3062; RV64I-NEXT: addi sp, sp, -16 3063; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3064; RV64I-NEXT: li a2, 0 3065; RV64I-NEXT: call __atomic_fetch_nand_8 3066; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3067; RV64I-NEXT: addi sp, sp, 16 3068; RV64I-NEXT: ret 3069; 3070; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic: 3071; RV64IA-NOZACAS: # %bb.0: 3072; RV64IA-NOZACAS-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 3073; RV64IA-NOZACAS-NEXT: lr.d a2, (a0) 3074; RV64IA-NOZACAS-NEXT: and a3, a2, a1 3075; RV64IA-NOZACAS-NEXT: not a3, a3 3076; RV64IA-NOZACAS-NEXT: sc.d a3, a3, (a0) 3077; RV64IA-NOZACAS-NEXT: bnez a3, .LBB40_1 3078; RV64IA-NOZACAS-NEXT: # %bb.2: 3079; RV64IA-NOZACAS-NEXT: mv a0, a2 3080; RV64IA-NOZACAS-NEXT: ret 3081; 3082; RV64IA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic: 3083; RV64IA-ZACAS: # %bb.0: 3084; RV64IA-ZACAS-NEXT: mv a2, a0 3085; RV64IA-ZACAS-NEXT: ld a0, 0(a0) 3086; RV64IA-ZACAS-NEXT: .LBB40_1: # %atomicrmw.start 3087; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 3088; RV64IA-ZACAS-NEXT: mv a3, a0 3089; RV64IA-ZACAS-NEXT: and a4, a0, a1 3090; RV64IA-ZACAS-NEXT: not a4, a4 3091; RV64IA-ZACAS-NEXT: amocas.d a0, a4, (a2) 3092; RV64IA-ZACAS-NEXT: bne a0, a3, .LBB40_1 3093; RV64IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 3094; RV64IA-ZACAS-NEXT: ret 3095 %1 = atomicrmw nand ptr %a, i64 %b monotonic 3096 ret i64 %1 3097} 3098 3099define signext i64 @atomicrmw_or_i64_monotonic(ptr %a, i64 %b) nounwind { 3100; RV32I-LABEL: atomicrmw_or_i64_monotonic: 3101; RV32I: # %bb.0: 3102; RV32I-NEXT: addi sp, sp, -16 3103; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3104; RV32I-NEXT: li a3, 0 3105; RV32I-NEXT: call __atomic_fetch_or_8 3106; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3107; RV32I-NEXT: addi sp, sp, 16 3108; RV32I-NEXT: ret 3109; 3110; RV32IA-LABEL: atomicrmw_or_i64_monotonic: 3111; RV32IA: # %bb.0: 3112; RV32IA-NEXT: addi sp, sp, -16 3113; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3114; RV32IA-NEXT: li a3, 0 3115; RV32IA-NEXT: call __atomic_fetch_or_8 3116; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3117; RV32IA-NEXT: addi sp, sp, 16 3118; RV32IA-NEXT: ret 3119; 3120; RV64I-LABEL: atomicrmw_or_i64_monotonic: 3121; RV64I: # %bb.0: 3122; RV64I-NEXT: addi sp, sp, -16 3123; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3124; RV64I-NEXT: li a2, 0 3125; RV64I-NEXT: call __atomic_fetch_or_8 3126; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3127; RV64I-NEXT: addi sp, sp, 16 3128; RV64I-NEXT: ret 3129; 3130; RV64IA-LABEL: atomicrmw_or_i64_monotonic: 3131; RV64IA: # %bb.0: 3132; RV64IA-NEXT: amoor.d a0, a1, (a0) 3133; RV64IA-NEXT: ret 3134 %1 = atomicrmw or ptr %a, i64 %b monotonic 3135 ret i64 %1 3136} 3137 3138define signext i64 @atomicrmw_xor_i64_monotonic(ptr %a, i64 %b) nounwind { 3139; RV32I-LABEL: atomicrmw_xor_i64_monotonic: 3140; RV32I: # %bb.0: 3141; RV32I-NEXT: addi sp, sp, -16 3142; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3143; RV32I-NEXT: li a3, 0 3144; RV32I-NEXT: call __atomic_fetch_xor_8 3145; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3146; RV32I-NEXT: addi sp, sp, 16 3147; RV32I-NEXT: ret 3148; 3149; RV32IA-LABEL: atomicrmw_xor_i64_monotonic: 3150; RV32IA: # %bb.0: 3151; RV32IA-NEXT: addi sp, sp, -16 3152; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3153; RV32IA-NEXT: li a3, 0 3154; RV32IA-NEXT: call __atomic_fetch_xor_8 3155; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3156; RV32IA-NEXT: addi sp, sp, 16 3157; RV32IA-NEXT: ret 3158; 3159; RV64I-LABEL: atomicrmw_xor_i64_monotonic: 3160; RV64I: # %bb.0: 3161; RV64I-NEXT: addi sp, sp, -16 3162; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3163; RV64I-NEXT: li a2, 0 3164; RV64I-NEXT: call __atomic_fetch_xor_8 3165; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3166; RV64I-NEXT: addi sp, sp, 16 3167; RV64I-NEXT: ret 3168; 3169; RV64IA-LABEL: atomicrmw_xor_i64_monotonic: 3170; RV64IA: # %bb.0: 3171; RV64IA-NEXT: amoxor.d a0, a1, (a0) 3172; RV64IA-NEXT: ret 3173 %1 = atomicrmw xor ptr %a, i64 %b monotonic 3174 ret i64 %1 3175} 3176 3177define signext i64 @atomicrmw_max_i64_monotonic(ptr %a, i64 %b) nounwind { 3178; RV32I-LABEL: atomicrmw_max_i64_monotonic: 3179; RV32I: # %bb.0: 3180; RV32I-NEXT: addi sp, sp, -32 3181; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3182; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3183; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3184; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3185; RV32I-NEXT: mv s0, a2 3186; RV32I-NEXT: mv s1, a0 3187; RV32I-NEXT: lw a4, 0(a0) 3188; RV32I-NEXT: lw a5, 4(a0) 3189; RV32I-NEXT: mv s2, a1 3190; RV32I-NEXT: j .LBB43_2 3191; RV32I-NEXT: .LBB43_1: # %atomicrmw.start 3192; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3193; RV32I-NEXT: sw a4, 8(sp) 3194; RV32I-NEXT: sw a5, 12(sp) 3195; RV32I-NEXT: addi a1, sp, 8 3196; RV32I-NEXT: mv a0, s1 3197; RV32I-NEXT: li a4, 0 3198; RV32I-NEXT: li a5, 0 3199; RV32I-NEXT: call __atomic_compare_exchange_8 3200; RV32I-NEXT: lw a4, 8(sp) 3201; RV32I-NEXT: lw a5, 12(sp) 3202; RV32I-NEXT: bnez a0, .LBB43_7 3203; RV32I-NEXT: .LBB43_2: # %atomicrmw.start 3204; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3205; RV32I-NEXT: beq a5, s0, .LBB43_4 3206; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3207; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3208; RV32I-NEXT: slt a0, s0, a5 3209; RV32I-NEXT: j .LBB43_5 3210; RV32I-NEXT: .LBB43_4: # in Loop: Header=BB43_2 Depth=1 3211; RV32I-NEXT: sltu a0, s2, a4 3212; RV32I-NEXT: .LBB43_5: # %atomicrmw.start 3213; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3214; RV32I-NEXT: mv a2, a4 3215; RV32I-NEXT: mv a3, a5 3216; RV32I-NEXT: bnez a0, .LBB43_1 3217; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3218; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3219; RV32I-NEXT: mv a2, s2 3220; RV32I-NEXT: mv a3, s0 3221; RV32I-NEXT: j .LBB43_1 3222; RV32I-NEXT: .LBB43_7: # %atomicrmw.end 3223; RV32I-NEXT: mv a0, a4 3224; RV32I-NEXT: mv a1, a5 3225; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3226; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3227; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3228; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3229; RV32I-NEXT: addi sp, sp, 32 3230; RV32I-NEXT: ret 3231; 3232; RV32IA-LABEL: atomicrmw_max_i64_monotonic: 3233; RV32IA: # %bb.0: 3234; RV32IA-NEXT: addi sp, sp, -32 3235; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3236; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3237; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3238; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3239; RV32IA-NEXT: mv s0, a2 3240; RV32IA-NEXT: mv s1, a0 3241; RV32IA-NEXT: lw a4, 0(a0) 3242; RV32IA-NEXT: lw a5, 4(a0) 3243; RV32IA-NEXT: mv s2, a1 3244; RV32IA-NEXT: j .LBB43_2 3245; RV32IA-NEXT: .LBB43_1: # %atomicrmw.start 3246; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3247; RV32IA-NEXT: sw a4, 8(sp) 3248; RV32IA-NEXT: sw a5, 12(sp) 3249; RV32IA-NEXT: addi a1, sp, 8 3250; RV32IA-NEXT: mv a0, s1 3251; RV32IA-NEXT: li a4, 0 3252; RV32IA-NEXT: li a5, 0 3253; RV32IA-NEXT: call __atomic_compare_exchange_8 3254; RV32IA-NEXT: lw a4, 8(sp) 3255; RV32IA-NEXT: lw a5, 12(sp) 3256; RV32IA-NEXT: bnez a0, .LBB43_7 3257; RV32IA-NEXT: .LBB43_2: # %atomicrmw.start 3258; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3259; RV32IA-NEXT: beq a5, s0, .LBB43_4 3260; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3261; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3262; RV32IA-NEXT: slt a0, s0, a5 3263; RV32IA-NEXT: j .LBB43_5 3264; RV32IA-NEXT: .LBB43_4: # in Loop: Header=BB43_2 Depth=1 3265; RV32IA-NEXT: sltu a0, s2, a4 3266; RV32IA-NEXT: .LBB43_5: # %atomicrmw.start 3267; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3268; RV32IA-NEXT: mv a2, a4 3269; RV32IA-NEXT: mv a3, a5 3270; RV32IA-NEXT: bnez a0, .LBB43_1 3271; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3272; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3273; RV32IA-NEXT: mv a2, s2 3274; RV32IA-NEXT: mv a3, s0 3275; RV32IA-NEXT: j .LBB43_1 3276; RV32IA-NEXT: .LBB43_7: # %atomicrmw.end 3277; RV32IA-NEXT: mv a0, a4 3278; RV32IA-NEXT: mv a1, a5 3279; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3280; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3281; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3282; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3283; RV32IA-NEXT: addi sp, sp, 32 3284; RV32IA-NEXT: ret 3285; 3286; RV64I-LABEL: atomicrmw_max_i64_monotonic: 3287; RV64I: # %bb.0: 3288; RV64I-NEXT: addi sp, sp, -32 3289; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3290; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3291; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3292; RV64I-NEXT: mv s0, a0 3293; RV64I-NEXT: ld a3, 0(a0) 3294; RV64I-NEXT: mv s1, a1 3295; RV64I-NEXT: j .LBB43_2 3296; RV64I-NEXT: .LBB43_1: # %atomicrmw.start 3297; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3298; RV64I-NEXT: sd a3, 0(sp) 3299; RV64I-NEXT: mv a1, sp 3300; RV64I-NEXT: mv a0, s0 3301; RV64I-NEXT: li a3, 0 3302; RV64I-NEXT: li a4, 0 3303; RV64I-NEXT: call __atomic_compare_exchange_8 3304; RV64I-NEXT: ld a3, 0(sp) 3305; RV64I-NEXT: bnez a0, .LBB43_4 3306; RV64I-NEXT: .LBB43_2: # %atomicrmw.start 3307; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3308; RV64I-NEXT: mv a2, a3 3309; RV64I-NEXT: blt s1, a3, .LBB43_1 3310; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3311; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3312; RV64I-NEXT: mv a2, s1 3313; RV64I-NEXT: j .LBB43_1 3314; RV64I-NEXT: .LBB43_4: # %atomicrmw.end 3315; RV64I-NEXT: mv a0, a3 3316; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3317; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3318; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3319; RV64I-NEXT: addi sp, sp, 32 3320; RV64I-NEXT: ret 3321; 3322; RV64IA-LABEL: atomicrmw_max_i64_monotonic: 3323; RV64IA: # %bb.0: 3324; RV64IA-NEXT: amomax.d a0, a1, (a0) 3325; RV64IA-NEXT: ret 3326 %1 = atomicrmw max ptr %a, i64 %b monotonic 3327 ret i64 %1 3328} 3329 3330define signext i64 @atomicrmw_min_i64_monotonic(ptr %a, i64 %b) nounwind { 3331; RV32I-LABEL: atomicrmw_min_i64_monotonic: 3332; RV32I: # %bb.0: 3333; RV32I-NEXT: addi sp, sp, -32 3334; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3335; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3336; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3337; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3338; RV32I-NEXT: mv s0, a2 3339; RV32I-NEXT: mv s1, a0 3340; RV32I-NEXT: lw a4, 0(a0) 3341; RV32I-NEXT: lw a5, 4(a0) 3342; RV32I-NEXT: mv s2, a1 3343; RV32I-NEXT: j .LBB44_2 3344; RV32I-NEXT: .LBB44_1: # %atomicrmw.start 3345; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3346; RV32I-NEXT: sw a4, 8(sp) 3347; RV32I-NEXT: sw a5, 12(sp) 3348; RV32I-NEXT: addi a1, sp, 8 3349; RV32I-NEXT: mv a0, s1 3350; RV32I-NEXT: li a4, 0 3351; RV32I-NEXT: li a5, 0 3352; RV32I-NEXT: call __atomic_compare_exchange_8 3353; RV32I-NEXT: lw a4, 8(sp) 3354; RV32I-NEXT: lw a5, 12(sp) 3355; RV32I-NEXT: bnez a0, .LBB44_7 3356; RV32I-NEXT: .LBB44_2: # %atomicrmw.start 3357; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3358; RV32I-NEXT: beq a5, s0, .LBB44_4 3359; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3360; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3361; RV32I-NEXT: slt a0, s0, a5 3362; RV32I-NEXT: j .LBB44_5 3363; RV32I-NEXT: .LBB44_4: # in Loop: Header=BB44_2 Depth=1 3364; RV32I-NEXT: sltu a0, s2, a4 3365; RV32I-NEXT: .LBB44_5: # %atomicrmw.start 3366; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3367; RV32I-NEXT: mv a2, a4 3368; RV32I-NEXT: mv a3, a5 3369; RV32I-NEXT: beqz a0, .LBB44_1 3370; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3371; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3372; RV32I-NEXT: mv a2, s2 3373; RV32I-NEXT: mv a3, s0 3374; RV32I-NEXT: j .LBB44_1 3375; RV32I-NEXT: .LBB44_7: # %atomicrmw.end 3376; RV32I-NEXT: mv a0, a4 3377; RV32I-NEXT: mv a1, a5 3378; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3379; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3380; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3381; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3382; RV32I-NEXT: addi sp, sp, 32 3383; RV32I-NEXT: ret 3384; 3385; RV32IA-LABEL: atomicrmw_min_i64_monotonic: 3386; RV32IA: # %bb.0: 3387; RV32IA-NEXT: addi sp, sp, -32 3388; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3389; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3390; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3391; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3392; RV32IA-NEXT: mv s0, a2 3393; RV32IA-NEXT: mv s1, a0 3394; RV32IA-NEXT: lw a4, 0(a0) 3395; RV32IA-NEXT: lw a5, 4(a0) 3396; RV32IA-NEXT: mv s2, a1 3397; RV32IA-NEXT: j .LBB44_2 3398; RV32IA-NEXT: .LBB44_1: # %atomicrmw.start 3399; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3400; RV32IA-NEXT: sw a4, 8(sp) 3401; RV32IA-NEXT: sw a5, 12(sp) 3402; RV32IA-NEXT: addi a1, sp, 8 3403; RV32IA-NEXT: mv a0, s1 3404; RV32IA-NEXT: li a4, 0 3405; RV32IA-NEXT: li a5, 0 3406; RV32IA-NEXT: call __atomic_compare_exchange_8 3407; RV32IA-NEXT: lw a4, 8(sp) 3408; RV32IA-NEXT: lw a5, 12(sp) 3409; RV32IA-NEXT: bnez a0, .LBB44_7 3410; RV32IA-NEXT: .LBB44_2: # %atomicrmw.start 3411; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3412; RV32IA-NEXT: beq a5, s0, .LBB44_4 3413; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3414; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3415; RV32IA-NEXT: slt a0, s0, a5 3416; RV32IA-NEXT: j .LBB44_5 3417; RV32IA-NEXT: .LBB44_4: # in Loop: Header=BB44_2 Depth=1 3418; RV32IA-NEXT: sltu a0, s2, a4 3419; RV32IA-NEXT: .LBB44_5: # %atomicrmw.start 3420; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3421; RV32IA-NEXT: mv a2, a4 3422; RV32IA-NEXT: mv a3, a5 3423; RV32IA-NEXT: beqz a0, .LBB44_1 3424; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3425; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3426; RV32IA-NEXT: mv a2, s2 3427; RV32IA-NEXT: mv a3, s0 3428; RV32IA-NEXT: j .LBB44_1 3429; RV32IA-NEXT: .LBB44_7: # %atomicrmw.end 3430; RV32IA-NEXT: mv a0, a4 3431; RV32IA-NEXT: mv a1, a5 3432; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3433; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3434; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3435; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3436; RV32IA-NEXT: addi sp, sp, 32 3437; RV32IA-NEXT: ret 3438; 3439; RV64I-LABEL: atomicrmw_min_i64_monotonic: 3440; RV64I: # %bb.0: 3441; RV64I-NEXT: addi sp, sp, -32 3442; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3443; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3444; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3445; RV64I-NEXT: mv s0, a0 3446; RV64I-NEXT: ld a3, 0(a0) 3447; RV64I-NEXT: mv s1, a1 3448; RV64I-NEXT: j .LBB44_2 3449; RV64I-NEXT: .LBB44_1: # %atomicrmw.start 3450; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3451; RV64I-NEXT: sd a3, 0(sp) 3452; RV64I-NEXT: mv a1, sp 3453; RV64I-NEXT: mv a0, s0 3454; RV64I-NEXT: li a3, 0 3455; RV64I-NEXT: li a4, 0 3456; RV64I-NEXT: call __atomic_compare_exchange_8 3457; RV64I-NEXT: ld a3, 0(sp) 3458; RV64I-NEXT: bnez a0, .LBB44_4 3459; RV64I-NEXT: .LBB44_2: # %atomicrmw.start 3460; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3461; RV64I-NEXT: mv a2, a3 3462; RV64I-NEXT: bge s1, a3, .LBB44_1 3463; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3464; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3465; RV64I-NEXT: mv a2, s1 3466; RV64I-NEXT: j .LBB44_1 3467; RV64I-NEXT: .LBB44_4: # %atomicrmw.end 3468; RV64I-NEXT: mv a0, a3 3469; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3470; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3471; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3472; RV64I-NEXT: addi sp, sp, 32 3473; RV64I-NEXT: ret 3474; 3475; RV64IA-LABEL: atomicrmw_min_i64_monotonic: 3476; RV64IA: # %bb.0: 3477; RV64IA-NEXT: amomin.d a0, a1, (a0) 3478; RV64IA-NEXT: ret 3479 %1 = atomicrmw min ptr %a, i64 %b monotonic 3480 ret i64 %1 3481} 3482 3483define signext i64 @atomicrmw_umax_i64_monotonic(ptr %a, i64 %b) nounwind { 3484; RV32I-LABEL: atomicrmw_umax_i64_monotonic: 3485; RV32I: # %bb.0: 3486; RV32I-NEXT: addi sp, sp, -32 3487; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3488; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3489; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3490; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3491; RV32I-NEXT: mv s0, a2 3492; RV32I-NEXT: mv s1, a0 3493; RV32I-NEXT: lw a4, 0(a0) 3494; RV32I-NEXT: lw a5, 4(a0) 3495; RV32I-NEXT: mv s2, a1 3496; RV32I-NEXT: j .LBB45_2 3497; RV32I-NEXT: .LBB45_1: # %atomicrmw.start 3498; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3499; RV32I-NEXT: sw a4, 8(sp) 3500; RV32I-NEXT: sw a5, 12(sp) 3501; RV32I-NEXT: addi a1, sp, 8 3502; RV32I-NEXT: mv a0, s1 3503; RV32I-NEXT: li a4, 0 3504; RV32I-NEXT: li a5, 0 3505; RV32I-NEXT: call __atomic_compare_exchange_8 3506; RV32I-NEXT: lw a4, 8(sp) 3507; RV32I-NEXT: lw a5, 12(sp) 3508; RV32I-NEXT: bnez a0, .LBB45_7 3509; RV32I-NEXT: .LBB45_2: # %atomicrmw.start 3510; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3511; RV32I-NEXT: beq a5, s0, .LBB45_4 3512; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3513; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3514; RV32I-NEXT: sltu a0, s0, a5 3515; RV32I-NEXT: j .LBB45_5 3516; RV32I-NEXT: .LBB45_4: # in Loop: Header=BB45_2 Depth=1 3517; RV32I-NEXT: sltu a0, s2, a4 3518; RV32I-NEXT: .LBB45_5: # %atomicrmw.start 3519; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3520; RV32I-NEXT: mv a2, a4 3521; RV32I-NEXT: mv a3, a5 3522; RV32I-NEXT: bnez a0, .LBB45_1 3523; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3524; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3525; RV32I-NEXT: mv a2, s2 3526; RV32I-NEXT: mv a3, s0 3527; RV32I-NEXT: j .LBB45_1 3528; RV32I-NEXT: .LBB45_7: # %atomicrmw.end 3529; RV32I-NEXT: mv a0, a4 3530; RV32I-NEXT: mv a1, a5 3531; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3532; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3533; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3534; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3535; RV32I-NEXT: addi sp, sp, 32 3536; RV32I-NEXT: ret 3537; 3538; RV32IA-LABEL: atomicrmw_umax_i64_monotonic: 3539; RV32IA: # %bb.0: 3540; RV32IA-NEXT: addi sp, sp, -32 3541; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3542; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3543; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3544; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3545; RV32IA-NEXT: mv s0, a2 3546; RV32IA-NEXT: mv s1, a0 3547; RV32IA-NEXT: lw a4, 0(a0) 3548; RV32IA-NEXT: lw a5, 4(a0) 3549; RV32IA-NEXT: mv s2, a1 3550; RV32IA-NEXT: j .LBB45_2 3551; RV32IA-NEXT: .LBB45_1: # %atomicrmw.start 3552; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3553; RV32IA-NEXT: sw a4, 8(sp) 3554; RV32IA-NEXT: sw a5, 12(sp) 3555; RV32IA-NEXT: addi a1, sp, 8 3556; RV32IA-NEXT: mv a0, s1 3557; RV32IA-NEXT: li a4, 0 3558; RV32IA-NEXT: li a5, 0 3559; RV32IA-NEXT: call __atomic_compare_exchange_8 3560; RV32IA-NEXT: lw a4, 8(sp) 3561; RV32IA-NEXT: lw a5, 12(sp) 3562; RV32IA-NEXT: bnez a0, .LBB45_7 3563; RV32IA-NEXT: .LBB45_2: # %atomicrmw.start 3564; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3565; RV32IA-NEXT: beq a5, s0, .LBB45_4 3566; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3567; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3568; RV32IA-NEXT: sltu a0, s0, a5 3569; RV32IA-NEXT: j .LBB45_5 3570; RV32IA-NEXT: .LBB45_4: # in Loop: Header=BB45_2 Depth=1 3571; RV32IA-NEXT: sltu a0, s2, a4 3572; RV32IA-NEXT: .LBB45_5: # %atomicrmw.start 3573; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3574; RV32IA-NEXT: mv a2, a4 3575; RV32IA-NEXT: mv a3, a5 3576; RV32IA-NEXT: bnez a0, .LBB45_1 3577; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3578; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3579; RV32IA-NEXT: mv a2, s2 3580; RV32IA-NEXT: mv a3, s0 3581; RV32IA-NEXT: j .LBB45_1 3582; RV32IA-NEXT: .LBB45_7: # %atomicrmw.end 3583; RV32IA-NEXT: mv a0, a4 3584; RV32IA-NEXT: mv a1, a5 3585; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3586; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3587; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3588; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3589; RV32IA-NEXT: addi sp, sp, 32 3590; RV32IA-NEXT: ret 3591; 3592; RV64I-LABEL: atomicrmw_umax_i64_monotonic: 3593; RV64I: # %bb.0: 3594; RV64I-NEXT: addi sp, sp, -32 3595; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3596; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3597; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3598; RV64I-NEXT: mv s0, a0 3599; RV64I-NEXT: ld a3, 0(a0) 3600; RV64I-NEXT: mv s1, a1 3601; RV64I-NEXT: j .LBB45_2 3602; RV64I-NEXT: .LBB45_1: # %atomicrmw.start 3603; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3604; RV64I-NEXT: sd a3, 0(sp) 3605; RV64I-NEXT: mv a1, sp 3606; RV64I-NEXT: mv a0, s0 3607; RV64I-NEXT: li a3, 0 3608; RV64I-NEXT: li a4, 0 3609; RV64I-NEXT: call __atomic_compare_exchange_8 3610; RV64I-NEXT: ld a3, 0(sp) 3611; RV64I-NEXT: bnez a0, .LBB45_4 3612; RV64I-NEXT: .LBB45_2: # %atomicrmw.start 3613; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3614; RV64I-NEXT: mv a2, a3 3615; RV64I-NEXT: bltu s1, a3, .LBB45_1 3616; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3617; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3618; RV64I-NEXT: mv a2, s1 3619; RV64I-NEXT: j .LBB45_1 3620; RV64I-NEXT: .LBB45_4: # %atomicrmw.end 3621; RV64I-NEXT: mv a0, a3 3622; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3623; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3624; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3625; RV64I-NEXT: addi sp, sp, 32 3626; RV64I-NEXT: ret 3627; 3628; RV64IA-LABEL: atomicrmw_umax_i64_monotonic: 3629; RV64IA: # %bb.0: 3630; RV64IA-NEXT: amomaxu.d a0, a1, (a0) 3631; RV64IA-NEXT: ret 3632 %1 = atomicrmw umax ptr %a, i64 %b monotonic 3633 ret i64 %1 3634} 3635 3636define signext i64 @atomicrmw_umin_i64_monotonic(ptr %a, i64 %b) nounwind { 3637; RV32I-LABEL: atomicrmw_umin_i64_monotonic: 3638; RV32I: # %bb.0: 3639; RV32I-NEXT: addi sp, sp, -32 3640; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3641; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3642; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3643; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3644; RV32I-NEXT: mv s0, a2 3645; RV32I-NEXT: mv s1, a0 3646; RV32I-NEXT: lw a4, 0(a0) 3647; RV32I-NEXT: lw a5, 4(a0) 3648; RV32I-NEXT: mv s2, a1 3649; RV32I-NEXT: j .LBB46_2 3650; RV32I-NEXT: .LBB46_1: # %atomicrmw.start 3651; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3652; RV32I-NEXT: sw a4, 8(sp) 3653; RV32I-NEXT: sw a5, 12(sp) 3654; RV32I-NEXT: addi a1, sp, 8 3655; RV32I-NEXT: mv a0, s1 3656; RV32I-NEXT: li a4, 0 3657; RV32I-NEXT: li a5, 0 3658; RV32I-NEXT: call __atomic_compare_exchange_8 3659; RV32I-NEXT: lw a4, 8(sp) 3660; RV32I-NEXT: lw a5, 12(sp) 3661; RV32I-NEXT: bnez a0, .LBB46_7 3662; RV32I-NEXT: .LBB46_2: # %atomicrmw.start 3663; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3664; RV32I-NEXT: beq a5, s0, .LBB46_4 3665; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3666; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3667; RV32I-NEXT: sltu a0, s0, a5 3668; RV32I-NEXT: j .LBB46_5 3669; RV32I-NEXT: .LBB46_4: # in Loop: Header=BB46_2 Depth=1 3670; RV32I-NEXT: sltu a0, s2, a4 3671; RV32I-NEXT: .LBB46_5: # %atomicrmw.start 3672; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3673; RV32I-NEXT: mv a2, a4 3674; RV32I-NEXT: mv a3, a5 3675; RV32I-NEXT: beqz a0, .LBB46_1 3676; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3677; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3678; RV32I-NEXT: mv a2, s2 3679; RV32I-NEXT: mv a3, s0 3680; RV32I-NEXT: j .LBB46_1 3681; RV32I-NEXT: .LBB46_7: # %atomicrmw.end 3682; RV32I-NEXT: mv a0, a4 3683; RV32I-NEXT: mv a1, a5 3684; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3685; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3686; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3687; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3688; RV32I-NEXT: addi sp, sp, 32 3689; RV32I-NEXT: ret 3690; 3691; RV32IA-LABEL: atomicrmw_umin_i64_monotonic: 3692; RV32IA: # %bb.0: 3693; RV32IA-NEXT: addi sp, sp, -32 3694; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3695; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3696; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3697; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3698; RV32IA-NEXT: mv s0, a2 3699; RV32IA-NEXT: mv s1, a0 3700; RV32IA-NEXT: lw a4, 0(a0) 3701; RV32IA-NEXT: lw a5, 4(a0) 3702; RV32IA-NEXT: mv s2, a1 3703; RV32IA-NEXT: j .LBB46_2 3704; RV32IA-NEXT: .LBB46_1: # %atomicrmw.start 3705; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3706; RV32IA-NEXT: sw a4, 8(sp) 3707; RV32IA-NEXT: sw a5, 12(sp) 3708; RV32IA-NEXT: addi a1, sp, 8 3709; RV32IA-NEXT: mv a0, s1 3710; RV32IA-NEXT: li a4, 0 3711; RV32IA-NEXT: li a5, 0 3712; RV32IA-NEXT: call __atomic_compare_exchange_8 3713; RV32IA-NEXT: lw a4, 8(sp) 3714; RV32IA-NEXT: lw a5, 12(sp) 3715; RV32IA-NEXT: bnez a0, .LBB46_7 3716; RV32IA-NEXT: .LBB46_2: # %atomicrmw.start 3717; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3718; RV32IA-NEXT: beq a5, s0, .LBB46_4 3719; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3720; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3721; RV32IA-NEXT: sltu a0, s0, a5 3722; RV32IA-NEXT: j .LBB46_5 3723; RV32IA-NEXT: .LBB46_4: # in Loop: Header=BB46_2 Depth=1 3724; RV32IA-NEXT: sltu a0, s2, a4 3725; RV32IA-NEXT: .LBB46_5: # %atomicrmw.start 3726; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3727; RV32IA-NEXT: mv a2, a4 3728; RV32IA-NEXT: mv a3, a5 3729; RV32IA-NEXT: beqz a0, .LBB46_1 3730; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3731; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3732; RV32IA-NEXT: mv a2, s2 3733; RV32IA-NEXT: mv a3, s0 3734; RV32IA-NEXT: j .LBB46_1 3735; RV32IA-NEXT: .LBB46_7: # %atomicrmw.end 3736; RV32IA-NEXT: mv a0, a4 3737; RV32IA-NEXT: mv a1, a5 3738; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3739; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3740; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3741; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3742; RV32IA-NEXT: addi sp, sp, 32 3743; RV32IA-NEXT: ret 3744; 3745; RV64I-LABEL: atomicrmw_umin_i64_monotonic: 3746; RV64I: # %bb.0: 3747; RV64I-NEXT: addi sp, sp, -32 3748; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3749; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3750; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3751; RV64I-NEXT: mv s0, a0 3752; RV64I-NEXT: ld a3, 0(a0) 3753; RV64I-NEXT: mv s1, a1 3754; RV64I-NEXT: j .LBB46_2 3755; RV64I-NEXT: .LBB46_1: # %atomicrmw.start 3756; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3757; RV64I-NEXT: sd a3, 0(sp) 3758; RV64I-NEXT: mv a1, sp 3759; RV64I-NEXT: mv a0, s0 3760; RV64I-NEXT: li a3, 0 3761; RV64I-NEXT: li a4, 0 3762; RV64I-NEXT: call __atomic_compare_exchange_8 3763; RV64I-NEXT: ld a3, 0(sp) 3764; RV64I-NEXT: bnez a0, .LBB46_4 3765; RV64I-NEXT: .LBB46_2: # %atomicrmw.start 3766; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3767; RV64I-NEXT: mv a2, a3 3768; RV64I-NEXT: bgeu s1, a3, .LBB46_1 3769; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3770; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3771; RV64I-NEXT: mv a2, s1 3772; RV64I-NEXT: j .LBB46_1 3773; RV64I-NEXT: .LBB46_4: # %atomicrmw.end 3774; RV64I-NEXT: mv a0, a3 3775; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3776; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3777; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3778; RV64I-NEXT: addi sp, sp, 32 3779; RV64I-NEXT: ret 3780; 3781; RV64IA-LABEL: atomicrmw_umin_i64_monotonic: 3782; RV64IA: # %bb.0: 3783; RV64IA-NEXT: amominu.d a0, a1, (a0) 3784; RV64IA-NEXT: ret 3785 %1 = atomicrmw umin ptr %a, i64 %b monotonic 3786 ret i64 %1 3787} 3788 3789define signext i8 @cmpxchg_i8_monotonic_monotonic_val0(ptr %ptr, i8 signext %cmp, i8 signext %val) nounwind { 3790; RV32I-LABEL: cmpxchg_i8_monotonic_monotonic_val0: 3791; RV32I: # %bb.0: 3792; RV32I-NEXT: addi sp, sp, -16 3793; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3794; RV32I-NEXT: sb a1, 11(sp) 3795; RV32I-NEXT: addi a1, sp, 11 3796; RV32I-NEXT: li a3, 0 3797; RV32I-NEXT: li a4, 0 3798; RV32I-NEXT: call __atomic_compare_exchange_1 3799; RV32I-NEXT: lb a0, 11(sp) 3800; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3801; RV32I-NEXT: addi sp, sp, 16 3802; RV32I-NEXT: ret 3803; 3804; RV32IA-LABEL: cmpxchg_i8_monotonic_monotonic_val0: 3805; RV32IA: # %bb.0: 3806; RV32IA-NEXT: andi a3, a0, -4 3807; RV32IA-NEXT: slli a0, a0, 3 3808; RV32IA-NEXT: li a4, 255 3809; RV32IA-NEXT: andi a1, a1, 255 3810; RV32IA-NEXT: andi a2, a2, 255 3811; RV32IA-NEXT: sll a4, a4, a0 3812; RV32IA-NEXT: sll a1, a1, a0 3813; RV32IA-NEXT: sll a2, a2, a0 3814; RV32IA-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 3815; RV32IA-NEXT: lr.w a5, (a3) 3816; RV32IA-NEXT: and a6, a5, a4 3817; RV32IA-NEXT: bne a6, a1, .LBB47_3 3818; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 3819; RV32IA-NEXT: xor a6, a5, a2 3820; RV32IA-NEXT: and a6, a6, a4 3821; RV32IA-NEXT: xor a6, a5, a6 3822; RV32IA-NEXT: sc.w a6, a6, (a3) 3823; RV32IA-NEXT: bnez a6, .LBB47_1 3824; RV32IA-NEXT: .LBB47_3: 3825; RV32IA-NEXT: srl a0, a5, a0 3826; RV32IA-NEXT: slli a0, a0, 24 3827; RV32IA-NEXT: srai a0, a0, 24 3828; RV32IA-NEXT: ret 3829; 3830; RV64I-LABEL: cmpxchg_i8_monotonic_monotonic_val0: 3831; RV64I: # %bb.0: 3832; RV64I-NEXT: addi sp, sp, -16 3833; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3834; RV64I-NEXT: sb a1, 7(sp) 3835; RV64I-NEXT: addi a1, sp, 7 3836; RV64I-NEXT: li a3, 0 3837; RV64I-NEXT: li a4, 0 3838; RV64I-NEXT: call __atomic_compare_exchange_1 3839; RV64I-NEXT: lb a0, 7(sp) 3840; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3841; RV64I-NEXT: addi sp, sp, 16 3842; RV64I-NEXT: ret 3843; 3844; RV64IA-LABEL: cmpxchg_i8_monotonic_monotonic_val0: 3845; RV64IA: # %bb.0: 3846; RV64IA-NEXT: andi a3, a0, -4 3847; RV64IA-NEXT: slli a0, a0, 3 3848; RV64IA-NEXT: li a4, 255 3849; RV64IA-NEXT: andi a1, a1, 255 3850; RV64IA-NEXT: andi a2, a2, 255 3851; RV64IA-NEXT: sllw a4, a4, a0 3852; RV64IA-NEXT: sllw a1, a1, a0 3853; RV64IA-NEXT: sllw a2, a2, a0 3854; RV64IA-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 3855; RV64IA-NEXT: lr.w a5, (a3) 3856; RV64IA-NEXT: and a6, a5, a4 3857; RV64IA-NEXT: bne a6, a1, .LBB47_3 3858; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 3859; RV64IA-NEXT: xor a6, a5, a2 3860; RV64IA-NEXT: and a6, a6, a4 3861; RV64IA-NEXT: xor a6, a5, a6 3862; RV64IA-NEXT: sc.w a6, a6, (a3) 3863; RV64IA-NEXT: bnez a6, .LBB47_1 3864; RV64IA-NEXT: .LBB47_3: 3865; RV64IA-NEXT: srlw a0, a5, a0 3866; RV64IA-NEXT: slli a0, a0, 56 3867; RV64IA-NEXT: srai a0, a0, 56 3868; RV64IA-NEXT: ret 3869 %1 = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic 3870 %2 = extractvalue { i8, i1 } %1, 0 3871 ret i8 %2 3872} 3873 3874define i1 @cmpxchg_i8_monotonic_monotonic_val1(ptr %ptr, i8 signext %cmp, i8 signext %val) nounwind { 3875; RV32I-LABEL: cmpxchg_i8_monotonic_monotonic_val1: 3876; RV32I: # %bb.0: 3877; RV32I-NEXT: addi sp, sp, -16 3878; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3879; RV32I-NEXT: sb a1, 11(sp) 3880; RV32I-NEXT: addi a1, sp, 11 3881; RV32I-NEXT: li a3, 0 3882; RV32I-NEXT: li a4, 0 3883; RV32I-NEXT: call __atomic_compare_exchange_1 3884; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3885; RV32I-NEXT: addi sp, sp, 16 3886; RV32I-NEXT: ret 3887; 3888; RV32IA-LABEL: cmpxchg_i8_monotonic_monotonic_val1: 3889; RV32IA: # %bb.0: 3890; RV32IA-NEXT: andi a3, a0, -4 3891; RV32IA-NEXT: slli a0, a0, 3 3892; RV32IA-NEXT: li a4, 255 3893; RV32IA-NEXT: andi a1, a1, 255 3894; RV32IA-NEXT: andi a2, a2, 255 3895; RV32IA-NEXT: sll a4, a4, a0 3896; RV32IA-NEXT: sll a1, a1, a0 3897; RV32IA-NEXT: sll a0, a2, a0 3898; RV32IA-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 3899; RV32IA-NEXT: lr.w a2, (a3) 3900; RV32IA-NEXT: and a5, a2, a4 3901; RV32IA-NEXT: bne a5, a1, .LBB48_3 3902; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 3903; RV32IA-NEXT: xor a5, a2, a0 3904; RV32IA-NEXT: and a5, a5, a4 3905; RV32IA-NEXT: xor a5, a2, a5 3906; RV32IA-NEXT: sc.w a5, a5, (a3) 3907; RV32IA-NEXT: bnez a5, .LBB48_1 3908; RV32IA-NEXT: .LBB48_3: 3909; RV32IA-NEXT: and a2, a2, a4 3910; RV32IA-NEXT: xor a1, a1, a2 3911; RV32IA-NEXT: seqz a0, a1 3912; RV32IA-NEXT: ret 3913; 3914; RV64I-LABEL: cmpxchg_i8_monotonic_monotonic_val1: 3915; RV64I: # %bb.0: 3916; RV64I-NEXT: addi sp, sp, -16 3917; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3918; RV64I-NEXT: sb a1, 7(sp) 3919; RV64I-NEXT: addi a1, sp, 7 3920; RV64I-NEXT: li a3, 0 3921; RV64I-NEXT: li a4, 0 3922; RV64I-NEXT: call __atomic_compare_exchange_1 3923; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3924; RV64I-NEXT: addi sp, sp, 16 3925; RV64I-NEXT: ret 3926; 3927; RV64IA-LABEL: cmpxchg_i8_monotonic_monotonic_val1: 3928; RV64IA: # %bb.0: 3929; RV64IA-NEXT: andi a3, a0, -4 3930; RV64IA-NEXT: slli a0, a0, 3 3931; RV64IA-NEXT: li a4, 255 3932; RV64IA-NEXT: andi a1, a1, 255 3933; RV64IA-NEXT: andi a2, a2, 255 3934; RV64IA-NEXT: sllw a4, a4, a0 3935; RV64IA-NEXT: sllw a1, a1, a0 3936; RV64IA-NEXT: sllw a0, a2, a0 3937; RV64IA-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 3938; RV64IA-NEXT: lr.w a2, (a3) 3939; RV64IA-NEXT: and a5, a2, a4 3940; RV64IA-NEXT: bne a5, a1, .LBB48_3 3941; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 3942; RV64IA-NEXT: xor a5, a2, a0 3943; RV64IA-NEXT: and a5, a5, a4 3944; RV64IA-NEXT: xor a5, a2, a5 3945; RV64IA-NEXT: sc.w a5, a5, (a3) 3946; RV64IA-NEXT: bnez a5, .LBB48_1 3947; RV64IA-NEXT: .LBB48_3: 3948; RV64IA-NEXT: and a2, a2, a4 3949; RV64IA-NEXT: xor a1, a1, a2 3950; RV64IA-NEXT: seqz a0, a1 3951; RV64IA-NEXT: ret 3952 %1 = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic 3953 %2 = extractvalue { i8, i1 } %1, 1 3954 ret i1 %2 3955} 3956 3957define signext i16 @cmpxchg_i16_monotonic_monotonic_val0(ptr %ptr, i16 signext %cmp, i16 signext %val) nounwind { 3958; RV32I-LABEL: cmpxchg_i16_monotonic_monotonic_val0: 3959; RV32I: # %bb.0: 3960; RV32I-NEXT: addi sp, sp, -16 3961; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3962; RV32I-NEXT: sh a1, 10(sp) 3963; RV32I-NEXT: addi a1, sp, 10 3964; RV32I-NEXT: li a3, 0 3965; RV32I-NEXT: li a4, 0 3966; RV32I-NEXT: call __atomic_compare_exchange_2 3967; RV32I-NEXT: lh a0, 10(sp) 3968; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3969; RV32I-NEXT: addi sp, sp, 16 3970; RV32I-NEXT: ret 3971; 3972; RV32IA-LABEL: cmpxchg_i16_monotonic_monotonic_val0: 3973; RV32IA: # %bb.0: 3974; RV32IA-NEXT: andi a3, a0, -4 3975; RV32IA-NEXT: slli a0, a0, 3 3976; RV32IA-NEXT: lui a4, 16 3977; RV32IA-NEXT: addi a4, a4, -1 3978; RV32IA-NEXT: sll a5, a4, a0 3979; RV32IA-NEXT: and a1, a1, a4 3980; RV32IA-NEXT: and a2, a2, a4 3981; RV32IA-NEXT: sll a1, a1, a0 3982; RV32IA-NEXT: sll a2, a2, a0 3983; RV32IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 3984; RV32IA-NEXT: lr.w a4, (a3) 3985; RV32IA-NEXT: and a6, a4, a5 3986; RV32IA-NEXT: bne a6, a1, .LBB49_3 3987; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 3988; RV32IA-NEXT: xor a6, a4, a2 3989; RV32IA-NEXT: and a6, a6, a5 3990; RV32IA-NEXT: xor a6, a4, a6 3991; RV32IA-NEXT: sc.w a6, a6, (a3) 3992; RV32IA-NEXT: bnez a6, .LBB49_1 3993; RV32IA-NEXT: .LBB49_3: 3994; RV32IA-NEXT: srl a0, a4, a0 3995; RV32IA-NEXT: slli a0, a0, 16 3996; RV32IA-NEXT: srai a0, a0, 16 3997; RV32IA-NEXT: ret 3998; 3999; RV64I-LABEL: cmpxchg_i16_monotonic_monotonic_val0: 4000; RV64I: # %bb.0: 4001; RV64I-NEXT: addi sp, sp, -16 4002; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4003; RV64I-NEXT: sh a1, 6(sp) 4004; RV64I-NEXT: addi a1, sp, 6 4005; RV64I-NEXT: li a3, 0 4006; RV64I-NEXT: li a4, 0 4007; RV64I-NEXT: call __atomic_compare_exchange_2 4008; RV64I-NEXT: lh a0, 6(sp) 4009; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4010; RV64I-NEXT: addi sp, sp, 16 4011; RV64I-NEXT: ret 4012; 4013; RV64IA-LABEL: cmpxchg_i16_monotonic_monotonic_val0: 4014; RV64IA: # %bb.0: 4015; RV64IA-NEXT: andi a3, a0, -4 4016; RV64IA-NEXT: slli a0, a0, 3 4017; RV64IA-NEXT: lui a4, 16 4018; RV64IA-NEXT: addi a4, a4, -1 4019; RV64IA-NEXT: sllw a5, a4, a0 4020; RV64IA-NEXT: and a1, a1, a4 4021; RV64IA-NEXT: and a2, a2, a4 4022; RV64IA-NEXT: sllw a1, a1, a0 4023; RV64IA-NEXT: sllw a2, a2, a0 4024; RV64IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 4025; RV64IA-NEXT: lr.w a4, (a3) 4026; RV64IA-NEXT: and a6, a4, a5 4027; RV64IA-NEXT: bne a6, a1, .LBB49_3 4028; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 4029; RV64IA-NEXT: xor a6, a4, a2 4030; RV64IA-NEXT: and a6, a6, a5 4031; RV64IA-NEXT: xor a6, a4, a6 4032; RV64IA-NEXT: sc.w a6, a6, (a3) 4033; RV64IA-NEXT: bnez a6, .LBB49_1 4034; RV64IA-NEXT: .LBB49_3: 4035; RV64IA-NEXT: srlw a0, a4, a0 4036; RV64IA-NEXT: slli a0, a0, 48 4037; RV64IA-NEXT: srai a0, a0, 48 4038; RV64IA-NEXT: ret 4039 %1 = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic 4040 %2 = extractvalue { i16, i1 } %1, 0 4041 ret i16 %2 4042} 4043 4044define i1 @cmpxchg_i16_monotonic_monotonic_val1(ptr %ptr, i16 signext %cmp, i16 signext %val) nounwind { 4045; RV32I-LABEL: cmpxchg_i16_monotonic_monotonic_val1: 4046; RV32I: # %bb.0: 4047; RV32I-NEXT: addi sp, sp, -16 4048; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4049; RV32I-NEXT: sh a1, 10(sp) 4050; RV32I-NEXT: addi a1, sp, 10 4051; RV32I-NEXT: li a3, 0 4052; RV32I-NEXT: li a4, 0 4053; RV32I-NEXT: call __atomic_compare_exchange_2 4054; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4055; RV32I-NEXT: addi sp, sp, 16 4056; RV32I-NEXT: ret 4057; 4058; RV32IA-LABEL: cmpxchg_i16_monotonic_monotonic_val1: 4059; RV32IA: # %bb.0: 4060; RV32IA-NEXT: andi a3, a0, -4 4061; RV32IA-NEXT: slli a0, a0, 3 4062; RV32IA-NEXT: lui a4, 16 4063; RV32IA-NEXT: addi a4, a4, -1 4064; RV32IA-NEXT: sll a5, a4, a0 4065; RV32IA-NEXT: and a1, a1, a4 4066; RV32IA-NEXT: and a2, a2, a4 4067; RV32IA-NEXT: sll a1, a1, a0 4068; RV32IA-NEXT: sll a0, a2, a0 4069; RV32IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 4070; RV32IA-NEXT: lr.w a2, (a3) 4071; RV32IA-NEXT: and a4, a2, a5 4072; RV32IA-NEXT: bne a4, a1, .LBB50_3 4073; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 4074; RV32IA-NEXT: xor a4, a2, a0 4075; RV32IA-NEXT: and a4, a4, a5 4076; RV32IA-NEXT: xor a4, a2, a4 4077; RV32IA-NEXT: sc.w a4, a4, (a3) 4078; RV32IA-NEXT: bnez a4, .LBB50_1 4079; RV32IA-NEXT: .LBB50_3: 4080; RV32IA-NEXT: and a2, a2, a5 4081; RV32IA-NEXT: xor a1, a1, a2 4082; RV32IA-NEXT: seqz a0, a1 4083; RV32IA-NEXT: ret 4084; 4085; RV64I-LABEL: cmpxchg_i16_monotonic_monotonic_val1: 4086; RV64I: # %bb.0: 4087; RV64I-NEXT: addi sp, sp, -16 4088; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4089; RV64I-NEXT: sh a1, 6(sp) 4090; RV64I-NEXT: addi a1, sp, 6 4091; RV64I-NEXT: li a3, 0 4092; RV64I-NEXT: li a4, 0 4093; RV64I-NEXT: call __atomic_compare_exchange_2 4094; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4095; RV64I-NEXT: addi sp, sp, 16 4096; RV64I-NEXT: ret 4097; 4098; RV64IA-LABEL: cmpxchg_i16_monotonic_monotonic_val1: 4099; RV64IA: # %bb.0: 4100; RV64IA-NEXT: andi a3, a0, -4 4101; RV64IA-NEXT: slli a0, a0, 3 4102; RV64IA-NEXT: lui a4, 16 4103; RV64IA-NEXT: addi a4, a4, -1 4104; RV64IA-NEXT: sllw a5, a4, a0 4105; RV64IA-NEXT: and a1, a1, a4 4106; RV64IA-NEXT: and a2, a2, a4 4107; RV64IA-NEXT: sllw a1, a1, a0 4108; RV64IA-NEXT: sllw a0, a2, a0 4109; RV64IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 4110; RV64IA-NEXT: lr.w a2, (a3) 4111; RV64IA-NEXT: and a4, a2, a5 4112; RV64IA-NEXT: bne a4, a1, .LBB50_3 4113; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 4114; RV64IA-NEXT: xor a4, a2, a0 4115; RV64IA-NEXT: and a4, a4, a5 4116; RV64IA-NEXT: xor a4, a2, a4 4117; RV64IA-NEXT: sc.w a4, a4, (a3) 4118; RV64IA-NEXT: bnez a4, .LBB50_1 4119; RV64IA-NEXT: .LBB50_3: 4120; RV64IA-NEXT: and a2, a2, a5 4121; RV64IA-NEXT: xor a1, a1, a2 4122; RV64IA-NEXT: seqz a0, a1 4123; RV64IA-NEXT: ret 4124 %1 = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic 4125 %2 = extractvalue { i16, i1 } %1, 1 4126 ret i1 %2 4127} 4128 4129define signext i32 @cmpxchg_i32_monotonic_monotonic_val0(ptr %ptr, i32 signext %cmp, i32 signext %val) nounwind { 4130; RV32I-LABEL: cmpxchg_i32_monotonic_monotonic_val0: 4131; RV32I: # %bb.0: 4132; RV32I-NEXT: addi sp, sp, -16 4133; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4134; RV32I-NEXT: sw a1, 8(sp) 4135; RV32I-NEXT: addi a1, sp, 8 4136; RV32I-NEXT: li a3, 0 4137; RV32I-NEXT: li a4, 0 4138; RV32I-NEXT: call __atomic_compare_exchange_4 4139; RV32I-NEXT: lw a0, 8(sp) 4140; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4141; RV32I-NEXT: addi sp, sp, 16 4142; RV32I-NEXT: ret 4143; 4144; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0: 4145; RV32IA-NOZACAS: # %bb.0: 4146; RV32IA-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 4147; RV32IA-NOZACAS-NEXT: lr.w a3, (a0) 4148; RV32IA-NOZACAS-NEXT: bne a3, a1, .LBB51_3 4149; RV32IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 4150; RV32IA-NOZACAS-NEXT: sc.w a4, a2, (a0) 4151; RV32IA-NOZACAS-NEXT: bnez a4, .LBB51_1 4152; RV32IA-NOZACAS-NEXT: .LBB51_3: 4153; RV32IA-NOZACAS-NEXT: mv a0, a3 4154; RV32IA-NOZACAS-NEXT: ret 4155; 4156; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0: 4157; RV32IA-ZACAS: # %bb.0: 4158; RV32IA-ZACAS-NEXT: amocas.w a1, a2, (a0) 4159; RV32IA-ZACAS-NEXT: mv a0, a1 4160; RV32IA-ZACAS-NEXT: ret 4161; 4162; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val0: 4163; RV64I: # %bb.0: 4164; RV64I-NEXT: addi sp, sp, -16 4165; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4166; RV64I-NEXT: sw a1, 4(sp) 4167; RV64I-NEXT: addi a1, sp, 4 4168; RV64I-NEXT: li a3, 0 4169; RV64I-NEXT: li a4, 0 4170; RV64I-NEXT: call __atomic_compare_exchange_4 4171; RV64I-NEXT: lw a0, 4(sp) 4172; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4173; RV64I-NEXT: addi sp, sp, 16 4174; RV64I-NEXT: ret 4175; 4176; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0: 4177; RV64IA-NOZACAS: # %bb.0: 4178; RV64IA-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 4179; RV64IA-NOZACAS-NEXT: lr.w a3, (a0) 4180; RV64IA-NOZACAS-NEXT: bne a3, a1, .LBB51_3 4181; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 4182; RV64IA-NOZACAS-NEXT: sc.w a4, a2, (a0) 4183; RV64IA-NOZACAS-NEXT: bnez a4, .LBB51_1 4184; RV64IA-NOZACAS-NEXT: .LBB51_3: 4185; RV64IA-NOZACAS-NEXT: mv a0, a3 4186; RV64IA-NOZACAS-NEXT: ret 4187; 4188; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val0: 4189; RV64IA-ZACAS: # %bb.0: 4190; RV64IA-ZACAS-NEXT: amocas.w a1, a2, (a0) 4191; RV64IA-ZACAS-NEXT: mv a0, a1 4192; RV64IA-ZACAS-NEXT: ret 4193 %1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic 4194 %2 = extractvalue { i32, i1 } %1, 0 4195 ret i32 %2 4196} 4197 4198define i1 @cmpxchg_i32_monotonic_monotonic_val1(ptr %ptr, i32 signext %cmp, i32 signext %val) nounwind { 4199; RV32I-LABEL: cmpxchg_i32_monotonic_monotonic_val1: 4200; RV32I: # %bb.0: 4201; RV32I-NEXT: addi sp, sp, -16 4202; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4203; RV32I-NEXT: sw a1, 8(sp) 4204; RV32I-NEXT: addi a1, sp, 8 4205; RV32I-NEXT: li a3, 0 4206; RV32I-NEXT: li a4, 0 4207; RV32I-NEXT: call __atomic_compare_exchange_4 4208; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4209; RV32I-NEXT: addi sp, sp, 16 4210; RV32I-NEXT: ret 4211; 4212; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1: 4213; RV32IA-NOZACAS: # %bb.0: 4214; RV32IA-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 4215; RV32IA-NOZACAS-NEXT: lr.w a3, (a0) 4216; RV32IA-NOZACAS-NEXT: bne a3, a1, .LBB52_3 4217; RV32IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 4218; RV32IA-NOZACAS-NEXT: sc.w a4, a2, (a0) 4219; RV32IA-NOZACAS-NEXT: bnez a4, .LBB52_1 4220; RV32IA-NOZACAS-NEXT: .LBB52_3: 4221; RV32IA-NOZACAS-NEXT: xor a1, a3, a1 4222; RV32IA-NOZACAS-NEXT: seqz a0, a1 4223; RV32IA-NOZACAS-NEXT: ret 4224; 4225; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1: 4226; RV32IA-ZACAS: # %bb.0: 4227; RV32IA-ZACAS-NEXT: mv a3, a1 4228; RV32IA-ZACAS-NEXT: amocas.w a3, a2, (a0) 4229; RV32IA-ZACAS-NEXT: xor a1, a3, a1 4230; RV32IA-ZACAS-NEXT: seqz a0, a1 4231; RV32IA-ZACAS-NEXT: ret 4232; 4233; RV64I-LABEL: cmpxchg_i32_monotonic_monotonic_val1: 4234; RV64I: # %bb.0: 4235; RV64I-NEXT: addi sp, sp, -16 4236; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4237; RV64I-NEXT: sw a1, 4(sp) 4238; RV64I-NEXT: addi a1, sp, 4 4239; RV64I-NEXT: li a3, 0 4240; RV64I-NEXT: li a4, 0 4241; RV64I-NEXT: call __atomic_compare_exchange_4 4242; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4243; RV64I-NEXT: addi sp, sp, 16 4244; RV64I-NEXT: ret 4245; 4246; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1: 4247; RV64IA-NOZACAS: # %bb.0: 4248; RV64IA-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 4249; RV64IA-NOZACAS-NEXT: lr.w a3, (a0) 4250; RV64IA-NOZACAS-NEXT: bne a3, a1, .LBB52_3 4251; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 4252; RV64IA-NOZACAS-NEXT: sc.w a4, a2, (a0) 4253; RV64IA-NOZACAS-NEXT: bnez a4, .LBB52_1 4254; RV64IA-NOZACAS-NEXT: .LBB52_3: 4255; RV64IA-NOZACAS-NEXT: xor a1, a3, a1 4256; RV64IA-NOZACAS-NEXT: seqz a0, a1 4257; RV64IA-NOZACAS-NEXT: ret 4258; 4259; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_monotonic_val1: 4260; RV64IA-ZACAS: # %bb.0: 4261; RV64IA-ZACAS-NEXT: mv a3, a1 4262; RV64IA-ZACAS-NEXT: amocas.w a3, a2, (a0) 4263; RV64IA-ZACAS-NEXT: xor a1, a3, a1 4264; RV64IA-ZACAS-NEXT: seqz a0, a1 4265; RV64IA-ZACAS-NEXT: ret 4266 %1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic 4267 %2 = extractvalue { i32, i1 } %1, 1 4268 ret i1 %2 4269} 4270 4271define signext i32 @atomicrmw_xchg_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4272; RV32I-LABEL: atomicrmw_xchg_i32_monotonic_crossbb: 4273; RV32I: # %bb.0: 4274; RV32I-NEXT: andi a1, a1, 1 4275; RV32I-NEXT: beqz a1, .LBB53_2 4276; RV32I-NEXT: # %bb.1: # %then 4277; RV32I-NEXT: addi sp, sp, -16 4278; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4279; RV32I-NEXT: li a1, 1 4280; RV32I-NEXT: li a2, 0 4281; RV32I-NEXT: call __atomic_exchange_4 4282; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4283; RV32I-NEXT: addi sp, sp, 16 4284; RV32I-NEXT: ret 4285; RV32I-NEXT: .LBB53_2: # %else 4286; RV32I-NEXT: lw a1, 0(a0) 4287; RV32I-NEXT: li a2, 1 4288; RV32I-NEXT: sw a2, 0(a0) 4289; RV32I-NEXT: mv a0, a1 4290; RV32I-NEXT: ret 4291; 4292; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic_crossbb: 4293; RV32IA: # %bb.0: 4294; RV32IA-NEXT: andi a1, a1, 1 4295; RV32IA-NEXT: beqz a1, .LBB53_2 4296; RV32IA-NEXT: # %bb.1: # %then 4297; RV32IA-NEXT: li a1, 1 4298; RV32IA-NEXT: amoswap.w a0, a1, (a0) 4299; RV32IA-NEXT: ret 4300; RV32IA-NEXT: .LBB53_2: # %else 4301; RV32IA-NEXT: mv a1, a0 4302; RV32IA-NEXT: lw a0, 0(a0) 4303; RV32IA-NEXT: li a2, 1 4304; RV32IA-NEXT: sw a2, 0(a1) 4305; RV32IA-NEXT: ret 4306; 4307; RV64I-LABEL: atomicrmw_xchg_i32_monotonic_crossbb: 4308; RV64I: # %bb.0: 4309; RV64I-NEXT: andi a1, a1, 1 4310; RV64I-NEXT: beqz a1, .LBB53_2 4311; RV64I-NEXT: # %bb.1: # %then 4312; RV64I-NEXT: addi sp, sp, -16 4313; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4314; RV64I-NEXT: li a1, 1 4315; RV64I-NEXT: li a2, 0 4316; RV64I-NEXT: call __atomic_exchange_4 4317; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4318; RV64I-NEXT: addi sp, sp, 16 4319; RV64I-NEXT: sext.w a0, a0 4320; RV64I-NEXT: ret 4321; RV64I-NEXT: .LBB53_2: # %else 4322; RV64I-NEXT: lw a1, 0(a0) 4323; RV64I-NEXT: li a2, 1 4324; RV64I-NEXT: sw a2, 0(a0) 4325; RV64I-NEXT: sext.w a0, a1 4326; RV64I-NEXT: ret 4327; 4328; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic_crossbb: 4329; RV64IA: # %bb.0: 4330; RV64IA-NEXT: andi a1, a1, 1 4331; RV64IA-NEXT: beqz a1, .LBB53_2 4332; RV64IA-NEXT: # %bb.1: # %then 4333; RV64IA-NEXT: li a1, 1 4334; RV64IA-NEXT: amoswap.w a0, a1, (a0) 4335; RV64IA-NEXT: ret 4336; RV64IA-NEXT: .LBB53_2: # %else 4337; RV64IA-NEXT: mv a1, a0 4338; RV64IA-NEXT: lw a0, 0(a0) 4339; RV64IA-NEXT: li a2, 1 4340; RV64IA-NEXT: sw a2, 0(a1) 4341; RV64IA-NEXT: ret 4342 br i1 %c, label %then, label %else 4343 4344then: 4345 %1 = atomicrmw xchg ptr %a, i32 1 monotonic 4346 br label %merge 4347 4348else: 4349 %2 = load i32, ptr %a, align 4 4350 store i32 1, ptr %a 4351 br label %merge 4352 4353merge: 4354 %3 = phi i32 [ %1, %then ], [ %2, %else ] 4355 ret i32 %3 4356} 4357 4358define signext i32 @atomicrmw_add_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4359; RV32I-LABEL: atomicrmw_add_i32_monotonic_crossbb: 4360; RV32I: # %bb.0: 4361; RV32I-NEXT: andi a1, a1, 1 4362; RV32I-NEXT: beqz a1, .LBB54_2 4363; RV32I-NEXT: # %bb.1: # %then 4364; RV32I-NEXT: addi sp, sp, -16 4365; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4366; RV32I-NEXT: li a1, 1 4367; RV32I-NEXT: li a2, 0 4368; RV32I-NEXT: call __atomic_fetch_add_4 4369; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4370; RV32I-NEXT: addi sp, sp, 16 4371; RV32I-NEXT: ret 4372; RV32I-NEXT: .LBB54_2: # %else 4373; RV32I-NEXT: lw a1, 0(a0) 4374; RV32I-NEXT: addi a2, a1, 1 4375; RV32I-NEXT: sw a2, 0(a0) 4376; RV32I-NEXT: mv a0, a1 4377; RV32I-NEXT: ret 4378; 4379; RV32IA-LABEL: atomicrmw_add_i32_monotonic_crossbb: 4380; RV32IA: # %bb.0: 4381; RV32IA-NEXT: andi a1, a1, 1 4382; RV32IA-NEXT: beqz a1, .LBB54_2 4383; RV32IA-NEXT: # %bb.1: # %then 4384; RV32IA-NEXT: li a1, 1 4385; RV32IA-NEXT: amoadd.w a0, a1, (a0) 4386; RV32IA-NEXT: ret 4387; RV32IA-NEXT: .LBB54_2: # %else 4388; RV32IA-NEXT: mv a1, a0 4389; RV32IA-NEXT: lw a0, 0(a0) 4390; RV32IA-NEXT: addi a2, a0, 1 4391; RV32IA-NEXT: sw a2, 0(a1) 4392; RV32IA-NEXT: ret 4393; 4394; RV64I-LABEL: atomicrmw_add_i32_monotonic_crossbb: 4395; RV64I: # %bb.0: 4396; RV64I-NEXT: andi a1, a1, 1 4397; RV64I-NEXT: beqz a1, .LBB54_2 4398; RV64I-NEXT: # %bb.1: # %then 4399; RV64I-NEXT: addi sp, sp, -16 4400; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4401; RV64I-NEXT: li a1, 1 4402; RV64I-NEXT: li a2, 0 4403; RV64I-NEXT: call __atomic_fetch_add_4 4404; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4405; RV64I-NEXT: addi sp, sp, 16 4406; RV64I-NEXT: sext.w a0, a0 4407; RV64I-NEXT: ret 4408; RV64I-NEXT: .LBB54_2: # %else 4409; RV64I-NEXT: lw a1, 0(a0) 4410; RV64I-NEXT: addi a2, a1, 1 4411; RV64I-NEXT: sw a2, 0(a0) 4412; RV64I-NEXT: sext.w a0, a1 4413; RV64I-NEXT: ret 4414; 4415; RV64IA-LABEL: atomicrmw_add_i32_monotonic_crossbb: 4416; RV64IA: # %bb.0: 4417; RV64IA-NEXT: andi a1, a1, 1 4418; RV64IA-NEXT: beqz a1, .LBB54_2 4419; RV64IA-NEXT: # %bb.1: # %then 4420; RV64IA-NEXT: li a1, 1 4421; RV64IA-NEXT: amoadd.w a0, a1, (a0) 4422; RV64IA-NEXT: ret 4423; RV64IA-NEXT: .LBB54_2: # %else 4424; RV64IA-NEXT: mv a1, a0 4425; RV64IA-NEXT: lw a0, 0(a0) 4426; RV64IA-NEXT: addi a2, a0, 1 4427; RV64IA-NEXT: sw a2, 0(a1) 4428; RV64IA-NEXT: ret 4429 br i1 %c, label %then, label %else 4430 4431then: 4432 %1 = atomicrmw add ptr %a, i32 1 monotonic 4433 br label %merge 4434 4435else: 4436 %2 = load i32, ptr %a, align 4 4437 %3 = add i32 %2, 1 4438 store i32 %3, ptr %a 4439 br label %merge 4440 4441merge: 4442 %4 = phi i32 [ %1, %then ], [ %2, %else ] 4443 ret i32 %4 4444} 4445 4446define signext i32 @atomicrmw_sub_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4447; RV32I-LABEL: atomicrmw_sub_i32_monotonic_crossbb: 4448; RV32I: # %bb.0: 4449; RV32I-NEXT: andi a1, a1, 1 4450; RV32I-NEXT: beqz a1, .LBB55_2 4451; RV32I-NEXT: # %bb.1: # %then 4452; RV32I-NEXT: addi sp, sp, -16 4453; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4454; RV32I-NEXT: li a1, 1 4455; RV32I-NEXT: li a2, 0 4456; RV32I-NEXT: call __atomic_fetch_sub_4 4457; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4458; RV32I-NEXT: addi sp, sp, 16 4459; RV32I-NEXT: ret 4460; RV32I-NEXT: .LBB55_2: # %else 4461; RV32I-NEXT: lw a1, 0(a0) 4462; RV32I-NEXT: addi a2, a1, -1 4463; RV32I-NEXT: sw a2, 0(a0) 4464; RV32I-NEXT: mv a0, a1 4465; RV32I-NEXT: ret 4466; 4467; RV32IA-LABEL: atomicrmw_sub_i32_monotonic_crossbb: 4468; RV32IA: # %bb.0: 4469; RV32IA-NEXT: andi a1, a1, 1 4470; RV32IA-NEXT: beqz a1, .LBB55_2 4471; RV32IA-NEXT: # %bb.1: # %then 4472; RV32IA-NEXT: li a1, -1 4473; RV32IA-NEXT: amoadd.w a0, a1, (a0) 4474; RV32IA-NEXT: ret 4475; RV32IA-NEXT: .LBB55_2: # %else 4476; RV32IA-NEXT: mv a1, a0 4477; RV32IA-NEXT: lw a0, 0(a0) 4478; RV32IA-NEXT: addi a2, a0, -1 4479; RV32IA-NEXT: sw a2, 0(a1) 4480; RV32IA-NEXT: ret 4481; 4482; RV64I-LABEL: atomicrmw_sub_i32_monotonic_crossbb: 4483; RV64I: # %bb.0: 4484; RV64I-NEXT: andi a1, a1, 1 4485; RV64I-NEXT: beqz a1, .LBB55_2 4486; RV64I-NEXT: # %bb.1: # %then 4487; RV64I-NEXT: addi sp, sp, -16 4488; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4489; RV64I-NEXT: li a1, 1 4490; RV64I-NEXT: li a2, 0 4491; RV64I-NEXT: call __atomic_fetch_sub_4 4492; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4493; RV64I-NEXT: addi sp, sp, 16 4494; RV64I-NEXT: sext.w a0, a0 4495; RV64I-NEXT: ret 4496; RV64I-NEXT: .LBB55_2: # %else 4497; RV64I-NEXT: lw a1, 0(a0) 4498; RV64I-NEXT: addi a2, a1, -1 4499; RV64I-NEXT: sw a2, 0(a0) 4500; RV64I-NEXT: sext.w a0, a1 4501; RV64I-NEXT: ret 4502; 4503; RV64IA-LABEL: atomicrmw_sub_i32_monotonic_crossbb: 4504; RV64IA: # %bb.0: 4505; RV64IA-NEXT: andi a1, a1, 1 4506; RV64IA-NEXT: beqz a1, .LBB55_2 4507; RV64IA-NEXT: # %bb.1: # %then 4508; RV64IA-NEXT: li a1, -1 4509; RV64IA-NEXT: amoadd.w a0, a1, (a0) 4510; RV64IA-NEXT: ret 4511; RV64IA-NEXT: .LBB55_2: # %else 4512; RV64IA-NEXT: mv a1, a0 4513; RV64IA-NEXT: lw a0, 0(a0) 4514; RV64IA-NEXT: addi a2, a0, -1 4515; RV64IA-NEXT: sw a2, 0(a1) 4516; RV64IA-NEXT: ret 4517 br i1 %c, label %then, label %else 4518 4519then: 4520 %1 = atomicrmw sub ptr %a, i32 1 monotonic 4521 br label %merge 4522 4523else: 4524 %2 = load i32, ptr %a, align 4 4525 %3 = sub i32 %2, 1 4526 store i32 %3, ptr %a 4527 br label %merge 4528 4529merge: 4530 %4 = phi i32 [ %1, %then ], [ %2, %else ] 4531 ret i32 %4 4532} 4533 4534define signext i32 @atomicrmw_and_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4535; RV32I-LABEL: atomicrmw_and_i32_monotonic_crossbb: 4536; RV32I: # %bb.0: 4537; RV32I-NEXT: andi a1, a1, 1 4538; RV32I-NEXT: beqz a1, .LBB56_2 4539; RV32I-NEXT: # %bb.1: # %then 4540; RV32I-NEXT: addi sp, sp, -16 4541; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4542; RV32I-NEXT: li a1, 1 4543; RV32I-NEXT: li a2, 0 4544; RV32I-NEXT: call __atomic_fetch_and_4 4545; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4546; RV32I-NEXT: addi sp, sp, 16 4547; RV32I-NEXT: ret 4548; RV32I-NEXT: .LBB56_2: # %else 4549; RV32I-NEXT: lw a1, 0(a0) 4550; RV32I-NEXT: andi a2, a1, 1 4551; RV32I-NEXT: sw a2, 0(a0) 4552; RV32I-NEXT: mv a0, a1 4553; RV32I-NEXT: ret 4554; 4555; RV32IA-LABEL: atomicrmw_and_i32_monotonic_crossbb: 4556; RV32IA: # %bb.0: 4557; RV32IA-NEXT: andi a1, a1, 1 4558; RV32IA-NEXT: beqz a1, .LBB56_2 4559; RV32IA-NEXT: # %bb.1: # %then 4560; RV32IA-NEXT: li a1, 1 4561; RV32IA-NEXT: amoand.w a0, a1, (a0) 4562; RV32IA-NEXT: ret 4563; RV32IA-NEXT: .LBB56_2: # %else 4564; RV32IA-NEXT: mv a1, a0 4565; RV32IA-NEXT: lw a0, 0(a0) 4566; RV32IA-NEXT: andi a2, a0, 1 4567; RV32IA-NEXT: sw a2, 0(a1) 4568; RV32IA-NEXT: ret 4569; 4570; RV64I-LABEL: atomicrmw_and_i32_monotonic_crossbb: 4571; RV64I: # %bb.0: 4572; RV64I-NEXT: andi a1, a1, 1 4573; RV64I-NEXT: beqz a1, .LBB56_2 4574; RV64I-NEXT: # %bb.1: # %then 4575; RV64I-NEXT: addi sp, sp, -16 4576; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4577; RV64I-NEXT: li a1, 1 4578; RV64I-NEXT: li a2, 0 4579; RV64I-NEXT: call __atomic_fetch_and_4 4580; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4581; RV64I-NEXT: addi sp, sp, 16 4582; RV64I-NEXT: sext.w a0, a0 4583; RV64I-NEXT: ret 4584; RV64I-NEXT: .LBB56_2: # %else 4585; RV64I-NEXT: lwu a1, 0(a0) 4586; RV64I-NEXT: andi a2, a1, 1 4587; RV64I-NEXT: sw a2, 0(a0) 4588; RV64I-NEXT: sext.w a0, a1 4589; RV64I-NEXT: ret 4590; 4591; RV64IA-LABEL: atomicrmw_and_i32_monotonic_crossbb: 4592; RV64IA: # %bb.0: 4593; RV64IA-NEXT: andi a1, a1, 1 4594; RV64IA-NEXT: beqz a1, .LBB56_2 4595; RV64IA-NEXT: # %bb.1: # %then 4596; RV64IA-NEXT: li a1, 1 4597; RV64IA-NEXT: amoand.w a0, a1, (a0) 4598; RV64IA-NEXT: ret 4599; RV64IA-NEXT: .LBB56_2: # %else 4600; RV64IA-NEXT: mv a1, a0 4601; RV64IA-NEXT: lw a0, 0(a0) 4602; RV64IA-NEXT: andi a2, a0, 1 4603; RV64IA-NEXT: sw a2, 0(a1) 4604; RV64IA-NEXT: ret 4605 br i1 %c, label %then, label %else 4606 4607then: 4608 %1 = atomicrmw and ptr %a, i32 1 monotonic 4609 br label %merge 4610 4611else: 4612 %2 = load i32, ptr %a, align 4 4613 %3 = and i32 %2, 1 4614 store i32 %3, ptr %a 4615 br label %merge 4616 4617merge: 4618 %4 = phi i32 [ %1, %then ], [ %2, %else ] 4619 ret i32 %4 4620} 4621 4622define signext i32 @atomicrmw_nand_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4623; RV32I-LABEL: atomicrmw_nand_i32_monotonic_crossbb: 4624; RV32I: # %bb.0: 4625; RV32I-NEXT: andi a1, a1, 1 4626; RV32I-NEXT: beqz a1, .LBB57_2 4627; RV32I-NEXT: # %bb.1: # %then 4628; RV32I-NEXT: addi sp, sp, -16 4629; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4630; RV32I-NEXT: li a1, 1 4631; RV32I-NEXT: li a2, 0 4632; RV32I-NEXT: call __atomic_fetch_nand_4 4633; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4634; RV32I-NEXT: addi sp, sp, 16 4635; RV32I-NEXT: ret 4636; RV32I-NEXT: .LBB57_2: # %else 4637; RV32I-NEXT: lw a1, 0(a0) 4638; RV32I-NEXT: andi a2, a1, 1 4639; RV32I-NEXT: sw a2, 0(a0) 4640; RV32I-NEXT: mv a0, a1 4641; RV32I-NEXT: ret 4642; 4643; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb: 4644; RV32IA-NOZACAS: # %bb.0: 4645; RV32IA-NOZACAS-NEXT: andi a2, a1, 1 4646; RV32IA-NOZACAS-NEXT: mv a1, a0 4647; RV32IA-NOZACAS-NEXT: beqz a2, .LBB57_2 4648; RV32IA-NOZACAS-NEXT: # %bb.1: # %then 4649; RV32IA-NOZACAS-NEXT: li a2, 1 4650; RV32IA-NOZACAS-NEXT: .LBB57_3: # %then 4651; RV32IA-NOZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4652; RV32IA-NOZACAS-NEXT: lr.w a0, (a1) 4653; RV32IA-NOZACAS-NEXT: and a3, a0, a2 4654; RV32IA-NOZACAS-NEXT: not a3, a3 4655; RV32IA-NOZACAS-NEXT: sc.w a3, a3, (a1) 4656; RV32IA-NOZACAS-NEXT: bnez a3, .LBB57_3 4657; RV32IA-NOZACAS-NEXT: # %bb.4: # %then 4658; RV32IA-NOZACAS-NEXT: ret 4659; RV32IA-NOZACAS-NEXT: .LBB57_2: # %else 4660; RV32IA-NOZACAS-NEXT: lw a0, 0(a1) 4661; RV32IA-NOZACAS-NEXT: andi a2, a0, 1 4662; RV32IA-NOZACAS-NEXT: sw a2, 0(a1) 4663; RV32IA-NOZACAS-NEXT: ret 4664; 4665; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb: 4666; RV32IA-ZACAS: # %bb.0: 4667; RV32IA-ZACAS-NEXT: andi a1, a1, 1 4668; RV32IA-ZACAS-NEXT: beqz a1, .LBB57_4 4669; RV32IA-ZACAS-NEXT: # %bb.1: # %then 4670; RV32IA-ZACAS-NEXT: lw a1, 0(a0) 4671; RV32IA-ZACAS-NEXT: .LBB57_2: # %atomicrmw.start 4672; RV32IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4673; RV32IA-ZACAS-NEXT: mv a2, a1 4674; RV32IA-ZACAS-NEXT: not a3, a1 4675; RV32IA-ZACAS-NEXT: ori a3, a3, -2 4676; RV32IA-ZACAS-NEXT: amocas.w a1, a3, (a0) 4677; RV32IA-ZACAS-NEXT: bne a1, a2, .LBB57_2 4678; RV32IA-ZACAS-NEXT: # %bb.3: # %merge 4679; RV32IA-ZACAS-NEXT: mv a0, a1 4680; RV32IA-ZACAS-NEXT: ret 4681; RV32IA-ZACAS-NEXT: .LBB57_4: # %else 4682; RV32IA-ZACAS-NEXT: lw a1, 0(a0) 4683; RV32IA-ZACAS-NEXT: andi a2, a1, 1 4684; RV32IA-ZACAS-NEXT: sw a2, 0(a0) 4685; RV32IA-ZACAS-NEXT: mv a0, a1 4686; RV32IA-ZACAS-NEXT: ret 4687; 4688; RV64I-LABEL: atomicrmw_nand_i32_monotonic_crossbb: 4689; RV64I: # %bb.0: 4690; RV64I-NEXT: andi a1, a1, 1 4691; RV64I-NEXT: beqz a1, .LBB57_2 4692; RV64I-NEXT: # %bb.1: # %then 4693; RV64I-NEXT: addi sp, sp, -16 4694; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4695; RV64I-NEXT: li a1, 1 4696; RV64I-NEXT: li a2, 0 4697; RV64I-NEXT: call __atomic_fetch_nand_4 4698; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4699; RV64I-NEXT: addi sp, sp, 16 4700; RV64I-NEXT: sext.w a0, a0 4701; RV64I-NEXT: ret 4702; RV64I-NEXT: .LBB57_2: # %else 4703; RV64I-NEXT: lwu a1, 0(a0) 4704; RV64I-NEXT: andi a2, a1, 1 4705; RV64I-NEXT: sw a2, 0(a0) 4706; RV64I-NEXT: sext.w a0, a1 4707; RV64I-NEXT: ret 4708; 4709; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb: 4710; RV64IA-NOZACAS: # %bb.0: 4711; RV64IA-NOZACAS-NEXT: andi a2, a1, 1 4712; RV64IA-NOZACAS-NEXT: mv a1, a0 4713; RV64IA-NOZACAS-NEXT: beqz a2, .LBB57_2 4714; RV64IA-NOZACAS-NEXT: # %bb.1: # %then 4715; RV64IA-NOZACAS-NEXT: li a2, 1 4716; RV64IA-NOZACAS-NEXT: .LBB57_3: # %then 4717; RV64IA-NOZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4718; RV64IA-NOZACAS-NEXT: lr.w a0, (a1) 4719; RV64IA-NOZACAS-NEXT: and a3, a0, a2 4720; RV64IA-NOZACAS-NEXT: not a3, a3 4721; RV64IA-NOZACAS-NEXT: sc.w a3, a3, (a1) 4722; RV64IA-NOZACAS-NEXT: bnez a3, .LBB57_3 4723; RV64IA-NOZACAS-NEXT: # %bb.4: # %then 4724; RV64IA-NOZACAS-NEXT: ret 4725; RV64IA-NOZACAS-NEXT: .LBB57_2: # %else 4726; RV64IA-NOZACAS-NEXT: lw a0, 0(a1) 4727; RV64IA-NOZACAS-NEXT: andi a2, a0, 1 4728; RV64IA-NOZACAS-NEXT: sw a2, 0(a1) 4729; RV64IA-NOZACAS-NEXT: ret 4730; 4731; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic_crossbb: 4732; RV64IA-ZACAS: # %bb.0: 4733; RV64IA-ZACAS-NEXT: andi a1, a1, 1 4734; RV64IA-ZACAS-NEXT: beqz a1, .LBB57_4 4735; RV64IA-ZACAS-NEXT: # %bb.1: # %then 4736; RV64IA-ZACAS-NEXT: lw a1, 0(a0) 4737; RV64IA-ZACAS-NEXT: .LBB57_2: # %atomicrmw.start 4738; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4739; RV64IA-ZACAS-NEXT: mv a2, a1 4740; RV64IA-ZACAS-NEXT: not a3, a1 4741; RV64IA-ZACAS-NEXT: ori a3, a3, -2 4742; RV64IA-ZACAS-NEXT: amocas.w a1, a3, (a0) 4743; RV64IA-ZACAS-NEXT: bne a1, a2, .LBB57_2 4744; RV64IA-ZACAS-NEXT: # %bb.3: # %merge 4745; RV64IA-ZACAS-NEXT: mv a0, a1 4746; RV64IA-ZACAS-NEXT: ret 4747; RV64IA-ZACAS-NEXT: .LBB57_4: # %else 4748; RV64IA-ZACAS-NEXT: lw a1, 0(a0) 4749; RV64IA-ZACAS-NEXT: andi a2, a1, 1 4750; RV64IA-ZACAS-NEXT: sw a2, 0(a0) 4751; RV64IA-ZACAS-NEXT: mv a0, a1 4752; RV64IA-ZACAS-NEXT: ret 4753 br i1 %c, label %then, label %else 4754 4755then: 4756 %1 = atomicrmw nand ptr %a, i32 1 monotonic 4757 br label %merge 4758 4759else: 4760 %2 = load i32, ptr %a, align 4 4761 %3 = and i32 %2, 1 4762 store i32 %3, ptr %a 4763 br label %merge 4764 4765merge: 4766 %4 = phi i32 [ %1, %then ], [ %2, %else ] 4767 ret i32 %4 4768} 4769 4770define signext i32 @atomicrmw_or_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4771; RV32I-LABEL: atomicrmw_or_i32_monotonic_crossbb: 4772; RV32I: # %bb.0: 4773; RV32I-NEXT: andi a1, a1, 1 4774; RV32I-NEXT: beqz a1, .LBB58_2 4775; RV32I-NEXT: # %bb.1: # %then 4776; RV32I-NEXT: addi sp, sp, -16 4777; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4778; RV32I-NEXT: li a1, 1 4779; RV32I-NEXT: li a2, 0 4780; RV32I-NEXT: call __atomic_fetch_or_4 4781; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4782; RV32I-NEXT: addi sp, sp, 16 4783; RV32I-NEXT: ret 4784; RV32I-NEXT: .LBB58_2: # %else 4785; RV32I-NEXT: lw a1, 0(a0) 4786; RV32I-NEXT: ori a2, a1, 1 4787; RV32I-NEXT: sw a2, 0(a0) 4788; RV32I-NEXT: mv a0, a1 4789; RV32I-NEXT: ret 4790; 4791; RV32IA-LABEL: atomicrmw_or_i32_monotonic_crossbb: 4792; RV32IA: # %bb.0: 4793; RV32IA-NEXT: andi a1, a1, 1 4794; RV32IA-NEXT: beqz a1, .LBB58_2 4795; RV32IA-NEXT: # %bb.1: # %then 4796; RV32IA-NEXT: li a1, 1 4797; RV32IA-NEXT: amoor.w a0, a1, (a0) 4798; RV32IA-NEXT: ret 4799; RV32IA-NEXT: .LBB58_2: # %else 4800; RV32IA-NEXT: mv a1, a0 4801; RV32IA-NEXT: lw a0, 0(a0) 4802; RV32IA-NEXT: ori a2, a0, 1 4803; RV32IA-NEXT: sw a2, 0(a1) 4804; RV32IA-NEXT: ret 4805; 4806; RV64I-LABEL: atomicrmw_or_i32_monotonic_crossbb: 4807; RV64I: # %bb.0: 4808; RV64I-NEXT: andi a1, a1, 1 4809; RV64I-NEXT: beqz a1, .LBB58_2 4810; RV64I-NEXT: # %bb.1: # %then 4811; RV64I-NEXT: addi sp, sp, -16 4812; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4813; RV64I-NEXT: li a1, 1 4814; RV64I-NEXT: li a2, 0 4815; RV64I-NEXT: call __atomic_fetch_or_4 4816; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4817; RV64I-NEXT: addi sp, sp, 16 4818; RV64I-NEXT: sext.w a0, a0 4819; RV64I-NEXT: ret 4820; RV64I-NEXT: .LBB58_2: # %else 4821; RV64I-NEXT: lw a1, 0(a0) 4822; RV64I-NEXT: ori a2, a1, 1 4823; RV64I-NEXT: sw a2, 0(a0) 4824; RV64I-NEXT: sext.w a0, a1 4825; RV64I-NEXT: ret 4826; 4827; RV64IA-LABEL: atomicrmw_or_i32_monotonic_crossbb: 4828; RV64IA: # %bb.0: 4829; RV64IA-NEXT: andi a1, a1, 1 4830; RV64IA-NEXT: beqz a1, .LBB58_2 4831; RV64IA-NEXT: # %bb.1: # %then 4832; RV64IA-NEXT: li a1, 1 4833; RV64IA-NEXT: amoor.w a0, a1, (a0) 4834; RV64IA-NEXT: ret 4835; RV64IA-NEXT: .LBB58_2: # %else 4836; RV64IA-NEXT: mv a1, a0 4837; RV64IA-NEXT: lw a0, 0(a0) 4838; RV64IA-NEXT: ori a2, a0, 1 4839; RV64IA-NEXT: sw a2, 0(a1) 4840; RV64IA-NEXT: ret 4841 br i1 %c, label %then, label %else 4842 4843then: 4844 %1 = atomicrmw or ptr %a, i32 1 monotonic 4845 br label %merge 4846 4847else: 4848 %2 = load i32, ptr %a, align 4 4849 %3 = or i32 %2, 1 4850 store i32 %3, ptr %a 4851 br label %merge 4852 4853merge: 4854 %4 = phi i32 [ %1, %then ], [ %2, %else ] 4855 ret i32 %4 4856} 4857 4858define signext i32 @atomicrmw_xor_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4859; RV32I-LABEL: atomicrmw_xor_i32_monotonic_crossbb: 4860; RV32I: # %bb.0: 4861; RV32I-NEXT: andi a1, a1, 1 4862; RV32I-NEXT: beqz a1, .LBB59_2 4863; RV32I-NEXT: # %bb.1: # %then 4864; RV32I-NEXT: addi sp, sp, -16 4865; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4866; RV32I-NEXT: li a1, 1 4867; RV32I-NEXT: li a2, 0 4868; RV32I-NEXT: call __atomic_fetch_xor_4 4869; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4870; RV32I-NEXT: addi sp, sp, 16 4871; RV32I-NEXT: ret 4872; RV32I-NEXT: .LBB59_2: # %else 4873; RV32I-NEXT: lw a1, 0(a0) 4874; RV32I-NEXT: xori a2, a1, 1 4875; RV32I-NEXT: sw a2, 0(a0) 4876; RV32I-NEXT: mv a0, a1 4877; RV32I-NEXT: ret 4878; 4879; RV32IA-LABEL: atomicrmw_xor_i32_monotonic_crossbb: 4880; RV32IA: # %bb.0: 4881; RV32IA-NEXT: andi a1, a1, 1 4882; RV32IA-NEXT: beqz a1, .LBB59_2 4883; RV32IA-NEXT: # %bb.1: # %then 4884; RV32IA-NEXT: li a1, 1 4885; RV32IA-NEXT: amoxor.w a0, a1, (a0) 4886; RV32IA-NEXT: ret 4887; RV32IA-NEXT: .LBB59_2: # %else 4888; RV32IA-NEXT: mv a1, a0 4889; RV32IA-NEXT: lw a0, 0(a0) 4890; RV32IA-NEXT: xori a2, a0, 1 4891; RV32IA-NEXT: sw a2, 0(a1) 4892; RV32IA-NEXT: ret 4893; 4894; RV64I-LABEL: atomicrmw_xor_i32_monotonic_crossbb: 4895; RV64I: # %bb.0: 4896; RV64I-NEXT: andi a1, a1, 1 4897; RV64I-NEXT: beqz a1, .LBB59_2 4898; RV64I-NEXT: # %bb.1: # %then 4899; RV64I-NEXT: addi sp, sp, -16 4900; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4901; RV64I-NEXT: li a1, 1 4902; RV64I-NEXT: li a2, 0 4903; RV64I-NEXT: call __atomic_fetch_xor_4 4904; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4905; RV64I-NEXT: addi sp, sp, 16 4906; RV64I-NEXT: sext.w a0, a0 4907; RV64I-NEXT: ret 4908; RV64I-NEXT: .LBB59_2: # %else 4909; RV64I-NEXT: lw a1, 0(a0) 4910; RV64I-NEXT: xori a2, a1, 1 4911; RV64I-NEXT: sw a2, 0(a0) 4912; RV64I-NEXT: sext.w a0, a1 4913; RV64I-NEXT: ret 4914; 4915; RV64IA-LABEL: atomicrmw_xor_i32_monotonic_crossbb: 4916; RV64IA: # %bb.0: 4917; RV64IA-NEXT: andi a1, a1, 1 4918; RV64IA-NEXT: beqz a1, .LBB59_2 4919; RV64IA-NEXT: # %bb.1: # %then 4920; RV64IA-NEXT: li a1, 1 4921; RV64IA-NEXT: amoxor.w a0, a1, (a0) 4922; RV64IA-NEXT: ret 4923; RV64IA-NEXT: .LBB59_2: # %else 4924; RV64IA-NEXT: mv a1, a0 4925; RV64IA-NEXT: lw a0, 0(a0) 4926; RV64IA-NEXT: xori a2, a0, 1 4927; RV64IA-NEXT: sw a2, 0(a1) 4928; RV64IA-NEXT: ret 4929 br i1 %c, label %then, label %else 4930 4931then: 4932 %1 = atomicrmw xor ptr %a, i32 1 monotonic 4933 br label %merge 4934 4935else: 4936 %2 = load i32, ptr %a, align 4 4937 %3 = xor i32 %2, 1 4938 store i32 %3, ptr %a 4939 br label %merge 4940 4941merge: 4942 %4 = phi i32 [ %1, %then ], [ %2, %else ] 4943 ret i32 %4 4944} 4945 4946define signext i32 @atomicrmw_max_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 4947; RV32I-LABEL: atomicrmw_max_i32_monotonic_crossbb: 4948; RV32I: # %bb.0: 4949; RV32I-NEXT: addi sp, sp, -16 4950; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4951; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 4952; RV32I-NEXT: andi a1, a1, 1 4953; RV32I-NEXT: mv s0, a0 4954; RV32I-NEXT: beqz a1, .LBB60_5 4955; RV32I-NEXT: # %bb.1: # %then 4956; RV32I-NEXT: lw a1, 0(s0) 4957; RV32I-NEXT: j .LBB60_3 4958; RV32I-NEXT: .LBB60_2: # %atomicrmw.start 4959; RV32I-NEXT: # in Loop: Header=BB60_3 Depth=1 4960; RV32I-NEXT: sw a1, 4(sp) 4961; RV32I-NEXT: addi a1, sp, 4 4962; RV32I-NEXT: mv a0, s0 4963; RV32I-NEXT: li a3, 0 4964; RV32I-NEXT: li a4, 0 4965; RV32I-NEXT: call __atomic_compare_exchange_4 4966; RV32I-NEXT: lw a1, 4(sp) 4967; RV32I-NEXT: bnez a0, .LBB60_8 4968; RV32I-NEXT: .LBB60_3: # %atomicrmw.start 4969; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 4970; RV32I-NEXT: mv a2, a1 4971; RV32I-NEXT: bgtz a1, .LBB60_2 4972; RV32I-NEXT: # %bb.4: # %atomicrmw.start 4973; RV32I-NEXT: # in Loop: Header=BB60_3 Depth=1 4974; RV32I-NEXT: li a2, 1 4975; RV32I-NEXT: j .LBB60_2 4976; RV32I-NEXT: .LBB60_5: # %else 4977; RV32I-NEXT: lw a1, 0(s0) 4978; RV32I-NEXT: mv a0, a1 4979; RV32I-NEXT: bgtz a1, .LBB60_7 4980; RV32I-NEXT: # %bb.6: # %else 4981; RV32I-NEXT: li a0, 1 4982; RV32I-NEXT: .LBB60_7: # %else 4983; RV32I-NEXT: sw a0, 0(s0) 4984; RV32I-NEXT: .LBB60_8: # %merge 4985; RV32I-NEXT: mv a0, a1 4986; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4987; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 4988; RV32I-NEXT: addi sp, sp, 16 4989; RV32I-NEXT: ret 4990; 4991; RV32IA-LABEL: atomicrmw_max_i32_monotonic_crossbb: 4992; RV32IA: # %bb.0: 4993; RV32IA-NEXT: andi a2, a1, 1 4994; RV32IA-NEXT: mv a1, a0 4995; RV32IA-NEXT: beqz a2, .LBB60_2 4996; RV32IA-NEXT: # %bb.1: # %then 4997; RV32IA-NEXT: li a0, 1 4998; RV32IA-NEXT: amomax.w a0, a0, (a1) 4999; RV32IA-NEXT: ret 5000; RV32IA-NEXT: .LBB60_2: # %else 5001; RV32IA-NEXT: lw a0, 0(a1) 5002; RV32IA-NEXT: mv a2, a0 5003; RV32IA-NEXT: bgtz a0, .LBB60_4 5004; RV32IA-NEXT: # %bb.3: # %else 5005; RV32IA-NEXT: li a2, 1 5006; RV32IA-NEXT: .LBB60_4: # %else 5007; RV32IA-NEXT: sw a2, 0(a1) 5008; RV32IA-NEXT: ret 5009; 5010; RV64I-LABEL: atomicrmw_max_i32_monotonic_crossbb: 5011; RV64I: # %bb.0: 5012; RV64I-NEXT: addi sp, sp, -32 5013; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5014; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5015; RV64I-NEXT: andi a1, a1, 1 5016; RV64I-NEXT: mv s0, a0 5017; RV64I-NEXT: beqz a1, .LBB60_5 5018; RV64I-NEXT: # %bb.1: # %then 5019; RV64I-NEXT: lw a1, 0(s0) 5020; RV64I-NEXT: j .LBB60_3 5021; RV64I-NEXT: .LBB60_2: # %atomicrmw.start 5022; RV64I-NEXT: # in Loop: Header=BB60_3 Depth=1 5023; RV64I-NEXT: sw a1, 12(sp) 5024; RV64I-NEXT: addi a1, sp, 12 5025; RV64I-NEXT: mv a0, s0 5026; RV64I-NEXT: li a3, 0 5027; RV64I-NEXT: li a4, 0 5028; RV64I-NEXT: call __atomic_compare_exchange_4 5029; RV64I-NEXT: lw a1, 12(sp) 5030; RV64I-NEXT: bnez a0, .LBB60_8 5031; RV64I-NEXT: .LBB60_3: # %atomicrmw.start 5032; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5033; RV64I-NEXT: li a0, 1 5034; RV64I-NEXT: mv a2, a1 5035; RV64I-NEXT: blt a0, a1, .LBB60_2 5036; RV64I-NEXT: # %bb.4: # %atomicrmw.start 5037; RV64I-NEXT: # in Loop: Header=BB60_3 Depth=1 5038; RV64I-NEXT: li a2, 1 5039; RV64I-NEXT: j .LBB60_2 5040; RV64I-NEXT: .LBB60_5: # %else 5041; RV64I-NEXT: lw a1, 0(s0) 5042; RV64I-NEXT: mv a0, a1 5043; RV64I-NEXT: bgtz a1, .LBB60_7 5044; RV64I-NEXT: # %bb.6: # %else 5045; RV64I-NEXT: li a0, 1 5046; RV64I-NEXT: .LBB60_7: # %else 5047; RV64I-NEXT: sw a0, 0(s0) 5048; RV64I-NEXT: .LBB60_8: # %merge 5049; RV64I-NEXT: mv a0, a1 5050; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5051; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5052; RV64I-NEXT: addi sp, sp, 32 5053; RV64I-NEXT: ret 5054; 5055; RV64IA-LABEL: atomicrmw_max_i32_monotonic_crossbb: 5056; RV64IA: # %bb.0: 5057; RV64IA-NEXT: andi a2, a1, 1 5058; RV64IA-NEXT: mv a1, a0 5059; RV64IA-NEXT: beqz a2, .LBB60_2 5060; RV64IA-NEXT: # %bb.1: # %then 5061; RV64IA-NEXT: li a0, 1 5062; RV64IA-NEXT: amomax.w a0, a0, (a1) 5063; RV64IA-NEXT: ret 5064; RV64IA-NEXT: .LBB60_2: # %else 5065; RV64IA-NEXT: lw a0, 0(a1) 5066; RV64IA-NEXT: mv a2, a0 5067; RV64IA-NEXT: bgtz a0, .LBB60_4 5068; RV64IA-NEXT: # %bb.3: # %else 5069; RV64IA-NEXT: li a2, 1 5070; RV64IA-NEXT: .LBB60_4: # %else 5071; RV64IA-NEXT: sw a2, 0(a1) 5072; RV64IA-NEXT: ret 5073 br i1 %c, label %then, label %else 5074 5075then: 5076 %1 = atomicrmw max ptr %a, i32 1 monotonic 5077 br label %merge 5078 5079else: 5080 %2 = load i32, ptr %a, align 4 5081 %3 = call i32 @llvm.smax.i32(i32 %2, i32 1) 5082 store i32 %3, ptr %a 5083 br label %merge 5084 5085merge: 5086 %4 = phi i32 [ %1, %then ], [ %2, %else ] 5087 ret i32 %4 5088} 5089declare i32 @llvm.smax.i32(i32, i32) 5090 5091define signext i32 @atomicrmw_min_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 5092; RV32I-LABEL: atomicrmw_min_i32_monotonic_crossbb: 5093; RV32I: # %bb.0: 5094; RV32I-NEXT: addi sp, sp, -16 5095; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5096; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5097; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 5098; RV32I-NEXT: andi a1, a1, 1 5099; RV32I-NEXT: mv s0, a0 5100; RV32I-NEXT: beqz a1, .LBB61_5 5101; RV32I-NEXT: # %bb.1: # %then 5102; RV32I-NEXT: lw a1, 0(s0) 5103; RV32I-NEXT: li s1, 2 5104; RV32I-NEXT: j .LBB61_3 5105; RV32I-NEXT: .LBB61_2: # %atomicrmw.start 5106; RV32I-NEXT: # in Loop: Header=BB61_3 Depth=1 5107; RV32I-NEXT: sw a1, 0(sp) 5108; RV32I-NEXT: mv a1, sp 5109; RV32I-NEXT: mv a0, s0 5110; RV32I-NEXT: li a3, 0 5111; RV32I-NEXT: li a4, 0 5112; RV32I-NEXT: call __atomic_compare_exchange_4 5113; RV32I-NEXT: lw a1, 0(sp) 5114; RV32I-NEXT: bnez a0, .LBB61_8 5115; RV32I-NEXT: .LBB61_3: # %atomicrmw.start 5116; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 5117; RV32I-NEXT: mv a2, a1 5118; RV32I-NEXT: blt a1, s1, .LBB61_2 5119; RV32I-NEXT: # %bb.4: # %atomicrmw.start 5120; RV32I-NEXT: # in Loop: Header=BB61_3 Depth=1 5121; RV32I-NEXT: li a2, 1 5122; RV32I-NEXT: j .LBB61_2 5123; RV32I-NEXT: .LBB61_5: # %else 5124; RV32I-NEXT: lw a1, 0(s0) 5125; RV32I-NEXT: mv a0, a1 5126; RV32I-NEXT: blez a1, .LBB61_7 5127; RV32I-NEXT: # %bb.6: # %else 5128; RV32I-NEXT: li a0, 1 5129; RV32I-NEXT: .LBB61_7: # %else 5130; RV32I-NEXT: sw a0, 0(s0) 5131; RV32I-NEXT: .LBB61_8: # %merge 5132; RV32I-NEXT: mv a0, a1 5133; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5134; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5135; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 5136; RV32I-NEXT: addi sp, sp, 16 5137; RV32I-NEXT: ret 5138; 5139; RV32IA-LABEL: atomicrmw_min_i32_monotonic_crossbb: 5140; RV32IA: # %bb.0: 5141; RV32IA-NEXT: andi a2, a1, 1 5142; RV32IA-NEXT: mv a1, a0 5143; RV32IA-NEXT: beqz a2, .LBB61_2 5144; RV32IA-NEXT: # %bb.1: # %then 5145; RV32IA-NEXT: li a0, 1 5146; RV32IA-NEXT: amomin.w a0, a0, (a1) 5147; RV32IA-NEXT: ret 5148; RV32IA-NEXT: .LBB61_2: # %else 5149; RV32IA-NEXT: lw a0, 0(a1) 5150; RV32IA-NEXT: mv a2, a0 5151; RV32IA-NEXT: blez a0, .LBB61_4 5152; RV32IA-NEXT: # %bb.3: # %else 5153; RV32IA-NEXT: li a2, 1 5154; RV32IA-NEXT: .LBB61_4: # %else 5155; RV32IA-NEXT: sw a2, 0(a1) 5156; RV32IA-NEXT: ret 5157; 5158; RV64I-LABEL: atomicrmw_min_i32_monotonic_crossbb: 5159; RV64I: # %bb.0: 5160; RV64I-NEXT: addi sp, sp, -32 5161; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5162; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5163; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 5164; RV64I-NEXT: andi a1, a1, 1 5165; RV64I-NEXT: mv s0, a0 5166; RV64I-NEXT: beqz a1, .LBB61_5 5167; RV64I-NEXT: # %bb.1: # %then 5168; RV64I-NEXT: lw a1, 0(s0) 5169; RV64I-NEXT: li s1, 2 5170; RV64I-NEXT: j .LBB61_3 5171; RV64I-NEXT: .LBB61_2: # %atomicrmw.start 5172; RV64I-NEXT: # in Loop: Header=BB61_3 Depth=1 5173; RV64I-NEXT: sw a1, 4(sp) 5174; RV64I-NEXT: addi a1, sp, 4 5175; RV64I-NEXT: mv a0, s0 5176; RV64I-NEXT: li a3, 0 5177; RV64I-NEXT: li a4, 0 5178; RV64I-NEXT: call __atomic_compare_exchange_4 5179; RV64I-NEXT: lw a1, 4(sp) 5180; RV64I-NEXT: bnez a0, .LBB61_8 5181; RV64I-NEXT: .LBB61_3: # %atomicrmw.start 5182; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5183; RV64I-NEXT: mv a2, a1 5184; RV64I-NEXT: blt a1, s1, .LBB61_2 5185; RV64I-NEXT: # %bb.4: # %atomicrmw.start 5186; RV64I-NEXT: # in Loop: Header=BB61_3 Depth=1 5187; RV64I-NEXT: li a2, 1 5188; RV64I-NEXT: j .LBB61_2 5189; RV64I-NEXT: .LBB61_5: # %else 5190; RV64I-NEXT: lw a1, 0(s0) 5191; RV64I-NEXT: mv a0, a1 5192; RV64I-NEXT: blez a1, .LBB61_7 5193; RV64I-NEXT: # %bb.6: # %else 5194; RV64I-NEXT: li a0, 1 5195; RV64I-NEXT: .LBB61_7: # %else 5196; RV64I-NEXT: sw a0, 0(s0) 5197; RV64I-NEXT: .LBB61_8: # %merge 5198; RV64I-NEXT: mv a0, a1 5199; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5200; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5201; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 5202; RV64I-NEXT: addi sp, sp, 32 5203; RV64I-NEXT: ret 5204; 5205; RV64IA-LABEL: atomicrmw_min_i32_monotonic_crossbb: 5206; RV64IA: # %bb.0: 5207; RV64IA-NEXT: andi a2, a1, 1 5208; RV64IA-NEXT: mv a1, a0 5209; RV64IA-NEXT: beqz a2, .LBB61_2 5210; RV64IA-NEXT: # %bb.1: # %then 5211; RV64IA-NEXT: li a0, 1 5212; RV64IA-NEXT: amomin.w a0, a0, (a1) 5213; RV64IA-NEXT: ret 5214; RV64IA-NEXT: .LBB61_2: # %else 5215; RV64IA-NEXT: lw a0, 0(a1) 5216; RV64IA-NEXT: mv a2, a0 5217; RV64IA-NEXT: blez a0, .LBB61_4 5218; RV64IA-NEXT: # %bb.3: # %else 5219; RV64IA-NEXT: li a2, 1 5220; RV64IA-NEXT: .LBB61_4: # %else 5221; RV64IA-NEXT: sw a2, 0(a1) 5222; RV64IA-NEXT: ret 5223 br i1 %c, label %then, label %else 5224 5225then: 5226 %1 = atomicrmw min ptr %a, i32 1 monotonic 5227 br label %merge 5228 5229else: 5230 %2 = load i32, ptr %a, align 4 5231 %3 = call i32 @llvm.smin.i32(i32 %2, i32 1) 5232 store i32 %3, ptr %a 5233 br label %merge 5234 5235merge: 5236 %4 = phi i32 [ %1, %then ], [ %2, %else ] 5237 ret i32 %4 5238} 5239declare i32 @llvm.smin.i32(i32, i32) 5240 5241define signext i32 @atomicrmw_umax_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 5242; RV32I-LABEL: atomicrmw_umax_i32_monotonic_crossbb: 5243; RV32I: # %bb.0: 5244; RV32I-NEXT: addi sp, sp, -16 5245; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5246; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5247; RV32I-NEXT: andi a1, a1, 1 5248; RV32I-NEXT: mv s0, a0 5249; RV32I-NEXT: beqz a1, .LBB62_3 5250; RV32I-NEXT: # %bb.1: # %then 5251; RV32I-NEXT: lw a1, 0(s0) 5252; RV32I-NEXT: .LBB62_2: # %atomicrmw.start 5253; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 5254; RV32I-NEXT: seqz a2, a1 5255; RV32I-NEXT: add a2, a1, a2 5256; RV32I-NEXT: sw a1, 4(sp) 5257; RV32I-NEXT: addi a1, sp, 4 5258; RV32I-NEXT: mv a0, s0 5259; RV32I-NEXT: li a3, 0 5260; RV32I-NEXT: li a4, 0 5261; RV32I-NEXT: call __atomic_compare_exchange_4 5262; RV32I-NEXT: lw a1, 4(sp) 5263; RV32I-NEXT: beqz a0, .LBB62_2 5264; RV32I-NEXT: j .LBB62_4 5265; RV32I-NEXT: .LBB62_3: # %else 5266; RV32I-NEXT: lw a1, 0(s0) 5267; RV32I-NEXT: seqz a0, a1 5268; RV32I-NEXT: add a0, a1, a0 5269; RV32I-NEXT: sw a0, 0(s0) 5270; RV32I-NEXT: .LBB62_4: # %merge 5271; RV32I-NEXT: mv a0, a1 5272; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5273; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5274; RV32I-NEXT: addi sp, sp, 16 5275; RV32I-NEXT: ret 5276; 5277; RV32IA-LABEL: atomicrmw_umax_i32_monotonic_crossbb: 5278; RV32IA: # %bb.0: 5279; RV32IA-NEXT: andi a1, a1, 1 5280; RV32IA-NEXT: beqz a1, .LBB62_2 5281; RV32IA-NEXT: # %bb.1: # %then 5282; RV32IA-NEXT: li a1, 1 5283; RV32IA-NEXT: amomaxu.w a0, a1, (a0) 5284; RV32IA-NEXT: ret 5285; RV32IA-NEXT: .LBB62_2: # %else 5286; RV32IA-NEXT: mv a1, a0 5287; RV32IA-NEXT: lw a0, 0(a0) 5288; RV32IA-NEXT: seqz a2, a0 5289; RV32IA-NEXT: add a2, a0, a2 5290; RV32IA-NEXT: sw a2, 0(a1) 5291; RV32IA-NEXT: ret 5292; 5293; RV64I-LABEL: atomicrmw_umax_i32_monotonic_crossbb: 5294; RV64I: # %bb.0: 5295; RV64I-NEXT: addi sp, sp, -32 5296; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5297; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5298; RV64I-NEXT: andi a1, a1, 1 5299; RV64I-NEXT: mv s0, a0 5300; RV64I-NEXT: beqz a1, .LBB62_5 5301; RV64I-NEXT: # %bb.1: # %then 5302; RV64I-NEXT: lw a1, 0(s0) 5303; RV64I-NEXT: j .LBB62_3 5304; RV64I-NEXT: .LBB62_2: # %atomicrmw.start 5305; RV64I-NEXT: # in Loop: Header=BB62_3 Depth=1 5306; RV64I-NEXT: sw a1, 12(sp) 5307; RV64I-NEXT: addi a1, sp, 12 5308; RV64I-NEXT: mv a0, s0 5309; RV64I-NEXT: li a3, 0 5310; RV64I-NEXT: li a4, 0 5311; RV64I-NEXT: call __atomic_compare_exchange_4 5312; RV64I-NEXT: lw a1, 12(sp) 5313; RV64I-NEXT: bnez a0, .LBB62_6 5314; RV64I-NEXT: .LBB62_3: # %atomicrmw.start 5315; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5316; RV64I-NEXT: li a0, 1 5317; RV64I-NEXT: mv a2, a1 5318; RV64I-NEXT: bltu a0, a1, .LBB62_2 5319; RV64I-NEXT: # %bb.4: # %atomicrmw.start 5320; RV64I-NEXT: # in Loop: Header=BB62_3 Depth=1 5321; RV64I-NEXT: li a2, 1 5322; RV64I-NEXT: j .LBB62_2 5323; RV64I-NEXT: .LBB62_5: # %else 5324; RV64I-NEXT: lw a1, 0(s0) 5325; RV64I-NEXT: seqz a0, a1 5326; RV64I-NEXT: add a0, a1, a0 5327; RV64I-NEXT: sw a0, 0(s0) 5328; RV64I-NEXT: .LBB62_6: # %merge 5329; RV64I-NEXT: mv a0, a1 5330; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5331; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5332; RV64I-NEXT: addi sp, sp, 32 5333; RV64I-NEXT: ret 5334; 5335; RV64IA-LABEL: atomicrmw_umax_i32_monotonic_crossbb: 5336; RV64IA: # %bb.0: 5337; RV64IA-NEXT: andi a1, a1, 1 5338; RV64IA-NEXT: beqz a1, .LBB62_2 5339; RV64IA-NEXT: # %bb.1: # %then 5340; RV64IA-NEXT: li a1, 1 5341; RV64IA-NEXT: amomaxu.w a0, a1, (a0) 5342; RV64IA-NEXT: ret 5343; RV64IA-NEXT: .LBB62_2: # %else 5344; RV64IA-NEXT: mv a1, a0 5345; RV64IA-NEXT: lw a0, 0(a0) 5346; RV64IA-NEXT: seqz a2, a0 5347; RV64IA-NEXT: add a2, a0, a2 5348; RV64IA-NEXT: sw a2, 0(a1) 5349; RV64IA-NEXT: ret 5350 br i1 %c, label %then, label %else 5351 5352then: 5353 %1 = atomicrmw umax ptr %a, i32 1 monotonic 5354 br label %merge 5355 5356else: 5357 %2 = load i32, ptr %a, align 4 5358 %3 = call i32 @llvm.umax.i32(i32 %2, i32 1) 5359 store i32 %3, ptr %a 5360 br label %merge 5361 5362merge: 5363 %4 = phi i32 [ %1, %then ], [ %2, %else ] 5364 ret i32 %4 5365} 5366declare i32 @llvm.umax.i32(i32, i32) 5367 5368define signext i32 @atomicrmw_umin_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind { 5369; RV32I-LABEL: atomicrmw_umin_i32_monotonic_crossbb: 5370; RV32I: # %bb.0: 5371; RV32I-NEXT: addi sp, sp, -16 5372; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5373; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 5374; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 5375; RV32I-NEXT: andi a1, a1, 1 5376; RV32I-NEXT: mv s0, a0 5377; RV32I-NEXT: beqz a1, .LBB63_5 5378; RV32I-NEXT: # %bb.1: # %then 5379; RV32I-NEXT: lw a1, 0(s0) 5380; RV32I-NEXT: li s1, 2 5381; RV32I-NEXT: j .LBB63_3 5382; RV32I-NEXT: .LBB63_2: # %atomicrmw.start 5383; RV32I-NEXT: # in Loop: Header=BB63_3 Depth=1 5384; RV32I-NEXT: sw a1, 0(sp) 5385; RV32I-NEXT: mv a1, sp 5386; RV32I-NEXT: mv a0, s0 5387; RV32I-NEXT: li a3, 0 5388; RV32I-NEXT: li a4, 0 5389; RV32I-NEXT: call __atomic_compare_exchange_4 5390; RV32I-NEXT: lw a1, 0(sp) 5391; RV32I-NEXT: bnez a0, .LBB63_8 5392; RV32I-NEXT: .LBB63_3: # %atomicrmw.start 5393; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 5394; RV32I-NEXT: mv a2, a1 5395; RV32I-NEXT: bltu a1, s1, .LBB63_2 5396; RV32I-NEXT: # %bb.4: # %atomicrmw.start 5397; RV32I-NEXT: # in Loop: Header=BB63_3 Depth=1 5398; RV32I-NEXT: li a2, 1 5399; RV32I-NEXT: j .LBB63_2 5400; RV32I-NEXT: .LBB63_5: # %else 5401; RV32I-NEXT: lw a1, 0(s0) 5402; RV32I-NEXT: li a2, 1 5403; RV32I-NEXT: mv a0, a1 5404; RV32I-NEXT: bltu a1, a2, .LBB63_7 5405; RV32I-NEXT: # %bb.6: # %else 5406; RV32I-NEXT: li a0, 1 5407; RV32I-NEXT: .LBB63_7: # %else 5408; RV32I-NEXT: sw a0, 0(s0) 5409; RV32I-NEXT: .LBB63_8: # %merge 5410; RV32I-NEXT: mv a0, a1 5411; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5412; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 5413; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 5414; RV32I-NEXT: addi sp, sp, 16 5415; RV32I-NEXT: ret 5416; 5417; RV32IA-LABEL: atomicrmw_umin_i32_monotonic_crossbb: 5418; RV32IA: # %bb.0: 5419; RV32IA-NEXT: andi a2, a1, 1 5420; RV32IA-NEXT: mv a1, a0 5421; RV32IA-NEXT: beqz a2, .LBB63_2 5422; RV32IA-NEXT: # %bb.1: # %then 5423; RV32IA-NEXT: li a0, 1 5424; RV32IA-NEXT: amominu.w a0, a0, (a1) 5425; RV32IA-NEXT: ret 5426; RV32IA-NEXT: .LBB63_2: # %else 5427; RV32IA-NEXT: lw a0, 0(a1) 5428; RV32IA-NEXT: li a3, 1 5429; RV32IA-NEXT: mv a2, a0 5430; RV32IA-NEXT: bltu a0, a3, .LBB63_4 5431; RV32IA-NEXT: # %bb.3: # %else 5432; RV32IA-NEXT: li a2, 1 5433; RV32IA-NEXT: .LBB63_4: # %else 5434; RV32IA-NEXT: sw a2, 0(a1) 5435; RV32IA-NEXT: ret 5436; 5437; RV64I-LABEL: atomicrmw_umin_i32_monotonic_crossbb: 5438; RV64I: # %bb.0: 5439; RV64I-NEXT: addi sp, sp, -32 5440; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5441; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5442; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 5443; RV64I-NEXT: andi a1, a1, 1 5444; RV64I-NEXT: mv s0, a0 5445; RV64I-NEXT: beqz a1, .LBB63_5 5446; RV64I-NEXT: # %bb.1: # %then 5447; RV64I-NEXT: lw a1, 0(s0) 5448; RV64I-NEXT: li s1, 2 5449; RV64I-NEXT: j .LBB63_3 5450; RV64I-NEXT: .LBB63_2: # %atomicrmw.start 5451; RV64I-NEXT: # in Loop: Header=BB63_3 Depth=1 5452; RV64I-NEXT: sw a1, 4(sp) 5453; RV64I-NEXT: addi a1, sp, 4 5454; RV64I-NEXT: mv a0, s0 5455; RV64I-NEXT: li a3, 0 5456; RV64I-NEXT: li a4, 0 5457; RV64I-NEXT: call __atomic_compare_exchange_4 5458; RV64I-NEXT: lw a1, 4(sp) 5459; RV64I-NEXT: bnez a0, .LBB63_8 5460; RV64I-NEXT: .LBB63_3: # %atomicrmw.start 5461; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5462; RV64I-NEXT: mv a2, a1 5463; RV64I-NEXT: bltu a1, s1, .LBB63_2 5464; RV64I-NEXT: # %bb.4: # %atomicrmw.start 5465; RV64I-NEXT: # in Loop: Header=BB63_3 Depth=1 5466; RV64I-NEXT: li a2, 1 5467; RV64I-NEXT: j .LBB63_2 5468; RV64I-NEXT: .LBB63_5: # %else 5469; RV64I-NEXT: lw a1, 0(s0) 5470; RV64I-NEXT: li a2, 1 5471; RV64I-NEXT: mv a0, a1 5472; RV64I-NEXT: bltu a1, a2, .LBB63_7 5473; RV64I-NEXT: # %bb.6: # %else 5474; RV64I-NEXT: li a0, 1 5475; RV64I-NEXT: .LBB63_7: # %else 5476; RV64I-NEXT: sw a0, 0(s0) 5477; RV64I-NEXT: .LBB63_8: # %merge 5478; RV64I-NEXT: mv a0, a1 5479; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5480; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5481; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 5482; RV64I-NEXT: addi sp, sp, 32 5483; RV64I-NEXT: ret 5484; 5485; RV64IA-LABEL: atomicrmw_umin_i32_monotonic_crossbb: 5486; RV64IA: # %bb.0: 5487; RV64IA-NEXT: andi a2, a1, 1 5488; RV64IA-NEXT: mv a1, a0 5489; RV64IA-NEXT: beqz a2, .LBB63_2 5490; RV64IA-NEXT: # %bb.1: # %then 5491; RV64IA-NEXT: li a0, 1 5492; RV64IA-NEXT: amominu.w a0, a0, (a1) 5493; RV64IA-NEXT: ret 5494; RV64IA-NEXT: .LBB63_2: # %else 5495; RV64IA-NEXT: lw a0, 0(a1) 5496; RV64IA-NEXT: li a3, 1 5497; RV64IA-NEXT: mv a2, a0 5498; RV64IA-NEXT: bltu a0, a3, .LBB63_4 5499; RV64IA-NEXT: # %bb.3: # %else 5500; RV64IA-NEXT: li a2, 1 5501; RV64IA-NEXT: .LBB63_4: # %else 5502; RV64IA-NEXT: sw a2, 0(a1) 5503; RV64IA-NEXT: ret 5504 br i1 %c, label %then, label %else 5505 5506then: 5507 %1 = atomicrmw umin ptr %a, i32 1 monotonic 5508 br label %merge 5509 5510else: 5511 %2 = load i32, ptr %a, align 4 5512 %3 = call i32 @llvm.umin.i32(i32 %2, i32 1) 5513 store i32 %3, ptr %a 5514 br label %merge 5515 5516merge: 5517 %4 = phi i32 [ %1, %then ], [ %2, %else ] 5518 ret i32 %4 5519} 5520declare i32 @llvm.umin.i32(i32, i32) 5521 5522define signext i32 @cmpxchg_i32_monotonic_crossbb(ptr %ptr, i32 signext %cmp, i32 signext %val, i1 zeroext %c) nounwind { 5523; RV32I-LABEL: cmpxchg_i32_monotonic_crossbb: 5524; RV32I: # %bb.0: 5525; RV32I-NEXT: beqz a3, .LBB64_2 5526; RV32I-NEXT: # %bb.1: # %then 5527; RV32I-NEXT: addi sp, sp, -16 5528; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5529; RV32I-NEXT: sw a1, 8(sp) 5530; RV32I-NEXT: addi a1, sp, 8 5531; RV32I-NEXT: li a3, 5 5532; RV32I-NEXT: li a4, 5 5533; RV32I-NEXT: call __atomic_compare_exchange_4 5534; RV32I-NEXT: lw a0, 8(sp) 5535; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5536; RV32I-NEXT: addi sp, sp, 16 5537; RV32I-NEXT: ret 5538; RV32I-NEXT: .LBB64_2: # %else 5539; RV32I-NEXT: lw a0, 0(a0) 5540; RV32I-NEXT: ret 5541; 5542; RV32IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_crossbb: 5543; RV32IA-NOZACAS: # %bb.0: 5544; RV32IA-NOZACAS-NEXT: mv a4, a0 5545; RV32IA-NOZACAS-NEXT: beqz a3, .LBB64_2 5546; RV32IA-NOZACAS-NEXT: # %bb.1: # %then 5547; RV32IA-NOZACAS-NEXT: .LBB64_3: # %then 5548; RV32IA-NOZACAS-NEXT: # =>This Inner Loop Header: Depth=1 5549; RV32IA-NOZACAS-NEXT: lr.w.aqrl a0, (a4) 5550; RV32IA-NOZACAS-NEXT: bne a0, a1, .LBB64_5 5551; RV32IA-NOZACAS-NEXT: # %bb.4: # %then 5552; RV32IA-NOZACAS-NEXT: # in Loop: Header=BB64_3 Depth=1 5553; RV32IA-NOZACAS-NEXT: sc.w.rl a3, a2, (a4) 5554; RV32IA-NOZACAS-NEXT: bnez a3, .LBB64_3 5555; RV32IA-NOZACAS-NEXT: .LBB64_5: # %then 5556; RV32IA-NOZACAS-NEXT: ret 5557; RV32IA-NOZACAS-NEXT: .LBB64_2: # %else 5558; RV32IA-NOZACAS-NEXT: lw a0, 0(a4) 5559; RV32IA-NOZACAS-NEXT: ret 5560; 5561; RV32IA-ZACAS-LABEL: cmpxchg_i32_monotonic_crossbb: 5562; RV32IA-ZACAS: # %bb.0: 5563; RV32IA-ZACAS-NEXT: beqz a3, .LBB64_2 5564; RV32IA-ZACAS-NEXT: # %bb.1: # %then 5565; RV32IA-ZACAS-NEXT: fence rw, rw 5566; RV32IA-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0) 5567; RV32IA-ZACAS-NEXT: mv a0, a1 5568; RV32IA-ZACAS-NEXT: ret 5569; RV32IA-ZACAS-NEXT: .LBB64_2: # %else 5570; RV32IA-ZACAS-NEXT: lw a0, 0(a0) 5571; RV32IA-ZACAS-NEXT: ret 5572; 5573; RV64I-LABEL: cmpxchg_i32_monotonic_crossbb: 5574; RV64I: # %bb.0: 5575; RV64I-NEXT: beqz a3, .LBB64_2 5576; RV64I-NEXT: # %bb.1: # %then 5577; RV64I-NEXT: addi sp, sp, -16 5578; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5579; RV64I-NEXT: sw a1, 4(sp) 5580; RV64I-NEXT: addi a1, sp, 4 5581; RV64I-NEXT: li a3, 5 5582; RV64I-NEXT: li a4, 5 5583; RV64I-NEXT: call __atomic_compare_exchange_4 5584; RV64I-NEXT: lw a0, 4(sp) 5585; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5586; RV64I-NEXT: addi sp, sp, 16 5587; RV64I-NEXT: ret 5588; RV64I-NEXT: .LBB64_2: # %else 5589; RV64I-NEXT: lw a0, 0(a0) 5590; RV64I-NEXT: ret 5591; 5592; RV64IA-NOZACAS-LABEL: cmpxchg_i32_monotonic_crossbb: 5593; RV64IA-NOZACAS: # %bb.0: 5594; RV64IA-NOZACAS-NEXT: beqz a3, .LBB64_2 5595; RV64IA-NOZACAS-NEXT: # %bb.1: # %then 5596; RV64IA-NOZACAS-NEXT: .LBB64_3: # %then 5597; RV64IA-NOZACAS-NEXT: # =>This Inner Loop Header: Depth=1 5598; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a0) 5599; RV64IA-NOZACAS-NEXT: bne a3, a1, .LBB64_5 5600; RV64IA-NOZACAS-NEXT: # %bb.4: # %then 5601; RV64IA-NOZACAS-NEXT: # in Loop: Header=BB64_3 Depth=1 5602; RV64IA-NOZACAS-NEXT: sc.w.rl a4, a2, (a0) 5603; RV64IA-NOZACAS-NEXT: bnez a4, .LBB64_3 5604; RV64IA-NOZACAS-NEXT: .LBB64_5: # %then 5605; RV64IA-NOZACAS-NEXT: sext.w a0, a3 5606; RV64IA-NOZACAS-NEXT: ret 5607; RV64IA-NOZACAS-NEXT: .LBB64_2: # %else 5608; RV64IA-NOZACAS-NEXT: lw a3, 0(a0) 5609; RV64IA-NOZACAS-NEXT: sext.w a0, a3 5610; RV64IA-NOZACAS-NEXT: ret 5611; 5612; RV64IA-ZACAS-LABEL: cmpxchg_i32_monotonic_crossbb: 5613; RV64IA-ZACAS: # %bb.0: 5614; RV64IA-ZACAS-NEXT: beqz a3, .LBB64_2 5615; RV64IA-ZACAS-NEXT: # %bb.1: # %then 5616; RV64IA-ZACAS-NEXT: fence rw, rw 5617; RV64IA-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0) 5618; RV64IA-ZACAS-NEXT: mv a0, a1 5619; RV64IA-ZACAS-NEXT: ret 5620; RV64IA-ZACAS-NEXT: .LBB64_2: # %else 5621; RV64IA-ZACAS-NEXT: lw a0, 0(a0) 5622; RV64IA-ZACAS-NEXT: ret 5623 br i1 %c, label %then, label %else 5624 5625then: 5626 %1 = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst 5627 %2 = extractvalue { i32, i1 } %1, 0 5628 br label %merge 5629 5630else: 5631 %3 = load i32, ptr %ptr, align 4 5632 br label %merge 5633 5634merge: 5635 %4 = phi i32 [ %2, %then ], [ %3, %else ] 5636 ret i32 %4 5637} 5638