1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefix=RV32I %s 4; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \ 5; RUN: | FileCheck -check-prefix=RV32IA %s 6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefix=RV64I %s 8; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64IA %s 10 11define signext i8 @atomic_load_i8_unordered(i8 *%a) nounwind { 12; RV32I-LABEL: atomic_load_i8_unordered: 13; RV32I: # %bb.0: 14; RV32I-NEXT: addi sp, sp, -16 15; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 16; RV32I-NEXT: li a1, 0 17; RV32I-NEXT: call __atomic_load_1@plt 18; RV32I-NEXT: slli a0, a0, 24 19; RV32I-NEXT: srai a0, a0, 24 20; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21; RV32I-NEXT: addi sp, sp, 16 22; RV32I-NEXT: ret 23; 24; RV32IA-LABEL: atomic_load_i8_unordered: 25; RV32IA: # %bb.0: 26; RV32IA-NEXT: lb a0, 0(a0) 27; RV32IA-NEXT: ret 28; 29; RV64I-LABEL: atomic_load_i8_unordered: 30; RV64I: # %bb.0: 31; RV64I-NEXT: addi sp, sp, -16 32; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 33; RV64I-NEXT: li a1, 0 34; RV64I-NEXT: call __atomic_load_1@plt 35; RV64I-NEXT: slli a0, a0, 56 36; RV64I-NEXT: srai a0, a0, 56 37; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 38; RV64I-NEXT: addi sp, sp, 16 39; RV64I-NEXT: ret 40; 41; RV64IA-LABEL: atomic_load_i8_unordered: 42; RV64IA: # %bb.0: 43; RV64IA-NEXT: lb a0, 0(a0) 44; RV64IA-NEXT: ret 45 %1 = load atomic i8, i8* %a unordered, align 1 46 ret i8 %1 47} 48 49define signext i16 @atomic_load_i16_unordered(i16 *%a) nounwind { 50; RV32I-LABEL: atomic_load_i16_unordered: 51; RV32I: # %bb.0: 52; RV32I-NEXT: addi sp, sp, -16 53; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 54; RV32I-NEXT: li a1, 0 55; RV32I-NEXT: call __atomic_load_2@plt 56; RV32I-NEXT: slli a0, a0, 16 57; RV32I-NEXT: srai a0, a0, 16 58; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 59; RV32I-NEXT: addi sp, sp, 16 60; RV32I-NEXT: ret 61; 62; RV32IA-LABEL: atomic_load_i16_unordered: 63; RV32IA: # %bb.0: 64; RV32IA-NEXT: lh a0, 0(a0) 65; RV32IA-NEXT: ret 66; 67; RV64I-LABEL: atomic_load_i16_unordered: 68; RV64I: # %bb.0: 69; RV64I-NEXT: addi sp, sp, -16 70; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 71; RV64I-NEXT: li a1, 0 72; RV64I-NEXT: call __atomic_load_2@plt 73; RV64I-NEXT: slli a0, a0, 48 74; RV64I-NEXT: srai a0, a0, 48 75; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 76; RV64I-NEXT: addi sp, sp, 16 77; RV64I-NEXT: ret 78; 79; RV64IA-LABEL: atomic_load_i16_unordered: 80; RV64IA: # %bb.0: 81; RV64IA-NEXT: lh a0, 0(a0) 82; RV64IA-NEXT: ret 83 %1 = load atomic i16, i16* %a unordered, align 2 84 ret i16 %1 85} 86 87define signext i32 @atomic_load_i32_unordered(i32 *%a) nounwind { 88; RV32I-LABEL: atomic_load_i32_unordered: 89; RV32I: # %bb.0: 90; RV32I-NEXT: addi sp, sp, -16 91; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 92; RV32I-NEXT: li a1, 0 93; RV32I-NEXT: call __atomic_load_4@plt 94; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 95; RV32I-NEXT: addi sp, sp, 16 96; RV32I-NEXT: ret 97; 98; RV32IA-LABEL: atomic_load_i32_unordered: 99; RV32IA: # %bb.0: 100; RV32IA-NEXT: lw a0, 0(a0) 101; RV32IA-NEXT: ret 102; 103; RV64I-LABEL: atomic_load_i32_unordered: 104; RV64I: # %bb.0: 105; RV64I-NEXT: addi sp, sp, -16 106; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 107; RV64I-NEXT: li a1, 0 108; RV64I-NEXT: call __atomic_load_4@plt 109; RV64I-NEXT: sext.w a0, a0 110; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 111; RV64I-NEXT: addi sp, sp, 16 112; RV64I-NEXT: ret 113; 114; RV64IA-LABEL: atomic_load_i32_unordered: 115; RV64IA: # %bb.0: 116; RV64IA-NEXT: lw a0, 0(a0) 117; RV64IA-NEXT: ret 118 %1 = load atomic i32, i32* %a unordered, align 4 119 ret i32 %1 120} 121 122 123define signext i8 @atomicrmw_xchg_i8_monotonic(i8* %a, i8 %b) nounwind { 124; RV32I-LABEL: atomicrmw_xchg_i8_monotonic: 125; RV32I: # %bb.0: 126; RV32I-NEXT: addi sp, sp, -16 127; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 128; RV32I-NEXT: li a2, 0 129; RV32I-NEXT: call __atomic_exchange_1@plt 130; RV32I-NEXT: slli a0, a0, 24 131; RV32I-NEXT: srai a0, a0, 24 132; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 133; RV32I-NEXT: addi sp, sp, 16 134; RV32I-NEXT: ret 135; 136; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic: 137; RV32IA: # %bb.0: 138; RV32IA-NEXT: andi a2, a0, -4 139; RV32IA-NEXT: slli a0, a0, 3 140; RV32IA-NEXT: li a3, 255 141; RV32IA-NEXT: sll a3, a3, a0 142; RV32IA-NEXT: andi a1, a1, 255 143; RV32IA-NEXT: sll a1, a1, a0 144; RV32IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 145; RV32IA-NEXT: lr.w a4, (a2) 146; RV32IA-NEXT: mv a5, a1 147; RV32IA-NEXT: xor a5, a4, a5 148; RV32IA-NEXT: and a5, a5, a3 149; RV32IA-NEXT: xor a5, a4, a5 150; RV32IA-NEXT: sc.w a5, a5, (a2) 151; RV32IA-NEXT: bnez a5, .LBB3_1 152; RV32IA-NEXT: # %bb.2: 153; RV32IA-NEXT: srl a0, a4, a0 154; RV32IA-NEXT: slli a0, a0, 24 155; RV32IA-NEXT: srai a0, a0, 24 156; RV32IA-NEXT: ret 157; 158; RV64I-LABEL: atomicrmw_xchg_i8_monotonic: 159; RV64I: # %bb.0: 160; RV64I-NEXT: addi sp, sp, -16 161; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 162; RV64I-NEXT: li a2, 0 163; RV64I-NEXT: call __atomic_exchange_1@plt 164; RV64I-NEXT: slli a0, a0, 56 165; RV64I-NEXT: srai a0, a0, 56 166; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 167; RV64I-NEXT: addi sp, sp, 16 168; RV64I-NEXT: ret 169; 170; RV64IA-LABEL: atomicrmw_xchg_i8_monotonic: 171; RV64IA: # %bb.0: 172; RV64IA-NEXT: andi a2, a0, -4 173; RV64IA-NEXT: slliw a0, a0, 3 174; RV64IA-NEXT: li a3, 255 175; RV64IA-NEXT: sllw a3, a3, a0 176; RV64IA-NEXT: andi a1, a1, 255 177; RV64IA-NEXT: sllw a1, a1, a0 178; RV64IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 179; RV64IA-NEXT: lr.w a4, (a2) 180; RV64IA-NEXT: mv a5, a1 181; RV64IA-NEXT: xor a5, a4, a5 182; RV64IA-NEXT: and a5, a5, a3 183; RV64IA-NEXT: xor a5, a4, a5 184; RV64IA-NEXT: sc.w a5, a5, (a2) 185; RV64IA-NEXT: bnez a5, .LBB3_1 186; RV64IA-NEXT: # %bb.2: 187; RV64IA-NEXT: srlw a0, a4, a0 188; RV64IA-NEXT: slli a0, a0, 56 189; RV64IA-NEXT: srai a0, a0, 56 190; RV64IA-NEXT: ret 191 %1 = atomicrmw xchg i8* %a, i8 %b monotonic 192 ret i8 %1 193} 194 195define signext i8 @atomicrmw_add_i8_monotonic(i8 *%a, i8 %b) nounwind { 196; RV32I-LABEL: atomicrmw_add_i8_monotonic: 197; RV32I: # %bb.0: 198; RV32I-NEXT: addi sp, sp, -16 199; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 200; RV32I-NEXT: li a2, 0 201; RV32I-NEXT: call __atomic_fetch_add_1@plt 202; RV32I-NEXT: slli a0, a0, 24 203; RV32I-NEXT: srai a0, a0, 24 204; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 205; RV32I-NEXT: addi sp, sp, 16 206; RV32I-NEXT: ret 207; 208; RV32IA-LABEL: atomicrmw_add_i8_monotonic: 209; RV32IA: # %bb.0: 210; RV32IA-NEXT: andi a2, a0, -4 211; RV32IA-NEXT: slli a0, a0, 3 212; RV32IA-NEXT: li a3, 255 213; RV32IA-NEXT: sll a3, a3, a0 214; RV32IA-NEXT: andi a1, a1, 255 215; RV32IA-NEXT: sll a1, a1, a0 216; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 217; RV32IA-NEXT: lr.w a4, (a2) 218; RV32IA-NEXT: add a5, a4, a1 219; RV32IA-NEXT: xor a5, a4, a5 220; RV32IA-NEXT: and a5, a5, a3 221; RV32IA-NEXT: xor a5, a4, a5 222; RV32IA-NEXT: sc.w a5, a5, (a2) 223; RV32IA-NEXT: bnez a5, .LBB4_1 224; RV32IA-NEXT: # %bb.2: 225; RV32IA-NEXT: srl a0, a4, a0 226; RV32IA-NEXT: slli a0, a0, 24 227; RV32IA-NEXT: srai a0, a0, 24 228; RV32IA-NEXT: ret 229; 230; RV64I-LABEL: atomicrmw_add_i8_monotonic: 231; RV64I: # %bb.0: 232; RV64I-NEXT: addi sp, sp, -16 233; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 234; RV64I-NEXT: li a2, 0 235; RV64I-NEXT: call __atomic_fetch_add_1@plt 236; RV64I-NEXT: slli a0, a0, 56 237; RV64I-NEXT: srai a0, a0, 56 238; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 239; RV64I-NEXT: addi sp, sp, 16 240; RV64I-NEXT: ret 241; 242; RV64IA-LABEL: atomicrmw_add_i8_monotonic: 243; RV64IA: # %bb.0: 244; RV64IA-NEXT: andi a2, a0, -4 245; RV64IA-NEXT: slliw a0, a0, 3 246; RV64IA-NEXT: li a3, 255 247; RV64IA-NEXT: sllw a3, a3, a0 248; RV64IA-NEXT: andi a1, a1, 255 249; RV64IA-NEXT: sllw a1, a1, a0 250; RV64IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 251; RV64IA-NEXT: lr.w a4, (a2) 252; RV64IA-NEXT: add a5, a4, a1 253; RV64IA-NEXT: xor a5, a4, a5 254; RV64IA-NEXT: and a5, a5, a3 255; RV64IA-NEXT: xor a5, a4, a5 256; RV64IA-NEXT: sc.w a5, a5, (a2) 257; RV64IA-NEXT: bnez a5, .LBB4_1 258; RV64IA-NEXT: # %bb.2: 259; RV64IA-NEXT: srlw a0, a4, a0 260; RV64IA-NEXT: slli a0, a0, 56 261; RV64IA-NEXT: srai a0, a0, 56 262; RV64IA-NEXT: ret 263 %1 = atomicrmw add i8* %a, i8 %b monotonic 264 ret i8 %1 265} 266 267define signext i8 @atomicrmw_sub_i8_monotonic(i8* %a, i8 %b) nounwind { 268; RV32I-LABEL: atomicrmw_sub_i8_monotonic: 269; RV32I: # %bb.0: 270; RV32I-NEXT: addi sp, sp, -16 271; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 272; RV32I-NEXT: li a2, 0 273; RV32I-NEXT: call __atomic_fetch_sub_1@plt 274; RV32I-NEXT: slli a0, a0, 24 275; RV32I-NEXT: srai a0, a0, 24 276; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 277; RV32I-NEXT: addi sp, sp, 16 278; RV32I-NEXT: ret 279; 280; RV32IA-LABEL: atomicrmw_sub_i8_monotonic: 281; RV32IA: # %bb.0: 282; RV32IA-NEXT: andi a2, a0, -4 283; RV32IA-NEXT: slli a0, a0, 3 284; RV32IA-NEXT: li a3, 255 285; RV32IA-NEXT: sll a3, a3, a0 286; RV32IA-NEXT: andi a1, a1, 255 287; RV32IA-NEXT: sll a1, a1, a0 288; RV32IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 289; RV32IA-NEXT: lr.w a4, (a2) 290; RV32IA-NEXT: sub a5, a4, a1 291; RV32IA-NEXT: xor a5, a4, a5 292; RV32IA-NEXT: and a5, a5, a3 293; RV32IA-NEXT: xor a5, a4, a5 294; RV32IA-NEXT: sc.w a5, a5, (a2) 295; RV32IA-NEXT: bnez a5, .LBB5_1 296; RV32IA-NEXT: # %bb.2: 297; RV32IA-NEXT: srl a0, a4, a0 298; RV32IA-NEXT: slli a0, a0, 24 299; RV32IA-NEXT: srai a0, a0, 24 300; RV32IA-NEXT: ret 301; 302; RV64I-LABEL: atomicrmw_sub_i8_monotonic: 303; RV64I: # %bb.0: 304; RV64I-NEXT: addi sp, sp, -16 305; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 306; RV64I-NEXT: li a2, 0 307; RV64I-NEXT: call __atomic_fetch_sub_1@plt 308; RV64I-NEXT: slli a0, a0, 56 309; RV64I-NEXT: srai a0, a0, 56 310; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 311; RV64I-NEXT: addi sp, sp, 16 312; RV64I-NEXT: ret 313; 314; RV64IA-LABEL: atomicrmw_sub_i8_monotonic: 315; RV64IA: # %bb.0: 316; RV64IA-NEXT: andi a2, a0, -4 317; RV64IA-NEXT: slliw a0, a0, 3 318; RV64IA-NEXT: li a3, 255 319; RV64IA-NEXT: sllw a3, a3, a0 320; RV64IA-NEXT: andi a1, a1, 255 321; RV64IA-NEXT: sllw a1, a1, a0 322; RV64IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1 323; RV64IA-NEXT: lr.w a4, (a2) 324; RV64IA-NEXT: sub a5, a4, a1 325; RV64IA-NEXT: xor a5, a4, a5 326; RV64IA-NEXT: and a5, a5, a3 327; RV64IA-NEXT: xor a5, a4, a5 328; RV64IA-NEXT: sc.w a5, a5, (a2) 329; RV64IA-NEXT: bnez a5, .LBB5_1 330; RV64IA-NEXT: # %bb.2: 331; RV64IA-NEXT: srlw a0, a4, a0 332; RV64IA-NEXT: slli a0, a0, 56 333; RV64IA-NEXT: srai a0, a0, 56 334; RV64IA-NEXT: ret 335 %1 = atomicrmw sub i8* %a, i8 %b monotonic 336 ret i8 %1 337} 338 339define signext i8 @atomicrmw_and_i8_monotonic(i8 *%a, i8 %b) nounwind { 340; RV32I-LABEL: atomicrmw_and_i8_monotonic: 341; RV32I: # %bb.0: 342; RV32I-NEXT: addi sp, sp, -16 343; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 344; RV32I-NEXT: li a2, 0 345; RV32I-NEXT: call __atomic_fetch_and_1@plt 346; RV32I-NEXT: slli a0, a0, 24 347; RV32I-NEXT: srai a0, a0, 24 348; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 349; RV32I-NEXT: addi sp, sp, 16 350; RV32I-NEXT: ret 351; 352; RV32IA-LABEL: atomicrmw_and_i8_monotonic: 353; RV32IA: # %bb.0: 354; RV32IA-NEXT: andi a2, a0, -4 355; RV32IA-NEXT: slli a0, a0, 3 356; RV32IA-NEXT: li a3, 255 357; RV32IA-NEXT: sll a3, a3, a0 358; RV32IA-NEXT: not a3, a3 359; RV32IA-NEXT: andi a1, a1, 255 360; RV32IA-NEXT: sll a1, a1, a0 361; RV32IA-NEXT: or a1, a3, a1 362; RV32IA-NEXT: amoand.w a1, a1, (a2) 363; RV32IA-NEXT: srl a0, a1, a0 364; RV32IA-NEXT: slli a0, a0, 24 365; RV32IA-NEXT: srai a0, a0, 24 366; RV32IA-NEXT: ret 367; 368; RV64I-LABEL: atomicrmw_and_i8_monotonic: 369; RV64I: # %bb.0: 370; RV64I-NEXT: addi sp, sp, -16 371; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 372; RV64I-NEXT: li a2, 0 373; RV64I-NEXT: call __atomic_fetch_and_1@plt 374; RV64I-NEXT: slli a0, a0, 56 375; RV64I-NEXT: srai a0, a0, 56 376; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 377; RV64I-NEXT: addi sp, sp, 16 378; RV64I-NEXT: ret 379; 380; RV64IA-LABEL: atomicrmw_and_i8_monotonic: 381; RV64IA: # %bb.0: 382; RV64IA-NEXT: andi a2, a0, -4 383; RV64IA-NEXT: slliw a0, a0, 3 384; RV64IA-NEXT: li a3, 255 385; RV64IA-NEXT: sllw a3, a3, a0 386; RV64IA-NEXT: not a3, a3 387; RV64IA-NEXT: andi a1, a1, 255 388; RV64IA-NEXT: sllw a1, a1, a0 389; RV64IA-NEXT: or a1, a3, a1 390; RV64IA-NEXT: amoand.w a1, a1, (a2) 391; RV64IA-NEXT: srlw a0, a1, a0 392; RV64IA-NEXT: slli a0, a0, 56 393; RV64IA-NEXT: srai a0, a0, 56 394; RV64IA-NEXT: ret 395 %1 = atomicrmw and i8* %a, i8 %b monotonic 396 ret i8 %1 397} 398 399define signext i8 @atomicrmw_nand_i8_monotonic(i8* %a, i8 %b) nounwind { 400; RV32I-LABEL: atomicrmw_nand_i8_monotonic: 401; RV32I: # %bb.0: 402; RV32I-NEXT: addi sp, sp, -16 403; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 404; RV32I-NEXT: li a2, 0 405; RV32I-NEXT: call __atomic_fetch_nand_1@plt 406; RV32I-NEXT: slli a0, a0, 24 407; RV32I-NEXT: srai a0, a0, 24 408; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 409; RV32I-NEXT: addi sp, sp, 16 410; RV32I-NEXT: ret 411; 412; RV32IA-LABEL: atomicrmw_nand_i8_monotonic: 413; RV32IA: # %bb.0: 414; RV32IA-NEXT: andi a2, a0, -4 415; RV32IA-NEXT: slli a0, a0, 3 416; RV32IA-NEXT: li a3, 255 417; RV32IA-NEXT: sll a3, a3, a0 418; RV32IA-NEXT: andi a1, a1, 255 419; RV32IA-NEXT: sll a1, a1, a0 420; RV32IA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 421; RV32IA-NEXT: lr.w a4, (a2) 422; RV32IA-NEXT: and a5, a4, a1 423; RV32IA-NEXT: not a5, a5 424; RV32IA-NEXT: xor a5, a4, a5 425; RV32IA-NEXT: and a5, a5, a3 426; RV32IA-NEXT: xor a5, a4, a5 427; RV32IA-NEXT: sc.w a5, a5, (a2) 428; RV32IA-NEXT: bnez a5, .LBB7_1 429; RV32IA-NEXT: # %bb.2: 430; RV32IA-NEXT: srl a0, a4, a0 431; RV32IA-NEXT: slli a0, a0, 24 432; RV32IA-NEXT: srai a0, a0, 24 433; RV32IA-NEXT: ret 434; 435; RV64I-LABEL: atomicrmw_nand_i8_monotonic: 436; RV64I: # %bb.0: 437; RV64I-NEXT: addi sp, sp, -16 438; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 439; RV64I-NEXT: li a2, 0 440; RV64I-NEXT: call __atomic_fetch_nand_1@plt 441; RV64I-NEXT: slli a0, a0, 56 442; RV64I-NEXT: srai a0, a0, 56 443; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 444; RV64I-NEXT: addi sp, sp, 16 445; RV64I-NEXT: ret 446; 447; RV64IA-LABEL: atomicrmw_nand_i8_monotonic: 448; RV64IA: # %bb.0: 449; RV64IA-NEXT: andi a2, a0, -4 450; RV64IA-NEXT: slliw a0, a0, 3 451; RV64IA-NEXT: li a3, 255 452; RV64IA-NEXT: sllw a3, a3, a0 453; RV64IA-NEXT: andi a1, a1, 255 454; RV64IA-NEXT: sllw a1, a1, a0 455; RV64IA-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1 456; RV64IA-NEXT: lr.w a4, (a2) 457; RV64IA-NEXT: and a5, a4, a1 458; RV64IA-NEXT: not a5, a5 459; RV64IA-NEXT: xor a5, a4, a5 460; RV64IA-NEXT: and a5, a5, a3 461; RV64IA-NEXT: xor a5, a4, a5 462; RV64IA-NEXT: sc.w a5, a5, (a2) 463; RV64IA-NEXT: bnez a5, .LBB7_1 464; RV64IA-NEXT: # %bb.2: 465; RV64IA-NEXT: srlw a0, a4, a0 466; RV64IA-NEXT: slli a0, a0, 56 467; RV64IA-NEXT: srai a0, a0, 56 468; RV64IA-NEXT: ret 469 %1 = atomicrmw nand i8* %a, i8 %b monotonic 470 ret i8 %1 471} 472 473define signext i8 @atomicrmw_or_i8_monotonic(i8 *%a, i8 %b) nounwind { 474; RV32I-LABEL: atomicrmw_or_i8_monotonic: 475; RV32I: # %bb.0: 476; RV32I-NEXT: addi sp, sp, -16 477; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 478; RV32I-NEXT: li a2, 0 479; RV32I-NEXT: call __atomic_fetch_or_1@plt 480; RV32I-NEXT: slli a0, a0, 24 481; RV32I-NEXT: srai a0, a0, 24 482; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 483; RV32I-NEXT: addi sp, sp, 16 484; RV32I-NEXT: ret 485; 486; RV32IA-LABEL: atomicrmw_or_i8_monotonic: 487; RV32IA: # %bb.0: 488; RV32IA-NEXT: andi a2, a0, -4 489; RV32IA-NEXT: slli a0, a0, 3 490; RV32IA-NEXT: andi a1, a1, 255 491; RV32IA-NEXT: sll a1, a1, a0 492; RV32IA-NEXT: amoor.w a1, a1, (a2) 493; RV32IA-NEXT: srl a0, a1, a0 494; RV32IA-NEXT: slli a0, a0, 24 495; RV32IA-NEXT: srai a0, a0, 24 496; RV32IA-NEXT: ret 497; 498; RV64I-LABEL: atomicrmw_or_i8_monotonic: 499; RV64I: # %bb.0: 500; RV64I-NEXT: addi sp, sp, -16 501; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 502; RV64I-NEXT: li a2, 0 503; RV64I-NEXT: call __atomic_fetch_or_1@plt 504; RV64I-NEXT: slli a0, a0, 56 505; RV64I-NEXT: srai a0, a0, 56 506; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 507; RV64I-NEXT: addi sp, sp, 16 508; RV64I-NEXT: ret 509; 510; RV64IA-LABEL: atomicrmw_or_i8_monotonic: 511; RV64IA: # %bb.0: 512; RV64IA-NEXT: andi a2, a0, -4 513; RV64IA-NEXT: slliw a0, a0, 3 514; RV64IA-NEXT: andi a1, a1, 255 515; RV64IA-NEXT: sllw a1, a1, a0 516; RV64IA-NEXT: amoor.w a1, a1, (a2) 517; RV64IA-NEXT: srlw a0, a1, a0 518; RV64IA-NEXT: slli a0, a0, 56 519; RV64IA-NEXT: srai a0, a0, 56 520; RV64IA-NEXT: ret 521 %1 = atomicrmw or i8* %a, i8 %b monotonic 522 ret i8 %1 523} 524 525define signext i8 @atomicrmw_xor_i8_monotonic(i8 *%a, i8 %b) nounwind { 526; RV32I-LABEL: atomicrmw_xor_i8_monotonic: 527; RV32I: # %bb.0: 528; RV32I-NEXT: addi sp, sp, -16 529; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 530; RV32I-NEXT: li a2, 0 531; RV32I-NEXT: call __atomic_fetch_xor_1@plt 532; RV32I-NEXT: slli a0, a0, 24 533; RV32I-NEXT: srai a0, a0, 24 534; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 535; RV32I-NEXT: addi sp, sp, 16 536; RV32I-NEXT: ret 537; 538; RV32IA-LABEL: atomicrmw_xor_i8_monotonic: 539; RV32IA: # %bb.0: 540; RV32IA-NEXT: andi a2, a0, -4 541; RV32IA-NEXT: slli a0, a0, 3 542; RV32IA-NEXT: andi a1, a1, 255 543; RV32IA-NEXT: sll a1, a1, a0 544; RV32IA-NEXT: amoxor.w a1, a1, (a2) 545; RV32IA-NEXT: srl a0, a1, a0 546; RV32IA-NEXT: slli a0, a0, 24 547; RV32IA-NEXT: srai a0, a0, 24 548; RV32IA-NEXT: ret 549; 550; RV64I-LABEL: atomicrmw_xor_i8_monotonic: 551; RV64I: # %bb.0: 552; RV64I-NEXT: addi sp, sp, -16 553; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 554; RV64I-NEXT: li a2, 0 555; RV64I-NEXT: call __atomic_fetch_xor_1@plt 556; RV64I-NEXT: slli a0, a0, 56 557; RV64I-NEXT: srai a0, a0, 56 558; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 559; RV64I-NEXT: addi sp, sp, 16 560; RV64I-NEXT: ret 561; 562; RV64IA-LABEL: atomicrmw_xor_i8_monotonic: 563; RV64IA: # %bb.0: 564; RV64IA-NEXT: andi a2, a0, -4 565; RV64IA-NEXT: slliw a0, a0, 3 566; RV64IA-NEXT: andi a1, a1, 255 567; RV64IA-NEXT: sllw a1, a1, a0 568; RV64IA-NEXT: amoxor.w a1, a1, (a2) 569; RV64IA-NEXT: srlw a0, a1, a0 570; RV64IA-NEXT: slli a0, a0, 56 571; RV64IA-NEXT: srai a0, a0, 56 572; RV64IA-NEXT: ret 573 %1 = atomicrmw xor i8* %a, i8 %b monotonic 574 ret i8 %1 575} 576 577define signext i8 @atomicrmw_max_i8_monotonic(i8 *%a, i8 %b) nounwind { 578; RV32I-LABEL: atomicrmw_max_i8_monotonic: 579; RV32I: # %bb.0: 580; RV32I-NEXT: addi sp, sp, -32 581; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 582; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 583; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 584; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 585; RV32I-NEXT: mv s0, a0 586; RV32I-NEXT: lbu a3, 0(a0) 587; RV32I-NEXT: mv s1, a1 588; RV32I-NEXT: slli a0, a1, 24 589; RV32I-NEXT: srai s2, a0, 24 590; RV32I-NEXT: j .LBB10_2 591; RV32I-NEXT: .LBB10_1: # %atomicrmw.start 592; RV32I-NEXT: # in Loop: Header=BB10_2 Depth=1 593; RV32I-NEXT: sb a3, 15(sp) 594; RV32I-NEXT: addi a1, sp, 15 595; RV32I-NEXT: mv a0, s0 596; RV32I-NEXT: li a3, 0 597; RV32I-NEXT: li a4, 0 598; RV32I-NEXT: call __atomic_compare_exchange_1@plt 599; RV32I-NEXT: lb a3, 15(sp) 600; RV32I-NEXT: bnez a0, .LBB10_4 601; RV32I-NEXT: .LBB10_2: # %atomicrmw.start 602; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 603; RV32I-NEXT: slli a0, a3, 24 604; RV32I-NEXT: srai a0, a0, 24 605; RV32I-NEXT: mv a2, a3 606; RV32I-NEXT: blt s2, a0, .LBB10_1 607; RV32I-NEXT: # %bb.3: # %atomicrmw.start 608; RV32I-NEXT: # in Loop: Header=BB10_2 Depth=1 609; RV32I-NEXT: mv a2, s1 610; RV32I-NEXT: j .LBB10_1 611; RV32I-NEXT: .LBB10_4: # %atomicrmw.end 612; RV32I-NEXT: slli a0, a3, 24 613; RV32I-NEXT: srai a0, a0, 24 614; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 615; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 616; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 617; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 618; RV32I-NEXT: addi sp, sp, 32 619; RV32I-NEXT: ret 620; 621; RV32IA-LABEL: atomicrmw_max_i8_monotonic: 622; RV32IA: # %bb.0: 623; RV32IA-NEXT: andi a2, a0, -4 624; RV32IA-NEXT: slli a0, a0, 3 625; RV32IA-NEXT: andi a3, a0, 24 626; RV32IA-NEXT: li a4, 255 627; RV32IA-NEXT: sll a4, a4, a0 628; RV32IA-NEXT: slli a1, a1, 24 629; RV32IA-NEXT: srai a1, a1, 24 630; RV32IA-NEXT: sll a1, a1, a0 631; RV32IA-NEXT: xori a3, a3, 24 632; RV32IA-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 633; RV32IA-NEXT: lr.w a5, (a2) 634; RV32IA-NEXT: and a7, a5, a4 635; RV32IA-NEXT: mv a6, a5 636; RV32IA-NEXT: sll a7, a7, a3 637; RV32IA-NEXT: sra a7, a7, a3 638; RV32IA-NEXT: bge a7, a1, .LBB10_3 639; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1 640; RV32IA-NEXT: xor a6, a5, a1 641; RV32IA-NEXT: and a6, a6, a4 642; RV32IA-NEXT: xor a6, a5, a6 643; RV32IA-NEXT: .LBB10_3: # in Loop: Header=BB10_1 Depth=1 644; RV32IA-NEXT: sc.w a6, a6, (a2) 645; RV32IA-NEXT: bnez a6, .LBB10_1 646; RV32IA-NEXT: # %bb.4: 647; RV32IA-NEXT: srl a0, a5, a0 648; RV32IA-NEXT: slli a0, a0, 24 649; RV32IA-NEXT: srai a0, a0, 24 650; RV32IA-NEXT: ret 651; 652; RV64I-LABEL: atomicrmw_max_i8_monotonic: 653; RV64I: # %bb.0: 654; RV64I-NEXT: addi sp, sp, -48 655; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 656; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 657; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 658; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 659; RV64I-NEXT: mv s0, a0 660; RV64I-NEXT: lbu a3, 0(a0) 661; RV64I-NEXT: mv s1, a1 662; RV64I-NEXT: slli a0, a1, 56 663; RV64I-NEXT: srai s2, a0, 56 664; RV64I-NEXT: j .LBB10_2 665; RV64I-NEXT: .LBB10_1: # %atomicrmw.start 666; RV64I-NEXT: # in Loop: Header=BB10_2 Depth=1 667; RV64I-NEXT: sb a3, 15(sp) 668; RV64I-NEXT: addi a1, sp, 15 669; RV64I-NEXT: mv a0, s0 670; RV64I-NEXT: li a3, 0 671; RV64I-NEXT: li a4, 0 672; RV64I-NEXT: call __atomic_compare_exchange_1@plt 673; RV64I-NEXT: lb a3, 15(sp) 674; RV64I-NEXT: bnez a0, .LBB10_4 675; RV64I-NEXT: .LBB10_2: # %atomicrmw.start 676; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 677; RV64I-NEXT: slli a0, a3, 56 678; RV64I-NEXT: srai a0, a0, 56 679; RV64I-NEXT: mv a2, a3 680; RV64I-NEXT: blt s2, a0, .LBB10_1 681; RV64I-NEXT: # %bb.3: # %atomicrmw.start 682; RV64I-NEXT: # in Loop: Header=BB10_2 Depth=1 683; RV64I-NEXT: mv a2, s1 684; RV64I-NEXT: j .LBB10_1 685; RV64I-NEXT: .LBB10_4: # %atomicrmw.end 686; RV64I-NEXT: slli a0, a3, 56 687; RV64I-NEXT: srai a0, a0, 56 688; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 689; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 690; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 691; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 692; RV64I-NEXT: addi sp, sp, 48 693; RV64I-NEXT: ret 694; 695; RV64IA-LABEL: atomicrmw_max_i8_monotonic: 696; RV64IA: # %bb.0: 697; RV64IA-NEXT: andi a2, a0, -4 698; RV64IA-NEXT: slliw a0, a0, 3 699; RV64IA-NEXT: andi a3, a0, 24 700; RV64IA-NEXT: li a4, 255 701; RV64IA-NEXT: sllw a4, a4, a0 702; RV64IA-NEXT: slli a1, a1, 56 703; RV64IA-NEXT: srai a1, a1, 56 704; RV64IA-NEXT: sllw a1, a1, a0 705; RV64IA-NEXT: xori a3, a3, 56 706; RV64IA-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1 707; RV64IA-NEXT: lr.w a5, (a2) 708; RV64IA-NEXT: and a7, a5, a4 709; RV64IA-NEXT: mv a6, a5 710; RV64IA-NEXT: sll a7, a7, a3 711; RV64IA-NEXT: sra a7, a7, a3 712; RV64IA-NEXT: bge a7, a1, .LBB10_3 713; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1 714; RV64IA-NEXT: xor a6, a5, a1 715; RV64IA-NEXT: and a6, a6, a4 716; RV64IA-NEXT: xor a6, a5, a6 717; RV64IA-NEXT: .LBB10_3: # in Loop: Header=BB10_1 Depth=1 718; RV64IA-NEXT: sc.w a6, a6, (a2) 719; RV64IA-NEXT: bnez a6, .LBB10_1 720; RV64IA-NEXT: # %bb.4: 721; RV64IA-NEXT: srlw a0, a5, a0 722; RV64IA-NEXT: slli a0, a0, 56 723; RV64IA-NEXT: srai a0, a0, 56 724; RV64IA-NEXT: ret 725 %1 = atomicrmw max i8* %a, i8 %b monotonic 726 ret i8 %1 727} 728 729define signext i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind { 730; RV32I-LABEL: atomicrmw_min_i8_monotonic: 731; RV32I: # %bb.0: 732; RV32I-NEXT: addi sp, sp, -32 733; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 734; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 735; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 736; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 737; RV32I-NEXT: mv s0, a0 738; RV32I-NEXT: lbu a3, 0(a0) 739; RV32I-NEXT: mv s1, a1 740; RV32I-NEXT: slli a0, a1, 24 741; RV32I-NEXT: srai s2, a0, 24 742; RV32I-NEXT: j .LBB11_2 743; RV32I-NEXT: .LBB11_1: # %atomicrmw.start 744; RV32I-NEXT: # in Loop: Header=BB11_2 Depth=1 745; RV32I-NEXT: sb a3, 15(sp) 746; RV32I-NEXT: addi a1, sp, 15 747; RV32I-NEXT: mv a0, s0 748; RV32I-NEXT: li a3, 0 749; RV32I-NEXT: li a4, 0 750; RV32I-NEXT: call __atomic_compare_exchange_1@plt 751; RV32I-NEXT: lb a3, 15(sp) 752; RV32I-NEXT: bnez a0, .LBB11_4 753; RV32I-NEXT: .LBB11_2: # %atomicrmw.start 754; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 755; RV32I-NEXT: slli a0, a3, 24 756; RV32I-NEXT: srai a0, a0, 24 757; RV32I-NEXT: mv a2, a3 758; RV32I-NEXT: bge s2, a0, .LBB11_1 759; RV32I-NEXT: # %bb.3: # %atomicrmw.start 760; RV32I-NEXT: # in Loop: Header=BB11_2 Depth=1 761; RV32I-NEXT: mv a2, s1 762; RV32I-NEXT: j .LBB11_1 763; RV32I-NEXT: .LBB11_4: # %atomicrmw.end 764; RV32I-NEXT: slli a0, a3, 24 765; RV32I-NEXT: srai a0, a0, 24 766; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 767; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 768; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 769; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 770; RV32I-NEXT: addi sp, sp, 32 771; RV32I-NEXT: ret 772; 773; RV32IA-LABEL: atomicrmw_min_i8_monotonic: 774; RV32IA: # %bb.0: 775; RV32IA-NEXT: andi a2, a0, -4 776; RV32IA-NEXT: slli a0, a0, 3 777; RV32IA-NEXT: andi a3, a0, 24 778; RV32IA-NEXT: li a4, 255 779; RV32IA-NEXT: sll a4, a4, a0 780; RV32IA-NEXT: slli a1, a1, 24 781; RV32IA-NEXT: srai a1, a1, 24 782; RV32IA-NEXT: sll a1, a1, a0 783; RV32IA-NEXT: xori a3, a3, 24 784; RV32IA-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 785; RV32IA-NEXT: lr.w a5, (a2) 786; RV32IA-NEXT: and a7, a5, a4 787; RV32IA-NEXT: mv a6, a5 788; RV32IA-NEXT: sll a7, a7, a3 789; RV32IA-NEXT: sra a7, a7, a3 790; RV32IA-NEXT: bge a1, a7, .LBB11_3 791; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB11_1 Depth=1 792; RV32IA-NEXT: xor a6, a5, a1 793; RV32IA-NEXT: and a6, a6, a4 794; RV32IA-NEXT: xor a6, a5, a6 795; RV32IA-NEXT: .LBB11_3: # in Loop: Header=BB11_1 Depth=1 796; RV32IA-NEXT: sc.w a6, a6, (a2) 797; RV32IA-NEXT: bnez a6, .LBB11_1 798; RV32IA-NEXT: # %bb.4: 799; RV32IA-NEXT: srl a0, a5, a0 800; RV32IA-NEXT: slli a0, a0, 24 801; RV32IA-NEXT: srai a0, a0, 24 802; RV32IA-NEXT: ret 803; 804; RV64I-LABEL: atomicrmw_min_i8_monotonic: 805; RV64I: # %bb.0: 806; RV64I-NEXT: addi sp, sp, -48 807; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 808; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 809; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 810; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 811; RV64I-NEXT: mv s0, a0 812; RV64I-NEXT: lbu a3, 0(a0) 813; RV64I-NEXT: mv s1, a1 814; RV64I-NEXT: slli a0, a1, 56 815; RV64I-NEXT: srai s2, a0, 56 816; RV64I-NEXT: j .LBB11_2 817; RV64I-NEXT: .LBB11_1: # %atomicrmw.start 818; RV64I-NEXT: # in Loop: Header=BB11_2 Depth=1 819; RV64I-NEXT: sb a3, 15(sp) 820; RV64I-NEXT: addi a1, sp, 15 821; RV64I-NEXT: mv a0, s0 822; RV64I-NEXT: li a3, 0 823; RV64I-NEXT: li a4, 0 824; RV64I-NEXT: call __atomic_compare_exchange_1@plt 825; RV64I-NEXT: lb a3, 15(sp) 826; RV64I-NEXT: bnez a0, .LBB11_4 827; RV64I-NEXT: .LBB11_2: # %atomicrmw.start 828; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 829; RV64I-NEXT: slli a0, a3, 56 830; RV64I-NEXT: srai a0, a0, 56 831; RV64I-NEXT: mv a2, a3 832; RV64I-NEXT: bge s2, a0, .LBB11_1 833; RV64I-NEXT: # %bb.3: # %atomicrmw.start 834; RV64I-NEXT: # in Loop: Header=BB11_2 Depth=1 835; RV64I-NEXT: mv a2, s1 836; RV64I-NEXT: j .LBB11_1 837; RV64I-NEXT: .LBB11_4: # %atomicrmw.end 838; RV64I-NEXT: slli a0, a3, 56 839; RV64I-NEXT: srai a0, a0, 56 840; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 841; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 842; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 843; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 844; RV64I-NEXT: addi sp, sp, 48 845; RV64I-NEXT: ret 846; 847; RV64IA-LABEL: atomicrmw_min_i8_monotonic: 848; RV64IA: # %bb.0: 849; RV64IA-NEXT: andi a2, a0, -4 850; RV64IA-NEXT: slliw a0, a0, 3 851; RV64IA-NEXT: andi a3, a0, 24 852; RV64IA-NEXT: li a4, 255 853; RV64IA-NEXT: sllw a4, a4, a0 854; RV64IA-NEXT: slli a1, a1, 56 855; RV64IA-NEXT: srai a1, a1, 56 856; RV64IA-NEXT: sllw a1, a1, a0 857; RV64IA-NEXT: xori a3, a3, 56 858; RV64IA-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 859; RV64IA-NEXT: lr.w a5, (a2) 860; RV64IA-NEXT: and a7, a5, a4 861; RV64IA-NEXT: mv a6, a5 862; RV64IA-NEXT: sll a7, a7, a3 863; RV64IA-NEXT: sra a7, a7, a3 864; RV64IA-NEXT: bge a1, a7, .LBB11_3 865; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB11_1 Depth=1 866; RV64IA-NEXT: xor a6, a5, a1 867; RV64IA-NEXT: and a6, a6, a4 868; RV64IA-NEXT: xor a6, a5, a6 869; RV64IA-NEXT: .LBB11_3: # in Loop: Header=BB11_1 Depth=1 870; RV64IA-NEXT: sc.w a6, a6, (a2) 871; RV64IA-NEXT: bnez a6, .LBB11_1 872; RV64IA-NEXT: # %bb.4: 873; RV64IA-NEXT: srlw a0, a5, a0 874; RV64IA-NEXT: slli a0, a0, 56 875; RV64IA-NEXT: srai a0, a0, 56 876; RV64IA-NEXT: ret 877 %1 = atomicrmw min i8* %a, i8 %b monotonic 878 ret i8 %1 879} 880 881define signext i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind { 882; RV32I-LABEL: atomicrmw_umax_i8_monotonic: 883; RV32I: # %bb.0: 884; RV32I-NEXT: addi sp, sp, -32 885; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 886; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 887; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 888; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 889; RV32I-NEXT: mv s0, a0 890; RV32I-NEXT: lbu a3, 0(a0) 891; RV32I-NEXT: mv s1, a1 892; RV32I-NEXT: andi s2, a1, 255 893; RV32I-NEXT: j .LBB12_2 894; RV32I-NEXT: .LBB12_1: # %atomicrmw.start 895; RV32I-NEXT: # in Loop: Header=BB12_2 Depth=1 896; RV32I-NEXT: sb a3, 15(sp) 897; RV32I-NEXT: addi a1, sp, 15 898; RV32I-NEXT: mv a0, s0 899; RV32I-NEXT: li a3, 0 900; RV32I-NEXT: li a4, 0 901; RV32I-NEXT: call __atomic_compare_exchange_1@plt 902; RV32I-NEXT: lb a3, 15(sp) 903; RV32I-NEXT: bnez a0, .LBB12_4 904; RV32I-NEXT: .LBB12_2: # %atomicrmw.start 905; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 906; RV32I-NEXT: andi a0, a3, 255 907; RV32I-NEXT: mv a2, a3 908; RV32I-NEXT: bltu s2, a0, .LBB12_1 909; RV32I-NEXT: # %bb.3: # %atomicrmw.start 910; RV32I-NEXT: # in Loop: Header=BB12_2 Depth=1 911; RV32I-NEXT: mv a2, s1 912; RV32I-NEXT: j .LBB12_1 913; RV32I-NEXT: .LBB12_4: # %atomicrmw.end 914; RV32I-NEXT: slli a0, a3, 24 915; RV32I-NEXT: srai a0, a0, 24 916; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 917; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 918; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 919; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 920; RV32I-NEXT: addi sp, sp, 32 921; RV32I-NEXT: ret 922; 923; RV32IA-LABEL: atomicrmw_umax_i8_monotonic: 924; RV32IA: # %bb.0: 925; RV32IA-NEXT: andi a2, a0, -4 926; RV32IA-NEXT: slli a0, a0, 3 927; RV32IA-NEXT: li a3, 255 928; RV32IA-NEXT: sll a3, a3, a0 929; RV32IA-NEXT: andi a1, a1, 255 930; RV32IA-NEXT: sll a1, a1, a0 931; RV32IA-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 932; RV32IA-NEXT: lr.w a4, (a2) 933; RV32IA-NEXT: and a6, a4, a3 934; RV32IA-NEXT: mv a5, a4 935; RV32IA-NEXT: bgeu a6, a1, .LBB12_3 936; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1 937; RV32IA-NEXT: xor a5, a4, a1 938; RV32IA-NEXT: and a5, a5, a3 939; RV32IA-NEXT: xor a5, a4, a5 940; RV32IA-NEXT: .LBB12_3: # in Loop: Header=BB12_1 Depth=1 941; RV32IA-NEXT: sc.w a5, a5, (a2) 942; RV32IA-NEXT: bnez a5, .LBB12_1 943; RV32IA-NEXT: # %bb.4: 944; RV32IA-NEXT: srl a0, a4, a0 945; RV32IA-NEXT: slli a0, a0, 24 946; RV32IA-NEXT: srai a0, a0, 24 947; RV32IA-NEXT: ret 948; 949; RV64I-LABEL: atomicrmw_umax_i8_monotonic: 950; RV64I: # %bb.0: 951; RV64I-NEXT: addi sp, sp, -48 952; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 953; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 954; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 955; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 956; RV64I-NEXT: mv s0, a0 957; RV64I-NEXT: lbu a3, 0(a0) 958; RV64I-NEXT: mv s1, a1 959; RV64I-NEXT: andi s2, a1, 255 960; RV64I-NEXT: j .LBB12_2 961; RV64I-NEXT: .LBB12_1: # %atomicrmw.start 962; RV64I-NEXT: # in Loop: Header=BB12_2 Depth=1 963; RV64I-NEXT: sb a3, 15(sp) 964; RV64I-NEXT: addi a1, sp, 15 965; RV64I-NEXT: mv a0, s0 966; RV64I-NEXT: li a3, 0 967; RV64I-NEXT: li a4, 0 968; RV64I-NEXT: call __atomic_compare_exchange_1@plt 969; RV64I-NEXT: lb a3, 15(sp) 970; RV64I-NEXT: bnez a0, .LBB12_4 971; RV64I-NEXT: .LBB12_2: # %atomicrmw.start 972; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 973; RV64I-NEXT: andi a0, a3, 255 974; RV64I-NEXT: mv a2, a3 975; RV64I-NEXT: bltu s2, a0, .LBB12_1 976; RV64I-NEXT: # %bb.3: # %atomicrmw.start 977; RV64I-NEXT: # in Loop: Header=BB12_2 Depth=1 978; RV64I-NEXT: mv a2, s1 979; RV64I-NEXT: j .LBB12_1 980; RV64I-NEXT: .LBB12_4: # %atomicrmw.end 981; RV64I-NEXT: slli a0, a3, 56 982; RV64I-NEXT: srai a0, a0, 56 983; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 984; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 985; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 986; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 987; RV64I-NEXT: addi sp, sp, 48 988; RV64I-NEXT: ret 989; 990; RV64IA-LABEL: atomicrmw_umax_i8_monotonic: 991; RV64IA: # %bb.0: 992; RV64IA-NEXT: andi a2, a0, -4 993; RV64IA-NEXT: slliw a0, a0, 3 994; RV64IA-NEXT: li a3, 255 995; RV64IA-NEXT: sllw a3, a3, a0 996; RV64IA-NEXT: andi a1, a1, 255 997; RV64IA-NEXT: sllw a1, a1, a0 998; RV64IA-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1 999; RV64IA-NEXT: lr.w a4, (a2) 1000; RV64IA-NEXT: and a6, a4, a3 1001; RV64IA-NEXT: mv a5, a4 1002; RV64IA-NEXT: bgeu a6, a1, .LBB12_3 1003; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1 1004; RV64IA-NEXT: xor a5, a4, a1 1005; RV64IA-NEXT: and a5, a5, a3 1006; RV64IA-NEXT: xor a5, a4, a5 1007; RV64IA-NEXT: .LBB12_3: # in Loop: Header=BB12_1 Depth=1 1008; RV64IA-NEXT: sc.w a5, a5, (a2) 1009; RV64IA-NEXT: bnez a5, .LBB12_1 1010; RV64IA-NEXT: # %bb.4: 1011; RV64IA-NEXT: srlw a0, a4, a0 1012; RV64IA-NEXT: slli a0, a0, 56 1013; RV64IA-NEXT: srai a0, a0, 56 1014; RV64IA-NEXT: ret 1015 %1 = atomicrmw umax i8* %a, i8 %b monotonic 1016 ret i8 %1 1017} 1018 1019define signext i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind { 1020; RV32I-LABEL: atomicrmw_umin_i8_monotonic: 1021; RV32I: # %bb.0: 1022; RV32I-NEXT: addi sp, sp, -32 1023; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1024; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1025; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1026; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1027; RV32I-NEXT: mv s0, a0 1028; RV32I-NEXT: lbu a3, 0(a0) 1029; RV32I-NEXT: mv s1, a1 1030; RV32I-NEXT: andi s2, a1, 255 1031; RV32I-NEXT: j .LBB13_2 1032; RV32I-NEXT: .LBB13_1: # %atomicrmw.start 1033; RV32I-NEXT: # in Loop: Header=BB13_2 Depth=1 1034; RV32I-NEXT: sb a3, 15(sp) 1035; RV32I-NEXT: addi a1, sp, 15 1036; RV32I-NEXT: mv a0, s0 1037; RV32I-NEXT: li a3, 0 1038; RV32I-NEXT: li a4, 0 1039; RV32I-NEXT: call __atomic_compare_exchange_1@plt 1040; RV32I-NEXT: lb a3, 15(sp) 1041; RV32I-NEXT: bnez a0, .LBB13_4 1042; RV32I-NEXT: .LBB13_2: # %atomicrmw.start 1043; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1044; RV32I-NEXT: andi a0, a3, 255 1045; RV32I-NEXT: mv a2, a3 1046; RV32I-NEXT: bgeu s2, a0, .LBB13_1 1047; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1048; RV32I-NEXT: # in Loop: Header=BB13_2 Depth=1 1049; RV32I-NEXT: mv a2, s1 1050; RV32I-NEXT: j .LBB13_1 1051; RV32I-NEXT: .LBB13_4: # %atomicrmw.end 1052; RV32I-NEXT: slli a0, a3, 24 1053; RV32I-NEXT: srai a0, a0, 24 1054; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1055; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1056; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1057; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1058; RV32I-NEXT: addi sp, sp, 32 1059; RV32I-NEXT: ret 1060; 1061; RV32IA-LABEL: atomicrmw_umin_i8_monotonic: 1062; RV32IA: # %bb.0: 1063; RV32IA-NEXT: andi a2, a0, -4 1064; RV32IA-NEXT: slli a0, a0, 3 1065; RV32IA-NEXT: li a3, 255 1066; RV32IA-NEXT: sll a3, a3, a0 1067; RV32IA-NEXT: andi a1, a1, 255 1068; RV32IA-NEXT: sll a1, a1, a0 1069; RV32IA-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 1070; RV32IA-NEXT: lr.w a4, (a2) 1071; RV32IA-NEXT: and a6, a4, a3 1072; RV32IA-NEXT: mv a5, a4 1073; RV32IA-NEXT: bgeu a1, a6, .LBB13_3 1074; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1 1075; RV32IA-NEXT: xor a5, a4, a1 1076; RV32IA-NEXT: and a5, a5, a3 1077; RV32IA-NEXT: xor a5, a4, a5 1078; RV32IA-NEXT: .LBB13_3: # in Loop: Header=BB13_1 Depth=1 1079; RV32IA-NEXT: sc.w a5, a5, (a2) 1080; RV32IA-NEXT: bnez a5, .LBB13_1 1081; RV32IA-NEXT: # %bb.4: 1082; RV32IA-NEXT: srl a0, a4, a0 1083; RV32IA-NEXT: slli a0, a0, 24 1084; RV32IA-NEXT: srai a0, a0, 24 1085; RV32IA-NEXT: ret 1086; 1087; RV64I-LABEL: atomicrmw_umin_i8_monotonic: 1088; RV64I: # %bb.0: 1089; RV64I-NEXT: addi sp, sp, -48 1090; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1091; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1092; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1093; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1094; RV64I-NEXT: mv s0, a0 1095; RV64I-NEXT: lbu a3, 0(a0) 1096; RV64I-NEXT: mv s1, a1 1097; RV64I-NEXT: andi s2, a1, 255 1098; RV64I-NEXT: j .LBB13_2 1099; RV64I-NEXT: .LBB13_1: # %atomicrmw.start 1100; RV64I-NEXT: # in Loop: Header=BB13_2 Depth=1 1101; RV64I-NEXT: sb a3, 15(sp) 1102; RV64I-NEXT: addi a1, sp, 15 1103; RV64I-NEXT: mv a0, s0 1104; RV64I-NEXT: li a3, 0 1105; RV64I-NEXT: li a4, 0 1106; RV64I-NEXT: call __atomic_compare_exchange_1@plt 1107; RV64I-NEXT: lb a3, 15(sp) 1108; RV64I-NEXT: bnez a0, .LBB13_4 1109; RV64I-NEXT: .LBB13_2: # %atomicrmw.start 1110; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1111; RV64I-NEXT: andi a0, a3, 255 1112; RV64I-NEXT: mv a2, a3 1113; RV64I-NEXT: bgeu s2, a0, .LBB13_1 1114; RV64I-NEXT: # %bb.3: # %atomicrmw.start 1115; RV64I-NEXT: # in Loop: Header=BB13_2 Depth=1 1116; RV64I-NEXT: mv a2, s1 1117; RV64I-NEXT: j .LBB13_1 1118; RV64I-NEXT: .LBB13_4: # %atomicrmw.end 1119; RV64I-NEXT: slli a0, a3, 56 1120; RV64I-NEXT: srai a0, a0, 56 1121; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1122; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1123; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1124; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1125; RV64I-NEXT: addi sp, sp, 48 1126; RV64I-NEXT: ret 1127; 1128; RV64IA-LABEL: atomicrmw_umin_i8_monotonic: 1129; RV64IA: # %bb.0: 1130; RV64IA-NEXT: andi a2, a0, -4 1131; RV64IA-NEXT: slliw a0, a0, 3 1132; RV64IA-NEXT: li a3, 255 1133; RV64IA-NEXT: sllw a3, a3, a0 1134; RV64IA-NEXT: andi a1, a1, 255 1135; RV64IA-NEXT: sllw a1, a1, a0 1136; RV64IA-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1 1137; RV64IA-NEXT: lr.w a4, (a2) 1138; RV64IA-NEXT: and a6, a4, a3 1139; RV64IA-NEXT: mv a5, a4 1140; RV64IA-NEXT: bgeu a1, a6, .LBB13_3 1141; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1 1142; RV64IA-NEXT: xor a5, a4, a1 1143; RV64IA-NEXT: and a5, a5, a3 1144; RV64IA-NEXT: xor a5, a4, a5 1145; RV64IA-NEXT: .LBB13_3: # in Loop: Header=BB13_1 Depth=1 1146; RV64IA-NEXT: sc.w a5, a5, (a2) 1147; RV64IA-NEXT: bnez a5, .LBB13_1 1148; RV64IA-NEXT: # %bb.4: 1149; RV64IA-NEXT: srlw a0, a4, a0 1150; RV64IA-NEXT: slli a0, a0, 56 1151; RV64IA-NEXT: srai a0, a0, 56 1152; RV64IA-NEXT: ret 1153 %1 = atomicrmw umin i8* %a, i8 %b monotonic 1154 ret i8 %1 1155} 1156 1157define signext i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind { 1158; RV32I-LABEL: atomicrmw_xchg_i16_monotonic: 1159; RV32I: # %bb.0: 1160; RV32I-NEXT: addi sp, sp, -16 1161; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1162; RV32I-NEXT: li a2, 0 1163; RV32I-NEXT: call __atomic_exchange_2@plt 1164; RV32I-NEXT: slli a0, a0, 16 1165; RV32I-NEXT: srai a0, a0, 16 1166; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1167; RV32I-NEXT: addi sp, sp, 16 1168; RV32I-NEXT: ret 1169; 1170; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic: 1171; RV32IA: # %bb.0: 1172; RV32IA-NEXT: andi a2, a0, -4 1173; RV32IA-NEXT: slli a0, a0, 3 1174; RV32IA-NEXT: lui a3, 16 1175; RV32IA-NEXT: addi a3, a3, -1 1176; RV32IA-NEXT: sll a4, a3, a0 1177; RV32IA-NEXT: and a1, a1, a3 1178; RV32IA-NEXT: sll a1, a1, a0 1179; RV32IA-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 1180; RV32IA-NEXT: lr.w a3, (a2) 1181; RV32IA-NEXT: mv a5, a1 1182; RV32IA-NEXT: xor a5, a3, a5 1183; RV32IA-NEXT: and a5, a5, a4 1184; RV32IA-NEXT: xor a5, a3, a5 1185; RV32IA-NEXT: sc.w a5, a5, (a2) 1186; RV32IA-NEXT: bnez a5, .LBB14_1 1187; RV32IA-NEXT: # %bb.2: 1188; RV32IA-NEXT: srl a0, a3, a0 1189; RV32IA-NEXT: slli a0, a0, 16 1190; RV32IA-NEXT: srai a0, a0, 16 1191; RV32IA-NEXT: ret 1192; 1193; RV64I-LABEL: atomicrmw_xchg_i16_monotonic: 1194; RV64I: # %bb.0: 1195; RV64I-NEXT: addi sp, sp, -16 1196; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1197; RV64I-NEXT: li a2, 0 1198; RV64I-NEXT: call __atomic_exchange_2@plt 1199; RV64I-NEXT: slli a0, a0, 48 1200; RV64I-NEXT: srai a0, a0, 48 1201; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1202; RV64I-NEXT: addi sp, sp, 16 1203; RV64I-NEXT: ret 1204; 1205; RV64IA-LABEL: atomicrmw_xchg_i16_monotonic: 1206; RV64IA: # %bb.0: 1207; RV64IA-NEXT: andi a2, a0, -4 1208; RV64IA-NEXT: slliw a0, a0, 3 1209; RV64IA-NEXT: lui a3, 16 1210; RV64IA-NEXT: addiw a3, a3, -1 1211; RV64IA-NEXT: sllw a4, a3, a0 1212; RV64IA-NEXT: and a1, a1, a3 1213; RV64IA-NEXT: sllw a1, a1, a0 1214; RV64IA-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1 1215; RV64IA-NEXT: lr.w a3, (a2) 1216; RV64IA-NEXT: mv a5, a1 1217; RV64IA-NEXT: xor a5, a3, a5 1218; RV64IA-NEXT: and a5, a5, a4 1219; RV64IA-NEXT: xor a5, a3, a5 1220; RV64IA-NEXT: sc.w a5, a5, (a2) 1221; RV64IA-NEXT: bnez a5, .LBB14_1 1222; RV64IA-NEXT: # %bb.2: 1223; RV64IA-NEXT: srlw a0, a3, a0 1224; RV64IA-NEXT: slli a0, a0, 48 1225; RV64IA-NEXT: srai a0, a0, 48 1226; RV64IA-NEXT: ret 1227 %1 = atomicrmw xchg i16* %a, i16 %b monotonic 1228 ret i16 %1 1229} 1230 1231define signext i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind { 1232; RV32I-LABEL: atomicrmw_add_i16_monotonic: 1233; RV32I: # %bb.0: 1234; RV32I-NEXT: addi sp, sp, -16 1235; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1236; RV32I-NEXT: li a2, 0 1237; RV32I-NEXT: call __atomic_fetch_add_2@plt 1238; RV32I-NEXT: slli a0, a0, 16 1239; RV32I-NEXT: srai a0, a0, 16 1240; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1241; RV32I-NEXT: addi sp, sp, 16 1242; RV32I-NEXT: ret 1243; 1244; RV32IA-LABEL: atomicrmw_add_i16_monotonic: 1245; RV32IA: # %bb.0: 1246; RV32IA-NEXT: andi a2, a0, -4 1247; RV32IA-NEXT: slli a0, a0, 3 1248; RV32IA-NEXT: lui a3, 16 1249; RV32IA-NEXT: addi a3, a3, -1 1250; RV32IA-NEXT: sll a4, a3, a0 1251; RV32IA-NEXT: and a1, a1, a3 1252; RV32IA-NEXT: sll a1, a1, a0 1253; RV32IA-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1254; RV32IA-NEXT: lr.w a3, (a2) 1255; RV32IA-NEXT: add a5, a3, a1 1256; RV32IA-NEXT: xor a5, a3, a5 1257; RV32IA-NEXT: and a5, a5, a4 1258; RV32IA-NEXT: xor a5, a3, a5 1259; RV32IA-NEXT: sc.w a5, a5, (a2) 1260; RV32IA-NEXT: bnez a5, .LBB15_1 1261; RV32IA-NEXT: # %bb.2: 1262; RV32IA-NEXT: srl a0, a3, a0 1263; RV32IA-NEXT: slli a0, a0, 16 1264; RV32IA-NEXT: srai a0, a0, 16 1265; RV32IA-NEXT: ret 1266; 1267; RV64I-LABEL: atomicrmw_add_i16_monotonic: 1268; RV64I: # %bb.0: 1269; RV64I-NEXT: addi sp, sp, -16 1270; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1271; RV64I-NEXT: li a2, 0 1272; RV64I-NEXT: call __atomic_fetch_add_2@plt 1273; RV64I-NEXT: slli a0, a0, 48 1274; RV64I-NEXT: srai a0, a0, 48 1275; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1276; RV64I-NEXT: addi sp, sp, 16 1277; RV64I-NEXT: ret 1278; 1279; RV64IA-LABEL: atomicrmw_add_i16_monotonic: 1280; RV64IA: # %bb.0: 1281; RV64IA-NEXT: andi a2, a0, -4 1282; RV64IA-NEXT: slliw a0, a0, 3 1283; RV64IA-NEXT: lui a3, 16 1284; RV64IA-NEXT: addiw a3, a3, -1 1285; RV64IA-NEXT: sllw a4, a3, a0 1286; RV64IA-NEXT: and a1, a1, a3 1287; RV64IA-NEXT: sllw a1, a1, a0 1288; RV64IA-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1289; RV64IA-NEXT: lr.w a3, (a2) 1290; RV64IA-NEXT: add a5, a3, a1 1291; RV64IA-NEXT: xor a5, a3, a5 1292; RV64IA-NEXT: and a5, a5, a4 1293; RV64IA-NEXT: xor a5, a3, a5 1294; RV64IA-NEXT: sc.w a5, a5, (a2) 1295; RV64IA-NEXT: bnez a5, .LBB15_1 1296; RV64IA-NEXT: # %bb.2: 1297; RV64IA-NEXT: srlw a0, a3, a0 1298; RV64IA-NEXT: slli a0, a0, 48 1299; RV64IA-NEXT: srai a0, a0, 48 1300; RV64IA-NEXT: ret 1301 %1 = atomicrmw add i16* %a, i16 %b monotonic 1302 ret i16 %1 1303} 1304 1305define signext i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind { 1306; RV32I-LABEL: atomicrmw_sub_i16_monotonic: 1307; RV32I: # %bb.0: 1308; RV32I-NEXT: addi sp, sp, -16 1309; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1310; RV32I-NEXT: li a2, 0 1311; RV32I-NEXT: call __atomic_fetch_sub_2@plt 1312; RV32I-NEXT: slli a0, a0, 16 1313; RV32I-NEXT: srai a0, a0, 16 1314; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1315; RV32I-NEXT: addi sp, sp, 16 1316; RV32I-NEXT: ret 1317; 1318; RV32IA-LABEL: atomicrmw_sub_i16_monotonic: 1319; RV32IA: # %bb.0: 1320; RV32IA-NEXT: andi a2, a0, -4 1321; RV32IA-NEXT: slli a0, a0, 3 1322; RV32IA-NEXT: lui a3, 16 1323; RV32IA-NEXT: addi a3, a3, -1 1324; RV32IA-NEXT: sll a4, a3, a0 1325; RV32IA-NEXT: and a1, a1, a3 1326; RV32IA-NEXT: sll a1, a1, a0 1327; RV32IA-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1328; RV32IA-NEXT: lr.w a3, (a2) 1329; RV32IA-NEXT: sub a5, a3, a1 1330; RV32IA-NEXT: xor a5, a3, a5 1331; RV32IA-NEXT: and a5, a5, a4 1332; RV32IA-NEXT: xor a5, a3, a5 1333; RV32IA-NEXT: sc.w a5, a5, (a2) 1334; RV32IA-NEXT: bnez a5, .LBB16_1 1335; RV32IA-NEXT: # %bb.2: 1336; RV32IA-NEXT: srl a0, a3, a0 1337; RV32IA-NEXT: slli a0, a0, 16 1338; RV32IA-NEXT: srai a0, a0, 16 1339; RV32IA-NEXT: ret 1340; 1341; RV64I-LABEL: atomicrmw_sub_i16_monotonic: 1342; RV64I: # %bb.0: 1343; RV64I-NEXT: addi sp, sp, -16 1344; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1345; RV64I-NEXT: li a2, 0 1346; RV64I-NEXT: call __atomic_fetch_sub_2@plt 1347; RV64I-NEXT: slli a0, a0, 48 1348; RV64I-NEXT: srai a0, a0, 48 1349; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1350; RV64I-NEXT: addi sp, sp, 16 1351; RV64I-NEXT: ret 1352; 1353; RV64IA-LABEL: atomicrmw_sub_i16_monotonic: 1354; RV64IA: # %bb.0: 1355; RV64IA-NEXT: andi a2, a0, -4 1356; RV64IA-NEXT: slliw a0, a0, 3 1357; RV64IA-NEXT: lui a3, 16 1358; RV64IA-NEXT: addiw a3, a3, -1 1359; RV64IA-NEXT: sllw a4, a3, a0 1360; RV64IA-NEXT: and a1, a1, a3 1361; RV64IA-NEXT: sllw a1, a1, a0 1362; RV64IA-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1363; RV64IA-NEXT: lr.w a3, (a2) 1364; RV64IA-NEXT: sub a5, a3, a1 1365; RV64IA-NEXT: xor a5, a3, a5 1366; RV64IA-NEXT: and a5, a5, a4 1367; RV64IA-NEXT: xor a5, a3, a5 1368; RV64IA-NEXT: sc.w a5, a5, (a2) 1369; RV64IA-NEXT: bnez a5, .LBB16_1 1370; RV64IA-NEXT: # %bb.2: 1371; RV64IA-NEXT: srlw a0, a3, a0 1372; RV64IA-NEXT: slli a0, a0, 48 1373; RV64IA-NEXT: srai a0, a0, 48 1374; RV64IA-NEXT: ret 1375 %1 = atomicrmw sub i16* %a, i16 %b monotonic 1376 ret i16 %1 1377} 1378 1379define signext i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind { 1380; RV32I-LABEL: atomicrmw_and_i16_monotonic: 1381; RV32I: # %bb.0: 1382; RV32I-NEXT: addi sp, sp, -16 1383; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1384; RV32I-NEXT: li a2, 0 1385; RV32I-NEXT: call __atomic_fetch_and_2@plt 1386; RV32I-NEXT: slli a0, a0, 16 1387; RV32I-NEXT: srai a0, a0, 16 1388; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1389; RV32I-NEXT: addi sp, sp, 16 1390; RV32I-NEXT: ret 1391; 1392; RV32IA-LABEL: atomicrmw_and_i16_monotonic: 1393; RV32IA: # %bb.0: 1394; RV32IA-NEXT: andi a2, a0, -4 1395; RV32IA-NEXT: slli a0, a0, 3 1396; RV32IA-NEXT: lui a3, 16 1397; RV32IA-NEXT: addi a3, a3, -1 1398; RV32IA-NEXT: sll a4, a3, a0 1399; RV32IA-NEXT: not a4, a4 1400; RV32IA-NEXT: and a1, a1, a3 1401; RV32IA-NEXT: sll a1, a1, a0 1402; RV32IA-NEXT: or a1, a4, a1 1403; RV32IA-NEXT: amoand.w a1, a1, (a2) 1404; RV32IA-NEXT: srl a0, a1, a0 1405; RV32IA-NEXT: slli a0, a0, 16 1406; RV32IA-NEXT: srai a0, a0, 16 1407; RV32IA-NEXT: ret 1408; 1409; RV64I-LABEL: atomicrmw_and_i16_monotonic: 1410; RV64I: # %bb.0: 1411; RV64I-NEXT: addi sp, sp, -16 1412; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1413; RV64I-NEXT: li a2, 0 1414; RV64I-NEXT: call __atomic_fetch_and_2@plt 1415; RV64I-NEXT: slli a0, a0, 48 1416; RV64I-NEXT: srai a0, a0, 48 1417; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1418; RV64I-NEXT: addi sp, sp, 16 1419; RV64I-NEXT: ret 1420; 1421; RV64IA-LABEL: atomicrmw_and_i16_monotonic: 1422; RV64IA: # %bb.0: 1423; RV64IA-NEXT: andi a2, a0, -4 1424; RV64IA-NEXT: slliw a0, a0, 3 1425; RV64IA-NEXT: lui a3, 16 1426; RV64IA-NEXT: addiw a3, a3, -1 1427; RV64IA-NEXT: sllw a4, a3, a0 1428; RV64IA-NEXT: not a4, a4 1429; RV64IA-NEXT: and a1, a1, a3 1430; RV64IA-NEXT: sllw a1, a1, a0 1431; RV64IA-NEXT: or a1, a4, a1 1432; RV64IA-NEXT: amoand.w a1, a1, (a2) 1433; RV64IA-NEXT: srlw a0, a1, a0 1434; RV64IA-NEXT: slli a0, a0, 48 1435; RV64IA-NEXT: srai a0, a0, 48 1436; RV64IA-NEXT: ret 1437 %1 = atomicrmw and i16* %a, i16 %b monotonic 1438 ret i16 %1 1439} 1440 1441define signext i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind { 1442; RV32I-LABEL: atomicrmw_nand_i16_monotonic: 1443; RV32I: # %bb.0: 1444; RV32I-NEXT: addi sp, sp, -16 1445; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1446; RV32I-NEXT: li a2, 0 1447; RV32I-NEXT: call __atomic_fetch_nand_2@plt 1448; RV32I-NEXT: slli a0, a0, 16 1449; RV32I-NEXT: srai a0, a0, 16 1450; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1451; RV32I-NEXT: addi sp, sp, 16 1452; RV32I-NEXT: ret 1453; 1454; RV32IA-LABEL: atomicrmw_nand_i16_monotonic: 1455; RV32IA: # %bb.0: 1456; RV32IA-NEXT: andi a2, a0, -4 1457; RV32IA-NEXT: slli a0, a0, 3 1458; RV32IA-NEXT: lui a3, 16 1459; RV32IA-NEXT: addi a3, a3, -1 1460; RV32IA-NEXT: sll a4, a3, a0 1461; RV32IA-NEXT: and a1, a1, a3 1462; RV32IA-NEXT: sll a1, a1, a0 1463; RV32IA-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 1464; RV32IA-NEXT: lr.w a3, (a2) 1465; RV32IA-NEXT: and a5, a3, a1 1466; RV32IA-NEXT: not a5, a5 1467; RV32IA-NEXT: xor a5, a3, a5 1468; RV32IA-NEXT: and a5, a5, a4 1469; RV32IA-NEXT: xor a5, a3, a5 1470; RV32IA-NEXT: sc.w a5, a5, (a2) 1471; RV32IA-NEXT: bnez a5, .LBB18_1 1472; RV32IA-NEXT: # %bb.2: 1473; RV32IA-NEXT: srl a0, a3, a0 1474; RV32IA-NEXT: slli a0, a0, 16 1475; RV32IA-NEXT: srai a0, a0, 16 1476; RV32IA-NEXT: ret 1477; 1478; RV64I-LABEL: atomicrmw_nand_i16_monotonic: 1479; RV64I: # %bb.0: 1480; RV64I-NEXT: addi sp, sp, -16 1481; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1482; RV64I-NEXT: li a2, 0 1483; RV64I-NEXT: call __atomic_fetch_nand_2@plt 1484; RV64I-NEXT: slli a0, a0, 48 1485; RV64I-NEXT: srai a0, a0, 48 1486; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1487; RV64I-NEXT: addi sp, sp, 16 1488; RV64I-NEXT: ret 1489; 1490; RV64IA-LABEL: atomicrmw_nand_i16_monotonic: 1491; RV64IA: # %bb.0: 1492; RV64IA-NEXT: andi a2, a0, -4 1493; RV64IA-NEXT: slliw a0, a0, 3 1494; RV64IA-NEXT: lui a3, 16 1495; RV64IA-NEXT: addiw a3, a3, -1 1496; RV64IA-NEXT: sllw a4, a3, a0 1497; RV64IA-NEXT: and a1, a1, a3 1498; RV64IA-NEXT: sllw a1, a1, a0 1499; RV64IA-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 1500; RV64IA-NEXT: lr.w a3, (a2) 1501; RV64IA-NEXT: and a5, a3, a1 1502; RV64IA-NEXT: not a5, a5 1503; RV64IA-NEXT: xor a5, a3, a5 1504; RV64IA-NEXT: and a5, a5, a4 1505; RV64IA-NEXT: xor a5, a3, a5 1506; RV64IA-NEXT: sc.w a5, a5, (a2) 1507; RV64IA-NEXT: bnez a5, .LBB18_1 1508; RV64IA-NEXT: # %bb.2: 1509; RV64IA-NEXT: srlw a0, a3, a0 1510; RV64IA-NEXT: slli a0, a0, 48 1511; RV64IA-NEXT: srai a0, a0, 48 1512; RV64IA-NEXT: ret 1513 %1 = atomicrmw nand i16* %a, i16 %b monotonic 1514 ret i16 %1 1515} 1516 1517define signext i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind { 1518; RV32I-LABEL: atomicrmw_or_i16_monotonic: 1519; RV32I: # %bb.0: 1520; RV32I-NEXT: addi sp, sp, -16 1521; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1522; RV32I-NEXT: li a2, 0 1523; RV32I-NEXT: call __atomic_fetch_or_2@plt 1524; RV32I-NEXT: slli a0, a0, 16 1525; RV32I-NEXT: srai a0, a0, 16 1526; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1527; RV32I-NEXT: addi sp, sp, 16 1528; RV32I-NEXT: ret 1529; 1530; RV32IA-LABEL: atomicrmw_or_i16_monotonic: 1531; RV32IA: # %bb.0: 1532; RV32IA-NEXT: andi a2, a0, -4 1533; RV32IA-NEXT: slli a0, a0, 3 1534; RV32IA-NEXT: slli a1, a1, 16 1535; RV32IA-NEXT: srli a1, a1, 16 1536; RV32IA-NEXT: sll a1, a1, a0 1537; RV32IA-NEXT: amoor.w a1, a1, (a2) 1538; RV32IA-NEXT: srl a0, a1, a0 1539; RV32IA-NEXT: slli a0, a0, 16 1540; RV32IA-NEXT: srai a0, a0, 16 1541; RV32IA-NEXT: ret 1542; 1543; RV64I-LABEL: atomicrmw_or_i16_monotonic: 1544; RV64I: # %bb.0: 1545; RV64I-NEXT: addi sp, sp, -16 1546; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1547; RV64I-NEXT: li a2, 0 1548; RV64I-NEXT: call __atomic_fetch_or_2@plt 1549; RV64I-NEXT: slli a0, a0, 48 1550; RV64I-NEXT: srai a0, a0, 48 1551; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1552; RV64I-NEXT: addi sp, sp, 16 1553; RV64I-NEXT: ret 1554; 1555; RV64IA-LABEL: atomicrmw_or_i16_monotonic: 1556; RV64IA: # %bb.0: 1557; RV64IA-NEXT: andi a2, a0, -4 1558; RV64IA-NEXT: slliw a0, a0, 3 1559; RV64IA-NEXT: slli a1, a1, 48 1560; RV64IA-NEXT: srli a1, a1, 48 1561; RV64IA-NEXT: sllw a1, a1, a0 1562; RV64IA-NEXT: amoor.w a1, a1, (a2) 1563; RV64IA-NEXT: srlw a0, a1, a0 1564; RV64IA-NEXT: slli a0, a0, 48 1565; RV64IA-NEXT: srai a0, a0, 48 1566; RV64IA-NEXT: ret 1567 %1 = atomicrmw or i16* %a, i16 %b monotonic 1568 ret i16 %1 1569} 1570 1571define signext i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind { 1572; RV32I-LABEL: atomicrmw_xor_i16_monotonic: 1573; RV32I: # %bb.0: 1574; RV32I-NEXT: addi sp, sp, -16 1575; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1576; RV32I-NEXT: li a2, 0 1577; RV32I-NEXT: call __atomic_fetch_xor_2@plt 1578; RV32I-NEXT: slli a0, a0, 16 1579; RV32I-NEXT: srai a0, a0, 16 1580; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1581; RV32I-NEXT: addi sp, sp, 16 1582; RV32I-NEXT: ret 1583; 1584; RV32IA-LABEL: atomicrmw_xor_i16_monotonic: 1585; RV32IA: # %bb.0: 1586; RV32IA-NEXT: andi a2, a0, -4 1587; RV32IA-NEXT: slli a0, a0, 3 1588; RV32IA-NEXT: slli a1, a1, 16 1589; RV32IA-NEXT: srli a1, a1, 16 1590; RV32IA-NEXT: sll a1, a1, a0 1591; RV32IA-NEXT: amoxor.w a1, a1, (a2) 1592; RV32IA-NEXT: srl a0, a1, a0 1593; RV32IA-NEXT: slli a0, a0, 16 1594; RV32IA-NEXT: srai a0, a0, 16 1595; RV32IA-NEXT: ret 1596; 1597; RV64I-LABEL: atomicrmw_xor_i16_monotonic: 1598; RV64I: # %bb.0: 1599; RV64I-NEXT: addi sp, sp, -16 1600; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1601; RV64I-NEXT: li a2, 0 1602; RV64I-NEXT: call __atomic_fetch_xor_2@plt 1603; RV64I-NEXT: slli a0, a0, 48 1604; RV64I-NEXT: srai a0, a0, 48 1605; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1606; RV64I-NEXT: addi sp, sp, 16 1607; RV64I-NEXT: ret 1608; 1609; RV64IA-LABEL: atomicrmw_xor_i16_monotonic: 1610; RV64IA: # %bb.0: 1611; RV64IA-NEXT: andi a2, a0, -4 1612; RV64IA-NEXT: slliw a0, a0, 3 1613; RV64IA-NEXT: slli a1, a1, 48 1614; RV64IA-NEXT: srli a1, a1, 48 1615; RV64IA-NEXT: sllw a1, a1, a0 1616; RV64IA-NEXT: amoxor.w a1, a1, (a2) 1617; RV64IA-NEXT: srlw a0, a1, a0 1618; RV64IA-NEXT: slli a0, a0, 48 1619; RV64IA-NEXT: srai a0, a0, 48 1620; RV64IA-NEXT: ret 1621 %1 = atomicrmw xor i16* %a, i16 %b monotonic 1622 ret i16 %1 1623} 1624 1625define signext i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind { 1626; RV32I-LABEL: atomicrmw_max_i16_monotonic: 1627; RV32I: # %bb.0: 1628; RV32I-NEXT: addi sp, sp, -32 1629; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1630; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1631; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1632; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1633; RV32I-NEXT: mv s0, a0 1634; RV32I-NEXT: lhu a3, 0(a0) 1635; RV32I-NEXT: mv s1, a1 1636; RV32I-NEXT: slli a0, a1, 16 1637; RV32I-NEXT: srai s2, a0, 16 1638; RV32I-NEXT: j .LBB21_2 1639; RV32I-NEXT: .LBB21_1: # %atomicrmw.start 1640; RV32I-NEXT: # in Loop: Header=BB21_2 Depth=1 1641; RV32I-NEXT: sh a3, 14(sp) 1642; RV32I-NEXT: addi a1, sp, 14 1643; RV32I-NEXT: mv a0, s0 1644; RV32I-NEXT: li a3, 0 1645; RV32I-NEXT: li a4, 0 1646; RV32I-NEXT: call __atomic_compare_exchange_2@plt 1647; RV32I-NEXT: lh a3, 14(sp) 1648; RV32I-NEXT: bnez a0, .LBB21_4 1649; RV32I-NEXT: .LBB21_2: # %atomicrmw.start 1650; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1651; RV32I-NEXT: slli a0, a3, 16 1652; RV32I-NEXT: srai a0, a0, 16 1653; RV32I-NEXT: mv a2, a3 1654; RV32I-NEXT: blt s2, a0, .LBB21_1 1655; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1656; RV32I-NEXT: # in Loop: Header=BB21_2 Depth=1 1657; RV32I-NEXT: mv a2, s1 1658; RV32I-NEXT: j .LBB21_1 1659; RV32I-NEXT: .LBB21_4: # %atomicrmw.end 1660; RV32I-NEXT: slli a0, a3, 16 1661; RV32I-NEXT: srai a0, a0, 16 1662; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1663; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1664; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1665; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1666; RV32I-NEXT: addi sp, sp, 32 1667; RV32I-NEXT: ret 1668; 1669; RV32IA-LABEL: atomicrmw_max_i16_monotonic: 1670; RV32IA: # %bb.0: 1671; RV32IA-NEXT: andi a2, a0, -4 1672; RV32IA-NEXT: slli a0, a0, 3 1673; RV32IA-NEXT: andi a3, a0, 24 1674; RV32IA-NEXT: lui a4, 16 1675; RV32IA-NEXT: addi a4, a4, -1 1676; RV32IA-NEXT: sll a4, a4, a0 1677; RV32IA-NEXT: slli a1, a1, 16 1678; RV32IA-NEXT: srai a1, a1, 16 1679; RV32IA-NEXT: sll a1, a1, a0 1680; RV32IA-NEXT: li a5, 16 1681; RV32IA-NEXT: sub a3, a5, a3 1682; RV32IA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 1683; RV32IA-NEXT: lr.w a5, (a2) 1684; RV32IA-NEXT: and a7, a5, a4 1685; RV32IA-NEXT: mv a6, a5 1686; RV32IA-NEXT: sll a7, a7, a3 1687; RV32IA-NEXT: sra a7, a7, a3 1688; RV32IA-NEXT: bge a7, a1, .LBB21_3 1689; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1 1690; RV32IA-NEXT: xor a6, a5, a1 1691; RV32IA-NEXT: and a6, a6, a4 1692; RV32IA-NEXT: xor a6, a5, a6 1693; RV32IA-NEXT: .LBB21_3: # in Loop: Header=BB21_1 Depth=1 1694; RV32IA-NEXT: sc.w a6, a6, (a2) 1695; RV32IA-NEXT: bnez a6, .LBB21_1 1696; RV32IA-NEXT: # %bb.4: 1697; RV32IA-NEXT: srl a0, a5, a0 1698; RV32IA-NEXT: slli a0, a0, 16 1699; RV32IA-NEXT: srai a0, a0, 16 1700; RV32IA-NEXT: ret 1701; 1702; RV64I-LABEL: atomicrmw_max_i16_monotonic: 1703; RV64I: # %bb.0: 1704; RV64I-NEXT: addi sp, sp, -48 1705; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1706; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1707; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1708; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1709; RV64I-NEXT: mv s0, a0 1710; RV64I-NEXT: lhu a3, 0(a0) 1711; RV64I-NEXT: mv s1, a1 1712; RV64I-NEXT: slli a0, a1, 48 1713; RV64I-NEXT: srai s2, a0, 48 1714; RV64I-NEXT: j .LBB21_2 1715; RV64I-NEXT: .LBB21_1: # %atomicrmw.start 1716; RV64I-NEXT: # in Loop: Header=BB21_2 Depth=1 1717; RV64I-NEXT: sh a3, 14(sp) 1718; RV64I-NEXT: addi a1, sp, 14 1719; RV64I-NEXT: mv a0, s0 1720; RV64I-NEXT: li a3, 0 1721; RV64I-NEXT: li a4, 0 1722; RV64I-NEXT: call __atomic_compare_exchange_2@plt 1723; RV64I-NEXT: lh a3, 14(sp) 1724; RV64I-NEXT: bnez a0, .LBB21_4 1725; RV64I-NEXT: .LBB21_2: # %atomicrmw.start 1726; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1727; RV64I-NEXT: slli a0, a3, 48 1728; RV64I-NEXT: srai a0, a0, 48 1729; RV64I-NEXT: mv a2, a3 1730; RV64I-NEXT: blt s2, a0, .LBB21_1 1731; RV64I-NEXT: # %bb.3: # %atomicrmw.start 1732; RV64I-NEXT: # in Loop: Header=BB21_2 Depth=1 1733; RV64I-NEXT: mv a2, s1 1734; RV64I-NEXT: j .LBB21_1 1735; RV64I-NEXT: .LBB21_4: # %atomicrmw.end 1736; RV64I-NEXT: slli a0, a3, 48 1737; RV64I-NEXT: srai a0, a0, 48 1738; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1739; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1740; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1741; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1742; RV64I-NEXT: addi sp, sp, 48 1743; RV64I-NEXT: ret 1744; 1745; RV64IA-LABEL: atomicrmw_max_i16_monotonic: 1746; RV64IA: # %bb.0: 1747; RV64IA-NEXT: andi a2, a0, -4 1748; RV64IA-NEXT: slliw a0, a0, 3 1749; RV64IA-NEXT: andi a3, a0, 24 1750; RV64IA-NEXT: lui a4, 16 1751; RV64IA-NEXT: addiw a4, a4, -1 1752; RV64IA-NEXT: sllw a4, a4, a0 1753; RV64IA-NEXT: slli a1, a1, 48 1754; RV64IA-NEXT: srai a1, a1, 48 1755; RV64IA-NEXT: sllw a1, a1, a0 1756; RV64IA-NEXT: li a5, 48 1757; RV64IA-NEXT: sub a3, a5, a3 1758; RV64IA-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 1759; RV64IA-NEXT: lr.w a5, (a2) 1760; RV64IA-NEXT: and a7, a5, a4 1761; RV64IA-NEXT: mv a6, a5 1762; RV64IA-NEXT: sll a7, a7, a3 1763; RV64IA-NEXT: sra a7, a7, a3 1764; RV64IA-NEXT: bge a7, a1, .LBB21_3 1765; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1 1766; RV64IA-NEXT: xor a6, a5, a1 1767; RV64IA-NEXT: and a6, a6, a4 1768; RV64IA-NEXT: xor a6, a5, a6 1769; RV64IA-NEXT: .LBB21_3: # in Loop: Header=BB21_1 Depth=1 1770; RV64IA-NEXT: sc.w a6, a6, (a2) 1771; RV64IA-NEXT: bnez a6, .LBB21_1 1772; RV64IA-NEXT: # %bb.4: 1773; RV64IA-NEXT: srlw a0, a5, a0 1774; RV64IA-NEXT: slli a0, a0, 48 1775; RV64IA-NEXT: srai a0, a0, 48 1776; RV64IA-NEXT: ret 1777 %1 = atomicrmw max i16* %a, i16 %b monotonic 1778 ret i16 %1 1779} 1780 1781define signext i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind { 1782; RV32I-LABEL: atomicrmw_min_i16_monotonic: 1783; RV32I: # %bb.0: 1784; RV32I-NEXT: addi sp, sp, -32 1785; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1786; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1787; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1788; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1789; RV32I-NEXT: mv s0, a0 1790; RV32I-NEXT: lhu a3, 0(a0) 1791; RV32I-NEXT: mv s1, a1 1792; RV32I-NEXT: slli a0, a1, 16 1793; RV32I-NEXT: srai s2, a0, 16 1794; RV32I-NEXT: j .LBB22_2 1795; RV32I-NEXT: .LBB22_1: # %atomicrmw.start 1796; RV32I-NEXT: # in Loop: Header=BB22_2 Depth=1 1797; RV32I-NEXT: sh a3, 14(sp) 1798; RV32I-NEXT: addi a1, sp, 14 1799; RV32I-NEXT: mv a0, s0 1800; RV32I-NEXT: li a3, 0 1801; RV32I-NEXT: li a4, 0 1802; RV32I-NEXT: call __atomic_compare_exchange_2@plt 1803; RV32I-NEXT: lh a3, 14(sp) 1804; RV32I-NEXT: bnez a0, .LBB22_4 1805; RV32I-NEXT: .LBB22_2: # %atomicrmw.start 1806; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1807; RV32I-NEXT: slli a0, a3, 16 1808; RV32I-NEXT: srai a0, a0, 16 1809; RV32I-NEXT: mv a2, a3 1810; RV32I-NEXT: bge s2, a0, .LBB22_1 1811; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1812; RV32I-NEXT: # in Loop: Header=BB22_2 Depth=1 1813; RV32I-NEXT: mv a2, s1 1814; RV32I-NEXT: j .LBB22_1 1815; RV32I-NEXT: .LBB22_4: # %atomicrmw.end 1816; RV32I-NEXT: slli a0, a3, 16 1817; RV32I-NEXT: srai a0, a0, 16 1818; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1819; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1820; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1821; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1822; RV32I-NEXT: addi sp, sp, 32 1823; RV32I-NEXT: ret 1824; 1825; RV32IA-LABEL: atomicrmw_min_i16_monotonic: 1826; RV32IA: # %bb.0: 1827; RV32IA-NEXT: andi a2, a0, -4 1828; RV32IA-NEXT: slli a0, a0, 3 1829; RV32IA-NEXT: andi a3, a0, 24 1830; RV32IA-NEXT: lui a4, 16 1831; RV32IA-NEXT: addi a4, a4, -1 1832; RV32IA-NEXT: sll a4, a4, a0 1833; RV32IA-NEXT: slli a1, a1, 16 1834; RV32IA-NEXT: srai a1, a1, 16 1835; RV32IA-NEXT: sll a1, a1, a0 1836; RV32IA-NEXT: li a5, 16 1837; RV32IA-NEXT: sub a3, a5, a3 1838; RV32IA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 1839; RV32IA-NEXT: lr.w a5, (a2) 1840; RV32IA-NEXT: and a7, a5, a4 1841; RV32IA-NEXT: mv a6, a5 1842; RV32IA-NEXT: sll a7, a7, a3 1843; RV32IA-NEXT: sra a7, a7, a3 1844; RV32IA-NEXT: bge a1, a7, .LBB22_3 1845; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1 1846; RV32IA-NEXT: xor a6, a5, a1 1847; RV32IA-NEXT: and a6, a6, a4 1848; RV32IA-NEXT: xor a6, a5, a6 1849; RV32IA-NEXT: .LBB22_3: # in Loop: Header=BB22_1 Depth=1 1850; RV32IA-NEXT: sc.w a6, a6, (a2) 1851; RV32IA-NEXT: bnez a6, .LBB22_1 1852; RV32IA-NEXT: # %bb.4: 1853; RV32IA-NEXT: srl a0, a5, a0 1854; RV32IA-NEXT: slli a0, a0, 16 1855; RV32IA-NEXT: srai a0, a0, 16 1856; RV32IA-NEXT: ret 1857; 1858; RV64I-LABEL: atomicrmw_min_i16_monotonic: 1859; RV64I: # %bb.0: 1860; RV64I-NEXT: addi sp, sp, -48 1861; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1862; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1863; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1864; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1865; RV64I-NEXT: mv s0, a0 1866; RV64I-NEXT: lhu a3, 0(a0) 1867; RV64I-NEXT: mv s1, a1 1868; RV64I-NEXT: slli a0, a1, 48 1869; RV64I-NEXT: srai s2, a0, 48 1870; RV64I-NEXT: j .LBB22_2 1871; RV64I-NEXT: .LBB22_1: # %atomicrmw.start 1872; RV64I-NEXT: # in Loop: Header=BB22_2 Depth=1 1873; RV64I-NEXT: sh a3, 14(sp) 1874; RV64I-NEXT: addi a1, sp, 14 1875; RV64I-NEXT: mv a0, s0 1876; RV64I-NEXT: li a3, 0 1877; RV64I-NEXT: li a4, 0 1878; RV64I-NEXT: call __atomic_compare_exchange_2@plt 1879; RV64I-NEXT: lh a3, 14(sp) 1880; RV64I-NEXT: bnez a0, .LBB22_4 1881; RV64I-NEXT: .LBB22_2: # %atomicrmw.start 1882; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1883; RV64I-NEXT: slli a0, a3, 48 1884; RV64I-NEXT: srai a0, a0, 48 1885; RV64I-NEXT: mv a2, a3 1886; RV64I-NEXT: bge s2, a0, .LBB22_1 1887; RV64I-NEXT: # %bb.3: # %atomicrmw.start 1888; RV64I-NEXT: # in Loop: Header=BB22_2 Depth=1 1889; RV64I-NEXT: mv a2, s1 1890; RV64I-NEXT: j .LBB22_1 1891; RV64I-NEXT: .LBB22_4: # %atomicrmw.end 1892; RV64I-NEXT: slli a0, a3, 48 1893; RV64I-NEXT: srai a0, a0, 48 1894; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1895; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1896; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1897; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1898; RV64I-NEXT: addi sp, sp, 48 1899; RV64I-NEXT: ret 1900; 1901; RV64IA-LABEL: atomicrmw_min_i16_monotonic: 1902; RV64IA: # %bb.0: 1903; RV64IA-NEXT: andi a2, a0, -4 1904; RV64IA-NEXT: slliw a0, a0, 3 1905; RV64IA-NEXT: andi a3, a0, 24 1906; RV64IA-NEXT: lui a4, 16 1907; RV64IA-NEXT: addiw a4, a4, -1 1908; RV64IA-NEXT: sllw a4, a4, a0 1909; RV64IA-NEXT: slli a1, a1, 48 1910; RV64IA-NEXT: srai a1, a1, 48 1911; RV64IA-NEXT: sllw a1, a1, a0 1912; RV64IA-NEXT: li a5, 48 1913; RV64IA-NEXT: sub a3, a5, a3 1914; RV64IA-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 1915; RV64IA-NEXT: lr.w a5, (a2) 1916; RV64IA-NEXT: and a7, a5, a4 1917; RV64IA-NEXT: mv a6, a5 1918; RV64IA-NEXT: sll a7, a7, a3 1919; RV64IA-NEXT: sra a7, a7, a3 1920; RV64IA-NEXT: bge a1, a7, .LBB22_3 1921; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1 1922; RV64IA-NEXT: xor a6, a5, a1 1923; RV64IA-NEXT: and a6, a6, a4 1924; RV64IA-NEXT: xor a6, a5, a6 1925; RV64IA-NEXT: .LBB22_3: # in Loop: Header=BB22_1 Depth=1 1926; RV64IA-NEXT: sc.w a6, a6, (a2) 1927; RV64IA-NEXT: bnez a6, .LBB22_1 1928; RV64IA-NEXT: # %bb.4: 1929; RV64IA-NEXT: srlw a0, a5, a0 1930; RV64IA-NEXT: slli a0, a0, 48 1931; RV64IA-NEXT: srai a0, a0, 48 1932; RV64IA-NEXT: ret 1933 %1 = atomicrmw min i16* %a, i16 %b monotonic 1934 ret i16 %1 1935} 1936 1937define signext i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind { 1938; RV32I-LABEL: atomicrmw_umax_i16_monotonic: 1939; RV32I: # %bb.0: 1940; RV32I-NEXT: addi sp, sp, -32 1941; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1942; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1943; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1944; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1945; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1946; RV32I-NEXT: mv s0, a1 1947; RV32I-NEXT: mv s1, a0 1948; RV32I-NEXT: lhu a1, 0(a0) 1949; RV32I-NEXT: lui a0, 16 1950; RV32I-NEXT: addi s2, a0, -1 1951; RV32I-NEXT: and s3, s0, s2 1952; RV32I-NEXT: j .LBB23_2 1953; RV32I-NEXT: .LBB23_1: # %atomicrmw.start 1954; RV32I-NEXT: # in Loop: Header=BB23_2 Depth=1 1955; RV32I-NEXT: sh a1, 10(sp) 1956; RV32I-NEXT: addi a1, sp, 10 1957; RV32I-NEXT: mv a0, s1 1958; RV32I-NEXT: li a3, 0 1959; RV32I-NEXT: li a4, 0 1960; RV32I-NEXT: call __atomic_compare_exchange_2@plt 1961; RV32I-NEXT: lh a1, 10(sp) 1962; RV32I-NEXT: bnez a0, .LBB23_4 1963; RV32I-NEXT: .LBB23_2: # %atomicrmw.start 1964; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1965; RV32I-NEXT: and a0, a1, s2 1966; RV32I-NEXT: mv a2, a1 1967; RV32I-NEXT: bltu s3, a0, .LBB23_1 1968; RV32I-NEXT: # %bb.3: # %atomicrmw.start 1969; RV32I-NEXT: # in Loop: Header=BB23_2 Depth=1 1970; RV32I-NEXT: mv a2, s0 1971; RV32I-NEXT: j .LBB23_1 1972; RV32I-NEXT: .LBB23_4: # %atomicrmw.end 1973; RV32I-NEXT: slli a0, a1, 16 1974; RV32I-NEXT: srai a0, a0, 16 1975; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1976; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1977; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1978; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1979; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 1980; RV32I-NEXT: addi sp, sp, 32 1981; RV32I-NEXT: ret 1982; 1983; RV32IA-LABEL: atomicrmw_umax_i16_monotonic: 1984; RV32IA: # %bb.0: 1985; RV32IA-NEXT: andi a2, a0, -4 1986; RV32IA-NEXT: slli a0, a0, 3 1987; RV32IA-NEXT: lui a3, 16 1988; RV32IA-NEXT: addi a3, a3, -1 1989; RV32IA-NEXT: sll a4, a3, a0 1990; RV32IA-NEXT: and a1, a1, a3 1991; RV32IA-NEXT: sll a1, a1, a0 1992; RV32IA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 1993; RV32IA-NEXT: lr.w a3, (a2) 1994; RV32IA-NEXT: and a6, a3, a4 1995; RV32IA-NEXT: mv a5, a3 1996; RV32IA-NEXT: bgeu a6, a1, .LBB23_3 1997; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1 1998; RV32IA-NEXT: xor a5, a3, a1 1999; RV32IA-NEXT: and a5, a5, a4 2000; RV32IA-NEXT: xor a5, a3, a5 2001; RV32IA-NEXT: .LBB23_3: # in Loop: Header=BB23_1 Depth=1 2002; RV32IA-NEXT: sc.w a5, a5, (a2) 2003; RV32IA-NEXT: bnez a5, .LBB23_1 2004; RV32IA-NEXT: # %bb.4: 2005; RV32IA-NEXT: srl a0, a3, a0 2006; RV32IA-NEXT: slli a0, a0, 16 2007; RV32IA-NEXT: srai a0, a0, 16 2008; RV32IA-NEXT: ret 2009; 2010; RV64I-LABEL: atomicrmw_umax_i16_monotonic: 2011; RV64I: # %bb.0: 2012; RV64I-NEXT: addi sp, sp, -48 2013; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2014; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2015; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2016; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2017; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 2018; RV64I-NEXT: mv s0, a1 2019; RV64I-NEXT: mv s1, a0 2020; RV64I-NEXT: lhu a1, 0(a0) 2021; RV64I-NEXT: lui a0, 16 2022; RV64I-NEXT: addiw s2, a0, -1 2023; RV64I-NEXT: and s3, s0, s2 2024; RV64I-NEXT: j .LBB23_2 2025; RV64I-NEXT: .LBB23_1: # %atomicrmw.start 2026; RV64I-NEXT: # in Loop: Header=BB23_2 Depth=1 2027; RV64I-NEXT: sh a1, 6(sp) 2028; RV64I-NEXT: addi a1, sp, 6 2029; RV64I-NEXT: mv a0, s1 2030; RV64I-NEXT: li a3, 0 2031; RV64I-NEXT: li a4, 0 2032; RV64I-NEXT: call __atomic_compare_exchange_2@plt 2033; RV64I-NEXT: lh a1, 6(sp) 2034; RV64I-NEXT: bnez a0, .LBB23_4 2035; RV64I-NEXT: .LBB23_2: # %atomicrmw.start 2036; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2037; RV64I-NEXT: and a0, a1, s2 2038; RV64I-NEXT: mv a2, a1 2039; RV64I-NEXT: bltu s3, a0, .LBB23_1 2040; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2041; RV64I-NEXT: # in Loop: Header=BB23_2 Depth=1 2042; RV64I-NEXT: mv a2, s0 2043; RV64I-NEXT: j .LBB23_1 2044; RV64I-NEXT: .LBB23_4: # %atomicrmw.end 2045; RV64I-NEXT: slli a0, a1, 48 2046; RV64I-NEXT: srai a0, a0, 48 2047; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2048; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2049; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2050; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2051; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 2052; RV64I-NEXT: addi sp, sp, 48 2053; RV64I-NEXT: ret 2054; 2055; RV64IA-LABEL: atomicrmw_umax_i16_monotonic: 2056; RV64IA: # %bb.0: 2057; RV64IA-NEXT: andi a2, a0, -4 2058; RV64IA-NEXT: slliw a0, a0, 3 2059; RV64IA-NEXT: lui a3, 16 2060; RV64IA-NEXT: addiw a3, a3, -1 2061; RV64IA-NEXT: sllw a4, a3, a0 2062; RV64IA-NEXT: and a1, a1, a3 2063; RV64IA-NEXT: sllw a1, a1, a0 2064; RV64IA-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2065; RV64IA-NEXT: lr.w a3, (a2) 2066; RV64IA-NEXT: and a6, a3, a4 2067; RV64IA-NEXT: mv a5, a3 2068; RV64IA-NEXT: bgeu a6, a1, .LBB23_3 2069; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1 2070; RV64IA-NEXT: xor a5, a3, a1 2071; RV64IA-NEXT: and a5, a5, a4 2072; RV64IA-NEXT: xor a5, a3, a5 2073; RV64IA-NEXT: .LBB23_3: # in Loop: Header=BB23_1 Depth=1 2074; RV64IA-NEXT: sc.w a5, a5, (a2) 2075; RV64IA-NEXT: bnez a5, .LBB23_1 2076; RV64IA-NEXT: # %bb.4: 2077; RV64IA-NEXT: srlw a0, a3, a0 2078; RV64IA-NEXT: slli a0, a0, 48 2079; RV64IA-NEXT: srai a0, a0, 48 2080; RV64IA-NEXT: ret 2081 %1 = atomicrmw umax i16* %a, i16 %b monotonic 2082 ret i16 %1 2083} 2084 2085define signext i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind { 2086; RV32I-LABEL: atomicrmw_umin_i16_monotonic: 2087; RV32I: # %bb.0: 2088; RV32I-NEXT: addi sp, sp, -32 2089; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 2090; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 2091; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 2092; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 2093; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 2094; RV32I-NEXT: mv s0, a1 2095; RV32I-NEXT: mv s1, a0 2096; RV32I-NEXT: lhu a1, 0(a0) 2097; RV32I-NEXT: lui a0, 16 2098; RV32I-NEXT: addi s2, a0, -1 2099; RV32I-NEXT: and s3, s0, s2 2100; RV32I-NEXT: j .LBB24_2 2101; RV32I-NEXT: .LBB24_1: # %atomicrmw.start 2102; RV32I-NEXT: # in Loop: Header=BB24_2 Depth=1 2103; RV32I-NEXT: sh a1, 10(sp) 2104; RV32I-NEXT: addi a1, sp, 10 2105; RV32I-NEXT: mv a0, s1 2106; RV32I-NEXT: li a3, 0 2107; RV32I-NEXT: li a4, 0 2108; RV32I-NEXT: call __atomic_compare_exchange_2@plt 2109; RV32I-NEXT: lh a1, 10(sp) 2110; RV32I-NEXT: bnez a0, .LBB24_4 2111; RV32I-NEXT: .LBB24_2: # %atomicrmw.start 2112; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2113; RV32I-NEXT: and a0, a1, s2 2114; RV32I-NEXT: mv a2, a1 2115; RV32I-NEXT: bgeu s3, a0, .LBB24_1 2116; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2117; RV32I-NEXT: # in Loop: Header=BB24_2 Depth=1 2118; RV32I-NEXT: mv a2, s0 2119; RV32I-NEXT: j .LBB24_1 2120; RV32I-NEXT: .LBB24_4: # %atomicrmw.end 2121; RV32I-NEXT: slli a0, a1, 16 2122; RV32I-NEXT: srai a0, a0, 16 2123; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2124; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2125; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2126; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2127; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 2128; RV32I-NEXT: addi sp, sp, 32 2129; RV32I-NEXT: ret 2130; 2131; RV32IA-LABEL: atomicrmw_umin_i16_monotonic: 2132; RV32IA: # %bb.0: 2133; RV32IA-NEXT: andi a2, a0, -4 2134; RV32IA-NEXT: slli a0, a0, 3 2135; RV32IA-NEXT: lui a3, 16 2136; RV32IA-NEXT: addi a3, a3, -1 2137; RV32IA-NEXT: sll a4, a3, a0 2138; RV32IA-NEXT: and a1, a1, a3 2139; RV32IA-NEXT: sll a1, a1, a0 2140; RV32IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2141; RV32IA-NEXT: lr.w a3, (a2) 2142; RV32IA-NEXT: and a6, a3, a4 2143; RV32IA-NEXT: mv a5, a3 2144; RV32IA-NEXT: bgeu a1, a6, .LBB24_3 2145; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB24_1 Depth=1 2146; RV32IA-NEXT: xor a5, a3, a1 2147; RV32IA-NEXT: and a5, a5, a4 2148; RV32IA-NEXT: xor a5, a3, a5 2149; RV32IA-NEXT: .LBB24_3: # in Loop: Header=BB24_1 Depth=1 2150; RV32IA-NEXT: sc.w a5, a5, (a2) 2151; RV32IA-NEXT: bnez a5, .LBB24_1 2152; RV32IA-NEXT: # %bb.4: 2153; RV32IA-NEXT: srl a0, a3, a0 2154; RV32IA-NEXT: slli a0, a0, 16 2155; RV32IA-NEXT: srai a0, a0, 16 2156; RV32IA-NEXT: ret 2157; 2158; RV64I-LABEL: atomicrmw_umin_i16_monotonic: 2159; RV64I: # %bb.0: 2160; RV64I-NEXT: addi sp, sp, -48 2161; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2162; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2163; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2164; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2165; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 2166; RV64I-NEXT: mv s0, a1 2167; RV64I-NEXT: mv s1, a0 2168; RV64I-NEXT: lhu a1, 0(a0) 2169; RV64I-NEXT: lui a0, 16 2170; RV64I-NEXT: addiw s2, a0, -1 2171; RV64I-NEXT: and s3, s0, s2 2172; RV64I-NEXT: j .LBB24_2 2173; RV64I-NEXT: .LBB24_1: # %atomicrmw.start 2174; RV64I-NEXT: # in Loop: Header=BB24_2 Depth=1 2175; RV64I-NEXT: sh a1, 6(sp) 2176; RV64I-NEXT: addi a1, sp, 6 2177; RV64I-NEXT: mv a0, s1 2178; RV64I-NEXT: li a3, 0 2179; RV64I-NEXT: li a4, 0 2180; RV64I-NEXT: call __atomic_compare_exchange_2@plt 2181; RV64I-NEXT: lh a1, 6(sp) 2182; RV64I-NEXT: bnez a0, .LBB24_4 2183; RV64I-NEXT: .LBB24_2: # %atomicrmw.start 2184; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2185; RV64I-NEXT: and a0, a1, s2 2186; RV64I-NEXT: mv a2, a1 2187; RV64I-NEXT: bgeu s3, a0, .LBB24_1 2188; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2189; RV64I-NEXT: # in Loop: Header=BB24_2 Depth=1 2190; RV64I-NEXT: mv a2, s0 2191; RV64I-NEXT: j .LBB24_1 2192; RV64I-NEXT: .LBB24_4: # %atomicrmw.end 2193; RV64I-NEXT: slli a0, a1, 48 2194; RV64I-NEXT: srai a0, a0, 48 2195; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2196; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2197; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2198; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2199; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 2200; RV64I-NEXT: addi sp, sp, 48 2201; RV64I-NEXT: ret 2202; 2203; RV64IA-LABEL: atomicrmw_umin_i16_monotonic: 2204; RV64IA: # %bb.0: 2205; RV64IA-NEXT: andi a2, a0, -4 2206; RV64IA-NEXT: slliw a0, a0, 3 2207; RV64IA-NEXT: lui a3, 16 2208; RV64IA-NEXT: addiw a3, a3, -1 2209; RV64IA-NEXT: sllw a4, a3, a0 2210; RV64IA-NEXT: and a1, a1, a3 2211; RV64IA-NEXT: sllw a1, a1, a0 2212; RV64IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2213; RV64IA-NEXT: lr.w a3, (a2) 2214; RV64IA-NEXT: and a6, a3, a4 2215; RV64IA-NEXT: mv a5, a3 2216; RV64IA-NEXT: bgeu a1, a6, .LBB24_3 2217; RV64IA-NEXT: # %bb.2: # in Loop: Header=BB24_1 Depth=1 2218; RV64IA-NEXT: xor a5, a3, a1 2219; RV64IA-NEXT: and a5, a5, a4 2220; RV64IA-NEXT: xor a5, a3, a5 2221; RV64IA-NEXT: .LBB24_3: # in Loop: Header=BB24_1 Depth=1 2222; RV64IA-NEXT: sc.w a5, a5, (a2) 2223; RV64IA-NEXT: bnez a5, .LBB24_1 2224; RV64IA-NEXT: # %bb.4: 2225; RV64IA-NEXT: srlw a0, a3, a0 2226; RV64IA-NEXT: slli a0, a0, 48 2227; RV64IA-NEXT: srai a0, a0, 48 2228; RV64IA-NEXT: ret 2229 %1 = atomicrmw umin i16* %a, i16 %b monotonic 2230 ret i16 %1 2231} 2232 2233define signext i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind { 2234; RV32I-LABEL: atomicrmw_xchg_i32_monotonic: 2235; RV32I: # %bb.0: 2236; RV32I-NEXT: addi sp, sp, -16 2237; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2238; RV32I-NEXT: li a2, 0 2239; RV32I-NEXT: call __atomic_exchange_4@plt 2240; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2241; RV32I-NEXT: addi sp, sp, 16 2242; RV32I-NEXT: ret 2243; 2244; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic: 2245; RV32IA: # %bb.0: 2246; RV32IA-NEXT: amoswap.w a0, a1, (a0) 2247; RV32IA-NEXT: ret 2248; 2249; RV64I-LABEL: atomicrmw_xchg_i32_monotonic: 2250; RV64I: # %bb.0: 2251; RV64I-NEXT: addi sp, sp, -16 2252; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2253; RV64I-NEXT: li a2, 0 2254; RV64I-NEXT: call __atomic_exchange_4@plt 2255; RV64I-NEXT: sext.w a0, a0 2256; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2257; RV64I-NEXT: addi sp, sp, 16 2258; RV64I-NEXT: ret 2259; 2260; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic: 2261; RV64IA: # %bb.0: 2262; RV64IA-NEXT: amoswap.w a0, a1, (a0) 2263; RV64IA-NEXT: ret 2264 %1 = atomicrmw xchg i32* %a, i32 %b monotonic 2265 ret i32 %1 2266} 2267 2268define signext i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind { 2269; RV32I-LABEL: atomicrmw_add_i32_monotonic: 2270; RV32I: # %bb.0: 2271; RV32I-NEXT: addi sp, sp, -16 2272; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2273; RV32I-NEXT: li a2, 0 2274; RV32I-NEXT: call __atomic_fetch_add_4@plt 2275; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2276; RV32I-NEXT: addi sp, sp, 16 2277; RV32I-NEXT: ret 2278; 2279; RV32IA-LABEL: atomicrmw_add_i32_monotonic: 2280; RV32IA: # %bb.0: 2281; RV32IA-NEXT: amoadd.w a0, a1, (a0) 2282; RV32IA-NEXT: ret 2283; 2284; RV64I-LABEL: atomicrmw_add_i32_monotonic: 2285; RV64I: # %bb.0: 2286; RV64I-NEXT: addi sp, sp, -16 2287; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2288; RV64I-NEXT: li a2, 0 2289; RV64I-NEXT: call __atomic_fetch_add_4@plt 2290; RV64I-NEXT: sext.w a0, a0 2291; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2292; RV64I-NEXT: addi sp, sp, 16 2293; RV64I-NEXT: ret 2294; 2295; RV64IA-LABEL: atomicrmw_add_i32_monotonic: 2296; RV64IA: # %bb.0: 2297; RV64IA-NEXT: amoadd.w a0, a1, (a0) 2298; RV64IA-NEXT: ret 2299 %1 = atomicrmw add i32* %a, i32 %b monotonic 2300 ret i32 %1 2301} 2302 2303define signext i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind { 2304; RV32I-LABEL: atomicrmw_sub_i32_monotonic: 2305; RV32I: # %bb.0: 2306; RV32I-NEXT: addi sp, sp, -16 2307; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2308; RV32I-NEXT: li a2, 0 2309; RV32I-NEXT: call __atomic_fetch_sub_4@plt 2310; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2311; RV32I-NEXT: addi sp, sp, 16 2312; RV32I-NEXT: ret 2313; 2314; RV32IA-LABEL: atomicrmw_sub_i32_monotonic: 2315; RV32IA: # %bb.0: 2316; RV32IA-NEXT: neg a1, a1 2317; RV32IA-NEXT: amoadd.w a0, a1, (a0) 2318; RV32IA-NEXT: ret 2319; 2320; RV64I-LABEL: atomicrmw_sub_i32_monotonic: 2321; RV64I: # %bb.0: 2322; RV64I-NEXT: addi sp, sp, -16 2323; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2324; RV64I-NEXT: li a2, 0 2325; RV64I-NEXT: call __atomic_fetch_sub_4@plt 2326; RV64I-NEXT: sext.w a0, a0 2327; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2328; RV64I-NEXT: addi sp, sp, 16 2329; RV64I-NEXT: ret 2330; 2331; RV64IA-LABEL: atomicrmw_sub_i32_monotonic: 2332; RV64IA: # %bb.0: 2333; RV64IA-NEXT: neg a1, a1 2334; RV64IA-NEXT: amoadd.w a0, a1, (a0) 2335; RV64IA-NEXT: ret 2336 %1 = atomicrmw sub i32* %a, i32 %b monotonic 2337 ret i32 %1 2338} 2339 2340define signext i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind { 2341; RV32I-LABEL: atomicrmw_and_i32_monotonic: 2342; RV32I: # %bb.0: 2343; RV32I-NEXT: addi sp, sp, -16 2344; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2345; RV32I-NEXT: li a2, 0 2346; RV32I-NEXT: call __atomic_fetch_and_4@plt 2347; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2348; RV32I-NEXT: addi sp, sp, 16 2349; RV32I-NEXT: ret 2350; 2351; RV32IA-LABEL: atomicrmw_and_i32_monotonic: 2352; RV32IA: # %bb.0: 2353; RV32IA-NEXT: amoand.w a0, a1, (a0) 2354; RV32IA-NEXT: ret 2355; 2356; RV64I-LABEL: atomicrmw_and_i32_monotonic: 2357; RV64I: # %bb.0: 2358; RV64I-NEXT: addi sp, sp, -16 2359; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2360; RV64I-NEXT: li a2, 0 2361; RV64I-NEXT: call __atomic_fetch_and_4@plt 2362; RV64I-NEXT: sext.w a0, a0 2363; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2364; RV64I-NEXT: addi sp, sp, 16 2365; RV64I-NEXT: ret 2366; 2367; RV64IA-LABEL: atomicrmw_and_i32_monotonic: 2368; RV64IA: # %bb.0: 2369; RV64IA-NEXT: amoand.w a0, a1, (a0) 2370; RV64IA-NEXT: ret 2371 %1 = atomicrmw and i32* %a, i32 %b monotonic 2372 ret i32 %1 2373} 2374 2375define signext i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind { 2376; RV32I-LABEL: atomicrmw_nand_i32_monotonic: 2377; RV32I: # %bb.0: 2378; RV32I-NEXT: addi sp, sp, -16 2379; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2380; RV32I-NEXT: li a2, 0 2381; RV32I-NEXT: call __atomic_fetch_nand_4@plt 2382; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2383; RV32I-NEXT: addi sp, sp, 16 2384; RV32I-NEXT: ret 2385; 2386; RV32IA-LABEL: atomicrmw_nand_i32_monotonic: 2387; RV32IA: # %bb.0: 2388; RV32IA-NEXT: .LBB29_1: # =>This Inner Loop Header: Depth=1 2389; RV32IA-NEXT: lr.w a2, (a0) 2390; RV32IA-NEXT: and a3, a2, a1 2391; RV32IA-NEXT: not a3, a3 2392; RV32IA-NEXT: sc.w a3, a3, (a0) 2393; RV32IA-NEXT: bnez a3, .LBB29_1 2394; RV32IA-NEXT: # %bb.2: 2395; RV32IA-NEXT: mv a0, a2 2396; RV32IA-NEXT: ret 2397; 2398; RV64I-LABEL: atomicrmw_nand_i32_monotonic: 2399; RV64I: # %bb.0: 2400; RV64I-NEXT: addi sp, sp, -16 2401; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2402; RV64I-NEXT: li a2, 0 2403; RV64I-NEXT: call __atomic_fetch_nand_4@plt 2404; RV64I-NEXT: sext.w a0, a0 2405; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2406; RV64I-NEXT: addi sp, sp, 16 2407; RV64I-NEXT: ret 2408; 2409; RV64IA-LABEL: atomicrmw_nand_i32_monotonic: 2410; RV64IA: # %bb.0: 2411; RV64IA-NEXT: .LBB29_1: # =>This Inner Loop Header: Depth=1 2412; RV64IA-NEXT: lr.w a2, (a0) 2413; RV64IA-NEXT: and a3, a2, a1 2414; RV64IA-NEXT: not a3, a3 2415; RV64IA-NEXT: sc.w a3, a3, (a0) 2416; RV64IA-NEXT: bnez a3, .LBB29_1 2417; RV64IA-NEXT: # %bb.2: 2418; RV64IA-NEXT: mv a0, a2 2419; RV64IA-NEXT: ret 2420 %1 = atomicrmw nand i32* %a, i32 %b monotonic 2421 ret i32 %1 2422} 2423 2424define signext i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind { 2425; RV32I-LABEL: atomicrmw_or_i32_monotonic: 2426; RV32I: # %bb.0: 2427; RV32I-NEXT: addi sp, sp, -16 2428; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2429; RV32I-NEXT: li a2, 0 2430; RV32I-NEXT: call __atomic_fetch_or_4@plt 2431; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2432; RV32I-NEXT: addi sp, sp, 16 2433; RV32I-NEXT: ret 2434; 2435; RV32IA-LABEL: atomicrmw_or_i32_monotonic: 2436; RV32IA: # %bb.0: 2437; RV32IA-NEXT: amoor.w a0, a1, (a0) 2438; RV32IA-NEXT: ret 2439; 2440; RV64I-LABEL: atomicrmw_or_i32_monotonic: 2441; RV64I: # %bb.0: 2442; RV64I-NEXT: addi sp, sp, -16 2443; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2444; RV64I-NEXT: li a2, 0 2445; RV64I-NEXT: call __atomic_fetch_or_4@plt 2446; RV64I-NEXT: sext.w a0, a0 2447; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2448; RV64I-NEXT: addi sp, sp, 16 2449; RV64I-NEXT: ret 2450; 2451; RV64IA-LABEL: atomicrmw_or_i32_monotonic: 2452; RV64IA: # %bb.0: 2453; RV64IA-NEXT: amoor.w a0, a1, (a0) 2454; RV64IA-NEXT: ret 2455 %1 = atomicrmw or i32* %a, i32 %b monotonic 2456 ret i32 %1 2457} 2458 2459define signext i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind { 2460; RV32I-LABEL: atomicrmw_xor_i32_monotonic: 2461; RV32I: # %bb.0: 2462; RV32I-NEXT: addi sp, sp, -16 2463; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2464; RV32I-NEXT: li a2, 0 2465; RV32I-NEXT: call __atomic_fetch_xor_4@plt 2466; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2467; RV32I-NEXT: addi sp, sp, 16 2468; RV32I-NEXT: ret 2469; 2470; RV32IA-LABEL: atomicrmw_xor_i32_monotonic: 2471; RV32IA: # %bb.0: 2472; RV32IA-NEXT: amoxor.w a0, a1, (a0) 2473; RV32IA-NEXT: ret 2474; 2475; RV64I-LABEL: atomicrmw_xor_i32_monotonic: 2476; RV64I: # %bb.0: 2477; RV64I-NEXT: addi sp, sp, -16 2478; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2479; RV64I-NEXT: li a2, 0 2480; RV64I-NEXT: call __atomic_fetch_xor_4@plt 2481; RV64I-NEXT: sext.w a0, a0 2482; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2483; RV64I-NEXT: addi sp, sp, 16 2484; RV64I-NEXT: ret 2485; 2486; RV64IA-LABEL: atomicrmw_xor_i32_monotonic: 2487; RV64IA: # %bb.0: 2488; RV64IA-NEXT: amoxor.w a0, a1, (a0) 2489; RV64IA-NEXT: ret 2490 %1 = atomicrmw xor i32* %a, i32 %b monotonic 2491 ret i32 %1 2492} 2493 2494define signext i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind { 2495; RV32I-LABEL: atomicrmw_max_i32_monotonic: 2496; RV32I: # %bb.0: 2497; RV32I-NEXT: addi sp, sp, -16 2498; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2499; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2500; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2501; RV32I-NEXT: mv s0, a0 2502; RV32I-NEXT: lw a3, 0(a0) 2503; RV32I-NEXT: mv s1, a1 2504; RV32I-NEXT: j .LBB32_2 2505; RV32I-NEXT: .LBB32_1: # %atomicrmw.start 2506; RV32I-NEXT: # in Loop: Header=BB32_2 Depth=1 2507; RV32I-NEXT: sw a3, 0(sp) 2508; RV32I-NEXT: mv a1, sp 2509; RV32I-NEXT: mv a0, s0 2510; RV32I-NEXT: li a3, 0 2511; RV32I-NEXT: li a4, 0 2512; RV32I-NEXT: call __atomic_compare_exchange_4@plt 2513; RV32I-NEXT: lw a3, 0(sp) 2514; RV32I-NEXT: bnez a0, .LBB32_4 2515; RV32I-NEXT: .LBB32_2: # %atomicrmw.start 2516; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2517; RV32I-NEXT: mv a2, a3 2518; RV32I-NEXT: blt s1, a3, .LBB32_1 2519; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2520; RV32I-NEXT: # in Loop: Header=BB32_2 Depth=1 2521; RV32I-NEXT: mv a2, s1 2522; RV32I-NEXT: j .LBB32_1 2523; RV32I-NEXT: .LBB32_4: # %atomicrmw.end 2524; RV32I-NEXT: mv a0, a3 2525; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2526; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2527; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2528; RV32I-NEXT: addi sp, sp, 16 2529; RV32I-NEXT: ret 2530; 2531; RV32IA-LABEL: atomicrmw_max_i32_monotonic: 2532; RV32IA: # %bb.0: 2533; RV32IA-NEXT: amomax.w a0, a1, (a0) 2534; RV32IA-NEXT: ret 2535; 2536; RV64I-LABEL: atomicrmw_max_i32_monotonic: 2537; RV64I: # %bb.0: 2538; RV64I-NEXT: addi sp, sp, -48 2539; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2540; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2541; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2542; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2543; RV64I-NEXT: mv s0, a0 2544; RV64I-NEXT: lw a3, 0(a0) 2545; RV64I-NEXT: mv s1, a1 2546; RV64I-NEXT: sext.w s2, a1 2547; RV64I-NEXT: j .LBB32_2 2548; RV64I-NEXT: .LBB32_1: # %atomicrmw.start 2549; RV64I-NEXT: # in Loop: Header=BB32_2 Depth=1 2550; RV64I-NEXT: sw a3, 12(sp) 2551; RV64I-NEXT: addi a1, sp, 12 2552; RV64I-NEXT: mv a0, s0 2553; RV64I-NEXT: li a3, 0 2554; RV64I-NEXT: li a4, 0 2555; RV64I-NEXT: call __atomic_compare_exchange_4@plt 2556; RV64I-NEXT: lw a3, 12(sp) 2557; RV64I-NEXT: bnez a0, .LBB32_4 2558; RV64I-NEXT: .LBB32_2: # %atomicrmw.start 2559; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2560; RV64I-NEXT: mv a2, a3 2561; RV64I-NEXT: blt s2, a3, .LBB32_1 2562; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2563; RV64I-NEXT: # in Loop: Header=BB32_2 Depth=1 2564; RV64I-NEXT: mv a2, s1 2565; RV64I-NEXT: j .LBB32_1 2566; RV64I-NEXT: .LBB32_4: # %atomicrmw.end 2567; RV64I-NEXT: mv a0, a3 2568; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2569; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2570; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2571; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2572; RV64I-NEXT: addi sp, sp, 48 2573; RV64I-NEXT: ret 2574; 2575; RV64IA-LABEL: atomicrmw_max_i32_monotonic: 2576; RV64IA: # %bb.0: 2577; RV64IA-NEXT: amomax.w a0, a1, (a0) 2578; RV64IA-NEXT: ret 2579 %1 = atomicrmw max i32* %a, i32 %b monotonic 2580 ret i32 %1 2581} 2582 2583define signext i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind { 2584; RV32I-LABEL: atomicrmw_min_i32_monotonic: 2585; RV32I: # %bb.0: 2586; RV32I-NEXT: addi sp, sp, -16 2587; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2588; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2589; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2590; RV32I-NEXT: mv s0, a0 2591; RV32I-NEXT: lw a3, 0(a0) 2592; RV32I-NEXT: mv s1, a1 2593; RV32I-NEXT: j .LBB33_2 2594; RV32I-NEXT: .LBB33_1: # %atomicrmw.start 2595; RV32I-NEXT: # in Loop: Header=BB33_2 Depth=1 2596; RV32I-NEXT: sw a3, 0(sp) 2597; RV32I-NEXT: mv a1, sp 2598; RV32I-NEXT: mv a0, s0 2599; RV32I-NEXT: li a3, 0 2600; RV32I-NEXT: li a4, 0 2601; RV32I-NEXT: call __atomic_compare_exchange_4@plt 2602; RV32I-NEXT: lw a3, 0(sp) 2603; RV32I-NEXT: bnez a0, .LBB33_4 2604; RV32I-NEXT: .LBB33_2: # %atomicrmw.start 2605; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2606; RV32I-NEXT: mv a2, a3 2607; RV32I-NEXT: bge s1, a3, .LBB33_1 2608; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2609; RV32I-NEXT: # in Loop: Header=BB33_2 Depth=1 2610; RV32I-NEXT: mv a2, s1 2611; RV32I-NEXT: j .LBB33_1 2612; RV32I-NEXT: .LBB33_4: # %atomicrmw.end 2613; RV32I-NEXT: mv a0, a3 2614; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2615; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2616; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2617; RV32I-NEXT: addi sp, sp, 16 2618; RV32I-NEXT: ret 2619; 2620; RV32IA-LABEL: atomicrmw_min_i32_monotonic: 2621; RV32IA: # %bb.0: 2622; RV32IA-NEXT: amomin.w a0, a1, (a0) 2623; RV32IA-NEXT: ret 2624; 2625; RV64I-LABEL: atomicrmw_min_i32_monotonic: 2626; RV64I: # %bb.0: 2627; RV64I-NEXT: addi sp, sp, -48 2628; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2629; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2630; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2631; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2632; RV64I-NEXT: mv s0, a0 2633; RV64I-NEXT: lw a3, 0(a0) 2634; RV64I-NEXT: mv s1, a1 2635; RV64I-NEXT: sext.w s2, a1 2636; RV64I-NEXT: j .LBB33_2 2637; RV64I-NEXT: .LBB33_1: # %atomicrmw.start 2638; RV64I-NEXT: # in Loop: Header=BB33_2 Depth=1 2639; RV64I-NEXT: sw a3, 12(sp) 2640; RV64I-NEXT: addi a1, sp, 12 2641; RV64I-NEXT: mv a0, s0 2642; RV64I-NEXT: li a3, 0 2643; RV64I-NEXT: li a4, 0 2644; RV64I-NEXT: call __atomic_compare_exchange_4@plt 2645; RV64I-NEXT: lw a3, 12(sp) 2646; RV64I-NEXT: bnez a0, .LBB33_4 2647; RV64I-NEXT: .LBB33_2: # %atomicrmw.start 2648; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2649; RV64I-NEXT: mv a2, a3 2650; RV64I-NEXT: bge s2, a3, .LBB33_1 2651; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2652; RV64I-NEXT: # in Loop: Header=BB33_2 Depth=1 2653; RV64I-NEXT: mv a2, s1 2654; RV64I-NEXT: j .LBB33_1 2655; RV64I-NEXT: .LBB33_4: # %atomicrmw.end 2656; RV64I-NEXT: mv a0, a3 2657; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2658; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2659; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2660; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2661; RV64I-NEXT: addi sp, sp, 48 2662; RV64I-NEXT: ret 2663; 2664; RV64IA-LABEL: atomicrmw_min_i32_monotonic: 2665; RV64IA: # %bb.0: 2666; RV64IA-NEXT: amomin.w a0, a1, (a0) 2667; RV64IA-NEXT: ret 2668 %1 = atomicrmw min i32* %a, i32 %b monotonic 2669 ret i32 %1 2670} 2671 2672define signext i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind { 2673; RV32I-LABEL: atomicrmw_umax_i32_monotonic: 2674; RV32I: # %bb.0: 2675; RV32I-NEXT: addi sp, sp, -16 2676; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2677; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2678; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2679; RV32I-NEXT: mv s0, a0 2680; RV32I-NEXT: lw a3, 0(a0) 2681; RV32I-NEXT: mv s1, a1 2682; RV32I-NEXT: j .LBB34_2 2683; RV32I-NEXT: .LBB34_1: # %atomicrmw.start 2684; RV32I-NEXT: # in Loop: Header=BB34_2 Depth=1 2685; RV32I-NEXT: sw a3, 0(sp) 2686; RV32I-NEXT: mv a1, sp 2687; RV32I-NEXT: mv a0, s0 2688; RV32I-NEXT: li a3, 0 2689; RV32I-NEXT: li a4, 0 2690; RV32I-NEXT: call __atomic_compare_exchange_4@plt 2691; RV32I-NEXT: lw a3, 0(sp) 2692; RV32I-NEXT: bnez a0, .LBB34_4 2693; RV32I-NEXT: .LBB34_2: # %atomicrmw.start 2694; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2695; RV32I-NEXT: mv a2, a3 2696; RV32I-NEXT: bltu s1, a3, .LBB34_1 2697; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2698; RV32I-NEXT: # in Loop: Header=BB34_2 Depth=1 2699; RV32I-NEXT: mv a2, s1 2700; RV32I-NEXT: j .LBB34_1 2701; RV32I-NEXT: .LBB34_4: # %atomicrmw.end 2702; RV32I-NEXT: mv a0, a3 2703; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2704; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2705; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2706; RV32I-NEXT: addi sp, sp, 16 2707; RV32I-NEXT: ret 2708; 2709; RV32IA-LABEL: atomicrmw_umax_i32_monotonic: 2710; RV32IA: # %bb.0: 2711; RV32IA-NEXT: amomaxu.w a0, a1, (a0) 2712; RV32IA-NEXT: ret 2713; 2714; RV64I-LABEL: atomicrmw_umax_i32_monotonic: 2715; RV64I: # %bb.0: 2716; RV64I-NEXT: addi sp, sp, -48 2717; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2718; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2719; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2720; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2721; RV64I-NEXT: mv s0, a0 2722; RV64I-NEXT: lw a3, 0(a0) 2723; RV64I-NEXT: mv s1, a1 2724; RV64I-NEXT: sext.w s2, a1 2725; RV64I-NEXT: j .LBB34_2 2726; RV64I-NEXT: .LBB34_1: # %atomicrmw.start 2727; RV64I-NEXT: # in Loop: Header=BB34_2 Depth=1 2728; RV64I-NEXT: sw a3, 12(sp) 2729; RV64I-NEXT: addi a1, sp, 12 2730; RV64I-NEXT: mv a0, s0 2731; RV64I-NEXT: li a3, 0 2732; RV64I-NEXT: li a4, 0 2733; RV64I-NEXT: call __atomic_compare_exchange_4@plt 2734; RV64I-NEXT: lw a3, 12(sp) 2735; RV64I-NEXT: bnez a0, .LBB34_4 2736; RV64I-NEXT: .LBB34_2: # %atomicrmw.start 2737; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2738; RV64I-NEXT: mv a2, a3 2739; RV64I-NEXT: bltu s2, a3, .LBB34_1 2740; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2741; RV64I-NEXT: # in Loop: Header=BB34_2 Depth=1 2742; RV64I-NEXT: mv a2, s1 2743; RV64I-NEXT: j .LBB34_1 2744; RV64I-NEXT: .LBB34_4: # %atomicrmw.end 2745; RV64I-NEXT: mv a0, a3 2746; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2747; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2748; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2749; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2750; RV64I-NEXT: addi sp, sp, 48 2751; RV64I-NEXT: ret 2752; 2753; RV64IA-LABEL: atomicrmw_umax_i32_monotonic: 2754; RV64IA: # %bb.0: 2755; RV64IA-NEXT: amomaxu.w a0, a1, (a0) 2756; RV64IA-NEXT: ret 2757 %1 = atomicrmw umax i32* %a, i32 %b monotonic 2758 ret i32 %1 2759} 2760 2761define signext i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind { 2762; RV32I-LABEL: atomicrmw_umin_i32_monotonic: 2763; RV32I: # %bb.0: 2764; RV32I-NEXT: addi sp, sp, -16 2765; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2766; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 2767; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 2768; RV32I-NEXT: mv s0, a0 2769; RV32I-NEXT: lw a3, 0(a0) 2770; RV32I-NEXT: mv s1, a1 2771; RV32I-NEXT: j .LBB35_2 2772; RV32I-NEXT: .LBB35_1: # %atomicrmw.start 2773; RV32I-NEXT: # in Loop: Header=BB35_2 Depth=1 2774; RV32I-NEXT: sw a3, 0(sp) 2775; RV32I-NEXT: mv a1, sp 2776; RV32I-NEXT: mv a0, s0 2777; RV32I-NEXT: li a3, 0 2778; RV32I-NEXT: li a4, 0 2779; RV32I-NEXT: call __atomic_compare_exchange_4@plt 2780; RV32I-NEXT: lw a3, 0(sp) 2781; RV32I-NEXT: bnez a0, .LBB35_4 2782; RV32I-NEXT: .LBB35_2: # %atomicrmw.start 2783; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2784; RV32I-NEXT: mv a2, a3 2785; RV32I-NEXT: bgeu s1, a3, .LBB35_1 2786; RV32I-NEXT: # %bb.3: # %atomicrmw.start 2787; RV32I-NEXT: # in Loop: Header=BB35_2 Depth=1 2788; RV32I-NEXT: mv a2, s1 2789; RV32I-NEXT: j .LBB35_1 2790; RV32I-NEXT: .LBB35_4: # %atomicrmw.end 2791; RV32I-NEXT: mv a0, a3 2792; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2793; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 2794; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 2795; RV32I-NEXT: addi sp, sp, 16 2796; RV32I-NEXT: ret 2797; 2798; RV32IA-LABEL: atomicrmw_umin_i32_monotonic: 2799; RV32IA: # %bb.0: 2800; RV32IA-NEXT: amominu.w a0, a1, (a0) 2801; RV32IA-NEXT: ret 2802; 2803; RV64I-LABEL: atomicrmw_umin_i32_monotonic: 2804; RV64I: # %bb.0: 2805; RV64I-NEXT: addi sp, sp, -48 2806; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2807; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2808; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2809; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2810; RV64I-NEXT: mv s0, a0 2811; RV64I-NEXT: lw a3, 0(a0) 2812; RV64I-NEXT: mv s1, a1 2813; RV64I-NEXT: sext.w s2, a1 2814; RV64I-NEXT: j .LBB35_2 2815; RV64I-NEXT: .LBB35_1: # %atomicrmw.start 2816; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2817; RV64I-NEXT: sw a3, 12(sp) 2818; RV64I-NEXT: addi a1, sp, 12 2819; RV64I-NEXT: mv a0, s0 2820; RV64I-NEXT: li a3, 0 2821; RV64I-NEXT: li a4, 0 2822; RV64I-NEXT: call __atomic_compare_exchange_4@plt 2823; RV64I-NEXT: lw a3, 12(sp) 2824; RV64I-NEXT: bnez a0, .LBB35_4 2825; RV64I-NEXT: .LBB35_2: # %atomicrmw.start 2826; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2827; RV64I-NEXT: mv a2, a3 2828; RV64I-NEXT: bgeu s2, a3, .LBB35_1 2829; RV64I-NEXT: # %bb.3: # %atomicrmw.start 2830; RV64I-NEXT: # in Loop: Header=BB35_2 Depth=1 2831; RV64I-NEXT: mv a2, s1 2832; RV64I-NEXT: j .LBB35_1 2833; RV64I-NEXT: .LBB35_4: # %atomicrmw.end 2834; RV64I-NEXT: mv a0, a3 2835; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 2836; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 2837; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 2838; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 2839; RV64I-NEXT: addi sp, sp, 48 2840; RV64I-NEXT: ret 2841; 2842; RV64IA-LABEL: atomicrmw_umin_i32_monotonic: 2843; RV64IA: # %bb.0: 2844; RV64IA-NEXT: amominu.w a0, a1, (a0) 2845; RV64IA-NEXT: ret 2846 %1 = atomicrmw umin i32* %a, i32 %b monotonic 2847 ret i32 %1 2848} 2849 2850define signext i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind { 2851; RV32I-LABEL: atomicrmw_xchg_i64_monotonic: 2852; RV32I: # %bb.0: 2853; RV32I-NEXT: addi sp, sp, -16 2854; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2855; RV32I-NEXT: li a3, 0 2856; RV32I-NEXT: call __atomic_exchange_8@plt 2857; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2858; RV32I-NEXT: addi sp, sp, 16 2859; RV32I-NEXT: ret 2860; 2861; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic: 2862; RV32IA: # %bb.0: 2863; RV32IA-NEXT: addi sp, sp, -16 2864; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2865; RV32IA-NEXT: li a3, 0 2866; RV32IA-NEXT: call __atomic_exchange_8@plt 2867; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2868; RV32IA-NEXT: addi sp, sp, 16 2869; RV32IA-NEXT: ret 2870; 2871; RV64I-LABEL: atomicrmw_xchg_i64_monotonic: 2872; RV64I: # %bb.0: 2873; RV64I-NEXT: addi sp, sp, -16 2874; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2875; RV64I-NEXT: li a2, 0 2876; RV64I-NEXT: call __atomic_exchange_8@plt 2877; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2878; RV64I-NEXT: addi sp, sp, 16 2879; RV64I-NEXT: ret 2880; 2881; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic: 2882; RV64IA: # %bb.0: 2883; RV64IA-NEXT: amoswap.d a0, a1, (a0) 2884; RV64IA-NEXT: ret 2885 %1 = atomicrmw xchg i64* %a, i64 %b monotonic 2886 ret i64 %1 2887} 2888 2889define signext i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind { 2890; RV32I-LABEL: atomicrmw_add_i64_monotonic: 2891; RV32I: # %bb.0: 2892; RV32I-NEXT: addi sp, sp, -16 2893; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2894; RV32I-NEXT: li a3, 0 2895; RV32I-NEXT: call __atomic_fetch_add_8@plt 2896; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2897; RV32I-NEXT: addi sp, sp, 16 2898; RV32I-NEXT: ret 2899; 2900; RV32IA-LABEL: atomicrmw_add_i64_monotonic: 2901; RV32IA: # %bb.0: 2902; RV32IA-NEXT: addi sp, sp, -16 2903; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2904; RV32IA-NEXT: li a3, 0 2905; RV32IA-NEXT: call __atomic_fetch_add_8@plt 2906; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2907; RV32IA-NEXT: addi sp, sp, 16 2908; RV32IA-NEXT: ret 2909; 2910; RV64I-LABEL: atomicrmw_add_i64_monotonic: 2911; RV64I: # %bb.0: 2912; RV64I-NEXT: addi sp, sp, -16 2913; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2914; RV64I-NEXT: li a2, 0 2915; RV64I-NEXT: call __atomic_fetch_add_8@plt 2916; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2917; RV64I-NEXT: addi sp, sp, 16 2918; RV64I-NEXT: ret 2919; 2920; RV64IA-LABEL: atomicrmw_add_i64_monotonic: 2921; RV64IA: # %bb.0: 2922; RV64IA-NEXT: amoadd.d a0, a1, (a0) 2923; RV64IA-NEXT: ret 2924 %1 = atomicrmw add i64* %a, i64 %b monotonic 2925 ret i64 %1 2926} 2927 2928define signext i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind { 2929; RV32I-LABEL: atomicrmw_sub_i64_monotonic: 2930; RV32I: # %bb.0: 2931; RV32I-NEXT: addi sp, sp, -16 2932; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2933; RV32I-NEXT: li a3, 0 2934; RV32I-NEXT: call __atomic_fetch_sub_8@plt 2935; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2936; RV32I-NEXT: addi sp, sp, 16 2937; RV32I-NEXT: ret 2938; 2939; RV32IA-LABEL: atomicrmw_sub_i64_monotonic: 2940; RV32IA: # %bb.0: 2941; RV32IA-NEXT: addi sp, sp, -16 2942; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2943; RV32IA-NEXT: li a3, 0 2944; RV32IA-NEXT: call __atomic_fetch_sub_8@plt 2945; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2946; RV32IA-NEXT: addi sp, sp, 16 2947; RV32IA-NEXT: ret 2948; 2949; RV64I-LABEL: atomicrmw_sub_i64_monotonic: 2950; RV64I: # %bb.0: 2951; RV64I-NEXT: addi sp, sp, -16 2952; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2953; RV64I-NEXT: li a2, 0 2954; RV64I-NEXT: call __atomic_fetch_sub_8@plt 2955; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2956; RV64I-NEXT: addi sp, sp, 16 2957; RV64I-NEXT: ret 2958; 2959; RV64IA-LABEL: atomicrmw_sub_i64_monotonic: 2960; RV64IA: # %bb.0: 2961; RV64IA-NEXT: neg a1, a1 2962; RV64IA-NEXT: amoadd.d a0, a1, (a0) 2963; RV64IA-NEXT: ret 2964 %1 = atomicrmw sub i64* %a, i64 %b monotonic 2965 ret i64 %1 2966} 2967 2968define signext i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind { 2969; RV32I-LABEL: atomicrmw_and_i64_monotonic: 2970; RV32I: # %bb.0: 2971; RV32I-NEXT: addi sp, sp, -16 2972; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2973; RV32I-NEXT: li a3, 0 2974; RV32I-NEXT: call __atomic_fetch_and_8@plt 2975; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2976; RV32I-NEXT: addi sp, sp, 16 2977; RV32I-NEXT: ret 2978; 2979; RV32IA-LABEL: atomicrmw_and_i64_monotonic: 2980; RV32IA: # %bb.0: 2981; RV32IA-NEXT: addi sp, sp, -16 2982; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2983; RV32IA-NEXT: li a3, 0 2984; RV32IA-NEXT: call __atomic_fetch_and_8@plt 2985; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2986; RV32IA-NEXT: addi sp, sp, 16 2987; RV32IA-NEXT: ret 2988; 2989; RV64I-LABEL: atomicrmw_and_i64_monotonic: 2990; RV64I: # %bb.0: 2991; RV64I-NEXT: addi sp, sp, -16 2992; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2993; RV64I-NEXT: li a2, 0 2994; RV64I-NEXT: call __atomic_fetch_and_8@plt 2995; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2996; RV64I-NEXT: addi sp, sp, 16 2997; RV64I-NEXT: ret 2998; 2999; RV64IA-LABEL: atomicrmw_and_i64_monotonic: 3000; RV64IA: # %bb.0: 3001; RV64IA-NEXT: amoand.d a0, a1, (a0) 3002; RV64IA-NEXT: ret 3003 %1 = atomicrmw and i64* %a, i64 %b monotonic 3004 ret i64 %1 3005} 3006 3007define signext i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind { 3008; RV32I-LABEL: atomicrmw_nand_i64_monotonic: 3009; RV32I: # %bb.0: 3010; RV32I-NEXT: addi sp, sp, -16 3011; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3012; RV32I-NEXT: li a3, 0 3013; RV32I-NEXT: call __atomic_fetch_nand_8@plt 3014; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3015; RV32I-NEXT: addi sp, sp, 16 3016; RV32I-NEXT: ret 3017; 3018; RV32IA-LABEL: atomicrmw_nand_i64_monotonic: 3019; RV32IA: # %bb.0: 3020; RV32IA-NEXT: addi sp, sp, -16 3021; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3022; RV32IA-NEXT: li a3, 0 3023; RV32IA-NEXT: call __atomic_fetch_nand_8@plt 3024; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3025; RV32IA-NEXT: addi sp, sp, 16 3026; RV32IA-NEXT: ret 3027; 3028; RV64I-LABEL: atomicrmw_nand_i64_monotonic: 3029; RV64I: # %bb.0: 3030; RV64I-NEXT: addi sp, sp, -16 3031; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3032; RV64I-NEXT: li a2, 0 3033; RV64I-NEXT: call __atomic_fetch_nand_8@plt 3034; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3035; RV64I-NEXT: addi sp, sp, 16 3036; RV64I-NEXT: ret 3037; 3038; RV64IA-LABEL: atomicrmw_nand_i64_monotonic: 3039; RV64IA: # %bb.0: 3040; RV64IA-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 3041; RV64IA-NEXT: lr.d a2, (a0) 3042; RV64IA-NEXT: and a3, a2, a1 3043; RV64IA-NEXT: not a3, a3 3044; RV64IA-NEXT: sc.d a3, a3, (a0) 3045; RV64IA-NEXT: bnez a3, .LBB40_1 3046; RV64IA-NEXT: # %bb.2: 3047; RV64IA-NEXT: mv a0, a2 3048; RV64IA-NEXT: ret 3049 %1 = atomicrmw nand i64* %a, i64 %b monotonic 3050 ret i64 %1 3051} 3052 3053define signext i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind { 3054; RV32I-LABEL: atomicrmw_or_i64_monotonic: 3055; RV32I: # %bb.0: 3056; RV32I-NEXT: addi sp, sp, -16 3057; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3058; RV32I-NEXT: li a3, 0 3059; RV32I-NEXT: call __atomic_fetch_or_8@plt 3060; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3061; RV32I-NEXT: addi sp, sp, 16 3062; RV32I-NEXT: ret 3063; 3064; RV32IA-LABEL: atomicrmw_or_i64_monotonic: 3065; RV32IA: # %bb.0: 3066; RV32IA-NEXT: addi sp, sp, -16 3067; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3068; RV32IA-NEXT: li a3, 0 3069; RV32IA-NEXT: call __atomic_fetch_or_8@plt 3070; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3071; RV32IA-NEXT: addi sp, sp, 16 3072; RV32IA-NEXT: ret 3073; 3074; RV64I-LABEL: atomicrmw_or_i64_monotonic: 3075; RV64I: # %bb.0: 3076; RV64I-NEXT: addi sp, sp, -16 3077; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3078; RV64I-NEXT: li a2, 0 3079; RV64I-NEXT: call __atomic_fetch_or_8@plt 3080; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3081; RV64I-NEXT: addi sp, sp, 16 3082; RV64I-NEXT: ret 3083; 3084; RV64IA-LABEL: atomicrmw_or_i64_monotonic: 3085; RV64IA: # %bb.0: 3086; RV64IA-NEXT: amoor.d a0, a1, (a0) 3087; RV64IA-NEXT: ret 3088 %1 = atomicrmw or i64* %a, i64 %b monotonic 3089 ret i64 %1 3090} 3091 3092define signext i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind { 3093; RV32I-LABEL: atomicrmw_xor_i64_monotonic: 3094; RV32I: # %bb.0: 3095; RV32I-NEXT: addi sp, sp, -16 3096; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3097; RV32I-NEXT: li a3, 0 3098; RV32I-NEXT: call __atomic_fetch_xor_8@plt 3099; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3100; RV32I-NEXT: addi sp, sp, 16 3101; RV32I-NEXT: ret 3102; 3103; RV32IA-LABEL: atomicrmw_xor_i64_monotonic: 3104; RV32IA: # %bb.0: 3105; RV32IA-NEXT: addi sp, sp, -16 3106; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3107; RV32IA-NEXT: li a3, 0 3108; RV32IA-NEXT: call __atomic_fetch_xor_8@plt 3109; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3110; RV32IA-NEXT: addi sp, sp, 16 3111; RV32IA-NEXT: ret 3112; 3113; RV64I-LABEL: atomicrmw_xor_i64_monotonic: 3114; RV64I: # %bb.0: 3115; RV64I-NEXT: addi sp, sp, -16 3116; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3117; RV64I-NEXT: li a2, 0 3118; RV64I-NEXT: call __atomic_fetch_xor_8@plt 3119; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3120; RV64I-NEXT: addi sp, sp, 16 3121; RV64I-NEXT: ret 3122; 3123; RV64IA-LABEL: atomicrmw_xor_i64_monotonic: 3124; RV64IA: # %bb.0: 3125; RV64IA-NEXT: amoxor.d a0, a1, (a0) 3126; RV64IA-NEXT: ret 3127 %1 = atomicrmw xor i64* %a, i64 %b monotonic 3128 ret i64 %1 3129} 3130 3131define signext i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind { 3132; RV32I-LABEL: atomicrmw_max_i64_monotonic: 3133; RV32I: # %bb.0: 3134; RV32I-NEXT: addi sp, sp, -32 3135; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3136; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3137; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3138; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3139; RV32I-NEXT: mv s0, a0 3140; RV32I-NEXT: lw a5, 4(a0) 3141; RV32I-NEXT: lw a4, 0(a0) 3142; RV32I-NEXT: mv s1, a2 3143; RV32I-NEXT: mv s2, a1 3144; RV32I-NEXT: j .LBB43_2 3145; RV32I-NEXT: .LBB43_1: # %atomicrmw.start 3146; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3147; RV32I-NEXT: sw a4, 8(sp) 3148; RV32I-NEXT: sw a5, 12(sp) 3149; RV32I-NEXT: addi a1, sp, 8 3150; RV32I-NEXT: mv a0, s0 3151; RV32I-NEXT: li a4, 0 3152; RV32I-NEXT: li a5, 0 3153; RV32I-NEXT: call __atomic_compare_exchange_8@plt 3154; RV32I-NEXT: lw a5, 12(sp) 3155; RV32I-NEXT: lw a4, 8(sp) 3156; RV32I-NEXT: bnez a0, .LBB43_7 3157; RV32I-NEXT: .LBB43_2: # %atomicrmw.start 3158; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3159; RV32I-NEXT: beq a5, s1, .LBB43_4 3160; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3161; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3162; RV32I-NEXT: slt a0, s1, a5 3163; RV32I-NEXT: j .LBB43_5 3164; RV32I-NEXT: .LBB43_4: # in Loop: Header=BB43_2 Depth=1 3165; RV32I-NEXT: sltu a0, s2, a4 3166; RV32I-NEXT: .LBB43_5: # %atomicrmw.start 3167; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3168; RV32I-NEXT: mv a2, a4 3169; RV32I-NEXT: mv a3, a5 3170; RV32I-NEXT: bnez a0, .LBB43_1 3171; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3172; RV32I-NEXT: # in Loop: Header=BB43_2 Depth=1 3173; RV32I-NEXT: mv a2, s2 3174; RV32I-NEXT: mv a3, s1 3175; RV32I-NEXT: j .LBB43_1 3176; RV32I-NEXT: .LBB43_7: # %atomicrmw.end 3177; RV32I-NEXT: mv a0, a4 3178; RV32I-NEXT: mv a1, a5 3179; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3180; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3181; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3182; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3183; RV32I-NEXT: addi sp, sp, 32 3184; RV32I-NEXT: ret 3185; 3186; RV32IA-LABEL: atomicrmw_max_i64_monotonic: 3187; RV32IA: # %bb.0: 3188; RV32IA-NEXT: addi sp, sp, -32 3189; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3190; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3191; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3192; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3193; RV32IA-NEXT: mv s0, a0 3194; RV32IA-NEXT: lw a5, 4(a0) 3195; RV32IA-NEXT: lw a4, 0(a0) 3196; RV32IA-NEXT: mv s1, a2 3197; RV32IA-NEXT: mv s2, a1 3198; RV32IA-NEXT: j .LBB43_2 3199; RV32IA-NEXT: .LBB43_1: # %atomicrmw.start 3200; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3201; RV32IA-NEXT: sw a4, 8(sp) 3202; RV32IA-NEXT: sw a5, 12(sp) 3203; RV32IA-NEXT: addi a1, sp, 8 3204; RV32IA-NEXT: mv a0, s0 3205; RV32IA-NEXT: li a4, 0 3206; RV32IA-NEXT: li a5, 0 3207; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 3208; RV32IA-NEXT: lw a5, 12(sp) 3209; RV32IA-NEXT: lw a4, 8(sp) 3210; RV32IA-NEXT: bnez a0, .LBB43_7 3211; RV32IA-NEXT: .LBB43_2: # %atomicrmw.start 3212; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3213; RV32IA-NEXT: beq a5, s1, .LBB43_4 3214; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3215; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3216; RV32IA-NEXT: slt a0, s1, a5 3217; RV32IA-NEXT: j .LBB43_5 3218; RV32IA-NEXT: .LBB43_4: # in Loop: Header=BB43_2 Depth=1 3219; RV32IA-NEXT: sltu a0, s2, a4 3220; RV32IA-NEXT: .LBB43_5: # %atomicrmw.start 3221; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3222; RV32IA-NEXT: mv a2, a4 3223; RV32IA-NEXT: mv a3, a5 3224; RV32IA-NEXT: bnez a0, .LBB43_1 3225; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3226; RV32IA-NEXT: # in Loop: Header=BB43_2 Depth=1 3227; RV32IA-NEXT: mv a2, s2 3228; RV32IA-NEXT: mv a3, s1 3229; RV32IA-NEXT: j .LBB43_1 3230; RV32IA-NEXT: .LBB43_7: # %atomicrmw.end 3231; RV32IA-NEXT: mv a0, a4 3232; RV32IA-NEXT: mv a1, a5 3233; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3234; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3235; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3236; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3237; RV32IA-NEXT: addi sp, sp, 32 3238; RV32IA-NEXT: ret 3239; 3240; RV64I-LABEL: atomicrmw_max_i64_monotonic: 3241; RV64I: # %bb.0: 3242; RV64I-NEXT: addi sp, sp, -32 3243; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3244; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3245; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3246; RV64I-NEXT: mv s0, a0 3247; RV64I-NEXT: ld a3, 0(a0) 3248; RV64I-NEXT: mv s1, a1 3249; RV64I-NEXT: j .LBB43_2 3250; RV64I-NEXT: .LBB43_1: # %atomicrmw.start 3251; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3252; RV64I-NEXT: sd a3, 0(sp) 3253; RV64I-NEXT: mv a1, sp 3254; RV64I-NEXT: mv a0, s0 3255; RV64I-NEXT: li a3, 0 3256; RV64I-NEXT: li a4, 0 3257; RV64I-NEXT: call __atomic_compare_exchange_8@plt 3258; RV64I-NEXT: ld a3, 0(sp) 3259; RV64I-NEXT: bnez a0, .LBB43_4 3260; RV64I-NEXT: .LBB43_2: # %atomicrmw.start 3261; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3262; RV64I-NEXT: mv a2, a3 3263; RV64I-NEXT: blt s1, a3, .LBB43_1 3264; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3265; RV64I-NEXT: # in Loop: Header=BB43_2 Depth=1 3266; RV64I-NEXT: mv a2, s1 3267; RV64I-NEXT: j .LBB43_1 3268; RV64I-NEXT: .LBB43_4: # %atomicrmw.end 3269; RV64I-NEXT: mv a0, a3 3270; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3271; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3272; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3273; RV64I-NEXT: addi sp, sp, 32 3274; RV64I-NEXT: ret 3275; 3276; RV64IA-LABEL: atomicrmw_max_i64_monotonic: 3277; RV64IA: # %bb.0: 3278; RV64IA-NEXT: amomax.d a0, a1, (a0) 3279; RV64IA-NEXT: ret 3280 %1 = atomicrmw max i64* %a, i64 %b monotonic 3281 ret i64 %1 3282} 3283 3284define signext i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind { 3285; RV32I-LABEL: atomicrmw_min_i64_monotonic: 3286; RV32I: # %bb.0: 3287; RV32I-NEXT: addi sp, sp, -32 3288; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3289; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3290; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3291; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3292; RV32I-NEXT: mv s0, a0 3293; RV32I-NEXT: lw a5, 4(a0) 3294; RV32I-NEXT: lw a4, 0(a0) 3295; RV32I-NEXT: mv s1, a2 3296; RV32I-NEXT: mv s2, a1 3297; RV32I-NEXT: j .LBB44_2 3298; RV32I-NEXT: .LBB44_1: # %atomicrmw.start 3299; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3300; RV32I-NEXT: sw a4, 8(sp) 3301; RV32I-NEXT: sw a5, 12(sp) 3302; RV32I-NEXT: addi a1, sp, 8 3303; RV32I-NEXT: mv a0, s0 3304; RV32I-NEXT: li a4, 0 3305; RV32I-NEXT: li a5, 0 3306; RV32I-NEXT: call __atomic_compare_exchange_8@plt 3307; RV32I-NEXT: lw a5, 12(sp) 3308; RV32I-NEXT: lw a4, 8(sp) 3309; RV32I-NEXT: bnez a0, .LBB44_7 3310; RV32I-NEXT: .LBB44_2: # %atomicrmw.start 3311; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3312; RV32I-NEXT: beq a5, s1, .LBB44_4 3313; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3314; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3315; RV32I-NEXT: slt a0, s1, a5 3316; RV32I-NEXT: j .LBB44_5 3317; RV32I-NEXT: .LBB44_4: # in Loop: Header=BB44_2 Depth=1 3318; RV32I-NEXT: sltu a0, s2, a4 3319; RV32I-NEXT: .LBB44_5: # %atomicrmw.start 3320; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3321; RV32I-NEXT: xori a0, a0, 1 3322; RV32I-NEXT: mv a2, a4 3323; RV32I-NEXT: mv a3, a5 3324; RV32I-NEXT: bnez a0, .LBB44_1 3325; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3326; RV32I-NEXT: # in Loop: Header=BB44_2 Depth=1 3327; RV32I-NEXT: mv a2, s2 3328; RV32I-NEXT: mv a3, s1 3329; RV32I-NEXT: j .LBB44_1 3330; RV32I-NEXT: .LBB44_7: # %atomicrmw.end 3331; RV32I-NEXT: mv a0, a4 3332; RV32I-NEXT: mv a1, a5 3333; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3334; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3335; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3336; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3337; RV32I-NEXT: addi sp, sp, 32 3338; RV32I-NEXT: ret 3339; 3340; RV32IA-LABEL: atomicrmw_min_i64_monotonic: 3341; RV32IA: # %bb.0: 3342; RV32IA-NEXT: addi sp, sp, -32 3343; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3344; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3345; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3346; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3347; RV32IA-NEXT: mv s0, a0 3348; RV32IA-NEXT: lw a5, 4(a0) 3349; RV32IA-NEXT: lw a4, 0(a0) 3350; RV32IA-NEXT: mv s1, a2 3351; RV32IA-NEXT: mv s2, a1 3352; RV32IA-NEXT: j .LBB44_2 3353; RV32IA-NEXT: .LBB44_1: # %atomicrmw.start 3354; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3355; RV32IA-NEXT: sw a4, 8(sp) 3356; RV32IA-NEXT: sw a5, 12(sp) 3357; RV32IA-NEXT: addi a1, sp, 8 3358; RV32IA-NEXT: mv a0, s0 3359; RV32IA-NEXT: li a4, 0 3360; RV32IA-NEXT: li a5, 0 3361; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 3362; RV32IA-NEXT: lw a5, 12(sp) 3363; RV32IA-NEXT: lw a4, 8(sp) 3364; RV32IA-NEXT: bnez a0, .LBB44_7 3365; RV32IA-NEXT: .LBB44_2: # %atomicrmw.start 3366; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3367; RV32IA-NEXT: beq a5, s1, .LBB44_4 3368; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3369; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3370; RV32IA-NEXT: slt a0, s1, a5 3371; RV32IA-NEXT: j .LBB44_5 3372; RV32IA-NEXT: .LBB44_4: # in Loop: Header=BB44_2 Depth=1 3373; RV32IA-NEXT: sltu a0, s2, a4 3374; RV32IA-NEXT: .LBB44_5: # %atomicrmw.start 3375; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3376; RV32IA-NEXT: xori a0, a0, 1 3377; RV32IA-NEXT: mv a2, a4 3378; RV32IA-NEXT: mv a3, a5 3379; RV32IA-NEXT: bnez a0, .LBB44_1 3380; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3381; RV32IA-NEXT: # in Loop: Header=BB44_2 Depth=1 3382; RV32IA-NEXT: mv a2, s2 3383; RV32IA-NEXT: mv a3, s1 3384; RV32IA-NEXT: j .LBB44_1 3385; RV32IA-NEXT: .LBB44_7: # %atomicrmw.end 3386; RV32IA-NEXT: mv a0, a4 3387; RV32IA-NEXT: mv a1, a5 3388; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3389; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3390; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3391; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3392; RV32IA-NEXT: addi sp, sp, 32 3393; RV32IA-NEXT: ret 3394; 3395; RV64I-LABEL: atomicrmw_min_i64_monotonic: 3396; RV64I: # %bb.0: 3397; RV64I-NEXT: addi sp, sp, -32 3398; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3399; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3400; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3401; RV64I-NEXT: mv s0, a0 3402; RV64I-NEXT: ld a3, 0(a0) 3403; RV64I-NEXT: mv s1, a1 3404; RV64I-NEXT: j .LBB44_2 3405; RV64I-NEXT: .LBB44_1: # %atomicrmw.start 3406; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3407; RV64I-NEXT: sd a3, 0(sp) 3408; RV64I-NEXT: mv a1, sp 3409; RV64I-NEXT: mv a0, s0 3410; RV64I-NEXT: li a3, 0 3411; RV64I-NEXT: li a4, 0 3412; RV64I-NEXT: call __atomic_compare_exchange_8@plt 3413; RV64I-NEXT: ld a3, 0(sp) 3414; RV64I-NEXT: bnez a0, .LBB44_4 3415; RV64I-NEXT: .LBB44_2: # %atomicrmw.start 3416; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3417; RV64I-NEXT: mv a2, a3 3418; RV64I-NEXT: bge s1, a3, .LBB44_1 3419; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3420; RV64I-NEXT: # in Loop: Header=BB44_2 Depth=1 3421; RV64I-NEXT: mv a2, s1 3422; RV64I-NEXT: j .LBB44_1 3423; RV64I-NEXT: .LBB44_4: # %atomicrmw.end 3424; RV64I-NEXT: mv a0, a3 3425; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3426; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3427; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3428; RV64I-NEXT: addi sp, sp, 32 3429; RV64I-NEXT: ret 3430; 3431; RV64IA-LABEL: atomicrmw_min_i64_monotonic: 3432; RV64IA: # %bb.0: 3433; RV64IA-NEXT: amomin.d a0, a1, (a0) 3434; RV64IA-NEXT: ret 3435 %1 = atomicrmw min i64* %a, i64 %b monotonic 3436 ret i64 %1 3437} 3438 3439define signext i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind { 3440; RV32I-LABEL: atomicrmw_umax_i64_monotonic: 3441; RV32I: # %bb.0: 3442; RV32I-NEXT: addi sp, sp, -32 3443; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3444; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3445; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3446; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3447; RV32I-NEXT: mv s0, a0 3448; RV32I-NEXT: lw a5, 4(a0) 3449; RV32I-NEXT: lw a4, 0(a0) 3450; RV32I-NEXT: mv s1, a2 3451; RV32I-NEXT: mv s2, a1 3452; RV32I-NEXT: j .LBB45_2 3453; RV32I-NEXT: .LBB45_1: # %atomicrmw.start 3454; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3455; RV32I-NEXT: sw a4, 8(sp) 3456; RV32I-NEXT: sw a5, 12(sp) 3457; RV32I-NEXT: addi a1, sp, 8 3458; RV32I-NEXT: mv a0, s0 3459; RV32I-NEXT: li a4, 0 3460; RV32I-NEXT: li a5, 0 3461; RV32I-NEXT: call __atomic_compare_exchange_8@plt 3462; RV32I-NEXT: lw a5, 12(sp) 3463; RV32I-NEXT: lw a4, 8(sp) 3464; RV32I-NEXT: bnez a0, .LBB45_7 3465; RV32I-NEXT: .LBB45_2: # %atomicrmw.start 3466; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3467; RV32I-NEXT: beq a5, s1, .LBB45_4 3468; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3469; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3470; RV32I-NEXT: sltu a0, s1, a5 3471; RV32I-NEXT: j .LBB45_5 3472; RV32I-NEXT: .LBB45_4: # in Loop: Header=BB45_2 Depth=1 3473; RV32I-NEXT: sltu a0, s2, a4 3474; RV32I-NEXT: .LBB45_5: # %atomicrmw.start 3475; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3476; RV32I-NEXT: mv a2, a4 3477; RV32I-NEXT: mv a3, a5 3478; RV32I-NEXT: bnez a0, .LBB45_1 3479; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3480; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 3481; RV32I-NEXT: mv a2, s2 3482; RV32I-NEXT: mv a3, s1 3483; RV32I-NEXT: j .LBB45_1 3484; RV32I-NEXT: .LBB45_7: # %atomicrmw.end 3485; RV32I-NEXT: mv a0, a4 3486; RV32I-NEXT: mv a1, a5 3487; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3488; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3489; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3490; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3491; RV32I-NEXT: addi sp, sp, 32 3492; RV32I-NEXT: ret 3493; 3494; RV32IA-LABEL: atomicrmw_umax_i64_monotonic: 3495; RV32IA: # %bb.0: 3496; RV32IA-NEXT: addi sp, sp, -32 3497; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3498; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3499; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3500; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3501; RV32IA-NEXT: mv s0, a0 3502; RV32IA-NEXT: lw a5, 4(a0) 3503; RV32IA-NEXT: lw a4, 0(a0) 3504; RV32IA-NEXT: mv s1, a2 3505; RV32IA-NEXT: mv s2, a1 3506; RV32IA-NEXT: j .LBB45_2 3507; RV32IA-NEXT: .LBB45_1: # %atomicrmw.start 3508; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3509; RV32IA-NEXT: sw a4, 8(sp) 3510; RV32IA-NEXT: sw a5, 12(sp) 3511; RV32IA-NEXT: addi a1, sp, 8 3512; RV32IA-NEXT: mv a0, s0 3513; RV32IA-NEXT: li a4, 0 3514; RV32IA-NEXT: li a5, 0 3515; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 3516; RV32IA-NEXT: lw a5, 12(sp) 3517; RV32IA-NEXT: lw a4, 8(sp) 3518; RV32IA-NEXT: bnez a0, .LBB45_7 3519; RV32IA-NEXT: .LBB45_2: # %atomicrmw.start 3520; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3521; RV32IA-NEXT: beq a5, s1, .LBB45_4 3522; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3523; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3524; RV32IA-NEXT: sltu a0, s1, a5 3525; RV32IA-NEXT: j .LBB45_5 3526; RV32IA-NEXT: .LBB45_4: # in Loop: Header=BB45_2 Depth=1 3527; RV32IA-NEXT: sltu a0, s2, a4 3528; RV32IA-NEXT: .LBB45_5: # %atomicrmw.start 3529; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3530; RV32IA-NEXT: mv a2, a4 3531; RV32IA-NEXT: mv a3, a5 3532; RV32IA-NEXT: bnez a0, .LBB45_1 3533; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3534; RV32IA-NEXT: # in Loop: Header=BB45_2 Depth=1 3535; RV32IA-NEXT: mv a2, s2 3536; RV32IA-NEXT: mv a3, s1 3537; RV32IA-NEXT: j .LBB45_1 3538; RV32IA-NEXT: .LBB45_7: # %atomicrmw.end 3539; RV32IA-NEXT: mv a0, a4 3540; RV32IA-NEXT: mv a1, a5 3541; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3542; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3543; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3544; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3545; RV32IA-NEXT: addi sp, sp, 32 3546; RV32IA-NEXT: ret 3547; 3548; RV64I-LABEL: atomicrmw_umax_i64_monotonic: 3549; RV64I: # %bb.0: 3550; RV64I-NEXT: addi sp, sp, -32 3551; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3552; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3553; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3554; RV64I-NEXT: mv s0, a0 3555; RV64I-NEXT: ld a3, 0(a0) 3556; RV64I-NEXT: mv s1, a1 3557; RV64I-NEXT: j .LBB45_2 3558; RV64I-NEXT: .LBB45_1: # %atomicrmw.start 3559; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3560; RV64I-NEXT: sd a3, 0(sp) 3561; RV64I-NEXT: mv a1, sp 3562; RV64I-NEXT: mv a0, s0 3563; RV64I-NEXT: li a3, 0 3564; RV64I-NEXT: li a4, 0 3565; RV64I-NEXT: call __atomic_compare_exchange_8@plt 3566; RV64I-NEXT: ld a3, 0(sp) 3567; RV64I-NEXT: bnez a0, .LBB45_4 3568; RV64I-NEXT: .LBB45_2: # %atomicrmw.start 3569; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3570; RV64I-NEXT: mv a2, a3 3571; RV64I-NEXT: bltu s1, a3, .LBB45_1 3572; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3573; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 3574; RV64I-NEXT: mv a2, s1 3575; RV64I-NEXT: j .LBB45_1 3576; RV64I-NEXT: .LBB45_4: # %atomicrmw.end 3577; RV64I-NEXT: mv a0, a3 3578; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3579; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3580; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3581; RV64I-NEXT: addi sp, sp, 32 3582; RV64I-NEXT: ret 3583; 3584; RV64IA-LABEL: atomicrmw_umax_i64_monotonic: 3585; RV64IA: # %bb.0: 3586; RV64IA-NEXT: amomaxu.d a0, a1, (a0) 3587; RV64IA-NEXT: ret 3588 %1 = atomicrmw umax i64* %a, i64 %b monotonic 3589 ret i64 %1 3590} 3591 3592define signext i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind { 3593; RV32I-LABEL: atomicrmw_umin_i64_monotonic: 3594; RV32I: # %bb.0: 3595; RV32I-NEXT: addi sp, sp, -32 3596; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3597; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3598; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3599; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3600; RV32I-NEXT: mv s0, a0 3601; RV32I-NEXT: lw a5, 4(a0) 3602; RV32I-NEXT: lw a4, 0(a0) 3603; RV32I-NEXT: mv s1, a2 3604; RV32I-NEXT: mv s2, a1 3605; RV32I-NEXT: j .LBB46_2 3606; RV32I-NEXT: .LBB46_1: # %atomicrmw.start 3607; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3608; RV32I-NEXT: sw a4, 8(sp) 3609; RV32I-NEXT: sw a5, 12(sp) 3610; RV32I-NEXT: addi a1, sp, 8 3611; RV32I-NEXT: mv a0, s0 3612; RV32I-NEXT: li a4, 0 3613; RV32I-NEXT: li a5, 0 3614; RV32I-NEXT: call __atomic_compare_exchange_8@plt 3615; RV32I-NEXT: lw a5, 12(sp) 3616; RV32I-NEXT: lw a4, 8(sp) 3617; RV32I-NEXT: bnez a0, .LBB46_7 3618; RV32I-NEXT: .LBB46_2: # %atomicrmw.start 3619; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3620; RV32I-NEXT: beq a5, s1, .LBB46_4 3621; RV32I-NEXT: # %bb.3: # %atomicrmw.start 3622; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3623; RV32I-NEXT: sltu a0, s1, a5 3624; RV32I-NEXT: j .LBB46_5 3625; RV32I-NEXT: .LBB46_4: # in Loop: Header=BB46_2 Depth=1 3626; RV32I-NEXT: sltu a0, s2, a4 3627; RV32I-NEXT: .LBB46_5: # %atomicrmw.start 3628; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3629; RV32I-NEXT: xori a0, a0, 1 3630; RV32I-NEXT: mv a2, a4 3631; RV32I-NEXT: mv a3, a5 3632; RV32I-NEXT: bnez a0, .LBB46_1 3633; RV32I-NEXT: # %bb.6: # %atomicrmw.start 3634; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 3635; RV32I-NEXT: mv a2, s2 3636; RV32I-NEXT: mv a3, s1 3637; RV32I-NEXT: j .LBB46_1 3638; RV32I-NEXT: .LBB46_7: # %atomicrmw.end 3639; RV32I-NEXT: mv a0, a4 3640; RV32I-NEXT: mv a1, a5 3641; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3642; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3643; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3644; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3645; RV32I-NEXT: addi sp, sp, 32 3646; RV32I-NEXT: ret 3647; 3648; RV32IA-LABEL: atomicrmw_umin_i64_monotonic: 3649; RV32IA: # %bb.0: 3650; RV32IA-NEXT: addi sp, sp, -32 3651; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 3652; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 3653; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 3654; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 3655; RV32IA-NEXT: mv s0, a0 3656; RV32IA-NEXT: lw a5, 4(a0) 3657; RV32IA-NEXT: lw a4, 0(a0) 3658; RV32IA-NEXT: mv s1, a2 3659; RV32IA-NEXT: mv s2, a1 3660; RV32IA-NEXT: j .LBB46_2 3661; RV32IA-NEXT: .LBB46_1: # %atomicrmw.start 3662; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3663; RV32IA-NEXT: sw a4, 8(sp) 3664; RV32IA-NEXT: sw a5, 12(sp) 3665; RV32IA-NEXT: addi a1, sp, 8 3666; RV32IA-NEXT: mv a0, s0 3667; RV32IA-NEXT: li a4, 0 3668; RV32IA-NEXT: li a5, 0 3669; RV32IA-NEXT: call __atomic_compare_exchange_8@plt 3670; RV32IA-NEXT: lw a5, 12(sp) 3671; RV32IA-NEXT: lw a4, 8(sp) 3672; RV32IA-NEXT: bnez a0, .LBB46_7 3673; RV32IA-NEXT: .LBB46_2: # %atomicrmw.start 3674; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 3675; RV32IA-NEXT: beq a5, s1, .LBB46_4 3676; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 3677; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3678; RV32IA-NEXT: sltu a0, s1, a5 3679; RV32IA-NEXT: j .LBB46_5 3680; RV32IA-NEXT: .LBB46_4: # in Loop: Header=BB46_2 Depth=1 3681; RV32IA-NEXT: sltu a0, s2, a4 3682; RV32IA-NEXT: .LBB46_5: # %atomicrmw.start 3683; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3684; RV32IA-NEXT: xori a0, a0, 1 3685; RV32IA-NEXT: mv a2, a4 3686; RV32IA-NEXT: mv a3, a5 3687; RV32IA-NEXT: bnez a0, .LBB46_1 3688; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 3689; RV32IA-NEXT: # in Loop: Header=BB46_2 Depth=1 3690; RV32IA-NEXT: mv a2, s2 3691; RV32IA-NEXT: mv a3, s1 3692; RV32IA-NEXT: j .LBB46_1 3693; RV32IA-NEXT: .LBB46_7: # %atomicrmw.end 3694; RV32IA-NEXT: mv a0, a4 3695; RV32IA-NEXT: mv a1, a5 3696; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 3697; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 3698; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 3699; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 3700; RV32IA-NEXT: addi sp, sp, 32 3701; RV32IA-NEXT: ret 3702; 3703; RV64I-LABEL: atomicrmw_umin_i64_monotonic: 3704; RV64I: # %bb.0: 3705; RV64I-NEXT: addi sp, sp, -32 3706; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 3707; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 3708; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 3709; RV64I-NEXT: mv s0, a0 3710; RV64I-NEXT: ld a3, 0(a0) 3711; RV64I-NEXT: mv s1, a1 3712; RV64I-NEXT: j .LBB46_2 3713; RV64I-NEXT: .LBB46_1: # %atomicrmw.start 3714; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3715; RV64I-NEXT: sd a3, 0(sp) 3716; RV64I-NEXT: mv a1, sp 3717; RV64I-NEXT: mv a0, s0 3718; RV64I-NEXT: li a3, 0 3719; RV64I-NEXT: li a4, 0 3720; RV64I-NEXT: call __atomic_compare_exchange_8@plt 3721; RV64I-NEXT: ld a3, 0(sp) 3722; RV64I-NEXT: bnez a0, .LBB46_4 3723; RV64I-NEXT: .LBB46_2: # %atomicrmw.start 3724; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 3725; RV64I-NEXT: mv a2, a3 3726; RV64I-NEXT: bgeu s1, a3, .LBB46_1 3727; RV64I-NEXT: # %bb.3: # %atomicrmw.start 3728; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 3729; RV64I-NEXT: mv a2, s1 3730; RV64I-NEXT: j .LBB46_1 3731; RV64I-NEXT: .LBB46_4: # %atomicrmw.end 3732; RV64I-NEXT: mv a0, a3 3733; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 3734; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 3735; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 3736; RV64I-NEXT: addi sp, sp, 32 3737; RV64I-NEXT: ret 3738; 3739; RV64IA-LABEL: atomicrmw_umin_i64_monotonic: 3740; RV64IA: # %bb.0: 3741; RV64IA-NEXT: amominu.d a0, a1, (a0) 3742; RV64IA-NEXT: ret 3743 %1 = atomicrmw umin i64* %a, i64 %b monotonic 3744 ret i64 %1 3745} 3746