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